You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1997 lines
98 KiB

-- DeathKnightFrost.lua
-- August 2025
-- Patch 11.2
if UnitClassBase( "player" ) ~= "DEATHKNIGHT" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
local PTR = ns.PTR
local spec = Hekili:NewSpecialization( 251 )
---- Local function declarations for increased performance
-- Strings
local strformat = string.format
-- Tables
local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe
-- Math
local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt
-- Common WoW APIs, comment out unneeded per-spec
-- local GetSpellCastCount = C_Spell.GetSpellCastCount
-- local GetSpellInfo = C_Spell.GetSpellInfo
-- local GetSpellInfo = ns.GetUnpackedSpellInfo
-- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID
-- local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID
-- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed
-- local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook
-- local IsActiveSpell = ns.IsActiveSpell
-- Specialization-specific local functions (if any)
spec:RegisterResource( Enum.PowerType.Runes, {
rune_regen = {
last = function () return state.query_time end,
stop = function( x ) return x == 6 end,
interval = function( time, val )
val = floor( val )
if val == 6 then return -1 end
return state.runes.expiry[ val + 1 ] - time
end,
value = 1,
},
empower_rune = {
aura = "empower_rune_weapon",
last = function()
local applied = state.buff.empower_rune_weapon.applied
return applied + floor( ( state.query_time - applied ) / 5 ) * 5
end,
stop = function( x )
return x == 6
end,
interval = 5,
value = 1,
},
}, setmetatable( {
expiry = { 0, 0, 0, 0, 0, 0 },
cooldown = 10,
regen = 0,
max = 6,
forecast = {},
fcount = 0,
times = {},
values = {},
resource = "runes",
reset = function()
local t = state.runes
for i = 1, 6 do
local start, duration, ready = GetRuneCooldown( i )
start = start or 0
duration = duration or ( 10 * state.haste )
t.expiry[ i ] = ready and 0 or ( start + duration )
t.cooldown = duration
end
table.sort( t.expiry )
t.actual = nil -- Reset actual to force recalculation
end,
gain = function( amount )
local t = state.runes
for i = 1, amount do
table.insert( t.expiry, 0 )
t.expiry[ 7 ] = nil
end
table.sort( t.expiry )
t.actual = nil
end,
spend = function( amount )
local t = state.runes
for i = 1, amount do
local nextReady = ( t.expiry[ 4 ] > 0 and t.expiry[ 4 ] or state.query_time ) + t.cooldown
table.remove( t.expiry, 1 )
table.insert( t.expiry, nextReady )
end
if state.this_action == "obliterate" and state.buff.exterminate.up then
state.gain( 20, "runic_power" )
else
state.gain( amount * 10, "runic_power" )
end
if state.talent.gathering_storm.enabled and state.buff.remorseless_winter.up then
state.buff.remorseless_winter.expires = state.buff.remorseless_winter.expires + ( 0.5 * amount )
end
t.actual = nil
end,
timeTo = function( x )
return state:TimeToResource( state.runes, x )
end,
}, {
__index = function( t, k )
if k == "actual" then
-- Calculate the number of runes available based on `expiry`.
local amount = 0
for i = 1, 6 do
if t.expiry[ i ] <= state.query_time then
amount = amount + 1
end
end
return amount
elseif k == "current" then
-- If this is a modeled resource, use our lookup system.
if t.forecast and t.fcount > 0 then
local q = state.query_time
local index, slice
if t.values[ q ] then return t.values[ q ] end
for i = 1, t.fcount do
local v = t.forecast[ i ]
if v.t <= q and v.v ~= nil then
index = i
slice = v
else
break
end
end
-- We have a slice.
if index and slice and slice.v then
t.values[ q ] = max( 0, min( t.max, slice.v ) )
return t.values[ q ]
end
end
return t.actual
elseif k == "deficit" then
return t.max - t.current
elseif k == "time_to_next" then
return t[ "time_to_" .. t.current + 1 ]
elseif k == "time_to_max" then
return t.current == t.max and 0 or max( 0, t.expiry[ 6 ] - state.query_time )
else
local amount = k:match( "time_to_(%d+)" )
amount = amount and tonumber( amount )
if amount then return t.timeTo( amount ) end
end
end
}))
spec:RegisterResource( Enum.PowerType.RunicPower, {
empower_rp = {
aura = "empower_rune_weapon",
last = function () return state.buff.empower_rune_weapon.applied + floor( ( state.query_time - state.buff.empower_rune_weapon.applied ) / 5 ) * 5 end,
interval = 5,
value = 5
},
swarming_mist = {
aura = "swarming_mist",
last = function ()
return state.buff.swarming_mist.applied + floor( state.query_time - state.buff.swarming_mist.applied )
end,
interval = 1,
value = function () return min( 15, state.true_active_enemies * 3 ) end,
},
} )
-- Talents
spec:RegisterTalents( {
-- Death Knight
antimagic_barrier = { 76046, 205727, 1 }, -- Reduces the cooldown of Anti-Magic Shell by $s1 sec and increases its duration and amount absorbed by $s2%
antimagic_zone = { 76065, 51052, 1 }, -- Places an Anti-Magic Zone for $s1 sec, reducing the magic damage taken by party or raid members by $s2%
asphyxiate = { 76064, 221562, 1 }, -- Lifts the enemy target off the ground, crushing their throat with dark energy and stunning them for $s1 sec
assimilation = { 76048, 374383, 1 }, -- The cooldown of Anti-Magic Zone is reduced by $s1 sec and its duration is increased by $s2 sec
blinding_sleet = { 76044, 207167, 1 }, -- Targets in a cone in front of you are blinded, causing them to wander disoriented for $s1 sec. Damage may cancel the effect. When Blinding Sleet ends, enemies are slowed by $s2% for $s3 sec
blood_draw = { 76056, 374598, 1 }, -- When you fall below $s1% health you drain $s2 health from nearby enemies, the damage you take is reduced by $s3% and your Death Strike cost is reduced by $s4 for $s5 sec. Can only occur every $s6 min
blood_scent = { 76078, 374030, 1 }, -- Increases Leech by $s1%
brittle = { 76061, 374504, 1 }, -- Your diseases have a chance to weaken your enemy causing your attacks against them to deal $s1% increased damage for $s2 sec
cleaving_strikes = { 76073, 316916, 1 }, -- Frostscythe deals $s1% increased damage during Remorseless Winter
coldthirst = { 76083, 378848, 1 }, -- Successfully interrupting an enemy with Mind Freeze grants $s1 Runic Power and reduces its cooldown by $s2 sec
control_undead = { 76059, 111673, 1 }, -- Dominates the target undead creature up to level $s1, forcing it to do your bidding for $s2 min
death_pact = { 76075, 48743, 1 }, -- Create a death pact that heals you for $s1% of your maximum health, but absorbs incoming healing equal to $s2% of your max health for $s3 sec
death_strike = { 76071, 49998, 1 }, -- Focuses dark power into a strike with both weapons, that deals a total of $s$s2 Physical damage and heals you for $s3% of all damage taken in the last $s4 sec, minimum $s5% of maximum health
deaths_echo = { 102007, 356367, 1 }, -- Death's Advance, Death and Decay, and Death Grip have $s1 additional charge
deaths_reach = { 102006, 276079, 1 }, -- Increases the range of Death Grip by $s1 yds. Killing an enemy that yields experience or honor resets the cooldown of Death Grip
enfeeble = { 76060, 392566, 1 }, -- Your ghoul's attacks have a chance to apply Enfeeble, reducing the enemies movement speed by $s1% and the damage they deal to you by $s2% for $s3 sec
gloom_ward = { 76052, 391571, 1 }, -- Absorbs are $s1% more effective on you
grip_of_the_dead = { 76057, 273952, 1 }, -- Death and Decay reduces the movement speed of enemies within its area by $s1%, decaying by $s2% every sec
ice_prison = { 76086, 454786, 1 }, -- Chains of Ice now also roots enemies for $s1 sec but its cooldown is increased to $s2 sec
icebound_fortitude = { 76081, 48792, 1 }, -- Your blood freezes, granting immunity to Stun effects and reducing all damage you take by $s1% for $s2 sec
icy_talons = { 76085, 194878, 1 }, -- Your Runic Power spending abilities increase your melee attack speed by $s1% for $s2 sec, stacking up to $s3 times
improved_death_strike = { 76067, 374277, 1 }, -- Death Strike's cost is reduced by $s1, and its healing is increased by $s2%
insidious_chill = { 76051, 391566, 1 }, -- Your auto-attacks reduce the target's auto-attack speed by $s1% for $s2 sec, stacking up to $s3 times
march_of_darkness = { 76074, 391546, 1 }, -- Death's Advance grants an additional $s1% movement speed over the first $s2 sec
mind_freeze = { 76084, 47528, 1 }, -- Smash the target's mind with cold, interrupting spellcasting and preventing any spell in that school from being cast for $s1 sec
null_magic = { 102008, 454842, 1 }, -- Magic damage taken is reduced by $s1% and the duration of harmful Magic effects against you are reduced by $s2%
osmosis = { 76088, 454835, 1 }, -- Anti-Magic Shell increases healing received by $s1%
permafrost = { 76066, 207200, 1 }, -- Your auto attack damage grants you an absorb shield equal to $s1% of the damage dealt
proliferating_chill = { 101708, 373930, 1 }, -- Chains of Ice affects $s1 additional nearby enemy
raise_dead = { 76072, 46585, 1 }, -- Raises a ghoul to fight by your side. You can have a maximum of one ghoul at a time. Lasts $s1 min
rune_mastery = { 76079, 374574, 2 }, -- Consuming a Rune has a chance to increase your Strength by $s1% for $s2 sec
runic_attenuation = { 76045, 207104, 1 }, -- Auto attacks have a chance to generate $s1 Runic Power
runic_protection = { 76055, 454788, 1 }, -- Your chance to be critically struck is reduced by $s1% and your Armor is increased by $s2%
sacrificial_pact = { 76060, 327574, 1 }, -- Sacrifice your ghoul to deal $s$s2 Shadow damage to all nearby enemies and heal for $s3% of your maximum health. Deals reduced damage beyond $s4 targets
soul_reaper = { 76063, 343294, 1 }, -- Strike an enemy for $s$s3 Shadowfrost damage and afflict the enemy with Soul Reaper. After $s4 sec, if the target is below $s5% health this effect will explode dealing an additional $s$s6 Shadowfrost damage to the target. If the enemy that yields experience or honor dies while afflicted by Soul Reaper, gain Runic Corruption
subduing_grasp = { 76080, 454822, 1 }, -- When you pull an enemy, the damage they deal to you is reduced by $s1% for $s2 sec
suppression = { 76087, 374049, 1 }, -- Damage taken from area of effect attacks reduced by $s1%. When suffering a loss of control effect, this bonus is increased by an additional $s2% for $s3 sec
unholy_bond = { 76076, 374261, 1 }, -- Increases the effectiveness of your Runeforge effects by $s1%
unholy_endurance = { 76058, 389682, 1 }, -- Increases Lichborne duration by $s1 sec and while active damage taken is reduced by $s2%
unholy_momentum = { 76069, 374265, 1 }, -- Increases Haste by $s1%
unyielding_will = { 76050, 457574, 1 }, -- Anti-Magic Shell now removes all harmful magical effects when activated, but its cooldown is increased by $s1 sec
vestigial_shell = { 76053, 454851, 1 }, -- Casting Anti-Magic Shell grants $s2 nearby allies a Lesser Anti-Magic Shell that Absorbs up to $s$s3 magic damage and reduces the duration of harmful Magic effects against them by $s4%
veteran_of_the_third_war = { 76068, 48263, 1 }, -- Stamina increased by $s1%
will_of_the_necropolis = { 76054, 206967, 2 }, -- Damage taken below $s1% Health is reduced by $s2%
wraith_walk = { 76077, 212552, 1 }, -- Embrace the power of the Shadowlands, removing all root effects and increasing your movement speed by $s1% for $s2 sec. Taking any action cancels the effect. While active, your movement speed cannot be reduced below $s3%
-- Frost
arctic_assault = { 76118, 456230, 1 }, -- Consuming Killing Machine fires a Glacial Advance through your target at $s1% effectiveness
avalanche = { 76105, 207142, 1 }, -- Casting Howling Blast with Rime active causes jagged icicles to fall on enemies nearby your target, applying Razorice and dealing $s$s2 Frost damage
biting_cold = { 76112, 377056, 1 }, -- Remorseless Winter damage is increased by $s1%. The first time Remorseless Winter deals damage to $s2 different enemies, you gain Rime
bonegrinder = { 76122, 377098, 2 }, -- Consuming Killing Machine grants $s1% critical strike chance for $s2 sec, stacking up to $s3 times. At $s4 stacks your next Killing Machine consumes the stacks and grants you $s5% increased Frost damage for $s6 sec
breath_of_sindragosa = { 76093, 1249658, 1 }, -- Call upon Sindragosa's aid in battle for $s2 sec, continuously dealing $s$s3 Frost damage every $s4 sec to enemies in a cone in front of you. Consuming Killing Machine or Rime increases the duration by $s5 sec. Deals reduced damage to secondary targets. Grants a charge of Empower Rune Weapon at the start and $s6 Runes at the end
cryogenic_chamber = { 106790, 456237, 1 }, -- When Howling Blast consumes Rime, $s1% of the damage it deals is gathered into the next cast of Remorseless Winter, up to $s2 times
empower_rune_weapon = { 76096, 47568, 1 }, -- Drain the will of your enemy to empower your rune weapon, dealing $s$s2 Shadowfrost damage and reduced damage to enemies nearby, gaining $s3 Runic Power, and grants you Killing Machine
enduring_strength = { 101930, 377190, 1 }, -- When Pillar of Frost expires, your Strength is increased by $s1% for $s2 sec. This effect lasts $s3 sec longer, up to $s4 sec, for each Obliterate and Frostscythe critical strike during Pillar of Frost
everfrost = { 76099, 376938, 1 }, -- Rime empowered Howling Blast deals $s1% increased damage to secondary targets. Remorseless Winter deals $s2% increased damage to enemies it hits, stacking up to $s3 times
frigid_executioner = { 76092, 377073, 1 }, -- Runic Empowerment has a $s1% chance to refund $s2 additional Rune
frost_strike = { 76115, 49143, 1 }, -- Chill your weapon with icy power and quickly strike the enemy, dealing $s$s2 Frost damage
frostbane = { 76094, 455993, 1 }, -- Each foe struck with Glacial Advance has a chance to transform your next Frost Strike into Frostbane. The chance increases with the number of Razorice stacks on the target. Frostbane Start a frozen onslaught that strikes twice, unleashing the chilling essence of winter, dealing $s$s4 Frost damage to all enemies caught in its wake with each strike. Each enemy struck reduces the damage dealt to the next foe by $s5%, down to $s6%
frostbound_will = { 107994, 1238680, 1 }, -- Consuming Rime reduces the cooldown of Empower Rune Weapon by $s1 sec
frostreaper = { 76098, 1230301, 1 }, -- Obliterate deals $s2% increased damage and has a chance to tether the souls of its target and a nearby enemy to yours. Frost Strike severs the tethers, dealing $s$s3 Shadowfrost damage to both foes
frostscythe = { 76113, 207230, 1 }, -- A sweeping attack that strikes all enemies in front of you for $s$s2 Frost damage. Deals reduced damage beyond $s3 targets. Consumes Killing Machine to have its critical strikes deal $s4 times the normal damage
frostwyrms_fury = { 76106, 279302, 1 }, -- Summons a frostwyrm who breathes on all enemies within $s2 yd in front of you, dealing $s$s3 Frost damage, stunning enemies for $s4 sec, and slowing movement speed by $s5% for $s6 sec
frozen_dominion = { 102009, 377226, 1 }, -- Pillar of Frost now summons a Remorseless Winter that lasts $s1 sec longer. Each enemy Remorseless Winter damages grants you $s2% Mastery, up to $s3% for $s4 sec
gathering_storm = { 76110, 194912, 1 }, -- Each Rune spent during Remorseless Winter increases its damage by $s1%, and extends its duration by $s2 sec
howling_blades = { 76121, 1230223, 1 }, -- Rime empowered Howling Blast unleashes $s2 icy blades at its target that deal $s$s3 Frost damage and have $s4% chance to grant Killing Machine
howling_blast = { 76114, 49184, 1 }, -- Blast the target with a frigid wind, dealing $s$s3 Frost damage to that foe, and reduced damage to all other enemies within $s4 yards, infecting all targets with Frost Fever. Frost Fever A disease that deals $s$s7 Frost damage over $s8 sec and has a chance to grant the Death Knight $s9 Runic Power each time it deals damage
hyperpyrexia = { 76108, 456238, 1 }, -- Your Runic Power spending abilities have a chance to additionally deal $s1% of the damage dealt over $s2 sec
icebreaker = { 76033, 392950, 2 }, -- When empowered by Rime, Howling Blast deals $s1% increased damage to your primary target
icy_death_torrent = { 101933, 435010, 1 }, -- Your auto attack critical strikes have a chance to send out a torrent of ice dealing $s$s2 Frost damage to enemies in front of you
icy_onslaught = { 106791, 1230272, 1 }, -- Frost Strike and Glacial Advance now cause your next Frost Strike and Glacial Advance to deal $s1% increased damage and cost $s2 more Runic Power. This effect stacks until the next Runic Empowerment
inexorable_assault = { 76100, 253593, 1 }, -- Gain Inexorable Assault every $s2 sec, stacking up to $s3 times. Obliterate and Frostscythe consume up to $s4 stacks, dealing an additional $s$s5 Frost damage for each stack consumed
killing_machine = { 76117, 51128, 1 }, -- Your auto attack critical strikes have a chance to make your next Obliterate deal Frost damage and critically strike, or make your next Frostscythe critically strike for $s1 times the normal damage
killing_streak = { 76091, 1230153, 1 }, -- Obliterate and Frostscythe consume all Killing Machines to deal $s1% increased critical strike damage and grant $s2% Haste for $s3 sec for each stack consumed. Multiple applications may overlap
murderous_efficiency = { 76037, 207061, 1 }, -- Consuming the Killing Machine effect has a $s1% chance to grant you $s2 Rune
northwinds = { 76109, 1230284, 1 }, -- Howling Blast now hits an additional target with maximum effectiveness. Rime increases Howling Blast damage done by an additional $s1%
obliterate = { 76116, 49020, 1 }, -- A brutal attack that deals $s$s2 Physical damage
obliteration = { 76123, 281238, 1 }, -- During Pillar of Frost, Frost Strike, Glacial Advance, and Howling Blast always grant Killing Machine and have a $s1% chance to generate a Rune. Additionally during Pillar of Frost, Empower Rune Weapon causes your next Obliterate or Frostscythe to cost no Runes
pillar_of_frost = { 101929, 51271, 1 }, -- The power of frost increases your Strength by $s1% for $s2 sec
rage_of_the_frozen_champion = { 101931, 377076, 1 }, -- Frost Strike and Glacial Advance have a $s1% increased chance to trigger Rime and Howling Blast generates $s2 Runic Power while Rime is active
runic_command = { 76102, 376251, 2 }, -- Increases your maximum Runic Power by $s1. Increases Rune regeneration rate by $s2%
runic_overflow = { 76103, 316803, 2 }, -- Increases Frost Strike and Glacial Advance damage by $s1%
shattering_blade = { 76095, 207057, 1 }, -- When Frost Strike damages an enemy with $s1 stacks of Razorice it will consume them to deal an additional $s2% damage
smothering_offense = { 76101, 435005, 1 }, -- Your auto attack damage is increased by $s1%. This amount is increased for each stack of Icy Talons you have and it can stack up to $s2 additional times
the_long_winter = { 101932, 456240, 1 }, -- While Pillar of Frost is active your auto-attack critical strikes increase its duration by $s1 sec, up to a maximum of $s2 sec
-- Deathbringer
bind_in_darkness = { 95043, 440031, 1 }, -- Rime empowered Howling Blast deals $s2% increased damage to its main target, and is now Shadowfrost$s$s3 Shadowfrost damage applies $s4 stacks to Reaper's Mark and $s5 stacks when it is a critical strike
dark_talons = { 95057, 436687, 1 }, -- Consuming Killing Machine or Rime has a $s1% chance to grant $s2 stacks of Icy Talons and increase its maximum stacks by the same amount for $s3 sec. Runic Power spending abilities count as Shadowfrost while Icy Talons is active
deaths_messenger = { 95049, 437122, 1 }, -- Reduces the cooldowns of Lichborne and Raise Dead by $s1 sec
expelling_shield = { 95049, 439948, 1 }, -- When an enemy deals direct damage to your Anti-Magic Shell, their cast speed is reduced by $s1% for $s2 sec
exterminate = { 95068, 441378, 1 }, -- After Reaper's Mark explodes, your next $s3 Obliterates or Frostscythes cost $s4 Rune and summon $s5 scythes to strike your enemies. The first scythe strikes your target for $s$s6 Shadowfrost damage and has a $s7% chance to grant Killing Machine, the second scythe strikes all enemies around your target for $s$s8 Shadowfrost damage and applies Frost Fever. Deals reduced damage beyond $s9 targets
grim_reaper = { 95034, 434905, 1 }, -- Reaper's Mark initial strike grants Killing Machine. Reaper's Mark explosion deals up to $s1% increased damage based on your target's missing health
pact_of_the_deathbringer = { 95035, 440476, 1 }, -- When you suffer a damaging effect equal to $s1% of your maximum health, you instantly cast Death Pact at $s2% effectiveness. May only occur every $s3 min. When a Reaper's Mark explodes, the cooldowns of this effect and Death Pact are reduced by $s4 sec
reaper_of_souls = { 95034, 440002, 1 }, -- When you apply Reaper's Mark, the cooldown of Soul Reaper is reset, your next Soul Reaper costs no runes, and it explodes on the target regardless of their health. Soul Reaper damage is increased by $s1%
reapers_mark = { 95062, 439843, 1 }, -- Viciously slice into the soul of your enemy, dealing $s$s2 Shadowfrost damage and applying Reaper's Mark. Each time you deal Shadow or Frost damage, add a stack of Reaper's Mark. After $s3 sec or reaching $s4 stacks, the mark explodes, dealing $s5 damage per stack. Reaper's Mark travels to an unmarked enemy nearby if the target dies
reapers_onslaught = { 95057, 469870, 1 }, -- Reduces the cooldown of Reaper's Mark by $s1 sec, but the amount of Obliterates and Frostscythes empowered by Exterminate is reduced by $s2
rune_carved_plates = { 95035, 440282, 1 }, -- Each Rune spent reduces the magic damage you take by $s1% and each Rune generated reduces the physical damage you take by $s2% for $s3 sec, up to $s4 times
soul_rupture = { 95061, 437161, 1 }, -- When Reaper's Mark explodes, it deals $s1% of the damage dealt to nearby enemies and causes them to deal $s2% reduced Physical damage to you for $s3 sec
swift_and_painful = { 95032, 443560, 1 }, -- If no enemies are struck by Soul Rupture, you gain $s1% Strength for $s2 sec. Wave of Souls is $s3% more effective on the main target of your Reaper's Mark
wave_of_souls = { 95036, 439851, 1 }, -- Reaper's Mark sends forth bursts of Shadowfrost energy and back, dealing $s$s2 Shadowfrost damage both ways to all enemies caught in its path. Wave of Souls critical strikes cause enemies to take $s3% increased Shadowfrost damage for $s4 sec, stacking up to $s5 times, and it is always a critical strike on its way back
wither_away = { 95058, 441894, 1 }, -- Frost Fever deals its damage $s1% faster, and the second scythe of Exterminate applies Frost Fever
-- Rider Of The Apocalypse
a_feast_of_souls = { 95042, 444072, 1 }, -- While you have $s1 or more Horsemen aiding you, your Runic Power spending abilities deal $s2% increased damage
apocalypse_now = { 95041, 444040, 1 }, -- Army of the Dead and Frostwyrm's Fury call upon all $s1 Horsemen to aid you for $s2 sec
death_charge = { 95060, 444010, 1 }, -- Call upon your Death Charger to break free of movement impairment effects. For $s1 sec, while upon your Death Charger your movement speed is increased by $s2%, you cannot be slowed below $s3% of normal speed, and you are immune to forced movement effects and knockbacks
fury_of_the_horsemen = { 95042, 444069, 1 }, -- Every $s1 Runic Power you spend extends the duration of the Horsemen's aid in combat by $s2 sec, up to $s3 sec
horsemens_aid = { 95037, 444074, 1 }, -- While at your aid, the Horsemen will occasionally cast Anti-Magic Shell on you and themselves at $s1% effectiveness. You may only benefit from this effect every $s2 sec
hungering_thirst = { 95044, 444037, 1 }, -- The damage of your diseases and Frost Strike are increased by $s1%
mawsworn_menace = { 95054, 444099, 1 }, -- Obliterate deals $s1% increased damage and your Remorseless Winter lasts $s2 sec longer
mograines_might = { 95067, 444047, 1 }, -- Your damage is increased by $s1% and you gain $s2% critical strike chance while inside Mograine's Death and Decay
nazgrims_conquest = { 95059, 444052, 1 }, -- If an enemy dies while Nazgrim is active, the strength of Apocalyptic Conquest is increased by $s1%. Additionally, each Rune you spend increase its value by $s2%
on_a_paler_horse = { 95060, 444008, 1 }, -- While outdoors you are able to mount your Acherus Deathcharger in combat
pact_of_the_apocalypse = { 95037, 444083, 1 }, -- When you take damage, $s1% of the damage is redirected to each active horsemen
riders_champion = { 95066, 444005, 1 }, -- Spending Runes has a chance to call forth the aid of a Horsemen for $s2 sec. Mograine Casts Death and Decay at his location that follows his position. Whitemane Casts Undeath on your target dealing $s$s3 Shadowfrost damage per stack every $s4 sec, for $s5 sec. Each time Undeath deals damage it gains a stack. Cannot be refreshed. Trollbane Casts Chains of Ice on your target slowing their movement speed by $s6% and increasing the damage they take from you by $s7% for $s8 sec. Nazgrim While Nazgrim is active you gain Apocalyptic Conquest, increasing your Strength by $s9%
trollbanes_icy_fury = { 95063, 444097, 1 }, -- Obliterate and Frostscythe shatter Trollbane's Chains of Ice when hit, dealing $s$s2 Shadowfrost damage to nearby enemies, and slowing them by $s3% for $s4 sec. Deals reduced damage beyond $s5 targets
whitemanes_famine = { 95047, 444033, 1 }, -- When Obliterate or Frostscythe damages an enemy affected by Undeath it gains $s1 stack and infects another nearby enemy
} )
-- PvP Talents
spec:RegisterPvpTalents( {
bitter_chill = 5435, -- (356470)
bloodforged_armor = 5586, -- (410301) Death Strike reduces all Physical damage taken by $s1% for $s2 sec
dark_simulacrum = 3512, -- (77606) Places a dark ward on an enemy player that persists for $s1 sec, triggering when the enemy next spends mana on a spell, and allowing the Death Knight to unleash an exact duplicate of that spell
deathchill = 701, -- (204080)
deaths_cold_embrace = 5693, -- (1218603)
delirium = 702, -- (233396)
rot_and_wither = 5510, -- (202727) Your Death and Decay rots enemies each time it deals damage, absorbing healing equal to $s1% of damage dealt
shroud_of_winter = 3439, -- (199719)
spellwarden = 5591, -- (410320) Anti-Magic Shell is now usable on allies and its cooldown is reduced by $s1 sec
strangulate = 5429, -- (47476) Shadowy tendrils constrict an enemy's throat, silencing them for $s1 sec
} )
-- Auras
spec:RegisterAuras( {
-- Your Runic Power spending abilities deal $w1% increased damage.
a_feast_of_souls = {
id = 440861,
duration = 3600,
max_stack = 1
},
-- Talent: Absorbing up to $w1 magic damage. Immune to harmful magic effects.
-- https://wowhead.com/beta/spell=48707
antimagic_shell = {
id = 48707,
duration = function () return ( legendary.deaths_embrace.enabled and 2 or 1 ) * 5 + ( conduit.reinforced_shell.mod * 0.001 ) end,
max_stack = 1
},
antimagic_zone = {
id = 145629,
duration = function () return 6 + ( 2 * talent.assimilation.rank ) end,
max_stack = 1
},
asphyxiate = {
id = 108194,
duration = 4,
mechanic = "stun",
type = "Magic",
max_stack = 1
},
-- Next Howling Blast deals Shadowfrost damage.
bind_in_darkness = {
id = 443532,
duration = 3600,
max_stack = 1
},
-- Talent: Disoriented.
-- https://wowhead.com/beta/spell=207167
blinding_sleet = {
id = 207167,
duration = 5,
mechanic = "disorient",
type = "Magic",
max_stack = 1
},
blood_draw = {
id = 454871,
duration = 8,
max_stack = 1
},
-- You may not benefit from the effects of Blood Draw.
-- https://wowhead.com/beta/spell=374609
blood_draw_cd = {
id = 374609,
duration = 120,
max_stack = 1
},
-- Draining $w1 health from the target every $t1 sec.
-- https://wowhead.com/beta/spell=55078
blood_plague = {
id = 55078,
duration = function() return 24 * ( talent.wither_away.enabled and 0.5 or 1 ) end,
tick_time = function() return 3 * ( talent.wither_away.enabled and 0.5 or 1 ) end,
max_stack = 1
},
-- Draining $s1 health from the target every $t1 sec.
-- https://wowhead.com/beta/spell=206931
blooddrinker = {
id = 206931,
duration = 3,
type = "Magic",
max_stack = 1
},
bonegrinder_crit = {
id = 377101,
duration = 10,
max_stack = 5
},
-- Talent: Frost damage increased by $s1%.
-- https://wowhead.com/beta/spell=377103
bonegrinder_frost = {
id = 377103,
duration = 10,
max_stack = 1
},
-- Talent: Continuously dealing Frost damage every $t1 sec to enemies in a cone in front of you.
-- https://wowhead.com/beta/spell=152279
breath_of_sindragosa = {
id = 1249658,
duration = 8,
tick_time = 1,
max_stack = 1
},
-- Talent: Movement slowed $w1% $?$w5!=0[and Haste reduced $w5% ][]by frozen chains.
-- https://wowhead.com/beta/spell=45524
chains_of_ice = {
id = 45524,
duration = 8,
mechanic = "snare",
type = "Magic",
max_stack = 1
},
chilled = {
id = 204206,
duration = 4,
mechanic = "snare",
type = "Magic",
max_stack = 1
},
cold_heart = {
id = 235599,
duration = 3600,
max_stack = 20
},
-- Talent: Controlled.
-- https://wowhead.com/beta/spell=111673
control_undead = {
id = 111673,
duration = 300,
mechanic = "charm",
type = "Magic",
max_stack = 1
},
cryogenic_chamber = {
id = 456370,
duration = 30,
max_stack = 20
},
-- Taunted.
-- https://wowhead.com/beta/spell=56222
dark_command = {
id = 56222,
duration = 3,
mechanic = "taunt",
max_stack = 1
},
dark_succor = {
id = 101568,
duration = 20,
max_stack = 1
},
-- Reduces healing done by $m1%.
-- https://wowhead.com/beta/spell=327095
death = {
id = 327095,
duration = 6,
type = "Magic",
max_stack = 3
},
death_and_decay = { -- Buff.
id = 188290,
duration = 10,
tick_time = 1,
max_stack = 1
},
-- [444347] $@spelldesc444010
death_charge = {
id = 444347,
duration = 10,
max_stack = 1
},
-- Talent: The next $w2 healing received will be absorbed.
-- https://wowhead.com/beta/spell=48743
death_pact = {
id = 48743,
duration = 15,
max_stack = 1
},
-- Your movement speed is increased by $s1%, you cannot be slowed below $s2% of normal speed, and you are immune to forced movement effects and knockbacks.
-- https://wowhead.com/beta/spell=48265
deaths_advance = {
id = 48265,
duration = 10,
type = "Magic",
max_stack = 1
},
-- Talent: When Pillar of Frost expires, you will gain $s1% Strength for $<duration> sec.
-- https://wowhead.com/beta/spell=377192
enduring_strength = {
id = 377192,
duration = 20,
max_stack = 20
},
-- Talent: Strength increased by $w1%.
-- https://wowhead.com/beta/spell=377195
enduring_strength_buff = {
id = 377195,
duration = function() return 6 + 2 * buff.enduring_strength.stack end,
max_stack = 1
},
everfrost = {
id = 376974,
duration = 8,
max_stack = 10
},
-- Casting speed reduced by $w1%.
expelling_shield = {
id = 440739,
duration = 6.0,
max_stack = 1
},
-- Reduces damage dealt to $@auracaster by $m1%.
-- https://wowhead.com/beta/spell=327092
famine = {
id = 327092,
duration = 6,
max_stack = 3
},
-- Frostbane Your Frost Strike has become Frostbane. $s1 seconds remaining
-- https://www.wowhead.com/spell=1229310
frostbane = {
id = 1229310,
duration = 30
},
-- https://www.wowhead.com/spell=1233351
frostreaper = {
id = 1233351,
duration = 8
},
-- Suffering $w1 Frost damage every $t1 sec.
-- https://wowhead.com/beta/spell=55095
frost_fever = {
id = 55095,
duration = function() return 24 * ( talent.wither_away.enabled and 0.5 or 1 ) end,
tick_time = function() return 3 * ( talent.wither_away.enabled and 0.5 or 1 ) end,
max_stack = 1
},
-- Talent: Movement speed slowed by $s2%.
-- https://wowhead.com/beta/spell=279303
frostwyrms_fury = {
id = 279303,
duration = 10,
type = "Magic",
max_stack = 1
},
-- Frozen Dominion Grants $s1% Mastery. $s2 seconds remaining
-- https://www.wowhead.com/spell=377253
frozen_dominion = {
id = 377253,
duration = 15,
max_stack = 5
},
frozen_pulse = {
-- Pseudo aura for legacy talent.
name = "Frozen Pulse",
meta = {
up = function () return runes.current < 3 end,
down = function () return runes.current >= 3 end,
stack = function () return runes.current < 3 and 1 or 0 end,
duration = 15,
remains = function () return runes.time_to_3 end,
applied = function () return runes.current < 3 and query_time or 0 end,
expires = function () return runes.current < 3 and ( runes.time_to_3 + query_time ) or 0 end,
}
},
-- Dealing $w1 Frost damage every $t1 sec.
-- https://wowhead.com/beta/spell=274074
glacial_contagion = {
id = 274074,
duration = 14,
tick_time = 2,
type = "Magic",
max_stack = 1
},
-- Dealing $w1 Shadow damage every $t1 sec.
-- https://wowhead.com/beta/spell=275931
harrowing_decay = {
id = 275931,
duration = 4,
tick_time = 1,
type = "Magic",
max_stack = 1
},
-- Deals $s1 Fire damage.
-- https://wowhead.com/beta/spell=286979
helchains = {
id = 286979,
duration = 15,
tick_time = 1,
type = "Magic",
max_stack = 1
},
-- Rooted.
ice_prison = {
id = 454787,
duration = 4.0,
max_stack = 1
},
-- Talent: Damage taken reduced by $w3%. Immune to Stun effects.
-- https://wowhead.com/beta/spell=48792
icebound_fortitude = {
id = 48792,
duration = 8,
tick_time = 1.0,
max_stack = 1
},
-- Icy Onslaught Damage of Frost Strike and Glacial Advance increased by $s1% and their cost by $s2 Runic Power. $s3 seconds remaining
-- https://www.wowhead.com/spell=1230273
icy_onslaught = {
id = 1230273,
duration = 30,
max_stack = 5
},
icy_talons = {
id = 194879,
duration = 10,
max_stack = function() return ( talent.smothering_offense.enabled and 5 or 3 ) + ( talent.dark_talons.enabled and 3 or 0 ) end
},
inexorable_assault = {
id = 253595,
duration = 3600,
max_stack = 5
},
insidious_chill = {
id = 391568,
duration = 30,
max_stack = 4
},
-- Talent: Guaranteed critical strike on your next Obliterate$?s207230[ or Frostscythe][].
-- https://wowhead.com/beta/spell=51124
killing_machine = {
id = 51124,
duration = 10,
max_stack = 2
},
-- Killing Streak Haste increased by $s1%. $s2 seconds remaining
-- https://www.wowhead.com/spell=1230916
killing_streak = {
id = 1230916,
duration = 8,
max_stack = 10
},
-- Absorbing up to $w1 magic damage.; Duration of harmful magic effects reduced by $s2%.
lesser_antimagic_shell = {
id = 454863,
duration = function() return 5.0 * ( talent.antimagic_barrier.enabled and 1.4 or 1 ) end,
max_stack = 1
},
-- Casting speed reduced by $w1%.
-- https://wowhead.com/beta/spell=326868
lethargy = {
id = 326868,
duration = 6,
max_stack = 1
},
-- Leech increased by $s1%$?a389682[, damage taken reduced by $s8%][] and immune to Charm, Fear and Sleep. Undead.
-- https://wowhead.com/beta/spell=49039
lichborne = {
id = 49039,
duration = 10,
tick_time = 1,
max_stack = 1
},
march_of_darkness = {
id = 391547,
duration = 3,
max_stack = 1
},
-- Talent: $@spellaura281238
-- https://wowhead.com/beta/spell=207256
obliteration = {
id = 207256,
duration = 3600,
max_stack = 1
},
-- Grants the ability to walk across water.
-- https://wowhead.com/beta/spell=3714
path_of_frost = {
id = 3714,
duration = 600,
tick_time = 0.5,
max_stack = 1
},
-- Suffering $o1 shadow damage over $d and slowed by $m2%.
-- https://wowhead.com/beta/spell=327093
pestilence = {
id = 327093,
duration = 6,
tick_time = 1,
type = "Magic",
max_stack = 3
},
-- Talent: Strength increased by $w1%.
-- https://wowhead.com/beta/spell=51271
pillar_of_frost = {
id = 51271,
duration = 12,
type = "Magic",
max_stack = 1
},
-- Frost damage taken from the Death Knight's abilities increased by $s1%.
-- https://wowhead.com/beta/spell=51714
razorice = {
id = 51714,
duration = 20,
tick_time = 1,
type = "Magic",
max_stack = 5
},
-- You are a prey for the Deathbringer... This effect will explode for $436304s1 Shadowfrost damage for each stack.
reapers_mark = {
id = 434765,
duration = 12.0,
tick_time = 1.0,
max_stack = function() if set_bonus.tww3 >= 4 then return 55 else
return 40 end end,
copy = "reapers_mark_debuff",
onRemove = function()
if set_bonus.tww3 >= 4 then
applyBuff( "empowered_soul" )
end
end,
},
-- Talent: Dealing $196771s1 Frost damage to enemies within $196771A1 yards each second.
-- https://wowhead.com/beta/spell=196770
remorseless_winter = {
id = function() if talent.frozen_dominion.enabled then return 1233152 else return 196770 end end,
duration = function() return 8 + ( 4 * talent.frozen_dominion.rank ) + ( 2 * talent.mawsworn_menace.rank ) end,
tick_time = 1,
max_stack = 1
},
-- Talent: Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=211793
remorseless_winter_snare = {
id = 211793,
duration = 3,
type = "Magic",
max_stack = 1
},
-- Talent: Your next Howling Blast will consume no Runes, generate no Runic Power, and deals $s2% additional damage.
-- https://wowhead.com/beta/spell=59052
rime = {
id = 59052,
duration = 15,
type = "Magic",
max_stack = 1
},
-- Magical damage taken reduced by $w1%.
rune_carved_plates = {
id = 440290,
duration = 5.0,
max_stack = 1
},
-- Talent: Strength increased by $w1%
-- https://wowhead.com/beta/spell=374585
rune_mastery = {
id = 374585,
duration = 8,
max_stack = 1
},
-- Runic Power generation increased by $s1%.
-- https://wowhead.com/beta/spell=326918
rune_of_hysteria = {
id = 326918,
duration = 8,
max_stack = 1
},
-- Healing for $s1% of your maximum health every $t sec.
-- https://wowhead.com/beta/spell=326808
rune_of_sanguination = {
id = 326808,
duration = 8,
max_stack = 1
},
-- Absorbs $w1 magic damage. When an enemy damages the shield, their cast speed is reduced by $w2% for $326868d.
-- https://wowhead.com/beta/spell=326867
rune_of_spellwarding = {
id = 326867,
duration = 8,
max_stack = 1
},
-- Haste and Movement Speed increased by $s1%.
-- https://wowhead.com/beta/spell=326984
rune_of_unending_thirst = {
id = 326984,
duration = 10,
max_stack = 1
},
-- Talent: Afflicted by Soul Reaper, if the target is below $s3% health this effect will explode dealing an additional $343295s1 Shadowfrost damage.
-- https://wowhead.com/beta/spell=448229
soul_reaper = {
id = 448229,
duration = 5,
tick_time = 5,
max_stack = 1
},
-- Silenced.
strangulate = {
id = 47476,
duration = 5.0,
max_stack = 1
},
-- Damage dealt to $@auracaster reduced by $w1%.
subduing_grasp = {
id = 454824,
duration = 6.0,
max_stack = 1
},
-- Damage taken from area of effect attacks reduced by an additional $w1%.
suppression = {
id = 454886,
duration = 6.0,
max_stack = 1
},
-- Deals $s1 Fire damage.
-- https://wowhead.com/beta/spell=319245
unholy_pact = {
id = 319245,
duration = 15,
tick_time = 1,
type = "Magic",
max_stack = 1
},
-- Talent: Strength increased by 0%
unleashed_frenzy = {
id = 376907,
duration = 10, -- 20230206 Hotfix
max_stack = 3
},
-- The touch of the spirit realm lingers....
-- https://wowhead.com/beta/spell=97821
voidtouched = {
id = 97821,
duration = 300,
max_stack = 1
},
-- Increases damage taken from $@auracaster by $m1%.
-- https://wowhead.com/beta/spell=327096
war = {
id = 327096,
duration = 6,
type = "Magic",
max_stack = 3
},
-- Talent: Movement speed increased by $w1%. Cannot be slowed below $s2% of normal movement speed. Cannot attack.
-- https://wowhead.com/beta/spell=212552
wraith_walk = {
id = 212552,
duration = 4,
max_stack = 1
},
-- PvP Talents
-- Your next spell with a mana cost will be copied by the Death Knight's runeblade.
dark_simulacrum = {
id = 77606,
duration = 12,
max_stack = 1
},
-- Your runeblade contains trapped magical energies, ready to be unleashed.
dark_simulacrum_buff = {
id = 77616,
duration = 12,
max_stack = 1
},
dead_of_winter = {
id = 289959,
duration = 4,
max_stack = 5
},
deathchill = {
id = 204085,
duration = 4,
max_stack = 1
},
delirium = {
id = 233396,
duration = 15,
max_stack = 1
},
shroud_of_winter = {
id = 199719,
duration = 3600,
max_stack = 1
},
-- Legendary
absolute_zero = {
id = 334693,
duration = 3,
max_stack = 1
},
-- Azerite Powers
cold_hearted = {
id = 288426,
duration = 8,
max_stack = 1
},
frostwhelps_indignation = {
id = 287338,
duration = 6,
max_stack = 1
},
} )
spec:RegisterTotem( "ghoul", 1100170 )
spec:RegisterGear({
-- The War Within
tww3 = {
items = { 237631, 237629, 237627, 237628, 237626 },
auras = {
-- Deathbringer
-- Crit Buff
empowered_soul = {
id = 1236996,
duration = 8,
max_stack = 1
},
}
},
tww2 = {
items = { 229253, 229251, 229256, 229254, 229252 },
auras = {
-- https://www.wowhead.com/spell=1216813
winning_streak = {
id = 1217897,
duration = 3600,
max_stack = 6
},
-- https://www.wowhead.com/spell=1222698
murderous_frenzy = {
id = 1222698,
duration = 6,
max_stack = 1
}
}
},
-- Dragonflight
tier31 = {
items = { 207198, 207199, 207200, 207201, 207203 },
auras = {
chilling_rage = {
id = 424165,
duration = 12,
max_stack = 5
}
}
},
tier30 = {
items = { 202464, 202462, 202461, 202460, 202459, 217223, 217225, 217221, 217222, 217224 },
auras = {
wrath_of_the_frostwyrm = {
id = 408368,
duration = 30,
max_stack = 10
},
lingering_chill = {
id = 410879,
duration = 12,
max_stack = 1
}
}
},
tier29 = {
items = { 200405, 200407, 200408, 200409, 200410 }
}
} )
local spendHook = function( amt, resource )
-- Runic Power
if amt > 0 and resource == "runic_power" then
if talent.icy_talons.enabled then addStack( "icy_talons", nil, 1 ) end
if talent.unleashed_frenzy.enabled then addStack( "unleashed_frenzy") end
end
-- Runes
if resource == "rune" and amt > 0 then
if active_dot.shackle_the_unworthy > 0 then
reduceCooldown( "shackle_the_unworthy", 4 * amt )
end
if talent.rune_carved_plates.enabled then
addStack( "rune_carved_plates", nil, amt )
end
end
end
spec:RegisterHook( "spend", spendHook )
spec:RegisterHook( "TALENTS_UPDATED", function()
class.abilityList.any_dnd = "|T136144:0|t |cff00ccff[Any " .. class.abilities.death_and_decay.name .. "]|r"
class.abilities.any_dnd = class.abilities.death_and_decay_actual
rawset( cooldown, "any_dnd", nil )
rawset( cooldown, "death_and_decay", nil )
rawset( cooldown, "any_dnd", cooldown.death_and_decay )
end )
local ERWDiscount = 0
spec:RegisterStateExpr( "erw_discount", function()
return ERWDiscount
end )
spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName )
if spellID == 47568 and ( subtype == "SPELL_CAST_SUCCESS" ) and state.talent.obliteration.enabled and state.buff.pillar_of_frost.up then
ERWDiscount = 1
elseif spellID == 49020 or spellID == 207230 then
ERWDiscount = 0
end
end )
spec:RegisterHook( "reset_precast", function ()
local control_expires = action.control_undead.lastCast + 300
if talent.control_undead.enabled and control_expires > now and pet.up then
summonPet( "controlled_undead", control_expires - now )
end
-- Reset CDs on any Rune abilities that do not have an actual cooldown.
for action in pairs( class.abilityList ) do
local data = class.abilities[ action ]
if data and data.cooldown == 0 and data.spendType == "runes" then
setCooldown( action, 0 )
end
end
end )
local KillingMachineConsumer = setfenv( function ()
local stacksConsumed = 0
-- Killing Streak
if talent.killing_streak.enabled then
stacksConsumed = buff.killing_machine.stack
removeBuff( "killing_machine" )
addStack( "killing_streak", stacksConsumed )
else
stacksConsumed = 1
removeStack( "killing_machine" )
end
-- Bonegrinder
if talent.bonegrinder.enabled then
local current = buff.bonegrinder_crit.stack or 0
local totalStacks = current + stacksConsumed
if totalStacks >= 5 then
removeBuff( "bonegrinder_crit" )
applyBuff( "bonegrinder_frost" )
-- Handle overflow: if we added 2 but only needed 1 to cap
local overflow = totalStacks - 5
if overflow > 0 then applyBuff( "bonegrinder_crit", nil, overflow ) end
else
addStack( "bonegrinder_crit", stacksConsumed )
end
end
-- Breath of Sindragosa
if buff.breath_of_sindragosa.up then buff.breath_of_sindragosa.expires = buff.breath_of_sindragosa.expires + 0.8 * stacksConsumed end
end, state )
-- Abilities
spec:RegisterAbilities( {
-- Talent: Surrounds you in an Anti-Magic Shell for $d, absorbing up to $<shield> magic damage and preventing application of harmful magical effects.$?s207188[][ Damage absorbed generates Runic Power.]
antimagic_shell = {
id = 48707,
cast = 0,
cooldown = function() return 60 - ( talent.antimagic_barrier.enabled and 15 or 0 ) - ( talent.unyielding_will.enabled and -20 or 0 ) - ( pvptalent.spellwarden.enabled and 10 or 0 ) end,
gcd = "off",
startsCombat = false,
toggle = function()
if settings.ams_usage == "defensives" or settings.ams_usage == "both" then return "defensives" end
end,
usable = function()
if settings.ams_usage == "damage" or settings.ams_usage == "both" then return incoming_magic_3s > 0, "settings require magic damage taken in the past 3 seconds" end
end,
handler = function ()
applyBuff( "antimagic_shell" )
if talent.unyielding_will.enabled then removeBuff( "dispellable_magic" ) end
end,
},
-- Talent: Places an Anti-Magic Zone that reduces spell damage taken by party or raid members by $145629m1%. The Anti-Magic Zone lasts for $d or until it absorbs $?a374383[${$<absorb>*1.1}][$<absorb>] damage.
antimagic_zone = {
id = 51052,
cast = 0,
cooldown = function() return 240 - ( talent.assimilation.enabled and 60 or 0 ) end,
gcd = "spell",
talent = "antimagic_zone",
startsCombat = false,
toggle = "defensives",
handler = function ()
applyBuff( "antimagic_zone" )
end,
},
-- Talent: Lifts the enemy target off the ground, crushing their throat with dark energy and stunning them for $d.
asphyxiate = {
id = 221562,
cast = 0,
cooldown = 45,
gcd = "spell",
talent = "asphyxiate",
startsCombat = false,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
applyDebuff( "target", "asphyxiate" )
interrupt()
end,
},
-- Talent: Targets in a cone in front of you are blinded, causing them to wander disoriented for $d. Damage may cancel the effect. When Blinding Sleet ends, enemies are slowed by $317898s1% for $317898d.
blinding_sleet = {
id = 207167,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "blinding_sleet",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyDebuff( "target", "blinding_sleet" )
active_dot.blinding_sleet = max( active_dot.blinding_sleet, active_enemies )
end,
},
-- Talent: Continuously deal ${$155166s2*$<CAP>/$AP} Frost damage every $t1 sec to enemies in a cone in front of you, until your Runic Power is exhausted. Deals reduced damage to secondary targets. |cFFFFFFFFGenerates $303753s1 $lRune:Runes; at the start and end.|r
breath_of_sindragosa = {
id = 1249658,
cast = 0,
cooldown = 150,
gcd = "off",
spend = 60,
spendType = "runic_power",
talent = "breath_of_sindragosa",
startsCombat = true,
texture = 1029007,
toggle = "cooldowns",
handler = function ()
gainCharges( "empower_rune_weapon", 1 )
applyBuff( "breath_of_sindragosa", 8 )
end,
},
-- Talent: Shackles the target $?a373930[and $373930s1 nearby enemy ][]with frozen chains, reducing movement speed by $s1% for $d.
chains_of_ice = {
id = 45524,
cast = 0,
cooldown = function() return 0 + ( talent.ice_prison.enabled and 12 or 0 ) end,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
handler = function ()
applyDebuff( "target", "chains_of_ice" )
if talent.ice_prison.enabled then applyDebuff( "target", "ice_prison" ) end
removeBuff( "cold_heart" )
end,
},
-- Talent: Dominates the target undead creature up to level $s1, forcing it to do your bidding for $d.
control_undead = {
id = 111673,
cast = 1.5,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
talent = "control_undead",
startsCombat = false,
usable = function () return target.is_undead and target.level <= level + 1, "requires undead target up to 1 level above player" end,
handler = function ()
summonPet( "controlled_undead", 300 )
end,
},
-- Command the target to attack you.
dark_command = {
id = 56222,
cast = 0,
cooldown = 8,
gcd = "off",
startsCombat = true,
handler = function ()
applyDebuff( "target", "dark_command" )
end,
},
dark_simulacrum = {
id = 77606,
cast = 0,
cooldown = 20,
gcd = "spell",
startsCombat = true,
texture = 135888,
pvptalent = "dark_simulacrum",
usable = function ()
if not target.is_player then return false, "target is not a player" end
return true
end,
handler = function ()
applyDebuff( "target", "dark_simulacrum" )
end,
},
-- Corrupts the targeted ground, causing ${$52212m1*11} Shadow damage over $d to...
death_and_decay = {
id = 43265,
noOverride = 324128,
cast = 0,
charges = function () if talent.deaths_echo.enabled then return 2 end end,
cooldown = 30,
recharge = function () if talent.deaths_echo.enabled then return 30 end end,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
notalent = "defile",
usable = function () return ( settings.dnd_while_moving or not moving ), "cannot cast while moving" end,
handler = function ()
applyBuff( "death_and_decay" )
applyDebuff( "target", "death_and_decay" )
if talent.grip_of_the_dead.enabled then applyDebuff( "target", "grip_of_the_dead" ) end
end,
bind = "any_dnd",
copy = { "death_and_decay_actual", "any_dnd" }
},
-- Fires a blast of unholy energy at the target$?a377580[ and $377580s2 additional nearby target][], causing $47632s1 Shadow damage to an enemy or healing an Undead ally for $47633s1 health.$?s390268[ Increases the duration of Dark Transformation by $390268s1 sec.][]
death_coil = {
id = 47541,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 35,
spendType = "runic_power",
startsCombat = true,
handler = function ()
if buff.dark_transformation.up then buff.dark_transformation.up.expires = buff.dark_transformation.expires + 1 end
if talent.unleashed_frenzy.enabled then addStack( "unleashed_frenzy", nil, 3 ) end
end,
},
-- Opens a gate which you can use to return to Ebon Hold. Using a Death Gate while in Ebon Hold will return you back to near your departure point.
death_gate = {
id = 50977,
cast = 4,
cooldown = 60,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
handler = function ()
end,
},
-- Harnesses the energy that surrounds and binds all matter, drawing the target toward you$?a389679[ and slowing their movement speed by $389681s1% for $389681d][]$?s137008[ and forcing the enemy to attack you][].
death_grip = {
id = 49576,
cast = 0,
charges = function() if talent.deaths_echo.enabled then return 2 end end,
cooldown = 15,
recharge = function() if talent.deaths_echo.enabled then return 15 end end,
gcd = "off",
startsCombat = false,
handler = function ()
applyDebuff( "target", "death_grip" )
setDistance( 5 )
if conduit.unending_grip.enabled then applyDebuff( "target", "unending_grip" ) end
end,
},
-- Talent: Create a death pact that heals you for $s1% of your maximum health, but absorbs incoming healing equal to $s3% of your max health for $d.
death_pact = {
id = 48743,
cast = 0,
cooldown = 120,
gcd = "off",
talent = "death_pact",
startsCombat = false,
toggle = "defensives",
handler = function ()
gain( health.max * 0.5, "health" )
applyDebuff( "player", "death_pact" )
end,
},
-- Talent: Focuses dark power into a strike$?s137006[ with both weapons, that deals a total of ${$s1+$66188s1}][ that deals $s1] Physical damage and heals you for ${$s2}.2% of all damage taken in the last $s4 sec, minimum ${$s3}.1% of maximum health.
death_strike = {
id = 49998,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.dark_succor.up then return 0 end
return ( talent.improved_death_strike.enabled and 40 or 50 ) - ( buff.blood_draw.up and 10 or 0 )
end,
spendType = "runic_power",
talent = "death_strike",
startsCombat = true,
handler = function ()
removeBuff( "dark_succor" )
gain( health.max * 0.10, "health" )
if talent.unleashed_frenzy.enabled then addStack( "unleashed_frenzy", nil, 3 ) end
end,
},
-- For $d, your movement speed is increased by $s1%, you cannot be slowed below $s2% of normal speed, and you are immune to forced movement effects and knockbacks. |cFFFFFFFFPassive:|r You cannot be slowed below $124285s1% of normal speed.
deaths_advance = {
id = 48265,
cast = 0,
charges = function() if talent.deaths_echo.enabled then return 2 end end,
cooldown = 45,
recharge = function() if talent.deaths_echo.enabled then return 45 end end,
gcd = "off",
startsCombat = false,
handler = function ()
applyBuff( "deaths_advance" )
if conduit.fleeting_wind.enabled then applyBuff( "fleeting_wind" ) end
end,
},
-- Talent: Empower your rune weapon, gaining $s3% Haste and generating $s1 $LRune:Runes; and ${$m2/10} Runic Power instantly and every $t1 sec for $d. $?s137006[ If you already know $@spellname47568, instead gain $392714s1 additional $Lcharge:charges; of $@spellname47568.][]
empower_rune_weapon = {
id = 47568,
cast = 0,
cooldown = 30,
charges = 2,
recharge = 30,
gcd = "off",
school = "shadowfrost",
talent = "empower_rune_weapon",
startsCombat = false,
handler = function ()
gain( 40, "runic_power" )
addStack( "killing_machine" )
end,
},
-- Talent: Chill your $?$owb==0[weapon with icy power and quickly strike the enemy, dealing $<2hDamage> Frost damage.][weapons with icy power and quickly strike the enemy with both, dealing a total of $<dualWieldDamage> Frost damage.]
frost_strike = {
id = function() return buff.frostbane.up and 1228436 or 49143 end,
texture = function() return buff.frostbane.up and 1273742 or 237520 end,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 35,
spendType = "runic_power",
school = function() if talent.dark_talons.enabled and buff.icy_talons.up then return "shadowfrost" end return "frost" end,
talent = "frost_strike",
startsCombat = true,
cycle = function ()
if debuff.mark_of_fyralath.up then return "mark_of_fyralath" end
if death_knight.runeforge.razorice and debuff.razorice.stack == 5 then return "razorice" end
end,
handler = function ()
if talent.obliteration.enabled and buff.pillar_of_frost.up then addStack( "killing_machine" ) end
if talent.shattering_blade.enabled and debuff.razorice.stack == 5 then removeDebuff( "target", "razorice" ) end
-- if debuff.razorice.stack > 5 then applyDebuff( "target", "razorice", nil, debuff.razorice.stack - 5 ) end
if talent.icy_onslaught.enabled then addStack( "icy_onslaught" ) end
removeBuff( "frostbane" )
if death_knight.runeforge.razorice then applyDebuff( "target", "razorice", nil, min( 5, buff.razorice.stack + 1 ) ) end
if talent.frostreaper.enabled then removeBuff( "frost_reaper" ) end
-- Legacy / PvP
if pvptalent.bitter_chill.enabled and debuff.chains_of_ice.up then
applyDebuff( "target", "chains_of_ice" )
end
if conduit.eradicating_blow.enabled then removeBuff( "eradicating_blow" ) end
end,
auras = {
unleashed_frenzy = {
id = 338501,
duration = 6,
max_stack = 5,
}
}
},
-- A sweeping attack that strikes all enemies in front of you for $s2 Frost damage. This attack always critically strikes and critical strikes with Frostscythe deal $s3 times normal damage. Deals reduced damage beyond $s5 targets. ; Consuming Killing Machine reduces the cooldown of Frostscythe by ${$s1/1000}.1 sec.
frostscythe = {
id = 207230,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function()
if talent.obliteration.enabled and erw_discount > 0 then return 0 end
if talent.exterminate.enabled and buff.exterminate.up then return 1 end
return 2
end,
spendType = "runes",
talent = "frostscythe",
startsCombat = true,
range = 7,
handler = function ()
removeStack( "inexorable_assault", 3 )
if talent.obliteration.enabled then erw_discount = 0 end
if buff.killing_machine.up then KillingMachineConsumer( ) end
if buff.exterminate.up then
removeStack( "exterminate" )
if talent.wither_away.enabled then
applyDebuff( "target", "frost_fever" )
active_dot.frost_fever = max ( active_dot.frost_fever, active_enemies ) -- it applies in AoE around your target
end
addStack( "killing_machine" )
end
end,
},
-- Talent: Summons a frostwyrm who breathes on all enemies within $s1 yd in front of you, dealing $279303s1 Frost damage and slowing movement speed by $279303s2% for $279303d.
frostwyrms_fury = {
id = 279302,
cast = 0,
cooldown = 90,
gcd = "spell",
talent = "frostwyrms_fury",
startsCombat = true,
toggle = "cooldowns",
handler = function ()
-- if talent.apocalypse_now.enabled then do stuff end
applyDebuff( "target", "frostwyrms_fury" )
if set_bonus.tier30_4pc > 0 then applyDebuff( "target", "lingering_chill" ) end
if legendary.absolute_zero.enabled then applyDebuff( "target", "absolute_zero" ) end
end,
},
-- Talent: Summon glacial spikes from the ground that advance forward, each dealing ${$195975s1*$<CAP>/$AP} Frost damage and applying Razorice to enemies near their eruption point.
glacial_advance = {
id = 194913,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 35,
spendType = "runic_power",
startsCombat = true,
handler = function ()
applyDebuff( "target", "razorice", nil, min( 5, buff.razorice.stack + 1 ) )
if active_enemies > 1 then active_dot.razorice = active_enemies end
if talent.obliteration.enabled and buff.pillar_of_frost.up then addStack( "killing_machine" ) end
if talent.unleashed_frenzy.enabled then addStack( "unleashed_frenzy", nil, 3 ) end
if talent.icy_onslaught.enabled then addStack( "icy_onslaught" ) end
end,
},
-- Talent: Blast the target with a frigid wind, dealing ${$s1*$<CAP>/$AP} $?s204088[Frost damage and applying Frost Fever to the target.][Frost damage to that foe, and reduced damage to all other enemies within $237680A1 yards, infecting all targets with Frost Fever.] |Tinterface\icons\spell_deathknight_frostfever.blp:24|t |cFFFFFFFFFrost Fever|r $@spelldesc55095
howling_blast = {
id = 49184,
cast = 0,
cooldown = 0,
gcd = "spell",
school = function() return talent.bind_in_darkness.enabled and buff.rime.up and "shadowfrost" or "frost" end,
spend = function () return buff.rime.up and 0 or 1 end,
spendType = "runes",
talent = "howling_blast",
startsCombat = true,
handler = function ()
applyDebuff( "target", "frost_fever" )
active_dot.frost_fever = max( active_dot.frost_fever, active_enemies )
if talent.bind_in_darkness.enabled and debuff.reapers_mark.up then applyDebuff( "target", "reapers_mark", nil, debuff.reapers_mark.stack + 2 ) end
if talent.obliteration.enabled and buff.pillar_of_frost.up then addStack( "killing_machine" ) end
if buff.rime.up then
removeBuff( "rime" )
if talent.rage_of_the_frozen_champion.enabled then gain( 8, "runic_power") end
if talent.avalanche.enabled then applyDebuff( "target", "razorice", nil, min( 5, buff.razorice.stack + 1 ) ) end
if legendary.rage_of_the_frozen_champion.enabled then gain( 8, "runic_power" ) end
if set_bonus.tier30_2pc > 0 then addStack( "wrath_of_the_frostwyrm" ) end
if talent.frostbound_will.enabled then reduceCooldown( "empower_rune_weapon", 6 ) end
if buff.breath_of_sindragosa.up then buff.breath_of_sindragosa.expires = buff.breath_of_sindragosa.expires + 0.8 end
end
if pvptalent.delirium.enabled then applyDebuff( "target", "delirium" ) end
end,
},
-- Talent: Your blood freezes, granting immunity to Stun effects and reducing all damage you take by $s3% for $d.
icebound_fortitude = {
id = 48792,
cast = 0,
cooldown = function () return 120 - ( azerite.cold_hearted.enabled and 15 or 0 ) + ( conduit.chilled_resilience.mod * 0.001 ) end,
gcd = "off",
talent = "icebound_fortitude",
startsCombat = false,
toggle = "defensives",
handler = function ()
applyBuff( "icebound_fortitude" )
end,
},
-- Draw upon unholy energy to become Undead for $d, increasing Leech by $s1%$?a389682[, reducing damage taken by $s8%][], and making you immune to Charm, Fear, and Sleep.
lichborne = {
id = 49039,
cast = 0,
cooldown = function() return 120 - ( talent.deaths_messenger.enabled and 30 or 0 ) end,
gcd = "off",
startsCombat = false,
toggle = "defensives",
handler = function ()
applyBuff( "lichborne" )
if conduit.hardened_bones.enabled then applyBuff( "hardened_bones" ) end
end,
},
-- Talent: Smash the target's mind with cold, interrupting spellcasting and preventing any spell in that school from being cast for $d.
mind_freeze = {
id = 47528,
cast = 0,
cooldown = 15,
gcd = "off",
talent = "mind_freeze",
startsCombat = true,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
if conduit.spirit_drain.enabled then gain( conduit.spirit_drain.mod * 0.1, "runic_power" ) end
interrupt()
end,
},
-- Talent: A brutal attack $?$owb==0[that deals $<2hDamage> Physical damage.][with both weapons that deals a total of $<dualWieldDamage> Physical damage.]
obliterate = {
id = 49020,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function()
if talent.obliteration.enabled and erw_discount > 0 then return 0 end
if talent.exterminate.enabled and buff.exterminate.up then return 1 end
return 2
end,
spendType = "runes",
talent = "obliterate",
startsCombat = true,
school = function() if buff.killing_machine.up then return "frost" end return "physical" end,
cycle = function ()
if debuff.mark_of_fyralath.up then return "mark_of_fyralath" end
if death_knight.runeforge.razorice and debuff.razorice.stack == 5 then return "razorice" end
end,
handler = function ()
if talent.inexorable_assault.enabled then removeStack( "inexorable_assault", 3 ) end
if talent.obliteration.enabled then erw_discount = 0 end
if buff.exterminate.up then
removeStack( "exterminate" )
if talent.wither_away.enabled then
applyDebuff( "target", "frost_fever" )
active_dot.frost_fever = max ( active_dot.frost_fever, active_enemies ) -- it applies in AoE around your target
end
addStack( "killing_machine" )
end
if buff.killing_machine.up then KillingMachineConsumer( ) end
-- Koltira's Favor is not predictable.
if conduit.eradicating_blow.enabled then addStack( "eradicating_blow", nil, 1 ) end
end,
auras = {
-- Conduit
eradicating_blow = {
id = 337936,
duration = 10,
max_stack = 2
}
}
},
-- Activates a freezing aura for $d that creates ice beneath your feet, allowing party or raid members within $a1 yards to walk on water. Usable while mounted, but being attacked or damaged will cancel the effect.
path_of_frost = {
id = 3714,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
handler = function ()
applyBuff( "path_of_frost" )
end,
},
-- The power of frost increases your Strength by $s1% for $d.
pillar_of_frost = {
id = 51271,
cast = 0,
cooldown = 60,
gcd = "off",
talent = "pillar_of_frost",
startsCombat = false,
handler = function ()
applyBuff( "pillar_of_frost" )
if talent.frozen_dominion.enabled then spec.abilities.remorseless_winter.handler() end
-- Legacy
if set_bonus.tier30_2pc > 0 then
applyDebuff( "target", "frostwyrms_fury" )
applyDebuff( "target", "lingering_chill" )
end
if azerite.frostwhelps_indignation.enabled then applyBuff( "frostwhelps_indignation" ) end
virtual_rp_spent_since_pof = 0
end,
},
--[[ Pours dark energy into a dead target, reuniting spirit and body to allow the target to reenter battle with $s2% health and at least $s1% mana.
raise_ally = {
id = 61999,
cast = 0,
cooldown = 600,
gcd = "spell",
spend = 30,
spendType = "runic_power",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
-- trigger voidtouched [97821]
end,
}, ]]
-- Talent: Raises a $?s58640[geist][ghoul] to fight by your side. You can have a maximum of one $?s58640[geist][ghoul] at a time. Lasts $46585d.
raise_dead = {
id = 46585,
cast = 0,
cooldown = function() return 120 - ( talent.deaths_messenger.enabled and 30 or 0 ) end,
gcd = "off",
talent = "raise_dead",
startsCombat = true,
usable = function () return not pet.alive, "cannot have an active pet" end,
handler = function ()
summonPet( "ghoul" )
end,
},
-- Viciously slice into the soul of your enemy, dealing $?a137008[$s1][$s4] Shadowfrost damage and applying Reaper's Mark.; Each time you deal Shadow or Frost damage,
reapers_mark = {
id = 439843,
cast = 0.0,
cooldown = function() return 60.0 - ( 15 * talent.reapers_onslaught.rank ) end,
gcd = "spell",
spend = 2,
spendType = 'runes',
talent = "reapers_mark",
startsCombat = true,
handler = function()
applyDebuff( "target", "reapers_mark" )
if talent.grim_reaper.enabled then
addStack( "killing_machine" )
end
if talent.reaper_of_souls.enabled then
setCooldown( "soul_reaper", 0 )
applyBuff( "reaper_of_souls" )
end
end,
},
-- Talent: Drain the warmth of life from all nearby enemies within $196771A1 yards, dealing ${9*$196771s1*$<CAP>/$AP} Frost damage over $d and reducing their movement speed by $211793s1%.
remorseless_winter = {
id = 196770,
cast = 0,
cooldown = function () return pvptalent.dead_of_winter.enabled and 45 or 20 end,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
notalent = "frozen_dominion",
handler = function ()
applyBuff( "remorseless_winter" )
removeBuff( "cryogenic_chamber" )
if active_enemies > 2 and legendary.biting_cold.enabled then
applyBuff( "rime" )
end
if conduit.biting_cold.enabled then applyDebuff( "target", "biting_cold" ) end
-- if pvptalent.deathchill.enabled then applyDebuff( "target", "deathchill" ) end
end,
auras = {
-- Conduit
biting_cold = {
id = 337989,
duration = 8,
max_stack = 10
}
}
},
-- Talent: Sacrifice your ghoul to deal $327611s1 Shadow damage to all nearby enemies and heal for $s1% of your maximum health. Deals reduced damage beyond $327611s2 targets.
sacrificial_pact = {
id = 327574,
cast = 0,
cooldown = 120,
gcd = "spell",
spend = 20,
spendType = "runic_power",
talent = "sacrificial_pact",
startsCombat = false,
toggle = "defensives",
usable = function () return pet.alive, "requires an undead pet" end,
handler = function ()
dismissPet( "ghoul" )
gain( 0.25 * health.max, "health" )
if talent.unleashed_frenzy.enabled then addStack( "unleashed_frenzy", nil, 3 ) end
end,
},
-- Talent: Strike an enemy for $s1 Shadowfrost damage and afflict the enemy with Soul Reaper. After $d, if the target is below $s3% health this effect will explode dealing an additional $343295s1 Shadowfrost damage to the target. If the enemy that yields experience or honor dies while afflicted by Soul Reaper, gain Runic Corruption.
soul_reaper = {
id = 343294,
cast = 0,
cooldown = 6,
gcd = "spell",
spend = function() if talent.reaper_of_souls.enabled and buff.reaper_of_souls.up then return 0 end return 1 end,
spendType = "runes",
talent = "soul_reaper",
startsCombat = true,
handler = function ()
applyDebuff( "target", "soul_reaper" )
if talent.obliteration.enabled and buff.pillar_of_frost.up then addStack( "killing_machine" ) end
end,
},
strangulate = {
id = 47476,
cast = 0,
cooldown = 45,
gcd = "off",
spend = 0,
spendType = "runes",
pvptalent = "strangulate",
startsCombat = false,
texture = 136214,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
interrupt()
applyDebuff( "target", "strangulate" )
end,
},
-- Talent: Embrace the power of the Shadowlands, removing all root effects and increasing your movement speed by $s1% for $d. Taking any action cancels the effect. While active, your movement speed cannot be reduced below $m2%.
wraith_walk = {
id = 212552,
cast = 4,
fixedCast = true,
channeled = true,
cooldown = 60,
gcd = "spell",
talent = "wraith_walk",
startsCombat = false,
start = function ()
applyBuff( "wraith_walk" )
end,
},
-- Stub.
any_dnd = {
name = function() return "|T136144:0|t |cff00ccff[Any " .. ( class.abilities.death_and_decay and class.abilities.death_and_decay.name or "Death and Decay" ) .. "]|r" end,
cast = 0,
cooldown = 0,
copy = "any_dnd_stub"
}
} )
spec:RegisterRanges( "frost_strike", "mind_freeze", "death_coil" )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
cycle = false,
nameplates = true,
nameplateRange = 10,
rangeFilter = false,
damage = true,
damageDots = false,
damageExpiration = 8,
potion = "tempered_potion",
package = "Frost DK",
} )
--[[ Estimation of whether or not random RP gains can happen, in an attempt to smooth out changing recommendations
spec:RegisterStateExpr( "breath_possible_gains", function ()
-- Initialize possible gains
local possible_gains = 0
-- Check for weapon swing before next GCD
if state.nextMH and state.nextMH > 0 and state.nextMH <= ( state.now + state.gcd.remains ) then
possible_gains = possible_gains + 5
end
-- Calculate next Frost Fever tick dynamically
if state.debuff.frost_fever.up then
local tick_time = state.debuff.frost_fever.tick_time or 3 -- Default tick time if unavailable
local last_tick = state.debuff.frost_fever.last_tick or state.debuff.frost_fever.applied
local next_tick = last_tick + tick_time
-- Check if Frost Fever will tick before the next GCD ends
if next_tick <= ( state.now + state.gcd.remains ) then
possible_gains = possible_gains + ( active_dot.frost_fever * 3 )
end
end
return possible_gains
end )--]]
spec:RegisterSetting( "dnd_while_moving", true, {
name = strformat( "Allow %s while moving", Hekili:GetSpellLinkWithTexture( spec.abilities.death_and_decay.id ) ),
desc = strformat( "If checked, then allow recommending %s while the player is moving otherwise only recommend it if the player is standing still.", Hekili:GetSpellLinkWithTexture( spec.abilities.death_and_decay.id ) ),
type = "toggle",
width = "full",
} )
spec:RegisterSetting( "ams_usage", "damage", {
name = strformat( "%s Requirements", Hekili:GetSpellLinkWithTexture( spec.abilities.antimagic_shell.id ) ),
desc = strformat( "The default priority uses |W%s|w to generate |W%s|w regardless of whether there is incoming magic damage. "
.. "You can specify additional conditions for |W%s|w usage here.\n\n"
.. "|cFFFFD100Damage|r:\nRequires incoming magic damage within the past 3 seconds.\n\n"
.. "|cFFFFD100Defensives|r:\nRequires the Defensives toggle to be active.\n\n"
.. "|cFFFFD100Defensives + Damage|r:\nRequires both of the above.\n\n"
.. "|cFFFFD100None|r:\nUse on cooldown if priority conditions are met.",
spec.abilities.antimagic_shell.name, _G.RUNIC_POWER, _G.RUNIC_POWER,
spec.abilities.antimagic_shell.name ),
type = "select",
width = "full",
values = {
["damage"] = "Damage",
["defensives"] = "Defensives",
["both"] = "Defensives + Damage",
["none"] = "None"
},
sorting = { "damage", "defensives", "both", "none" }
} )
spec:RegisterPack( "Frost DK", 20250415, [[Hekili:S3t)ZTTnY(3INBIIv(qwK2kPxhBntV(AN2(6DTtC7D)MLOLOKynfPEKuXrz8O)2F7cqqcqIfa0soj9(CYjtcUy3fl2VWcGB8U53U565bfH38p8h6pA4fEJg45p68lEZnxxSBt4nxVjy2DblHFKeSg(3VplnVy)0)N)x8n7ItdMJqipDB2m4TRkk2K)1ND2YOIvBVDWS01NLhTEBCqruAYSSGff4Fp7SBU(2TrXf)yYn3QR79h92BUoyBXQ0SBU(6O1Fla5O5Zd5npmF2nxJn)1dV41EJ(69t)X1BYsFF4(P)Ay2I0S1bjZc3)t7)jEJo)1(yJkIwhoPiDY8O2V76DjZ2p9EaRHFd9xDd8FT)B00GBUookViNr7rjlJbihKTmSaEW)GXtdtcUnoC(n)nGqMHu)nxVazDtYlYIUlKtgzrB4V6Agm2p93yaz)03LweWFd0MIWSOay4iiomPyqWKfHbaCsxmb46X5dk7P9t7TF68WB3UyXGSGpMMfnlCqEbm6TF6v7NoI9(syKVkOaHAYYj3ghmpubgmi0Qx2U5McyqQbPvJDSV6UO4yeORdMTkkrU793p9HhkHD4hGVzDucmSJGTI)KEBmcnuAa6QZj7Qtpc0zFo(aGkBBcW4VKHIWxEs1hdW92SWG7cZK(mIrtaFVGeFxeTCvXKSW1brj57NoUgjXb7bc5YnZkMC(igQO99OCB9hFsjZSjlhW4zf1yjo4bDDWMWmejhrIKVpa()Ghpid7oe051qzv69XLmX8ceoVPBYbB3iW5QUztAkRji7pNsg4TFA5PCrb4p9jzGFfjgrqCrZMSj9(WmwhCQuBY2W5YvcIN4GylhjfWCW8WfrZIk4IVdzs1gKq)RMh0WbEL5JTg19gEqu)jmYehXMSkiz(a)vCA3kvBGM8AQS1kkfMZqgz0Gs8ZJwDNf61actRxRZtp8O15aWAEAXaEVVi89GWsr0S7aqAA8Lw9qdTKAfcXjoJeY51sZOs0IvmljrjZZcwMMhup2IcavuDr2wq3dV9ZaoW807tyWv8hdapcsqqDFusb23BZy2j3p917N6nsrurTPm6JwTLRORjAFyDFhKnlib1WKLbW8g8)E9mGeMSkmiZOtcZwHA0WUpAwtVe(wac7N(dmqqRlegKwoB(G1bFqmwip4H8BkBhLQP5JEQZtf(futecBUJbJUxWHRZFY(PFvLj4JiMWaBhrepHAtJE3ulEundegrA720gGocYWrp2mpbDyG1H9pNs1caTJQVG1EV9tFj7hLyg7dUFx268jl2MTtb5QM)0SrGW(8DCoG0WX2KvPX7qTwHjllwPqgnFNwmSpLaTrh7CGlpNn58UeuKFakxdU7VmCWIGy47MmlBBoy5itXdjIXKkwcjlFmxLI0OJXHqsoxfBL4Zp3m)YOsEB8Rt6elZorEmyQYkkBrT0MGCGunHAwgdV4Wgd)R8MyN(HzjNBLxFHrjIcj)aWgyWAIK)cxpB3SQWuZXpXrV2pvByBC61GPNxWm30VHjSFrcX3p9Ba0edBVkC3hDiMvEM4Uw0EYoJ7sqp0kUo(yMqyMp5fSKnzE4SGDIXKkeFzWKnzrqqWf7QX8LXbZIcINem)9yMq0PerFoj(8qrAen1OiWggFWPeOUngtXcRx0LEeTubThNpjrWgWMqnjmjCDegOZvm3e6jhARYGr7P8Kr(2mwCTQySPqrptIoO6NeMKdH53muz96eunfBrhkDezmTK64lTI3MAcUAYX0PCGRUMyocNT1xgt17ZG4dfT0i801HuwkoxoJC0zjroqM(Af4hZe47tZsDl5Sk8ZMHprGChScO(IPMwZKIs81negudTwVcH2zDjCEP67ASHGbAX(SdzrQPDuBdbFPZrOSTAywQlKKEB8AXGUAR0A2R02l02YQMHCUX0VqNo3kauzTQMvGG1uQv(hEgtkRv7Cnfqb96BYcNLU(2aTzQjf(28WIOf1GqWmz)AcFHYaMEYDHft8MKVlzMsGm83mOWBWQG8jBZ5UEkKJlfdB6xvJqDCnBviaR7VQ4tQtC2Zme1sDRGzjdR0r3H(Uc0ABScwygnRqG(itoElmdoohyZdhmQ8b3CTNU4h64WLp9WL)N4Hl))CmCPfnDE4QPXGYHl9dwSpRX0N68e3sAxD4IXk(s6L9B9(O8bf4c4TkmlDB(KISGK81rO1i9Aw4rSQj8UoWf9nZfBk0RGXFj8YMCr)oYf9R5InnJ2rvhEteY)eA7nJy1tsK(ee3KaRyMZiDXw2r013m6AJpQbD9nIUnT(3r0vYfiT(X0ywHQlungSjKYRNeGsuN0AQB9773isac4BvB(zAHr977xLS)bJyP7300GxOg6un8YzfVs)wlCGk6ff)(y26OjlXYEwFgI6nCOyHc6Zc06uh8Uqhb65ebQrBjbb65eb6PHa9jjqvjCVkrzFD5RWrj55bRdwcEUEac06EVSmxlkdtNCdwGrsRzIp6GHeM(TGyiIHvajVz7h)iecXTPF4GTYToizBqS2eI0b0Z3n0ZMAV2ArLqpIqfmHELrScoBXZjqoeyZA1iwf(VfvGnaxYaX7LrOS7RnK1kiD7iceCMeWkD)lBd0DerTBhKL4Dgk0doscui6N6hXfDAvW6nrYRFJeDQRURuydjZNeLmzEq2DjH5564f54YjmBIuw91fNosbzHK0qBErXkO5Ra(pMT5fbBJlySaCyjFWTP5qBASChFZV(Z7N(plb6(P)c7XF9(P)q697NUE7Sv7N(omw39t)vEWUfP7NIrKdXTI5Cd(MzquPSKe(3y4X(PPlWsqu4uU24)DKYcrzMAQllA5suiVI2E7qhjNFphhK4vhPmq3MekalN0MhwWwdj4JVFviO)hWswPJcQVcqQngzmHjPBxUI)fGbG9t)U1L5c4DS8e8Vcd2KMOnNepckxcjLO9ZpqsFZtmHRZBkhiCw2650CzIFKO5lCKM5sVbj744fqcWC79tzn)EiMuuD6ozzzqsgKWzrRYLFlRIyoBtEnbhSF6pcVicGzsk8JG9txUnaubxeg(Q9t)JT5LpmniEG2K)4iJqmoHQiiMA)gxf))M1PBtk4uM60zK8r5dWHhdZH5SQBbqYbC1W)7aSJNrQG0qD5IsqHYlcJkkN(D8LzfD26NJux0cIuJjNT6zXHbVNBxctIOMLctZ65PjlmhygjzD3bNGDLe2qMMxDjj(swnorKayQ8zBAXIilopDDaDfG4yk3PlQcTIa1vh1qTIyAI98iLZ7dy1R0Z6Ow1YhPCO(oHPcs3uX6owJR1AY(9FQlUs6IdMMGmKw)cHoAx17156BrA3j0qRPqnD3QpLNQfRUEgc(uPPKnw0AJ7yIkXGANIRsZHj7aS3rusvUwrw3MMeUeuippmtca91sFYOkLnAMazTMCNcW4f7N(M9s15OjDWK6rPve74u4ZhknfMXBc5E4XDj7EM)DvvxvZLbRfJHhEMOwREH(cWS9uvQLlStLYrluSvXq)NJ6HHC6e9Qv2CCy(ofXgGgsZYdJHGtLy6gxKYMorvvzinSjcYQBIdsseVRCgqzflUmd8dDUdfRUs9CACwSIfezYvredcfyY8K5MTYzHR1LDBsZjgVX86dtVhrCZ)PI6Gc0ylsXYXpId3zB3if9XAmHflYcd)yOo7h2ZJIoH4gDRiOKC1SGujSOZ8q374XSoUUdcMppVCgRoTJ27a9Y16CaFm3kDDFZsmm3)anA0S31KZQuK4LOWYKcxXCdtMZsh38CD61SJaYIEAMN3ibwkPalaab4D9QqIvzgMcGFDqEokZ2O(5n7dDnbQM8mIfVXa9vPAcIGmFflmRWKpURz0ym0PvJmuNyiFq)hvtlN3CTVJMTdmefNMKRT)LETl9SuZR7ZtzTHVUdCJXIanxNksUB6IfHj5QL8LMVatTzl0vAHjQgI2uparSMeMNb0L4i4EYPRz1oZv7tMPYHWKlLNA3RsTFUYM2yy9c4zcw9B2mRiTjN1Cdm1TshSuy4AvbAMbQiDicRdCgoC2D6SnlTUv1MenxciY8zBB2Hg2O((0m8KaaZowWMnzPbZw1k3OS8iIUYvN)B4r5SmJfbJHmgXSu89P4IcwhhBXQGIYVV(eha(9kWPoGHcZtvYUEv6xhSF63cOdY0ra4nc6GOKsibJnt4ZFMGB3Fmz8XXdKzY6cQMCox5sUzNVvod1PHcTUk54ksYZgSiphiF3KxwNlx(0vH6yJAMe(HnHZkqgmwFFdv5fNlRo60obTxkk13ZKJ7H9NCyXr0QM9cPNxtxVuu7Z9fnYB4qTEn6ipTCSYbMQsatL(JBjBnA4GdBWbTaHhhxRjlZFOggw39STsuQcPBV(eoLPHoAlZcpASO416S4Dd6qviOwgrD3DxCiRUQlv1NDHQ33i2mzeNZYAVtVoVkcsN0t10LSJ1yPJDEzYx0K0PAnB2gRFKdXvjpUGyrO7GFAKRArVMnr)6FOZPIlQgACURA1k37n)gUPixD7feRLTvTip20KvAoRk7r(mbffaEgja1O1NNtJcIfM264SzxBLJiPC0QmqOdD3AxbpXSU6e2cHkMuDe(0ZycDPFlvVwf1GUmnyCrFUQAlgDIZ7wPAHwJBqKtmfNDJgqeOTQMoJhSj1IqlUFHuXQyCVsO1dIlgwgHVeZyruwEXKG15tWYiHX)5Q07UEwNAODpyKJBiibqMGLa1aHXdowlvwGY5wuPrmMtZGDf(Itu1wyUIGWfMaIES1fsaAYpqt0qMMv(gvcxk1qASa3LQuvvAZ(yKJ2cVuSwiS46tZ5OHol8ncH734iixcLApswsfaFopoTq(Vvs5TCDJIBLwUCj31lDmfBLbPOobfS8tTxTKMtPrxz(0Dv)6EZuEl0qskfsRVKctzgOUIxw6Lvcfv9LwSTET25lssZDUVySF)0FJfKo)pf1WdlC5vGeuiQMb(hyolZPyMXTxjQliSgx2YQykMMjqXFc87nbrz4Z4GQvDcXQZhFQ9cBjI4tjE57M4LV1QS1jXlV)ejE57M4vZAFxr8Y7rjEX9bur9aR6J9PwNFADkn1Txle8KQG5eRPXSlJTNytyPx7fkxJtPslqELqQvXI30W0r72koHGiTX1)tRIjI2jRTed0OH9SECtDnpsTwfKKeYgiqovf(L3wJvvb5wI2mRG(uf6wTAPgI5UiX(uOZ6)kX6Ge7tKUosn4ojXIIzu1yiTIr9102JszNSdSeBIf59r)HQfqEW5uRokESfClButHvrrpyDUKWUUbSww0ZSZ)2d)yCvYyvDOGCrOS72V3OMf1aOxmnjEh(V4kVKuwEYLOm4axw67JMZQLDoN5vIwGUfYw(t(Nvrp7N(lWJIaaNegXFVDODBkR2PLHdBYb1bWqToxZtg6KEuxNm4RDYqNvWqnzqVjIV0NmObRnozW7lIjdACuLQe6WpKDYt2QkJOypp(Sd0RL6Xwspx6cxZQczNGcFC0E7uhJCIZxZurwpvPN3OC7v0G93biueGRRB5op57Xk(e0R8JZ2HN66yPwugm6VlkReSTyDL0Su9OoeN6zAj7p2tm73gQ0fWxzdUNPODsW9b70(ElRiJn)TydNg8Wuqt6kLuulhBWLoTNDKd6i7ZMcIEw9A2gZZQ7S)hC5QyvhaUdbOYE7Mu()FJJiz5GZOR5wBJAMmQ1JkQIQPkyoLbVccd57oQBbLRSDcOIvSmwLgNdZdYUtrx7ix4mEY7DIBtzNlNrS6uz9TmANUqCTjOrqFM7VZPRw3kGj2IYUWcTSclYkjjeT4GYzdsU5HH(Qcue1AZTXD9IvjFgbN1Q(WTSazTlnEpPcEUn4yJh0f98tmNVgZa97XXS1EmGv)zNtV3zSjq6QQFtQBSPRrINQrBhJaSCeWAkBiN2USdUOuSJCbSj2qX9KkclTTvzFx33oz5YrmTv(UdQvoXIHjzcBK7ZGHw)wl(F4Ojph4vh0buTR8s9tr7GaCdkKH5079MddTAmmzEThvD4PcG1LZVqPhBOSvnERKTstMzZeBWhpLrvD8fAFoDtK(q4EMXm7hSHh78VkxCNTunbW4Rg6MTvweb9igGraRVEY6xzpLNIGlRSCMjDcrknEQJ(B5YiYkPwTAzVWAeUbFQgpajT7XmVZfmdrvQibSjLpJNNNE1ojqPEYUEUXM2PZxq7aw98KSiSOCs57vsqL2SG4DBY51dIWUF1tNKKEVvb42ooyDEGzd02IBRdkbzqU(YUGXLmEFbzNf0mkNQnu4HhlPnLnUActDOQQQISY5o3mJZLlhLoW4usnInAYMqtwq08jHVNHcZNNpi8d4LZhxVrJxvhCqBwKzgGl3Bjgya2mKCGSbUauvMYguCFk7h2DyVNM7lh76IoqPrZSAlh4fTPcj95braZh8hyUoZaxq792jgspvptCWgKs(SDGYvwNr7WfLNlsDKTB(HMBfy75vOXvZrp97cAP9Y7fg9mYew2A2Uqnj1U82KXXEeJmz4vDyJ5oGHPTLbGxwXRk6p12hnTVk5HJg6yKWLaw)z88XHqNN(no9f2D27iYSTOqq25UM96SvOFh5s1eSDTfFU4Pgtc2xO8uph5PJndsLtVf3A4lCcjb8GZQXfe9zIsYr()9jFCEKXlMYp9JZ1ggr)SJtbASmrFYKO9H42kT7tf9K3OptSEhYZOGql3jQKz0)24005CVauZQ)7yLR)(PFJytGY6zApsj75QEcmqgMXpTxA7LWiAx9Sc5YJFInBXnNhclAFzScRyCuoFYFSD(Y1H8ZYIroCd(sIAjZcHX7G4j42yvlHt7XIvOViklKnaQfW0EsyZVylZ2kttuZDaJ0qDWswaVzrZUJl3y0qRn0XYmFc0HgvTSYcMDyP9303eHtBnuOwiT66ORrOjM8owsVI5y)R0pD6XBF9upKrUPEuA1J9SZWwMhUI42VeMPjVfYXtLfa3lMGBJysUo)2LVAF8xDVXcdIVH2uN5uNWWE(lXswiFsC4c(ghAOaPuugNPU33vqjoCyOdT6)dzMKL0BAalBZE7kcOqPYFmJEPn6O1SPwwBBHcPEepPpXoI2guZoIFEa11(byOlRsI4nLhZrVhSlIF6)WFO)OHN7pAaaU7dYWOmHy2z78JO1BsZkkpuxFE5bJ0ZXJuH)VT89Xro7aAiyBrA5Mab8CeIVnFW(F6NzhZdEd)69t)20eO7yVpDtjloNF4l88tp1MZrv776x61)zLZ86)Stpfvtap6fSFjsD9lh1VF)x4nCiGM4zarhH)zc4FMv4xtIEwjrPk7Q9oLJISK7v)HnPkBGulLOfK1eYileI0NFPMLya3PSVW)fLDCVmLTB7yPp(zeFSG6ow9Zzu9tnj)xvj5NlQooPA5vGv6QZx4DN69H(2HNAPr3cKTETRqvkxqmHznqwttEkHojCBjoDIoo64H9OksYENO5n861T3PN2(LLLpzpt2xE4HtCWHMhEGc497zYVTXAqyrq4pZVFVtpHqc4HhmWI1GnI6r(kV(IXO)ZM7E2tf3Ts82Fi90gsvh(0QoiHNNzvhTETRq16KBTn5Pe6KW1GQdFZc3(Kc3(MeU9(cu42Ns1HhLWDBwSjHBFnQo(prU7zpvC3AXBVJRxhKW7G86WauTo52UxhhzOxdx)JSAzk4DyQLPHQvQ3b1YhxOxd3ZFsKZOHQvS1b5SJl0Td3h7C4Jn8U4jrULgQw5Moi3ECHUD4(y1jCSH3OJkD)0cD7W9XnZYvS(Xb9k4EH1Osz(n0Ere7PMmUXE9usm84rGtde5zSxDoOiwP1R86v1ekxwObIWZLxBVjVWkQiTOVp7zE9X)tVtBq7Ja3GmV8In5wYEx(FzWvm4Jk)fKX3)tAsCB1DC(Z7wQBnAarCDDsyar61QjBYUUibN0KYiP28Kc(Nma)zcVBPTJyyR3PMl3VEUeCgaed44ZEg5esrtUAy)QjcM7OkqPTz1DPjec6T(wKM)uWw(0ZvSYuQnkB0)FsvcTETQLE7g6jL913MNuW)Kb4pt4nTkb)NuzFn44NxvcAqiTQe(0Zw(0ZvSYuQKMOdB9acZ0mqFKUEygOmplf1QdbKB2MJm4paeFneAzy2ot4DDtoUa)aWA4D5GivCuHrmxTzh)o5aOGviRXeUlAWXeWha(ILwIj0T89hrW2DKL(wzxtxySXkDiDoBmQOYCUlnd0hPdrMbQznj6BZrg8haItPlrBtoUa)aWAt6qiB2XVtoakqV(enn4yc4daF1QrP97pIGT7iBhuuzPXkDiD6A3KLoBaRI83KBkFauT7i3ni3As3bFhyBDr)(BihNCJEOB3rUBmY2ObFhyBDrA7TpfMfPa6bfuanM(4ci(jg8oayxT3A0C(HdEknF0qok(9X6K64p2jG4PhiEDei2hBCi7RhBW7aGTp24qiNho476q)rzu7qKFAVCDKvxez1kDkHwmSKJ0RkQpDDg17uZ5UXqHg1)fN6ny0ljMncVvZ3MVlzg(DVuPBrg3RBmA0)zEdh2VF)XNAoFZgkIYMiONve0tlc61ab9vqqHGWx4JKN95BK8mNgjBJGFYgjlrWAfFF1XyQpfq6Ksi6c8h8rkiEzyXQGSjB2(XpgdmJ0pOdSun09oYvp36IdVn3AnYmz3indnSd9KR0MBELYw)6fPXXP3ZoVlcajyqx)9H4fYWw21Zq1L2kFz03pLFJTE72cr7sszl(92eLwpFo245bfb3gKh(17)j2gMhdjex48FKTM5i8FRkKXve)MRbV7xeH3HB)L)Y(PRkk2K)1ND2YOIvBVfMkU(S6RI2zzblkW)E2zWla6l)mO)VpidpvEJso7ByW(xllm0Fg7HZyLkaF7pwMAF873)tyN97B4CsaXdf3CoxhT(BHXK)EqgE16ocRyA)rmYz4fNFXBNTaPi8J)o8w5b(WC2rSE5yrE9os)vaCJWZGDGUVD3(P8vyGFL8WqeObLNpEIdre(jKh8CS4c4lJaV91lKWZZvoa4XtvEiU7C8mnjElaIv4qAskwocyPxmNb8WITzal3d7Xy8KQs8KHdgbdb8HK8bvvZWlVQsJ3RWn62vQQUEv6MRyxIRVI1Px59Q67s1Raq(QzPjZJylOr9uvzTIuRSJXv0P2K0tZsE78k48md4bUcoDHH6)yzO(htg6tZcg2DgkXsI1fgAPJnLmsvXpbWLLKK5I1vGUg381(YY0IQ9DVVoPJAF)k8B1(guVzF53qRDVlSgFTSgFcwJpbRrtWVAFzlwJ(8XQ99nyn(KSgtg(6cRP2DUwtfhjpxSEirBkP0Q474GH(DedjsAMwnjhhmuSFmAIF(YONNecCirLqguYJjMKdl4sntiCoSKgrLqgE5HfDPgTzohxsJWsuJV0fXdIR3LJGuc9gNufBhFLkX4cwx3x8nBvl7j6DV)PqPTweGk(IJNQrX5mVOJlpFqcuoC2RT)ddw4zzkiK6cWv304cfzV1LpnViapBrYWDLUgemdf2s5NnRG7kFmepJDcwVbGAfYgnlerG7cZKW)K5tIsMmpi7UKW8CWf)9t)MF9N3p9Fw277N(lSdsji2GFi9(9txVfJp4D4wIF)0FL7fpglbENLVV(EUdSKXc26Vj5n)1v(a5cbxZRQoOHFv5bgbodcbF(GBtZHwGtQGMewye9)DwOE8ODipWZzHffcYkRzXPE)QWemSH80TzZyH8GuxmYicts3UCf)l2Ibx8DIGAEhlOM)flOgxOuTNu7v06BhEyK3MVCiojoDf5DUBuhx2dmRZXG8YiWznNFzlwKTtwsKvO6TUoyfmOFr(CDbcNeEruEzu(quTl3gaAnkcXlF2)yBE5dtdIDkQr(L7pJAlVj)RO2lCJA)M1PBtk44T6uneG448C2jvj58lgJaV(j5aUAy8D4jJTdKGyed12ODg4BKLkz0YpINrDzB3uubFaQRr9llYcd)yyzZeuBUCZAQQR60jTujN6wt4kp6VfpNEl3FhA)2Xg(wMt)mcV8tRm0kHrp8qR9jHbkP(SUUeKNQhMvpvc)7td3wwbyo5GpLT1vK6JggnQu8xDuwvfQS6HxvpTNXwxoYesTrNHPMNc)9oLb3who)LBzMllpdwEX5p8G(gYrKZ7lzwB3Kc2TWvjSRFajuLAchENE(lp1)fLqmFDQWCF6IfHj5H9LElARS8JL9fSf)q46k)WUtm(BkZeLihX(xVpz2oyFLU9Wuz7LpiQmVj29gwVl5L)Q(1pwBNR)s5G(JepxZ3Pzcgfb2NPr57bhY2ghGkjd2ar)fmBvltDmJf8RfaHlkWJYzkilpwiX8lIVpfVjFfJDyZckk)(6eYc)Ev6w8MpaKEuCaQYAkyv5Bb0b1vJaWBuUuIJBCYJH(lflzBrJxXTprMAgjH5KovoalhTbzIUeTToyeNG9yBaKM(4wmlnwY2qRnPUUDOB5(H6Lmd5Cjkw(aJ68rSteQl9TUH)QWHl9gstTLmrZKRuqEh2b8Lsov1tHdaR6rZIkGP)9m2Vgjlb9GyJWiaJVvbY2og1tNgkl6inIHJh2VdJsnWm5reNOtbdu1KN(KcBMXw9wnchp8GY2w9YZh27eNMrwBJSl8xNa94ZbgDJjj247po29YG6KN0WgAoOBgOkMVbOvf1hJG(24G5HT2zRxamgsGCIRqX3GT)swh7UUTEQWr5iOJ6OUJgzQU4ee8ptUaiCvc4qL(F188OTN2N34ZroSqklnjCzgBn5a3jtUtypx651USq8MMqV9gC27Hh06Y6vJaVqSCyWwpJOX5aBTdmv(ll9ifhMRNR1uWPVyLt)HimK6FT6IEMVST5Sq33p9siQnimRfx9CXAbF)93p4(uik9G58feEtyC8vGk93m8mMOWRJswSfpZnF(4YWd)XYhC5zbJXa8JI7aKh55)wVZ4YfVoDXRzSEa0ndIMdCmE5TBGaK5lMogco(lx7mVr((V9VEgxgg7nP16DS(OA59BAJRdC(nbURDB3Or2DGIRG(rtrbvfyaxcc8zKjVictFfi3W0bcZSJsEF6DGu)hajSeqqfL4fMLqhPfseVkAbX8CdUL3xBedMxSttrSy(e3QN2anKvJfKaAadwctYGaaJJrAsNxlxmSNYe8frzqW1bRZNGPH8sulQnBEMqtZ(Buz0RbYwTGf8Gu(nE6Pv8bgZ3aq4RFf(JYZ88R8eE8Rnd2ilWQz23uJYsjGONUv(GVUbTEHViBbhbpfU8nGQr8OVUxtVyqPCG18VyPHedHcMlTjoSqeV2VLjybSFxLfFyAs(D7NUeu)NmqzQcWuNZUBC0X7MGFwdEnWojNKOIUEJuhhNYkROsgMiTIm0gNUgIb1b)tu5jHbZW7RePQetmhVWJyIQL6z2eWpgn4GQLgPbAfDWl5CXQJWihPve8lZZOZJ3bSh1jFAZfjT(5vcSLW08jZPvgUVcd3)l0t2WJhdN68I0JGH3(SEY85ziBg23UkijjKLKBe7KlXSMZEQwTPYErV2v1PiTM)F8MVqFwczE45etJTYbznwJR)vPMhKEmoA(gj91TBtW8D91A2O)tXmlnVTEY84Ru082JDTjyBG1NEG9WNx(V)dShRzWA11yEG9VWRMZ0K4D4)gY9UNTAvLGamnMLIvukVKtzU8kAbAWLLSE1GcgSF6VKXJmijmI)E7q72uMl6kWXMGh3O7JrDrT)ye1kYvES0u055E4i7P6vRDicSWRBkMYYVrFY5hk1NKeAGsE0(CAZ)2X(dPxoc9(AIoVzvbI2Xrh0oyFC0xEC09PAkJJ(Fzmo6BDC07Z04i2c29qQrN67EqqAR)AbczJgnnn16hBpt2CwibJ6VGvZFusraUStLv)W3h(EiisqJ7mqz7VXwdZYOp(DX6SITfxOvzo9Q07JlZNvEbBIY8uioBeMtwGGCaETaH5ZV9A3DiIQ9R)ATzK4EMQ9jb3hSJkv3MnnwUIRAmTZXR2xzv97xwidFRoNo3KI)QTVi)3L9L9rhPL9vRiVVIUHGBtxhLWiIjXrRVL5qOg2cPRD6CzceN0F57kPSltZnO7LJCrDMouw3GIwutgqa4tZYHqOYZlV6irqv9vIkCKIe1MEBXevnJg9SU0SGAk7MdKRrdUdVnk6YY857nKlx0Mk1SkbQN3RQREjmJooMTagb3PWGom2HCxOroNuq0Asw1zot38GHoGbgdmrEzKV8cyOt7sxPTgd7PUGVef)Nl8OoN54YPY6vjXXRr2fvV8TKMeO9vrXcG67Eud36KeDySMURDUxST3LumyubG6cNRVyXbBu0wSyLP0DIJnJ9SXf1pM3vcuUt09rTnDFScINxcjktMg)vdnR9e8qPNgUC7ccGTCRGp5xcAhzDKk7u2O0RMTBw1D3xEP7jOSf6bf(SQLDEEemSCE)QsbucitkFgI39OxNjBZ2gRwpHS3vFD(JywTmtweUCWP8sChMwpliE3M8qXI(x)KjjP3BX2whvYAY7mhMxQHSorpwR6c0vED21p9EltP3QMlvvIa6xQMJb1WIfOBKdmzjiA(eiade4ZNNpi8d4MBUxZhJEH0MwECyT2Wi6gE37KQGrhuCFk7h0Em0RUX(RSgYxNgnv0beebuiO5DUZRbwlgy(SDWSVATITdpI0HA111LDfGRo)w2MqpYt0)6511LpDpZoFl8R0NPzCSpbMCaxIaudSA5raooROsIc0oTT0fxXMkvl0Qvy2LZ2Fl1S0XH6pGRqb7vu5)wrUFzEJr09RmIpZ8zHcq0rG4uaT4H)zL5wRjOF7v3)GPFwsHEhR8X2p9BQQQCz)nXB4EU5NwAGR0Rjic(Ugq5ZbnBHzyw2EuFoeaBaw4TBJZdD8tIrEu(K)y78LRb(GJFfw4CaJkiEcwv7pkCDruwiJB9O(ALlV(oN4NYayADl8BQd0gBcP8lrpyTUkR29kgKVFX5mrrL8C04M8wS7ue3m8VIF7FpPMrj9oDpum3ST1FJfsfUAgp(s0uWIBuHM1BFjlBOj9oQFfWYuJusDNzixnVL8jjpMixGLYxuFx5pEO1orw2P9qIlswuI6KEPAIiSkb9)3CxlTg3WaH)TKlL1bky7DDifCwihk0t9sUVTlnoTbkXbVBUT0F7vJ17rZij)G0sVLgR59NMzKgL7o235PscaftVeckA)7iFKfdM4ptB3HXU5lGFOz9D8nbs9lW0ccKWVbwlFtUWIBlgNnn2nx5Lv(4VMLks)293T7YLm(1UTqf3ox6CBwKPY7jJjUkzsawmcFvjtMVUWrWJQGIwOsWSBxJ(pK99OOWmaGtgOCzQbgKONeEWWu1p82PJpAkrHqDLknK9v6sgi1PmcTsBq8jBxM4YH8ILxEoE(AcN(KKG1N0w4SA3Dtx7(P0DXQDlRYzxHb4sFdWVFeztKQy)5rXWQbKiXcP3iLDunRJekrUrAnXIDQ)TF)nzHXbGHI8Sr987vXUoBBAd(5qVaB862ztjbXcoOy75T7oeYSWUCwuEZp1uK4nzs73e0xw8uT)rne1a)ROX13aisCN7nPQy4fyTSNaNCtNpqDf23wQtQI7ivjpdgBJM9hFOI1XPcrxd3wtz6xt)m8U)4o3yP6q8Z6uPGgVFleFTBLQ4Iu13ObYj2x7qQqs(5a8YqsAzhbij7kljtsz5ccQYw8KL8DUFyqv(MRx0nzfap6yOEzbmyzUpFgXq0Cf456cQqZhN4LXZhx6xgKu31onHatyAPIedTL5Ah4M(ibMglPr1RSCINU1OotmjlBjXWK9ZiBJXI5XzZom1nYoXN6safO0W1vdkUrapPUf94FAmg7DavJ9QgTUXrVlIigNoACibVhPEmMDE5d6XrEuN7jvmdZGK2cTimzBkO7WrBt4I630MlxCg5F9lPI8OXBRlcAxAbVyNkuYu7lb5MyywHZ1ILyQ4JmwT4qb8WZQNg7PcPB2OAMkN)DYtgERXzUvf(pkPIytit5Dl7hqMGsxBL)llqz(ob8qPQmxUV)Z6bV(pFhEPSTR9X(oFS1i5KWDWaj33tsKfP(PFAMISz4gAFrSxB7UcmFMgVoz9quleB0A2Maz91L4VCXbrtCdHv1UYRgc1MtO0Y6MuxbBdtfFaN9PQ98iRc1drl8WHZmHLp8m0iy4kPdAlQsj8Avmwv)SPbrbz8n1GL0ziI5KCDxHXaHOuM8frUtpHD7zrsfkhdTdG9jaTGNURzcH0aYJ3bcEgGVGxQcUMH9ao8dQqXUil7AQvWPjNYYNlOLnto8ZBJ1bNisST27OdsAoObVxMqC1g3J4i2JPsE2Dg7R3LTAL49fYstqXNE72WL4)2TkWSA4MgrVUMKcq5Hho9A3po816MQdNf)7WFp]] )