-- WarlockDestruction.lua -- November 2022 if UnitClassBase( "player" ) ~= "WARLOCK" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID local PTR = ns.PTR local GetSpellTexture = C_Spell.GetSpellTexture local strformat = string.format local spec = Hekili:NewSpecialization( 267 ) local GetSpellCount = C_Spell.GetSpellCastCount spec:RegisterResource( Enum.PowerType.SoulShards, { infernal = { aura = "infernal", last = function () local app = state.buff.infernal.applied local t = state.query_time return app + floor( ( t - app ) * 2 ) * 0.5 end, interval = 0.5, value = 0.1 }, chaos_shards = { aura = "chaos_shards", last = function () local app = state.buff.chaos_shards.applied local t = state.query_time return app + floor( ( t - app ) * 2 ) * 0.5 end, interval = 0.5, value = 0.2, }, immolate = { aura = "immolate", debuff = true, last = function () local app = state.debuff.immolate.applied local t = state.query_time local tick = state.debuff.immolate.tick_time return app + floor( ( t - app ) / tick ) * tick end, interval = function () return state.debuff.immolate.tick_time end, value = 0.1 }, blasphemy = { aura = "blasphemy", last = function () local app = state.buff.blasphemy.applied local t = state.query_time return app + floor( ( t - app ) * 2 ) * 0.5 end, interval = 0.5, value = 0.1 } }, setmetatable( { actual = nil, max = nil, active_regen = 0, inactive_regen = 0, forecast = {}, times = {}, values = {}, fcount = 0, regen = 0, regenerates = false, }, { __index = function( t, k ) if k == 'count' or k == 'current' then return t.actual elseif k == 'actual' then t.actual = UnitPower( "player", Enum.PowerType.SoulShards, true ) / 10 return t.actual elseif k == 'max' then t.max = UnitPowerMax( "player", Enum.PowerType.SoulShards, true ) / 10 return t.max else local amount = k:match( "time_to_(%d+)" ) amount = amount and tonumber( amount ) if amount then return state:TimeToResource( t, amount ) end end end } ) ) spec:RegisterResource( Enum.PowerType.Mana ) -- Talents spec:RegisterTalents( { -- Warlock abyss_walker = { 71954, 389609, 1 }, -- Using Demonic Circle: Teleport or your Demonic Gateway reduces all damage you take by $389614s1% for $389614d. accrued_vitality = { 71953, 386613, 2 }, -- Drain Life heals for $s1% of the amount drained over $386614d. amplify_curse = { 71934, 328774, 1 }, -- Your next Curse of Exhaustion, Curse of Tongues or Curse of Weakness cast within $d is amplified.; $@spellname334275; Reduces the target's movement speed by an additional $s3%.; $@spellname1714; Increases casting time by an additional $%.; $@spellname702; Enemy is unable to critically strike. banish = { 71944, 710 , 1 }, -- Banishes an enemy Demon, Aberration$?s386651[, Undead][], or Elemental, preventing any action for $d. Limit 1. Casting Banish again on the target will cancel the effect. burning_rush = { 71949, 111400, 1 }, -- Increases your movement speed by $s1%, but also damages you for $s2% of your maximum health every $t2 sec. Movement impairing effects may not reduce you below $s3% of normal movement speed. Lasts $d. curses_of_enfeeblement = { 71951, 386105, 1 }, -- [1714] Forces the target to speak in Demonic, increasing the casting time of all spells by $s1% for $d.$?s103112[; Soulburn: Your Curse of Tongues will affect all enemies in a $104224A yard radius around your target.][]; Curses: A warlock can only have one Curse active per target. dark_accord = { 71956, 386659, 1 }, -- Reduces the cooldown of Unending Resolve by ${$s1/-1000} sec. dark_pact = { 71936, 108416, 1 }, -- Sacrifices $s2% of your current health to shield you for $s3% of the sacrificed health plus an additional $ for $d. Usable while suffering from control impairing effects. darkfury = { 71941, 264874, 1 }, -- Reduces the cooldown of Shadowfury by ${$s1/-1000} sec and increases its radius by $s2 yards. demon_skin = { 71952, 219272, 2 }, -- Your Soul Leech absorption now passively recharges at a rate of ${$s1/10}.1% of maximum health every $t1 sec, and may now absorb up to $s2% of maximum health.; Increases your armor by $m4%. demonic_circle = { 100941, 268358, 1 }, -- [48018] Summons a Demonic Circle for $d. Cast Demonic Circle: Teleport to teleport to its location and remove all movement slowing effects.$?s58081[; If you cast Demonic Circle: Summon while controlling an Eye of Kilrogg, the circle will appear where the eye is located.][] demonic_embrace = { 71930, 288843, 1 }, -- Stamina increased by $s1%. demonic_fortitude = { 71922, 386617, 1 }, -- Increases you and your pets' maximum health by $s1%. demonic_gateway = { 71955, 111771, 1 }, -- Creates a demonic gateway between two locations. Activating the gateway transports the user to the other gateway. Each player can use a Demonic Gateway only once per $ sec. demonic_inspiration = { 71928, 386858, 1 }, -- Increases the attack speed of your primary pet by $s1%. $?a137044[][; Increases Grimoire of Sacrifice damage by $s2%.] demonic_resilience = { 71917, 389590, 2 }, -- Reduces the chance you will be critically struck by $s1%. All damage your primary demon takes is reduced by $s3%. demonic_tactics = { 71925, 452894, 1 }, -- Your spells have a $s1% increased chance to deal a critical strike.; You gain $s2% more of the Critical Strike stat from all sources. fel_armor = { 71950, 386124, 2 }, -- When Soul Leech absorbs damage, $s1% of damage taken is absorbed and spread out over $387847d.; Reduces damage taken by ${$s4/10}.1%. fel_domination = { 71931, 333889, 1 }, -- Your next Imp, Voidwalker, Incubus, Succubus, Felhunter, or Felguard Summon spell is free and has its casting time reduced by $s1%.; fel_pact = { 71932, 386113, 1 }, -- Reduces the cooldown of Fel Domination by ${$s1/-1000} sec. fel_synergy = { 71924, 389367, 2 }, -- Soul Leech also heals you for $s1% and your pet for $s2% of the absorption it grants. fiendish_stride = { 71948, 386110, 1 }, -- Reduces the damage dealt by Burning Rush by ${$abs($s1)}%. Burning Rush increases your movement speed by an additional $s2%. frequent_donor = { 71937, 386686, 1 }, -- Reduces the cooldown of Dark Pact by ${$s1/-1000} sec. horrify = { 71916, 56244 , 1 }, -- Your Fear causes the target to tremble in place instead of fleeing in fear. howl_of_terror = { 71947, 5484 , 1 }, -- Let loose a terrifying howl, causing $i enemies within $A1 yds to flee in fear, disorienting them for $d. Damage may cancel the effect. ichor_of_devils = { 71937, 386664, 1 }, -- Dark Pact sacrifices only $s3% of your current health for the same shield value. lifeblood = { 71940, 386646, 2 }, -- When you use a Healthstone, gain $s2% Leech for $386647d. mortal_coil = { 71947, 6789 , 1 }, -- Horrifies an enemy target into fleeing, incapacitating for $6789d and healing you for $108396m1% of maximum health. nightmare = { 71916, 386648, 1 }, -- Increases the amount of damage required to break your fear effects by $s1%. pact_of_gluttony = { 71926, 386689, 1 }, -- [452930] Instantly restores $s1% health$?s262031[, plus an additional ${$262080d/$262080t1*$262080s1}% over $262080d.][.] resolute_barrier = { 71915, 389359, 2 }, -- Attacks received that deal at least $s2% of your health decrease Unending Resolve's cooldown by $s3 sec. Cannot occur more than once every ${$proccooldown-$s1/-1000} sec.; sargerei_technique = { 93179, 405955, 2 }, -- $?c1[Shadow Bolt and Drain Soul damage increased by $s1%.]?c2[Shadow Bolt damage increased by $s1%.][Incinerate damage increased by $s2%.] shadowflame = { 71941, 384069, 1 }, -- Slows enemies in a $A1 yard cone in front of you by $s1% for $d. shadowfury = { 71942, 30283 , 1 }, -- Stuns all enemies within $a1 yds for $d. socrethars_guile = { 93178, 405936, 2 }, -- $?c1[Agony damage increased by $s1%.]?c2[Wild Imp damage increased by $s2%.][Immolate damage increased by $s3%.] soul_conduit = { 71939, 215941, 1 }, -- Every Soul Shard you spend has a $?s137043[$s1%]?s137046[$s3%][$s2%] chance to be refunded. soul_link = { 71923, 108415, 2 }, -- $s2% of all damage you take is taken by your demon pet instead. $?a137044[][; While Grimoire of Sacrifice is active, your Stamina is increased by $s3%.] soulburn = { 71957, 385899, 1 }, -- Consumes a Soul Shard, unlocking the hidden power of your spells.; Demonic Circle: Teleport: Increases your movement speed by $387633s1% and makes you immune to snares and roots for $387633d.; Demonic Gateway: Can be cast instantly.; Drain Life: Gain an absorb shield equal to the amount of healing done for $387630d. This shield cannot exceed $387630s1% of your maximum health.; Health Funnel: Restores $387626s1% more health and reduces the damage taken by your pet by ${$abs($387641s1)}% for $387641d.; Healthstone: Increases the healing of your Healthstone by $387626s2% and increases your maximum health by $387636s1% for $387636d. strength_of_will = { 71956, 317138, 1 }, -- Unending Resolve reduces damage taken by an additional $s1%. sweet_souls = { 71927, 386620, 1 }, -- Your Healthstone heals you for an additional $s1% of your maximum health. Any party or raid member using a Healthstone also heals you for that amount. swift_artifice = { 71918, 452902, 1 }, -- Reduces the cast time of Soulstone and Create Healthstone by $s1%. teachings_of_the_black_harvest = { 71938, 385881, 1 }, -- Your primary pets gain a bonus effect.; Imp: Successful Singe Magic casts grant the target $386869s1% damage reduction for $386869d.; Voidwalker: Reduces the cooldown of Shadow Bulwark by ${$abs($s2/1000)} sec.; Felhunter: Reduces the cooldown of Devour Magic by ${$abs($s3/1000)} sec.; Sayaad: Reduces the cooldown of Seduction by ${$abs($s4/1000)} sec and causes the target to walk faster towards the demon.$?s137044[; Felguard: Reduces the cooldown of Pursuit by ${$abs($s6/1000)} sec and increases its maximum range by $s7 yards.][] teachings_of_the_satyr = { 71935, 387972, 1 }, -- Reduces the cooldown of Amplify Curse by ${$s1/-1000} sec. wrathful_minion = { 71946, 386864, 1 }, -- Increases the damage done by your primary pet by $s1%. $?a137044[][; Increases Grimoire of Sacrifice damage by $s2%.] -- Destruction Talents abyssal_dominion = { 94831, 429581, 1 }, -- $?s137044[Summon Demonic Tyrant is empowered, dealing $s1% increased damage and increasing the damage of your demons by $s2% while active.][Summon Infernal becomes empowered, dealing $s3% increased damage. When your Summon Infernal ends, it fragments into two smaller Infernals at $s4% effectiveness that lasts $456310d.] annihilans_bellow = { 94836, 429072, 1 }, -- Howl of Terror cooldown is reduced by ${$s1/-1000} sec and range is increased by $s2 yds. ashen_remains = { 71969, 387252, 1 }, -- Chaos Bolt, Shadowburn, and Incinerate deal $s1% increased damage to targets afflicted by $?a445465[Wither][Immolate]. aura_of_enfeeblement = { 94822, 440059, 1 }, -- While Unending Resolve is active, enemies within $449587a1 yds are affected by Curse of Tongues and Curse of Weakness at $s1% effectiveness. avatar_of_destruction = { 101998, 456975, 1 }, -- [434587] Generates $457578s1 Soul Shard Fragment every $457578t1 sec and casts Chaos Bolt at $456975s1% effectiveness at its summoner's target. backdraft = { 72067, 196406, 1 }, -- Conflagrate reduces the cast time of your next Incinerate, Chaos Bolt, or Soul Fire by $117828s1%. Maximum $?s267115[$s2][$s1] charges. backlash = { 71983, 387384, 1 }, -- Increases your critical strike chance by $s1%.; Physical attacks against you have a $s2% chance to make your next Incinerate instant cast. This effect can only occur once every $proccooldown sec. blackened_soul = { 94837, 440043, 1 }, -- Spending Soul Shards on damaging spells will further corrupt enemies affected by your Wither, increasing its stack count by $s1.; Each time Wither gains a stack it has a chance to collapse, consuming a stack every $445731t1 sec to deal $445736s1 Shadowflame damage to its host until 1 stack remains. bleakheart_tactics = { 94854, 440051, 1 }, -- Wither damage increased $s1%. When Wither gains a stack from Blackened Soul, it has a chance to gain an additional stack. blistering_atrophy = { 101996, 456939, 1 }, -- Increases the damage of Shadowburn by $s1%. The critical strike chance of Shadowburn is increased by an additional $s3% when damaging a target that is at or below $s4% health. burn_to_ashes = { 71964, 387153, 1 }, -- Chaos Bolt and Rain of Fire increase the damage of your next $s3 Incinerates by $s1%. Shadowburn increases the damage of your next Incinerate by $s1%.; Stacks up to $387154U times. cataclysm = { 71974, 152108, 1 }, -- Calls forth a cataclysm at the target location, dealing $s1 Shadowflame damage to all enemies within $A1 yards and afflicting them with $?a445465[Wither][Immolate]. channel_demonfire = { 72064, 196447, 1 }, -- Launches $s1 bolts of felfire over $d at random targets afflicted by your $?a445465[Wither][Immolate] within $196449A1 yds. Each bolt deals $196448s1 Fire damage to the target and $196448s2 Fire damage to nearby enemies. chaos_incarnate = { 71966, 387275, 1 }, -- Chaos Bolt, Rain of Fire, and Shadowburn always gain at least $s1% of the maximum benefit from your Mastery: Chaotic Energies. cloven_souls = { 94849, 428517, 1 }, -- Enemies damaged by your Overlord have their souls cloven, increasing damage taken by you and your pets by $434424s1% for $434424d. conflagrate = { 72068, 17962 , 1 }, -- Triggers an explosion on the target, dealing $s1 Fire damage.$?s196406[; Reduces the cast time of your next Incinerate or Chaos Bolt by $117828s1% for $117828d.][]; Generates $245330s1 Soul Shard Fragments. conflagration_of_chaos = { 72061, 387108, 1 }, -- Conflagrate and Shadowburn have a $s1% chance to guarantee your next cast of the ability to critically strike, and increase its damage by your critical strike chance. crashing_chaos = { 71960, 417234, 1 }, -- Summon Infernal increases the damage of your next $s3 casts of Chaos Bolt by $s1% or your next $s3 casts of Rain of Fire by $s2%. cruelty_of_kerxan = { 94848, 429902, 1 }, -- $?s137044[Summon Demonic Tyrant][Summon Infernal] grants Diabolic Ritual and reduces its duration by ${$s1/1000} sec. curse_of_the_satyr = { 94822, 440057, 1 }, -- [442804] Increases the time between an enemy's attacks by $s1% and the casting time of all spells by $s3% for $d.$?s103112[; Soulburn: Your Curse of Weakness will affect all enemies in a $104222A yard radius around your target.][]; Curses: A warlock can only have one Curse active per target. decimation = { 101997, 456985, 1 }, -- Your critical strikes have a chance to reset the cooldown of Soul Fire and reduce the cast time of your next Soul Fire by $457555s1%. demonfire_mastery = { 101993, 456946, 1 }, -- Increases the damage of Channel Demonfire by $s1% and it deals damage $s2% faster. devastation = { 72066, 454735, 1 }, -- Increases the critical strike chance of your Destruction spells by $s1%. diabolic_embers = { 71968, 387173, 1 }, -- Incinerate now generates $s1% additional Soul Shard Fragments. diabolic_ritual = { 94855, 428514, 1 }, -- Spending a Soul Shard on a damaging spell grants Diabolic Ritual for $431944d. While Diabolic Ritual is active, each Soul Shard spent on a damaging spell reduces its duration by $s1 sec.; When Diabolic Ritual expires you gain Demonic Art, causing your next $?s137044[Hand of Gul'dan][Chaos Bolt, Rain of Fire, or Shadowburn] to summon an Overlord, Mother of Chaos, or Pit Lord that unleashes a devastating attack against your enemies. dimension_ripper = { 102002, 457025, 1 }, -- Incinerate has a chance to tear open a Dimensional Rift or recharge Dimensional Rift if learned. dimensional_rift = { 102003, 387976, 1 }, -- [394235] Deals ${$394238s1*($394237d/$394237t1)} Shadow damage over $394237d. emberstorm = { 72062, 454744, 1 }, -- Increases the damage done by your Fire spells by $s1% and reduces the cast time of your Incinerate spell by $s2%. eradication = { 71984, 196412, 1 }, -- Chaos Bolt and Shadowburn increases the damage you deal to the target by $s2% for $196414d. explosive_potential = { 72059, 388827, 1 }, -- Reduces the cooldown of Conflagrate by ${$s1/-1000} sec. fiendish_cruelty = { 101994, 456943, 1 }, -- When Shadowburn fails to kill a target that is at or below $s2% health, its cooldown is reduced by $s1 sec. fire_and_brimstone = { 71982, 196408, 1 }, -- Incinerate now also hits all enemies near your target for $s1% damage. flames_of_xoroth = { 94833, 429657, 1 }, -- Fire damage increased by $s1% and damage dealt by your demons is increased by $s3%. flashpoint = { 71972, 387259, 1 }, -- When your $?a445465[Wither][Immolate] deals periodic damage to a target above $s2% health, gain $387263s1% Haste for $387263d.; Stacks up to $387263U times. gloom_of_nathreza = { 94843, 429899, 1 }, -- $?s137044[Hand of Gul'dan deals $s1% increased damage for each Soul Shard spent.][Enemies marked by your Havoc take $s2% increased damage from your single target spells.] grimoire_of_sacrifice = { 71971, 108503, 1 }, -- Sacrifices your demon pet for power, gaining its command demon ability, and causing your spells to sometimes also deal $196100s1 additional Shadow damage.; Lasts $196099d or until you summon a demon pet. hatefury_rituals = { 94854, 440048, 1 }, -- Wither deals $s1% increased periodic damage but its duration is $s2% shorter. havoc = { 71979, 80240 , 1 }, -- Marks a target with Havoc for $d, causing your single target spells to also strike the Havoc victim for $s1% of the damage dealt. illhoofs_design = { 94835, 440070, 1 }, -- Sacrifice $s1% of your maximum health. Soul Leech now absorbs an additional $s2% of your maximum health. improved_chaos_bolt = { 101992, 456951, 1 }, -- Increases the damage of Chaos Bolt by $s1% and reduces its cast time by ${$s2/-1000}.1 sec. improved_conflagrate = { 72065, 231793, 1 }, -- Conflagrate gains an additional charge. indiscriminate_flames = { 101995, 457114, 1 }, -- Backdraft increases the damage of your next Chaos Bolt by $s1% and increases the critical strike chance of your next Incinerate or Soul Fire by $s2%. infernal_bulwark = { 94852, 429130, 1 }, -- Unending Resolve grants Soul Leech equal to $434561s1% of your maximum health and increases the maximum amount Soul Leech can absorb by $434561s1% for $434561d. infernal_machine = { 94848, 429917, 1 }, -- Spending Soul Shards on damaging spells while your $?s137044[Demonic Tyrant][Infernal] is active decreases the duration of Diabolic Ritual by ${$s1/1000} additional sec. infernal_vitality = { 94852, 429115, 1 }, -- Unending Resolve heals you for ${$434559s1*($434559d/$434559t1)}% of your maximum health over $434559d. inferno = { 71974, 270545, 1 }, -- Rain of Fire damage is increased by $s2% and its Soul Shard cost is reduced by ${$s1/-10}. internal_combustion = { 71980, 266134, 1 }, -- Chaos Bolt consumes up to $s1 sec of $?a445465[Wither's][Immolate's] damage over time effect on your target, instantly dealing that much damage. malevolence = { 94842, 442726, 1 }, -- Dark magic erupts from you and corrupts your soul for $442726d, causing enemies suffering from your Wither to take $446285s1 Shadowflame damage and increase its stack count by $s1.; While corrupted your Haste is increased by $442726s1% and spending Soul Shards on damaging spells grants $s2 additional stack of Wither. mark_of_perotharn = { 94844, 440045, 1 }, -- Critical strike damage dealt by Wither is increased by $s1%. ; Wither has a chance to gain a stack when it critically strikes. Stacks gained this way do not activate Blackened Soul. mark_of_xavius = { 94834, 440046, 1 }, -- $?s980[Agony damage increased by $s1%.][Wither damage increased by $s2%.]; Blackened Soul deals $s3% increased damage per stack of Wither. master_ritualist = { 71962, 387165, 1 }, -- Ritual of Ruin requires $s1 less Soul Shards spent. mayhem = { 71979, 387506, 1 }, -- Your single target spells have a $s1% chance to apply $?a200546[Bane of Havoc below][Havoc to] a nearby enemy for ${$s3/1000}.1 sec.; $?a200546[$@spellicon200546 $@spellname200546; Curses the ground with a demonic bane, causing all of your single target spells to also strike targets marked with the bane for $80240s1% of the damage dealt. Lasts ${$s3/1000}.1 sec.][$@spellicon80240 $@spellname80240; Marks a target with Havoc for ${$s3/1000}.1 sec, causing your single target spells to also strike the Havoc victim for $80240s1% of the damage dealt.] power_overwhelming = { 71965, 387279, 1 }, -- Consuming Soul Shards increases your Mastery by ${$s2/10}.1% for $387283d for each shard spent. Gaining a stack does not refresh the duration. pyrogenics = { 71975, 387095, 1 }, -- Enemies affected by your Rain of Fire take $s1% increased damage from your Fire spells. raging_demonfire = { 72063, 387166, 1 }, -- Channel Demonfire fires an additional $s1 bolts. Each bolt increases the remaining duration of $?a445465[Wither][Immolate] on all targets hit by ${$s2/1000}.1 sec. rain_of_chaos = { 71960, 266086, 1 }, -- While your initial Infernal is active, every Soul Shard you spend has a $s1% chance to summon an additional Infernal that lasts $335236d. rain_of_fire = { 72069, 5740 , 1 }, -- Calls down a rain of hellfire, dealing ${$42223m1*8} Fire damage over $d to enemies in the area. reverse_entropy = { 71980, 205148, 1 }, -- Your spells have a chance to grant you $266030s1% Haste for $266030d. ritual_of_ruin = { 71970, 387156, 1 }, -- Every $s1 Soul Shards spent grants Ritual of Ruin, making your next Chaos Bolt or Rain of Fire consume no Soul Shards and have its cast time reduced by $387157s3%. roaring_blaze = { 72065, 205184, 1 }, -- Conflagrate increases your $?s6353[Soul Fire, ][]$?s196447[Channel Demonfire, ][]$?a445465[Wither][Immolate], Incinerate, and Conflagrate damage to the target by $265931s1% for $265931d. rolling_havoc = { 71961, 387569, 1 }, -- Each time your spells duplicate from Havoc, gain $s1% increased damage for $387570d. Stacks up to $387570U times. ruin = { 71967, 387103, 1 }, -- Increases the critical strike damage of your Destruction spells by $s1%. ruination = { 94830, 428522, 1 }, -- [434635] Call down a demon-infested meteor from the depths of the Twisting Nether, dealing $434636s1 Chaos damage on impact to all enemies within $434636a1 yds of the target$?s137046[ and summoning $433885s3 Diabolic Imp.; Damage is further increased by your critical strike chance and is reduced beyond $s2 targets.][ and summoning $433885s2 Wild Imps.; Damage is reduced beyond $s2 targets.] scalding_flames = { 71973, 388832, 1 }, -- Increases the damage of $?a445465[Wither][Immolate] by $s1% and its duration by ${$s3/1000} sec. secrets_of_the_coven = { 94826, 428518, 1 }, -- [434506] Hurl a bolt enveloped in the infernal flames of the abyss, dealing $s1 Fire damage to your enemy target and generating ${$s2/10} Soul Shards. seeds_of_their_demise = { 94829, 440055, 1 }, -- After Wither reaches $s1 stacks or when its host reaches $s2% health, Wither deals $445736s1 Shadowflame damage to its host every $445731t1 sec until 1 stack remains.; When Blackened Soul deals damage, you have a chance to gain $?s137046[$s4 stacks of Flashpoint][Tormented Crescendo]. shadowburn = { 72060, 17877 , 1 }, -- Blasts a target for $s1 Shadowflame damage, gaining $s3% critical strike chance on targets that have $s4% or less health.; Restores ${$245731s1/10} Soul Shard and refunds a charge if the target dies within $d. soul_fire = { 71978, 6353 , 1 }, -- Burns the enemy's soul, dealing $s1 Fire damage and applying $?a445465[Wither][Immolate].; Generates ${$281490s1/10} Soul Shard. souletched_circles = { 94836, 428911, 1 }, -- You always gain the benefit of Soulburn when casting Demonic Circle: Teleport, increasing your movement speed by 50% and making you immune to snares and roots for 6 sec. summon_infernal = { 71985, 1122 , 1 }, -- Summons an Infernal from the Twisting Nether, impacting for $22703s1 Fire damage and stunning all enemies in the area for $22703d.; The Infernal will serve you for $111685d, dealing ${$20153s1*(100+$137046s3)/100} damage to all nearby enemies every $19483t1 sec and generating $264365s1 Soul Shard Fragment every $264364t1 sec. summoners_embrace = { 71971, 453105, 1 }, -- Increases the damage dealt by your spells and your demon by $s1%. touch_of_rancora = { 94856, 429893, 1 }, -- Demonic Art increases the damage of your next $?s137044[Hand of Gul'dan][Chaos Bolt, Rain of Fire, or Shadowburn] by $s1% and reduces its cast time by $s2%. unstable_rifts = { 102427, 457064, 1 }, -- Bolts from Dimensional Rift now deal $s1% of damage dealt to nearby enemies as Fire damage. wither = { 94840, 445468, 1 }, -- [445468] Bestows a vile malediction upon the target, burning the sinew and muscle of its host, dealing $s1 Shadowflame damage immediately and an additional $445474o1 Shadowflame damage over $445474d.$?s137046[; Periodic damage generates 1 Soul Shard Fragment and has a $s2% chance to generate an additional 1 on critical strikes.; Replaces Immolate.][; Replaces Corruption.] xalans_cruelty = { 94845, 440040, 1 }, -- Shadow damage dealt by your spells and abilities is increased by $s3% and your Shadow spells gain $s1% more critical strike chance from all sources. xalans_ferocity = { 94853, 440044, 1 }, -- Fire damage dealt by your spells and abilities is increased by $s1% and your Fire spells gain $s4% more critical strike chance from all sources. zevrims_resilience = { 94835, 440065, 1 }, -- Dark Pact heals you for $108416s5 every $108416t5 sec while active. } ) -- PvP Talents spec:RegisterPvpTalents( { bane_of_havoc = 164 , -- (461917) [200546] $?a387506[Your single target spells have a $387506s1% chance to curse][Curses] the ground with a demonic bane, causing all of your single target spells to also strike targets marked with the bane for $80240s1% of the damage dealt. Lasts $?a387506[${$387506s3/1000} sec][$d]. bonds_of_fel = 5401, -- (353753) Encircle enemy players with Bonds of Fel. If any affected player leaves the $a2 yd radius they explode, dealing $353813s1 Fire damage split amongst all nearby enemies. call_observer = 5544, -- (201996) Summons a demonic Observer to keep a watchful eye over the area for $d.; Anytime an enemy within $m2 yards casts a harmful magical spell, the Observer will deal up to $212529s2% of the target's maximum health in Shadow damage. fel_fissure = 157 , -- (200586) Chaos Bolt creates a $m1 yd wide eruption of Felfire under the target, reducing movement speed by $200587m1% and reducing all healing received by $200587m2% on all enemies within the fissure. Lasts $212269d. gateway_mastery = 5382, -- (248855) Increases the range of your Demonic Gateway by $s1 yards, and reduces the cast time by $s2%. Reduces the time between how often players can take your Demonic Gateway by $s3 sec. impish_instincts = 5580, -- (409835) Taking direct Physical damage reduces the cooldown of Demonic Circle by ${$s1/-1000} sec.; Cannot occur more than once every $proccooldown sec. nether_ward = 3508, -- (212295) Surrounds the caster with a shield that lasts $d, reflecting all harmful spells cast on you. shadow_rift = 5393, -- (353294) Conjure a Shadow Rift at the target location lasting $d. Enemy players within the rift when it expires are teleported to your Demonic Circle.; Must be within $s2 yds of your Demonic Circle to cast. soul_rip = 5607, -- (410598) Fracture the soul of up to $i target players within $r yds into the shadows, reducing their damage done by $s1% and healing received by $s3% for $d. Souls are fractured up to $410615a yds from the player's location.; Players can retrieve their souls to remove this effect. } ) -- Auras spec:RegisterAuras( { active_havoc = { duration = function () return class.auras.havoc.duration end, max_stack = 1, generate = function( ah ) ah.duration = class.auras.havoc.duration if pvptalent.bane_of_havoc.enabled and debuff.bane_of_havoc.up and query_time - last_havoc < ah.duration then ah.count = 1 ah.applied = last_havoc ah.expires = last_havoc + ah.duration ah.caster = "player" return elseif not pvptalent.bane_of_havoc.enabled and active_dot.havoc > 0 and query_time - last_havoc < ah.duration then ah.count = 1 ah.applied = last_havoc ah.expires = last_havoc + ah.duration ah.caster = "player" return end ah.count = 0 ah.applied = 0 ah.expires = 0 ah.caster = "nobody" end }, -- Going to need to keep an eye on this. active_dot.bane_of_havoc won't work due to no SPELL_AURA_APPLIED event. bane_of_havoc = { id = 200548, duration = function () return level > 53 and 12 or 10 end, max_stack = 1, generate = function( boh ) boh.applied = action.bane_of_havoc.lastCast boh.expires = boh.applied > 0 and ( boh.applied + boh.duration ) or 0 end, }, accrued_vitality = { id = 386614, duration = 10, max_stack = 1, copy = 339298 }, -- Talent: Next Curse of Tongues, Curse of Exhaustion or Curse of Weakness is amplified. -- https://wowhead.com/beta/spell=328774 amplify_curse = { id = 328774, duration = 15, max_stack = 1 }, -- Time between attacks increased $w1% and casting speed increased by $w2%. aura_of_enfeeblement = { id = 449587, duration = 8.0, max_stack = 1, }, backdraft = { id = 117828, duration = 10, type = "Magic", max_stack = 2, }, -- Talent: Your next Incinerate is instant cast. -- https://wowhead.com/beta/spell=387385 backlash = { id = 387385, duration = 15, type = "Magic", max_stack = 1 }, -- Talent: Invulnerable, but unable to act. -- https://wowhead.com/beta/spell=710 banish = { id = 710, duration = 30, mechanic = "banish", type = "Magic", max_stack = 1 }, blasphemy = { id = 367680, duration = 8, max_stack = 1, }, -- Talent: Incinerate damage increased by $w1%. -- https://wowhead.com/beta/spell=387154 burn_to_ashes = { id = 387154, duration = 20, max_stack = 6 }, -- Talent: Movement speed increased by $s1%. -- https://wowhead.com/beta/spell=111400 burning_rush = { id = 111400, duration = 3600, max_stack = 1 }, -- Talent: -- https://wowhead.com/beta/spell=196447 channel_demonfire = { id = 196447, duration = function() return 3 * ( 1 - 0.35 * talent.demonfire_mastery.rank ) * haste end, tick_time = function() return 3 * ( 1 - 0.35 * talent.demonfire_mastery.rank ) * ( 1 - 0.12 * talent.raging_demonfire.rank ) * haste end, type = "Magic", max_stack = 1 }, -- Damage taken from you and your pets is increased by $s1%. cloven_soul = { id = 434424, duration = 15.0, max_stack = 1 }, conflagrate = { id = 265931, duration = 8, type = "Magic", max_stack = 1, copy = "roaring_blaze" }, conflagration_of_chaos_cf = { id = 387109, duration = 20, max_stack = 1 }, conflagration_of_chaos_sb = { id = 387110, duration = 20, max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 sec. -- https://wowhead.com/beta/spell=146739 corruption = { id = 146739, duration = 14, tick_time = 2, type = "Magic", max_stack = 1 }, crashing_chaos = { id = 417282, duration = 45, max_stack = 8, }, -- Movement speed slowed by $w1%. -- https://wowhead.com/beta/spell=334275 curse_of_exhaustion = { id = 334275, duration = 12, mechanic = "snare", type = "Magic", max_stack = 1 }, -- Speaking Demonic increasing casting time by $w1%. -- https://wowhead.com/beta/spell=1714 curse_of_tongues = { id = 1714, duration = 60, type = "Magic", max_stack = 1 }, -- Time between attacks increased by $w1%. $?e1[Chance to critically strike reduced by $w2%.][] -- https://wowhead.com/beta/spell=702 curse_of_weakness = { id = 702, duration = 120, type = "Magic", max_stack = 1 }, -- Talent: Absorbs $w1 damage. -- https://wowhead.com/beta/spell=108416 dark_pact = { id = 108416, duration = 20, max_stack = 1 }, -- Damage of $?s137046[Incinerate]?s198590[Drain Soul]?a137044&!s137046[Demonbolt][Shadow Bolt] increased by $w2%. -- https://wowhead.com/beta/spell=325299 decimating_bolt = { id = 325299, duration = 45, type = "Magic", max_stack = 3 }, -- The cast time of your next Soul Fire is reduced by $s1%. decimation = { id = 457555, duration = 10.0, max_stack = 1, }, -- [428524] Your next Soul Shard spent summons an Overlord that unleashes a devastating attack. diabolic_ritual_overlord = { id = 431944, duration = 20.0, max_stack = 1, }, diabolic_ritual_mother_of_chaos = { id = 432815, duration = 20.0, max_stack = 1, }, diabolic_ritual_pit_lord = { id = 432816, duration = 20.0, max_stack = 1, }, diabolic_ritual = { alias = { "diabolic_ritual_overlord", "diabolic_ritual_mother_of_chaos", "diabolic_ritual_pit_lord" }, aliasMode = "first", aliasType = "buff" }, -- Talent: -- https://wowhead.com/beta/spell=268358 demonic_circle = { id = 268358, duration = 3600, type = "Magic", max_stack = 1 }, -- Talent: Attack speed increased by $w1%. -- https://wowhead.com/beta/spell=386861 demonic_inspiration = { id = 386861, duration = 8, max_stack = 1, generate = function( t ) local name, _, count, _, duration, expires, caster = FindUnitBuffByID( "pet", 386861 ) if name then t.name = name t.count = count t.expires = expires t.applied = expires - duration t.caster = caster return end t.count = 0 t.expires = 0 t.applied = 0 t.caster = "nobody" end, }, -- Movement speed increased by $w1%. -- https://wowhead.com/beta/spell=339412 demonic_momentum = { id = 339412, duration = 5, max_stack = 1 }, -- Damage done increased by $w2%. -- https://wowhead.com/beta/spell=171982 demonic_synergy = { id = 171982, duration = 15, max_stack = 1 }, -- Doomed to take $w1 Shadow damage. -- https://wowhead.com/beta/spell=603 doom = { id = 603, duration = 20, tick_time = 20, type = "Magic", max_stack = 1 }, -- Suffering $s1 Shadow damage every $t1 seconds. Restoring health to the Warlock. -- https://wowhead.com/beta/spell=234153 drain_life = { id = 234153, duration = function () return 5 * haste * ( legendary.claw_of_endereth.enabled and 0.5 or 1 ) end, tick_time = function () return haste * ( legendary.claw_of_endereth.enabled and 0.5 or 1 ) end, type = "Magic", max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 seconds. -- https://wowhead.com/beta/spell=198590 drain_soul = { id = 198590, duration = 5, tick_time = 1, type = "Magic", max_stack = 1 }, -- Healing for $m1% of maximum health every $t1 sec.; Spell casts are not delayed by taking damage. empowered_healthstone = { id = 262080, duration = 6.0, max_stack = 1, }, -- Talent: Damage taken from the Warlock increased by $s1%. -- https://wowhead.com/beta/spell=196414 eradication = { id = 196414, duration = 7, max_stack = 1 }, -- Controlling Eye of Kilrogg. Detecting Invisibility. -- https://wowhead.com/beta/spell=126 eye_of_kilrogg = { id = 126, duration = 45, type = "Magic", max_stack = 1 }, -- $w1 damage is being delayed every $387846t1 sec.; Damage Remaining: $w2 fel_armor = { id = 387847, duration = 5, max_stack = 1, copy = 387846 }, -- Talent: Imp, Voidwalker, Succubus, Felhunter, or Felguard casting time reduced by $/1000;S1 sec. -- https://wowhead.com/beta/spell=333889 fel_domination = { id = 333889, duration = 15, type = "Magic", max_stack = 1 }, -- Talent: Haste increased by $w1%. -- https://wowhead.com/beta/spell=387263 flashpoint = { id = 387263, duration = 10, max_stack = 3 }, -- Talent: Sacrificed your demon pet to gain its command demon ability. Your spells sometimes deal additional Shadow damage. -- https://wowhead.com/beta/spell=196099 grimoire_of_sacrifice = { id = 196099, duration = 3600, max_stack = 1 }, -- Taking $s2% increased damage from the Warlock. Haunt's cooldown will be reset on death. -- https://wowhead.com/beta/spell=48181 haunt = { id = 48181, duration = 18, type = "Magic", max_stack = 1 }, -- Talent: Spells cast by the Warlock also hit this target for $s1% of normal initial damage. -- https://wowhead.com/beta/spell=80240 havoc = { id = 80240, duration = function() if talent.mayhem.enabled then return 5 end return talent.pandemonium.enabled and 15 or 12 end, type = "Magic", max_stack = 1 }, -- Transferring health. -- https://wowhead.com/beta/spell=755 health_funnel = { id = 755, duration = 5, tick_time = 1, type = "Magic", max_stack = 1 }, -- Talent: Disoriented. -- https://wowhead.com/beta/spell=5484 howl_of_terror = { id = 5484, duration = 20, mechanic = "flee", type = "Magic", max_stack = 1 }, -- Suffering $w1 Fire damage every $t1 sec.$?a339892[ Damage taken by Chaos Bolt and Incinerate increased by $w2%.][] -- https://wowhead.com/beta/spell=157736 immolate = { id = 157736, duration = function() return ( 18 + 3 * talent.scalding_flames.rank ) * haste end, tick_time = function() return 3 * haste end, type = "Magic", max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 sec. -- https://wowhead.com/beta/spell=322170 impending_catastrophe = { id = 322170, duration = 12, tick_time = 2, type = "Magic", max_stack = 1 }, -- Every $s1 Soul Shards spent grants Ritual of Ruin, making your next Chaos Bolt or Rain of Fire consume no Soul Shards and have its cast time reduced by $387157s3%. -- https://wowhead.com/beta/spell=387158 impending_ruin = { id = 387158, duration = 3600, max_stack = 15 }, infernal = { duration = 30, generate = function( inf ) if pet.infernal.alive then inf.count = 1 inf.applied = pet.infernal.expires - 30 inf.expires = pet.infernal.expires inf.caster = "player" return end inf.count = 0 inf.applied = 0 inf.expires = 0 inf.caster = "nobody" end, }, infernal_awakening = { id = 22703, duration = 2, max_stack = 1, }, -- Soul Leech can absorb an additional $s1% of your maximum health. infernal_bulwark = { id = 434561, duration = 8.0, max_stack = 1, }, -- Healing for ${$s1*($d/$t1)}% of your maximum health over $d. infernal_vitality = { id = 434559, duration = 10.0, max_stack = 1, }, -- Inflicts Shadow damage. laserbeam = { id = 212529, duration = 0.0, max_stack = 1, }, -- Talent: Leech increased by $w1%. -- https://wowhead.com/beta/spell=386647 lifeblood = { id = 386647, duration = 20, max_stack = 1 }, -- Haste increased by $w1% and $?s324536[Malefic Rapture grants $w2 additional stack of Wither to targets affected by Unstable Affliction.][Chaos Bolt grants $w3 additional stack of Wither.]; All of your active Withers are acute. malevolence = { id = 442726, duration = 20.0, max_stack = 1, }, -- Talent: Incapacitated. -- https://wowhead.com/beta/spell=6789 mortal_coil = { id = 6789, duration = 3, type = "Magic", max_stack = 1 }, -- Reflecting all spells. -- https://wowhead.com/beta/spell=212295 nether_ward = { id = 212295, duration = 3, type = "Magic", max_stack = 1 }, -- Movement speed increased by $s3%. -- https://wowhead.com/beta/spell=30151 pursuit = { id = 30151, duration = 8, max_stack = 1 }, -- Talent: Fire damage taken increased by $s1%. -- https://wowhead.com/beta/spell=387096 pyrogenics = { id = 387096, duration = 2, type = "Magic", max_stack = 1 }, rain_of_chaos = { id = 266087, duration = 30, max_stack = 1 }, -- Talent: $42223s1 Fire damage every $5740t2 sec. -- https://wowhead.com/beta/spell=5740 rain_of_fire = { id = 5740, duration = 8, type = "Magic", max_stack = 1 }, -- Talent: Haste increased by $s1%. -- https://wowhead.com/beta/spell=266030 reverse_entropy = { id = 266030, duration = 8, type = "Magic", max_stack = 1 }, -- Your next Chaos Bolt or Rain of Fire cost no Soul Shards and has its cast time reduced by 50%. ritual_of_ruin = { id = 387157, duration = 30, max_stack = 1 }, -- -- https://wowhead.com/beta/spell=698 ritual_of_summoning = { id = 698, duration = 120, type = "Magic", max_stack = 1 }, -- Talent: Damage increased by $W1%. -- https://wowhead.com/beta/spell=387570 rolling_havoc = { id = 387570, duration = 6, max_stack = 5 }, -- Covenant: Suffering $w2 Arcane damage every $t2 sec. -- https://wowhead.com/beta/spell=312321 scouring_tithe = { id = 312321, duration = 18, type = "Magic", max_stack = 1 }, -- Disoriented. -- https://wowhead.com/beta/spell=6358 seduction = { id = 6358, duration = 30, mechanic = "sleep", type = "Magic", max_stack = 1 }, -- Embeded with a demon seed that will soon explode, dealing Shadow damage to the caster's enemies within $27285A1 yards, and applying Corruption to them. The seed will detonate early if the target is hit by other detonations, or takes $w3 damage from your spells. -- https://wowhead.com/beta/spell=27243 seed_of_corruption = { id = 27243, duration = 12, type = "Magic", max_stack = 1 }, -- Maximum health increased by $s1%. -- https://wowhead.com/beta/spell=17767 shadow_bulwark = { id = 17767, duration = 20, type = "Magic", max_stack = 1 }, -- Talent: If the target dies and yields experience or honor, Shadowburn restores ${$245731s1/10} Soul Shard and refunds a charge. -- https://wowhead.com/beta/spell=17877 shadowburn = { id = 17877, duration = 5, type = "Magic", max_stack = 1 }, -- Talent: Slowed by $w1% for $d. -- https://wowhead.com/beta/spell=384069 shadowflame = { id = 384069, duration = 6, type = "Magic", max_stack = 1 }, -- Talent: Stunned. -- https://wowhead.com/beta/spell=30283 shadowfury = { id = 30283, duration = 3, mechanic = "stun", type = "Magic", max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 sec and siphoning life to the casting Warlock. -- https://wowhead.com/beta/spell=63106 siphon_life = { id = 63106, duration = 15, type = "Magic", max_stack = 1 }, -- Absorbs $w1 damage. -- https://wowhead.com/beta/spell=108366 soul_leech = { id = 108366, duration = 15, max_stack = 1 }, -- Talent: $s1% of all damage taken is split with the Warlock's summoned demon. The Warlock is healed for $s2% and your demon is healed for $s3% of all absorption granted by Soul Leech. -- https://wowhead.com/beta/spell=108446 soul_link = { id = 108446, duration = 3600, type = "Magic", max_stack = 1 }, -- Suffering $s2 Nature damage every $t2 sec. -- https://wowhead.com/beta/spell=386997 soul_rot = { id = 386997, duration = 8, type = "Magic", max_stack = 1, copy = 325640 }, -- -- https://wowhead.com/beta/spell=246985 soul_shards = { id = 246985, duration = 3600, max_stack = 1 }, -- Talent: Consumes a Soul Shard, unlocking the hidden power of your spells. |cFFFFFFFFDemonic Circle: Teleport|r: Increases your movement speed by $387633s1% and makes you immune to snares and roots for $387633d. |cFFFFFFFFDemonic Gateway|r: Can be cast instantly. |cFFFFFFFFDrain Life|r: Gain an absorb shield equal to the amount of healing done for $387630d. This shield cannot exceed $387630s1% of your maximum health. |cFFFFFFFFHealth Funnel|r: Restores $387626s1% more health and reduces the damage taken by your pet by ${$abs($387641s1)}% for $387641d. |cFFFFFFFFHealthstone|r: Increases the healing of your Healthstone by $387626s2% and increases your maximum health by $387636s1% for $387636d. -- https://wowhead.com/beta/spell=387626 soulburn = { id = 387626, duration = 3600, max_stack = 1 }, soulburn_demonic_circle = { id = 387633, duration = 8, max_stack = 1, }, soulburn_drain_life = { id = 394810, duration = 30, max_stack = 1, }, soulburn_health_funnel = { id = 387641, duration = 10, max_stack = 1, }, soulburn_healthstone = { id = 387636, duration = 12, max_stack = 1, }, -- Soul stored by $@auracaster. -- https://wowhead.com/beta/spell=20707 soulstone = { id = 20707, duration = 900, max_stack = 1 }, -- $@auracaster's subject. -- https://wowhead.com/beta/spell=1098 subjugate_demon = { id = 1098, duration = 300, mechanic = "charm", type = "Magic", max_stack = 1 }, -- -- https://wowhead.com/beta/spell=101508 the_codex_of_xerrath = { id = 101508, duration = 3600, max_stack = 1 }, tormented_souls = { duration = 3600, max_stack = 20, generate = function( t ) local n = GetSpellCount( 386256 ) if n > 0 then t.applied = query_time t.duration = 3600 t.expires = t.applied + 3600 t.count = n t.caster = "player" return end t.applied = 0 t.duration = 0 t.expires = 0 t.count = 0 t.caster = "nobody" end, copy = "tormented_soul" }, -- Damage dealt by your demons increased by $w1%. -- https://wowhead.com/beta/spell=339784 tyrants_soul = { id = 339784, duration = 15, max_stack = 1 }, -- Dealing $w1 Shadowflame damage every $t1 sec for $d. -- https://wowhead.com/beta/spell=273526 umbral_blaze = { id = 273526, duration = 6, tick_time = 2, type = "Magic", max_stack = 1 }, unending_breath = { id = 5697, duration = 600, max_stack = 1, }, -- Damage taken reduced by $w3% Immune to interrupt and silence effects. -- https://wowhead.com/beta/spell=104773 unending_resolve = { id = 104773, duration = 8, max_stack = 1 }, -- Suffering $w2 Shadow damage every $t2 sec. If dispelled, will cause ${$w2*$s1/100} damage to the dispeller and silence them for $196364d. -- https://wowhead.com/beta/spell=316099 unstable_affliction = { id = 316099, duration = 16, type = "Magic", max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 sec. -- https://wowhead.com/beta/spell=386931 vile_taint = { id = 386931, duration = 10, tick_time = 2, type = "Magic", max_stack = 1 }, -- Talent: Damage done increased by $w1%. -- https://wowhead.com/beta/spell=386865 wrathful_minion = { id = 386865, duration = 8, max_stack = 1, generate = function( t ) local name, _, count, _, duration, expires, caster = FindUnitBuffByID( "pet", 386865 ) if name then t.name = name t.count = count t.expires = expires t.applied = expires - duration t.caster = caster return end t.count = 0 t.expires = 0 t.applied = 0 t.caster = "nobody" end, }, -- Suffering $w1 Shadowflame damage every $t1 sec.$?a339892[ ; Damage taken by Chaos Bolt and Incinerate increased by $w2%.][] wither = { id = 445474, duration = function() return ( 18.0 + 3 * talent.scalding_flames.rank ) * ( 1 - 0.15 * talent.hatefury_rituals.rank ) end, tick_time = 2.0, pandemic = true, max_stack = 8, }, -- Azerite Powers chaos_shards = { id = 287660, duration = 2, max_stack = 1 }, -- Conduit combusting_engine = { id = 339986, duration = 30, max_stack = 1 }, -- Legendary odr_shawl_of_the_ymirjar = { id = 337164, duration = function () return class.auras.havoc.duration end, max_stack = 1 }, } ) spec:RegisterHook( "runHandler", function( a ) if talent.rolling_havoc.enabled and havoc_active and not debuff.havoc.up and action[ a ].startsCombat then addStack( "rolling_havoc" ) end end ) spec:RegisterHook( "spend", function( amt, resource ) if resource == "soul_shards" then if amt > 0 then if legendary.wilfreds_sigil_of_superior_summoning.enabled then reduceCooldown( "summon_infernal", amt * 1.5 ) end if talent.grand_warlocks_design.enabled then reduceCooldown( "summon_infernal", amt * 1.5 ) end if talent.power_overwhelming.enabled then addStack( "power_overwhelming", ( buff.power_overwhelming.up and buff.power_overwhelming.remains or nil ), amt ) end if talent.ritual_of_ruin.enabled then addStack( "impending_ruin", nil, amt ) if buff.impending_ruin.stack > 15 - ceil( 2.5 * talent.master_ritualist.rank ) then applyBuff( "ritual_of_ruin" ) removeBuff( "impending_ruin" ) end end elseif amt < 0 and floor( soul_shard ) < floor( soul_shard + amt ) then if talent.demonic_inspiration.enabled then applyBuff( "demonic_inspiration" ) end if talent.wrathful_minion.enabled then applyBuff( "wrathful_minion" ) end end end end ) local lastTarget local lastMayhem = 0 spec:RegisterHook( "COMBAT_LOG_EVENT_UNFILTERED", function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName ) if sourceGUID == GUID then if subtype == "SPELL_CAST_SUCCESS" and destGUID ~= nil and destGUID ~= "" then lastTarget = destGUID elseif state.talent.mayhem.enabled and subtype == "SPELL_AURA_APPLIED" and spellID == 80240 then lastMayhem = GetTime() end end end, false ) spec:RegisterStateExpr( "last_havoc", function () if talent.mayhem.enabled then return lastMayhem end return pvptalent.bane_of_havoc.enabled and action.bane_of_havoc.lastCast or action.havoc.lastCast end ) spec:RegisterStateExpr( "havoc_remains", function () return buff.active_havoc.remains end ) spec:RegisterStateExpr( "havoc_active", function () return buff.active_havoc.up end ) spec:RegisterHook( "TimeToReady", function( wait, action ) local ability = action and class.abilities[ action ] if ability and ability.spend and ability.spendType == "soul_shards" and ability.spend > soul_shard then wait = 3600 end return wait end ) spec:RegisterStateExpr( "soul_shard", function () return soul_shards.current end ) -- Tier 29 spec:RegisterGear( "tier29", 200336, 200338, 200333, 200335, 200337, 217212, 217214, 217215, 217211, 217213 ) spec:RegisterAura( "chaos_maelstrom", { id = 394679, duration = 10, max_stack = 1 } ) spec:RegisterGear( "tier30", 202534, 202533, 202532, 202536, 202531 ) spec:RegisterAura( "umbrafire_embers", { id = 409652, duration = 13, max_stack = 8 } ) spec:RegisterGear( "tier31", 207270, 207271, 207272, 207273, 207275 ) spec:RegisterAura( "searing_bolt", { id = 423886, duration = 10, max_stack = 1 } ) local SUMMON_DEMON_TEXT spec:RegisterHook( "reset_precast", function () last_havoc = nil soul_shards.actual = nil class.abilities.summon_pet = class.abilities[ settings.default_pet ] if not SUMMON_DEMON_TEXT then SUMMON_DEMON_TEXT = GetSpellInfo( 180284 ) class.abilityList.summon_pet = "|T136082:0|t |cff00ccff[" .. ( SUMMON_DEMON_TEXT or "Summon Demon" ) .. "]|r" end for i = 1, 5 do local up, _, start, duration, id = GetTotemInfo( i ) if up and id == 136219 then summonPet( "infernal", start + duration - now ) break end end if pvptalent.bane_of_havoc.enabled then class.abilities.havoc = class.abilities.bane_of_havoc else class.abilities.havoc = class.abilities.real_havoc end end ) spec:RegisterCycle( function () if active_enemies == 1 then return end -- For Havoc, we want to cast it on a different target. if this_action == "havoc" and class.abilities.havoc.key == "havoc" then return "cycle" end if ( debuff.havoc.up or FindUnitDebuffByID( "target", 80240, "PLAYER" ) ) and not legendary.odr_shawl_of_the_ymirjar.enabled then return "cycle" end end ) local Glyphed = IsSpellKnownOrOverridesKnown -- Fel Imp 58959 spec:RegisterPet( "imp", function() return Glyphed( 112866 ) and 58959 or 416 end, "summon_imp", 3600 ) -- Voidlord 58960 spec:RegisterPet( "voidwalker", function() return Glyphed( 112867 ) and 58960 or 1860 end, "summon_voidwalker", 3600 ) -- Observer 58964 spec:RegisterPet( "felhunter", function() return Glyphed( 112869 ) and 58964 or 417 end, "summon_felhunter", 3600 ) -- Fel Succubus 120526 -- Shadow Succubus 120527 -- Shivarra 58963 spec:RegisterPet( "sayaad", function() if Glyphed( 240263 ) then return 120526 elseif Glyphed( 240266 ) then return 120527 elseif Glyphed( 112868 ) then return 58963 elseif Glyphed( 365349 ) then return 184600 end return 1863 end, "summon_sayaad", 3600, "incubus", "succubus" ) -- Wrathguard 58965 spec:RegisterPet( "felguard", function() return Glyphed( 112870 ) and 58965 or 17252 end, "summon_felguard", 3600 ) -- Abilities spec:RegisterAbilities( { -- Calls forth a cataclysm at the target location, dealing $s1 Shadowflame damage to all enemies within $A1 yards and afflicting them with $?a445465[Wither][Immolate]. cataclysm = { id = 152108, cast = 2, cooldown = 30, gcd = "spell", school = "shadowflame", spend = 0.01, spendType = "mana", talent = "cataclysm", startsCombat = true, toggle = function() if active_enemies == 1 then return "interrupts" end end, handler = function () local applies = talent.wither.enabled and "wither" or "immolate" applyDebuff( "target", applies ) active_dot[ applies ] = max( active_dot[ applies ], true_active_enemies ) removeDebuff( "target", "combusting_engine" ) end, }, -- Launches $s1 bolts of felfire over $d at random targets afflicted by your $?a445465[Wither][Immolate] within $196449A1 yds. Each bolt deals $196448s1 Fire damage to the target and $196448s2 Fire damage to nearby enemies. channel_demonfire = { id = 196447, cast = function() return class.auras.channel_demonfire.duration end, channeled = true, cooldown = 25, gcd = "spell", school = "fire", spend = 0.015, spendType = "mana", talent = "channel_demonfire", startsCombat = true, usable = function () return active_dot[ talent.wither.enabled and "wither" or "immolate" ] > 0 end, start = function() removeBuff( "umbrafire_embers" ) end -- With raging_demonfire, this will extend Immolates but it's not worth modeling for the addon ( 0.2s * 17-20 ticks ). }, -- Talent: Unleashes a devastating blast of chaos, dealing a critical strike for 8,867 Chaos damage. Damage is further increased by your critical strike chance. chaos_bolt = { id = 116858, cast = function () return ( 3 - 0.5 * talent.improved_chaos_bolt.rank ) * ( buff.ritual_of_ruin.up and 0.5 or 1 ) * ( buff.backdraft.up and 0.7 or 1 ) * haste end, cooldown = 0, gcd = "spell", school = "chromatic", spend = function () if buff.ritual_of_ruin.up then return 0 end return 2 end, spendType = "soul_shards", talent = "chaos_bolt", startsCombat = true, cycle = function () return talent.eradication.enabled and "eradication" or nil end, velocity = 16, handler = function () removeStack( "crashing_chaos" ) if buff.ritual_of_ruin.up then removeBuff( "ritual_of_ruin" ) if talent.avatar_of_destruction.enabled then applyBuff( "blasphemy" ) end else removeStack( "backdraft" ) end if debuff.wither.up then applyDebuff( "target", "wither", nil, debuff.wither.stack + 1 + ( buff.malevolence.up and 1 or 0 ) ) end if talent.burn_to_ashes.enabled then addStack( "burn_to_ashes", nil, 2 ) end if talent.eradication.enabled then applyDebuff( "target", "eradication" ) active_dot.eradication = max( active_dot.eradication, active_dot.bane_of_havoc ) end if talent.internal_combustion.enabled and debuff.immolate.up then if debuff.immolate.remains <= 5 then removeDebuff( "target", "immolate" ) else debuff.immolate.expires = debuff.immolate.expires - 5 end end end, impact = function() end, }, --[[ Commands your demon to perform its most powerful ability. This spell will transform based on your active pet. Felhunter: Devour Magic Voidwalker: Shadow Bulwark Incubus/Succubus: Seduction Imp: Singe Magic command_demon = { id = 119898, cast = 0, cooldown = 0, gcd = "off", school = "physical", startsCombat = false, handler = function () end, }, ]] -- Talent: Triggers an explosion on the target, dealing 3,389 Fire damage. Reduces the cast time of your next Incinerate or Chaos Bolt by 30% for 10 sec. Generates 5 Soul Shard Fragments. conflagrate = { id = 17962, cast = 0, charges = function() return talent.improved_conflagrate.enabled and 3 or 2 end, cooldown = function() return talent.explosive_potential.enabled and 11 or 13 end, recharge = function() return talent.explosive_potential.enabled and 11 or 13 end, gcd = "spell", school = "fire", spend = 0.01, spendType = "mana", talent = "conflagrate", startsCombat = true, cycle = function () return talent.roaring_blaze.enabled and "conflagrate" or nil end, handler = function () gain( 0.5, "soul_shards" ) addStack( "backdraft" ) removeBuff( "conflagration_of_chaos_cf" ) if talent.decimation.enabled and target.health_pct < 50 then reduceCooldown( "soulfire", 5 ) end if talent.roaring_blaze.enabled then applyDebuff( "target", "conflagrate" ) active_dot.conflagrate = max( active_dot.conflagrate, active_dot.bane_of_havoc ) end if conduit.combusting_engine.enabled then applyDebuff( "target", "combusting_engine" ) end end, }, -- Corrupts the target, causing $s3 Shadow damage and $?a196103[$146739s1 Shadow damage every $146739t1 sec.][an additional $146739o1 Shadow damage over $146739d.] corruption = { id = 172, cast = 2.0, cooldown = 0.0, gcd = "spell", spend = 0.010, spendType = 'mana', startsCombat = true, handler = function() applyDebuff( "target", "corruption" ) end, -- Effects: -- #0: { 'type': TRIGGER_SPELL, 'subtype': NONE, 'trigger_spell': 146739, 'target': TARGET_UNIT_TARGET_ENEMY, } -- #1: { 'type': DUMMY, 'subtype': NONE, } -- #2: { 'type': SCHOOL_DAMAGE, 'subtype': NONE, 'sp_bonus': 0.138, 'pvp_multiplier': 1.25, 'variance': 0.05, 'target': TARGET_UNIT_TARGET_ENEMY, } -- Affected by: -- destruction_warlock[137046] #12: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 348, 'target': TARGET_UNIT_CASTER, } -- mark_of_perotharn[440045] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': SHOULD_NEVER_SEE_15, } -- xalans_cruelty[440040] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': CRIT_CHANCE, } -- xalans_cruelty[440040] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- xalans_cruelty[440040] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- absolute_corruption[196103] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 15.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- wither[445465] #0: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 445468, 'value1': 3, 'target': TARGET_UNIT_CASTER, } }, --[[ Creates a Healthstone that can be consumed to restore 25% health. When you use a Healthstone, gain 7% Leech for 20 sec. create_healthstone = { id = 6201, cast = 3, cooldown = 0, gcd = "spell", school = "shadow", spend = 0.02, spendType = "mana", startsCombat = false, handler = function () end, }, ]] -- Talent: Rips a hole in time and space, opening a random portal that damages your target: Shadowy Tear Deals 15,954 Shadow damage over 14 sec. Unstable Tear Deals 13,709 Chaos damage over 6 sec. Chaos Tear Fires a Chaos Bolt, dealing 4,524 Chaos damage. This Chaos Bolt always critically strikes and your critical strike chance increases its damage. Generates 3 Soul Shard Fragments. dimensional_rift = { id = 387976, cast = 0, charges = 3, cooldown = 45, recharge = 45, gcd = "spell", school = "chaos", spend = -0.3, spendType = "soul_shards", talent = "dimensional_rift", startsCombat = true, }, --[[ Summons an Eye of Kilrogg and binds your vision to it. The eye is stealthed and moves quickly but is very fragile. eye_of_kilrogg = { id = 126, cast = 2, cooldown = 0, gcd = "spell", school = "shadow", spend = 0.03, spendType = "mana", startsCombat = false, handler = function () applyBuff( "eye_of_kilrogg" ) end, }, ]] -- Talent: Sacrifices your demon pet for power, gaining its command demon ability, and causing your spells to sometimes also deal 1,678 additional Shadow damage. Lasts 1 |4hour:hrs; or until you summon a demon pet. grimoire_of_sacrifice = { id = 108503, cast = 0, cooldown = 30, gcd = "spell", school = "shadow", talent = "grimoire_of_sacrifice", startsCombat = false, essential = true, nobuff = "grimoire_of_sacrifice", usable = function () return pet.active, "requires a pet to sacrifice" end, handler = function () if pet.felhunter.alive then dismissPet( "felhunter" ) elseif pet.imp.alive then dismissPet( "imp" ) elseif pet.succubus.alive then dismissPet( "succubus" ) elseif pet.voidawalker.alive then dismissPet( "voidwalker" ) end applyBuff( "grimoire_of_sacrifice" ) end, }, -- Talent: Marks a target with Havoc for 15 sec, causing your single target spells to also strike the Havoc victim for 60% of normal initial damage. havoc = { id = 80240, cast = 0, cooldown = 30, gcd = "spell", school = "shadow", spend = 0.02, spendType = "mana", talent = "havoc", startsCombat = true, indicator = function () return active_enemies > 1 and ( lastTarget == "lastTarget" or target.unit == lastTarget ) and "cycle" or nil end, cycle = "havoc", bind = "bane_of_havoc", usable = function() if pvptalent.bane_of_havoc.enabled then return false, "pvptalent bane_of_havoc enabled" end return talent.cry_havoc.enabled or active_enemies > 1, "requires cry_havoc or multiple targets" end, handler = function () if class.abilities.havoc.indicator == "cycle" then active_dot.havoc = active_dot.havoc + 1 if legendary.odr_shawl_of_the_ymirjar.enabled then active_dot.odr_shawl_of_the_ymirjar = 1 end else applyDebuff( "target", "havoc" ) if legendary.odr_shawl_of_the_ymirjar.enabled then applyDebuff( "target", "odr_shawl_of_the_ymirjar" ) end end applyBuff( "active_havoc" ) end, copy = "real_havoc", }, bane_of_havoc = { id = 200546, cast = 0, cooldown = 45, gcd = "spell", startsCombat = true, cycle = "DoNotCycle", bind = "havoc", pvptalent = "bane_of_havoc", usable = function () return active_enemies > 1, "requires multiple targets" end, handler = function () applyDebuff( "target", "bane_of_havoc" ) active_dot.bane_of_havoc = active_enemies applyBuff( "active_havoc" ) end, }, -- Talent: Let loose a terrifying howl, causing 5 enemies within 10 yds to flee in fear, disorienting them for 20 sec. Damage may cancel the effect. howl_of_terror = { id = 5484, cast = 0, cooldown = 40, gcd = "spell", school = "shadow", talent = "howl_of_terror", startsCombat = false, handler = function () applyDebuff( "target", "howl_of_terror" ) end, }, -- Burns the enemy, causing 1,559 Fire damage immediately and an additional 9,826 Fire damage over 24 sec. Periodic damage generates 1 Soul Shard Fragment and has a 50% chance to generate an additional 1 on critical strikes. immolate = { id = 348, cast = 1.5, cooldown = 0, gcd = "spell", school = "fire", spend = 0.015, spendType = "mana", startsCombat = true, cycle = function () return not debuff.immolate.refreshable and "immolate" or nil end, notalent = "wither", handler = function () applyDebuff( "target", "immolate" ) active_dot.immolate = max( active_dot.immolate, active_dot.bane_of_havoc ) removeDebuff( "target", "combusting_engine" ) if talent.flashpoint.enabled and target.health_pct > 80 then addStack( "flashpoint" ) end end, }, -- Draws fire toward the enemy, dealing 3,794 Fire damage. Generates 2 Soul Shard Fragments and an additional 1 on critical strikes. incinerate = { id = 29722, cast = function () if buff.chaotic_inferno.up then return 0 end return 2 * haste * ( buff.backdraft.up and 0.7 or 1 ) end, cooldown = 0, gcd = "spell", school = "fire", spend = 0.015, spendType = "mana", startsCombat = true, handler = function () removeBuff( "chaotic_inferno" ) removeStack( "backdraft" ) removeStack( "burn_to_ashes" ) removeStack( "decimating_bolt" ) if talent.decimation.enabled and target.health_pct < 50 then reduceCooldown( "soulfire", 5 ) end -- Using true_active_enemies for resource predictions' sake. gain( ( 0.2 + ( 0.125 * ( true_active_enemies - 1 ) * talent.fire_and_brimstone.rank ) ) * ( legendary.embers_of_the_diabolic_raiment.enabled and 2 or 1 ) * ( talent.diabolic_embers.enabled and 2 or 1 ), "soul_shards" ) end, }, -- [430014] Dark magic erupts from you and corrupts your soul for $442726d, causing enemies suffering from your Wither to take $446285s1 Shadowflame damage and increase its stack count by $s1.; While corrupted your Haste is increased by $442726s1% and spending Soul Shards on damaging spells grants $s2 additional stack of Wither. malevolence = { id = 442726, cast = 0.0, cooldown = 60.0, gcd = "spell", spend = 0.010, spendType = 'mana', talent = "malevolence", startsCombat = true, handler = function () applyBuff( "malevolence") end, }, -- Calls down a rain of hellfire, dealing ${$42223m1*8} Fire damage over $d to enemies in the area. rain_of_fire = { id = 5740, cast = 0, cooldown = 0, gcd = "spell", school = "fire", spend = function () if buff.ritual_of_ruin.up then return 0 end return 3 end, spendType = "soul_shards", talent = "rain_of_fire", startsCombat = true, handler = function () removeStack( "crashing_chaos" ) if buff.ritual_of_ruin.up then removeBuff( "ritual_of_ruin" ) if talent.avatar_of_destruction.enabled then applyBuff( "blasphemy" ) end end if talent.burn_to_ashes.enabled then addStack( "burn_to_ashes", nil, 2 ) end end, }, --[[ Begins a ritual that sacrifices a random participant to summon a doomguard. Requires the caster and 4 additional party members to complete the ritual. ritual_of_doom = { id = 342601, cast = 0, cooldown = 3600, gcd = "spell", school = "shadow", spend = 1, spendType = "soul_shards", startsCombat = false, toggle = "cooldowns", handler = function () end, }, -- Begins a ritual to create a summoning portal, requiring the caster and 2 allies to complete. This portal can be used to summon party and raid members. ritual_of_summoning = { id = 698, cast = 0, cooldown = 120, gcd = "spell", school = "shadow", spend = 0.05, spendType = "mana", startsCombat = false, toggle = "cooldowns", handler = function () end, }, ]] -- Conjure a Shadow Rift at the target location lasting $d. Enemy players within the rift when it expires are teleported to your Demonic Circle.; Must be within $s2 yds of your Demonic Circle to cast. shadow_rift = { id = 353294, cast = 0.0, cooldown = 60.0, gcd = "spell", spend = 0.010, spendType = 'mana', startsCombat = false, pvptalent = "shadow_rift", }, -- Blasts a target for $s1 Shadowflame damage, gaining $s3% critical strike chance on targets that have $s4% or less health.; Restores ${$245731s1/10} Soul Shard and refunds a charge if the target dies within $d. shadowburn = { id = 17877, cast = 0, charges = 2, cooldown = 12, recharge = 12, gcd = "spell", school = "shadowflame", spend = 1, spendType = "soul_shards", talent = "shadowburn", startsCombat = true, cycle = function () return talent.eradication.enabled and "eradication" or nil end, handler = function () gain( 0.3, "soul_shards" ) applyDebuff( "target", "shadowburn" ) active_dot.shadowburn = max( active_dot.shadowburn, active_dot.bane_of_havoc ) removeBuff( "conflagration_of_chaos_sb" ) if talent.burn_to_ashes.enabled then addStack( "burn_to_ashes" ) end if talent.eradication.enabled then applyDebuff( "target", "eradication" ) active_dot.eradication = max( active_dot.eradication, active_dot.bane_of_havoc ) end end, }, -- Burns the enemy's soul, dealing $s1 Fire damage and applying $?a445465[Wither][Immolate].; Generates ${$281490s1/10} Soul Shard. soul_fire = { id = 6353, cast = function () return 4 * ( buff.decimation.up and 0.2 or 1 ) * haste end, cooldown = 45, gcd = "spell", school = "fire", spend = 0.02, spendType = "mana", talent = "soul_fire", startsCombat = true, aura = function() return talent.wither.enabled and "wither" or "immolate" end, handler = function () removeBuff( "decimation" ) gain( 1, "soul_shards" ) applyDebuff( "target", talent.wither.enabled and "wither" or "immolate" ) -- Add stack? end, }, -- Talent: Summons an Infernal from the Twisting Nether, impacting for 1,582 Fire damage and stunning all enemies in the area for 2 sec. The Infernal will serve you for 30 sec, dealing 1,160 damage to all nearby enemies every 1.6 sec and generating 1 Soul Shard Fragment every 0.5 sec. summon_infernal = { id = 1122, cast = 0, cooldown = 120, gcd = "spell", school = "shadow", spend = 0.02, spendType = "mana", talent = "summon_infernal", startsCombat = true, toggle = "cooldowns", handler = function () summonPet( "infernal", 30 ) if talent.rain_of_chaos.enabled then applyBuff( "rain_of_chaos" ) end if talent.crashing_chaos.enabled then applyBuff( "crashing_chaos", nil, 8 ) end end, }, -- Bestows a vile malediction upon the target, burning the sinew and muscle of its host, dealing $s1 Shadowflame damage immediately and an additional $445474o1 Shadowflame damage over $445474d.$?s137046[; Periodic damage generates 1 Soul Shard Fragment and has a $s2% chance to generate an additional 1 on critical strikes.; Replaces Immolate.][; Replaces Corruption.] wither = { id = 445468, cast = 0.0, cooldown = 0.0, gcd = "spell", spend = 0.015, spendType = 'mana', talent = "wither", startsCombat = true, handler = function () applyDebuff( "target", "wither" ) end, -- Effects: -- #0: { 'type': SCHOOL_DAMAGE, 'subtype': NONE, 'sp_bonus': 0.138, 'variance': 0.05, 'target': TARGET_UNIT_TARGET_ENEMY, } -- #1: { 'type': DUMMY, 'subtype': NONE, } -- #2: { 'type': TRIGGER_SPELL, 'subtype': NONE, 'trigger_spell': 445474, 'target': TARGET_UNIT_TARGET_ENEMY, } -- Affected by: -- destruction_warlock[137046] #12: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 348, 'target': TARGET_UNIT_CASTER, } -- socrethars_guile[405936] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- bleakheart_tactics[440051] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER_BY_LABEL, 'points': 20.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- emberstorm[454744] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- flames_of_xoroth[429657] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- flames_of_xoroth[429657] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- mark_of_perotharn[440045] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': SHOULD_NEVER_SEE_15, } -- mark_of_xavius[440046] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 25.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- scalding_flames[388832] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 25.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- xalans_cruelty[440040] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- xalans_cruelty[440040] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- xalans_ferocity[440044] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- xalans_ferocity[440044] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 2.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- xalans_ferocity[440044] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': CRIT_CHANCE, } -- absolute_corruption[196103] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 15.0, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- wither[445465] #0: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 445468, 'value1': 3, 'target': TARGET_UNIT_CASTER, } -- wither[445465] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, } }, } ) spec:RegisterRanges( "corruption", "subjugate_demon", "mortal_coil" ) spec:RegisterOptions( { enabled = true, aoe = 3, cycle = true, nameplates = false, nameplateRange = 40, rangeFilter = false, damage = true, damageDots = false, damageExpiration = 6, potion = "spectral_intellect", package = "Destruction", } ) spec:RegisterSetting( "default_pet", "summon_sayaad", { name = "|T136082:0|t Preferred Demon", desc = "Specify which demon should be summoned if you have no active pet.", type = "select", values = function() return { summon_sayaad = class.abilityList.summon_sayaad, summon_imp = class.abilityList.summon_imp, summon_felhunter = class.abilityList.summon_felhunter, summon_voidwalker = class.abilityList.summon_voidwalker, } end, width = "full" } ) spec:RegisterSetting( "cleave_apl", false, { name = function() return "|T" .. ( GetSpellTexture( 116858 ) ) .. ":0|t Funnel Damage in AOE" end, desc = function() return "If checked, the addon will use its cleave priority to funnel damage into your primary target (via |T" .. ( GetSpellTexture( 116858 ) ) .. ":0|t Chaos Bolt) instead of spending Soul Shards on |T" .. ( GetSpellTexture( 5740 ) ) .. ":0|t Rain of Fire.\n\n" .. "You may wish to change this option for different fights and scenarios, which can be done here, via the minimap button, or with |cFFFFD100/hekili toggle cleave_apl|r." end, type = "toggle", width = "full", } ) spec:RegisterVariable( "cleave_apl", function() if settings.cleave_apl ~= nil then return settings.cleave_apl end return false end ) --[[ Retired 2023-02-20. spec:RegisterSetting( "fixed_aoe_3_plus", false, { name = "Require 3+ Targets for AOE", desc = function() return "If checked, the default action list will only use its AOE action list (including |T" .. ( GetSpellTexture( 5740 ) ) .. ":0|t Rain of Fire) when there are 3+ targets.\n\n" .. "In multi-target Patchwerk simulations, this setting creates a significant DPS loss. However, this option may be useful in real-world scenarios, especially if you are fighting two moving targets that will not stand in your Rain of Fire for the whole duration." end, type = "toggle", width = "full", } ) ]] spec:RegisterSetting( "havoc_macro_text", nil, { name = "When |T460695:0|t Havoc is shown with a |TInterface\\Addons\\Hekili\\Textures\\Cycle:0|t indicator, the addon is recommending that you cast Havoc on a different target (without swapping). A mouseover macro is useful for this and an example is included below.", type = "description", width = "full", fontSize = "medium" } ) spec:RegisterSetting( "havoc_macro", nil, { name = "|T460695:0|t Havoc Macro", type = "input", width = "full", multiline = 2, get = function () return "#showtooltip\n/use [@mouseover,harm,nodead][] " .. class.abilities.havoc.name end, set = function () end, } ) spec:RegisterSetting( "immolate_macro_text", nil, { name = function () return "When |T" .. GetSpellTexture( 348 ) .. ":0|t Immolate is shown with a |TInterface\\Addons\\Hekili\\Textures\\Cycle:0|t indicator, the addon is recommending that you cast Immolate on a different target (without swapping). A mouseover macro is useful for this and an example is included below." end, type = "description", width = "full", fontSize = "medium" } ) spec:RegisterSetting( "immolate_macro", nil, { name = function () return "|T" .. GetSpellTexture( 348 ) .. ":0|t Immolate Macro" end, type = "input", width = "full", multiline = 2, get = function () return "#showtooltip\n/use [@mouseover,harm,nodead][] " .. class.abilities.immolate.name end, set = function () end, } ) spec:RegisterPack( "Destruction", 20240723, [[Hekili:T3txZTnos(BX1wrr0FOisBTzM9S0d3EVmtD1Up49Q9HRolrjrzZkuK6iLsIVYL(TFaKeG4JUbaPOSt2AQPQmjIGD3Or)nAq8O)J)JhFyD4(Oh)BbJdUB8NdUDuqW4BhF3JpS)LDrp(WUWvFj8jYFjnCl5p)pIk2NFy1(4Su6ZEjjlCnfgfzhYxrE(Z73VR4V8Pp9u8(NpSC0QSTFQiE7HKq6BSkpCZE6)E1NE8HLhIt2)BPpUeIacg)lp(q4H9pNL)4dpeV9VsGC861rvdpQy1Jpqh(nJ)8nb3(xoU4F8C0Xf)ZWCYFqqCC6XfdlYY3FCr2gVhFijUyFbLkJ3hTL(x(BLZ7O0WLjrRF8FNn5wgLKLNt(JI57FoAEXH0vHjjres4qr08SnBM)0Q10x(HWAoa(BSkNGS84WhFyiHyoUyF8wcjo74IGXhxm44IvzzjRZ(w6OIdB3MLopoDtuEAyYO8OTHXPf8X6DCXRVwbI840VeTF0E)rXfJWqDj0fhDWioU4WMcXloU4RHekKWdgvp45bZxEyZM6biJp6eGGP4OnfZFkC7Y49L0ga5f0kYZVfKNpi5fyM88yOKaX8W41ZJ(Au6(rHRxxmk67urJk4P(Sd7Q(9IDrjjZ3hM)u0EtZRztpUycNHSmROOeXBIF659Z5tT7PRQpUNiURicYePsFz7HOI5hsZd)AusC6tZl2fNUojsrMIZCysoZPq4RrCU3(We6Crv(QgL8LnaM83IjtyYmmA(QWI9LZczzbuAuuEaq4YeGdSdyNyT16Y4SrcV)weEFnXquWlsY2l(V7FwVd8DUKR2y3LhNrOOxoUGi05JaWG5rFFvYH1c0vdZ(5WI5mfpivyyLsZesq7SSnqwjxJzoWcbDVl4IBaa3yYamJnBdtpeMystHcH5RpKx6E74IRkxmOgcuen9Q8ALhVRsq7FsMEFlmLSgVp74cI3f(uLm4VrCHDCXVvpviponjIkX)n6lreroUyBm9FhYFPsqmQ2ni)3QGZZekjIknr(J4TepTRPZKKdrxZG2YOY3FnLQZl2pIQHCNznKG3encDdgoQreGQIHQr4BrJaZnLvvZZLgbebDIAebw0icSQre0gncjBSbuPUjIsDlfLX6fbmdoo8NWNuiR6nZjh4Ye5SDrRk11UIfvabVv088O0OTXrfmjKgxMQpFgtc65WVMTIpL9yo50d6HYf)ZT27MA4Tn8DJrHz1WjpUlJWWfhpgdwTMbAteWbnrH1TAvshfVunW)BBi5EKM8c9pJO)HSv(Jl2LN91y6BsSItNgxZga1eEg5pZRElgftE(FN8tXe4Mgfx9CRaBzg1dGiyknU)zRg3vunBPaI72rWfqcqeq6u6c)qiGqy8)cLXJLlj93RsqvyTHQq)qP2puARnld1OFjjB910SSLMuuUGWJQCWr(Dss7jZlEomFDLjAFTF9EYVExdjUklDts4t5081bsHPHCOERNxLY79mRx8LlvCq4JJM0GKYNrIebms9guOaI7gnPY)yfJip8jAm)RJiRguyr(H0VufBGW055W00OKMrzkYNyYcBcDIlqdRZ2pI97sEHRIeg9X6mKQ0lRZInB(64QIf4dSKuoxjuXlRsIyPLsfnu9F(VdueIkMZQ8xMxscssjncXvsVzccVQI5KCLtjcXLltsdJQcHV2lX6jzqVmlb0JL7csaonPYS3ECXn4tNRKygukzjXIXtr5TGF4HnxunU2mx08UxrOdWWtdgez3C7iyRZqO5oB8dJmdpCk5xDF2Y0kAy9HFnKi)sb36MYkQvGcfrUssu38M8JP1UHhNBB5U(JBHrhlwt8Xnz3iFPz1g1IRpUjxns7ZmUnHWigj4lbwIeUjGxIwxAbHkibBNht9BWJawqGqDuLujUvBNmoeNUkonQEot8)rm0f(1iihGC2uysvgbeFV0Q9wvZ35vrjx5u1qj3m(2zu)0g9ejhC(anZue2obgJ2g(DhrzL)EaFrz7iRZr7BadlKh6FJKspvEPE1RY(EZcl19(yPWG2g(YZrBBe5iWQg)7iazEJ8uHvxlmv0SqQPJ5ltc))IKurxhvQKkinl5p0FutHt5sRekMWYMZ)3kbtQrKy6m4ox(bsLb3RHAzPPBUbnYarlpeZORsEPyRzFdyHgjUqvB1wmYfNIAc3pGA4K3whO2qZsfZKcKG6HQSqU1)BLOrqL7uI8T2TGZsssHIQ5wWuKHd1I(BtEeb8ltI4ZESOdX0HRN0sV3(4vFHm112OdM)CMKHSxvogAEUiJxSurQqKZsqGyZZ5q5kfqiB454IlRe7YeFzH1EVsAcMB5zm4zKOK18jZwiRS7kVkEHHCcz7qKlP)zIq)fe6Sfo7R0PCqKUL(R3fTNxYTrmxC05m9be9TIDKLYxKEIAwL3HfPSFP7nUUMmRtoj4)MpU)hMrGdXP1z5XlB2fIbqUMWAYsIxnpA7YOC5qiDlGuPGxxEipLUigw8CuHSYGyW0Kj0QqYeAFKH0haIB0nVwZkTNIYGX9QaeZmOPxuqJ7MrZMlkmC3PXDIRsQbUaAToapi(AWqcWCD8QqTL4AVsIpwY6SKxPAdxntSrs(PUsqsuFOeU)MeA0eyCOaJzp8tQODqGOAVM9iz9(a3ka0SM4kCZZUcFwnqBbPz8W(Ma97MIBbf94g3edeDOsaX3iU7bgOZ6KpkD0w)YOblh8NfxCesetAzHkWM19eYyPu1P8X4zZ1hjKjgZBtbKkxAV6uRygpYPEj(bh5oOPo(dzwp4Y9TkUJgKOwkhCVOM2lWaCaI7rvnSNH1HLr0shpYNhLRwYv1rgYApSj44g3LlKPWBkjbfuZLX9ueGHkOlM5kC32Tnxv0uQoJrIlxvrnfxa7bZkJ)WRJbXJzH0H9tqlLXtnXotjrnuwCaRgbYyr1)oCAKLboWQ5N6MHlRnigShCsDTpzj4zTSJ6bwN62cyhRNYCYtOpU5AoZoo9RzFjA(USVfLtLRpqnMoFmx236aBmltyY11cun6fAzc)1XkghirhKUE(3cZtYw9LcAaKXpLce)TsgCMtBRom7DVKN9uuA8QIM9LuZHSCwKA1Rh3kV9LEBlRy7vosrFCOUpNnLywbul1oeTEzYVdIwgxeqmwkenVFPfXZBiNpd5n2Ym7OJCovKDzE82I9zPwkkiyaVMt)sbgfKfQVW25xzhrUV5oYjgzi27D5rRY2UmCpue4cCdwmf8ftAWtHjsrmTHkXNTnoT00apQCfD6DrQlKQM7OBnbrshBZjyBTq1w5mpCxc1cWMWdKqkEymuaR23RdLE3J2)e0Lfr0P0jiqXC2c8eyfpbn4r1OunEI3yMb1qXfVKkfcKZ9qfytR9bdrpb5yWHb)bB4ScAE1mY5rjfKj4yA9QQ5S(qHu3sgvGDgfwVef8oWOaXPBmk14)BHKRLtmszaAsJ1qJ4RpyQHg5UqeuGUQPVGYGOfZelhUejIZ2rkqFWontceMjAzW0IPsjVl)WYxM)TNJs2rsGlkjbI)(TNJl2fvUfx8sUnpEvn014Z194my2hTG8cCG8cAn5firEQbT3cYZFKERgpuLZTnoppRSQNBYjG8qE0AsyoBjcpzFROmX46Jyf0lBqY5Ysh9E4UA40fyUbTyAgyzAgCkttBkigMMbattex4UAjN158pkxMBJ(9WT1tLtT5jWQZGp5spU7vYOgwwn2ROLCzs5piazXWgegpaOP(YKH4nGq0(IUhBNth6q0bqZtTt3IT5PVZZtFhNNUOd7P540NRffyjhuE(TXBZO5mqWrri5XBIxbK3p4WAsavpzfLuF6VE8qoLldzkWcXMLNaNglptJ005viY2BqgTsTdDk2OBS3Z1LRX1hUVgRgSrXYnfjNeZeFLUXMKSSCMIIsfr(Knvhp2U8r(lxm1mWUQV5kELeOda0tOmF920TEgRcsDO660PTyVwmRpNt)uSc2DMS1C28Ceq34OhJQYp4jq)2H9SkDDTdud9aqUkmTSOuK)kXfqu9bDjBZXMtdZ(NPJH)7m4FD9jOKFSlJ3FnTyq7v)9kFtX1iCDw6hjpGEielpFn0khsEVW01nJP6n0gDCjajqSQqHqXkkFah7wDqANgayCo)RRrmRt3ZQrmxWE7nIzfQ)uSc2DMS16PCkgXGcV)emIbL5KUsF7lk5q4d6XTSn(1W(BkSbeWh3d2KSQhJm0LddSajLNphOHHG2Uh2(ToqUBEeRDCdBnmJWgZsxhxYOWl8QbEPgJ8O23ubyCx)RsOhpkFoWKjzHq8nStH0(TbOgGaqxJOCdb1hYcGQZbNnU0KaBTsGikiY)RO5U4i9W3Au8T75TKC4TDKHt0tJA3jFsigO0hT1pPSGZWhqIhX2wP20gXVFTcKHEqU1zhJVz6wBVHQzp8wSEtzZluvWIked2mNIM9It3xLKkD)6ouu(ok2z16dHHwpyerFpA1H9rT5SqyRPmnuKKF4oahqLAzVX2aGhTXB5c79kORrv4sAPUULh8h6bb5wEWHO0To5klC4j0PQUq6dGa5Hc6tfcD7S1cdQGVBN2K6za4PjzMlYbUWP4rjH3py8c0vJjlvb0EZQu5xGed5YS0d0DRkk)2XZVB3kBA34Hnypq2PSgiqXHKup5VkpS4zQk8kXJNRezP15)CTyL(gsPIK4()BvtIw9eNpCkg69dMrRFUoWjvrFyveZIKuaEWeN6rkXqR(78rkXqJ8)V(lntevQSDUk6uNr3FN4bCRGV5N4bx3lLYesm2Wv80nu2Bc1WDq6n5gQyxw5)hy)y6nKXdTWaB0urIQhN8h6k(OPkvr50tMQCvzgavZNzo8I2xZDMsByZnidA3JEtz1ot9vv5BSc7ojlB98nhYFrGRbRPA8voDUSaZLJaOQA)teZLAFTCY4mVf6noDwlGamhrq1q8nLf)V6MkctxrJcGMlqyssPdbAVHrib6J5F7QF8HVrCWtijIIq5hJZ4T7k)ouVHwm(pwwePpspze)VhilDRPXJsDAgEyFw9NMtQRDI7Qrh)9)Zy6xoo))YXf)1SucMkF8hzf(2yh9rqbDJS(OCJuyy0d9)UNvuQ)T5tdpGd5mcCRGf5txnmdcCCos9Tz1W2ODcL6Fi8aMuDD1OBa3kyr(sDdZGSVAeOIgqZyCOB0iNvylkqH2YCWYvMgUti1CF6bZ(CgP3Eg5IAWMpHe)A7cmbuESJa1QqRD7t9lWptG9THMV7mkyObBU6LrbdTh7iqTYhSBQSFb(zcSVn08KZOGHgS1jzw0EMOzHXCwbVeG)VsloSJgVhf0SpNRSYrFCX)9Xf6(0(F(3oUGWEYF54I1XL1zFnhM)5EvVwHt0VahhS9OSX5e2F2UGrluvoRahhSNt(rVa7J)oqwr1nP8hBvEry(86QISJUu7k4pBa(pO7)GUDbWVt0D2UOQruqBexcugoSSZej)pXYY8bta37kFVlMc9AxnKpyvtpSx(g0ruddpVpyfiEEd6gztOB2lk)M2jl7W(1x7iZ8DNx2wMXhmpLS((3yRv19Mn2Jqy2GZSGXmTbyw)NSX6pNYXFYkqWKJTs2NGCSDyJjhB9nF35LTLz8dKyS1CebASAtjcG5OPVb)zdW)bD)h0Tla(DIUBDGuaa)C7aYnN)DISpbhq2HT9aPqEZ3DEzBzgFW8uY67R7bkOZEGCmqQ3b5y3C(3jY(eKJTdB7bs92lh7gVSTmJFGeJhHwAzwtetFNSpkxPS6F15QGl0fH1NYkfacDaSCeQ)4tHkDpjeGNR1BLQW2xBxPREDPdFGcObpycAagzJYupLjQWg5qO4k4b6oDTLq0(x3vKC6mhKL0thWi7gq)YwEprc)StOkVREMlCfG8deHca1oLfUcW(Ln8liSbPJwGkVa8ChOc6aevFL2axb2injURahSbYvqHXMm3vej195kiaSZ0DfW9Iz3aell9dVhb49pVhbrNoVhbWNiVhCJ24F3q)yR2QnZ9Qb7790hvZUv7XM90ZZB2iq1ESeqX2t7UURgNzWF2a87eDRvJcK6vwmyOj4)b75(oD8RVADqM31GPJ9yt2osMwja3OsBejNBJ1fbDTutksj9n4pBa(DIUTlDhOj2aa)ZG0nawmjD7gzALaCJkTrKCUTw0FCJuTP1QTnAjjhJO092T16WDhPAF)zHrg0WKqYVIQt0gMPTr7okDNzAD4UJu7mt0HjNyYytlzQFHCHxXagvlWb6xyxyKzA4Yy1yJ6BDMHnQwGd3NzwhUmwX7F)D5zRgfM(Y817kmf3d246B8iv4Xwa)ylFAuHLnS9kTa7URuBD4YyfVF2DJNIpU(gpMx7WHVdleas)2ELwGD3x7SoCzS237h65g(UazAkNLFccOvZI47BfKNeWb5kT7mgWY81aSDqW5KL1C4GgyWcy3x17k8DbYoSMGmixPDNXqRx1DYu)j7DWwlkCbAI1y5K86R4zRyoDfR7O3Ld9VA8OjxIOqrEoaiOFyxPV5nkVPnwLN3SHMlEG1w5sJE9TsV(i0R9LwpE2IVHRzF6NS1mD699EnBesHEdZOoMBrjErodO8R9uU1cLF35Z9jB3G6WonFopFQiB5K4nmNcGHUOm1mmQLmxpsYyaVt8w09eVN26AKtODFbEK9ob8(kubhgVtdvre6oVX(KuPaCT78TgacQVw95jTDQSiZ9QlhDf6r(gt3zLGEzrsRen1V(jV))i6bDFxZX0A78UMJaWoSeHPN2pwuqArJEzhAXaEVVdTyi6K3HwmaFI7qBnWrup6GmsaI4gjO81XRcb4VcpPTw(6fzJ)OZjAZU3ZceRf(i6p3wvWdttORHj(g0qINyOCOn(uhOqS2860AzY(Kcro03Dcwirv0NW6e5CiME7DRpyrafk8Psfr00yxTHfuqhuVbn4q)Gx2l2B6LOuoNFSNoNPyIeNEVa7ZZhILJ)(VTL9vm5ZnF(sOxgc0L6YBpUv0pHSFMEvuNTjoH)DETyeVhZMkFZsFD8MP0DAD24bxWVgQp(7AV2vt)unbsgf8Zz1q5A6nZW0MBMJRR)qsmD81z7MwEzu7cauQZ11LxkitLRsl)snSfWlaeEbDgEvvkIo1kVtnRHR)1nx9HthpAY1874IP2BRP3KMVcUTMAZmp4KN5AT8YBsJ5a3YlTzMZU0K1ekn0ygV(Q0Wq36oLXP1geTHodGPtJnqsd(nVfJkJ7KOt(LJmedvTtguyqO9EqBiGaecaSvkuM59cbOuYAn(a4oFF1qjoHXYsFzWypLXJU0EzqR0gcms7i7A)vdLyITG2nlw2sAND5gRAflq0kMVGnSZ0gX0l7Dg0gw3InJX(cH0EX0lBFg0UT2I9JXUCVhI4a4TgCz0qvHJz8YhgjajwLhHFmVsNuSOF5jnZFc8718TVNgdy9iOOJFzbF83)t)jwaHfAI6LP6pNEhgu(T)xiim53A1lRkvKS(2ecUwlb6Yr4Y6BFOQkmCyNijldAMl66p711QG1Gg4se51x7JJ(69bJjZ8Jl(P)MlfNX2O0iFLgwZATCQ6Fh(e5ypepRFHc6)VqowbT1VpbV9FFCCJr2wwHXKg6YX6UZFFCSlZREnE6Mm)7WxZa3wQ6cv3hY8T9BzGTx8DNr2wwHX0f7ImFN)ugGlZlD5AYe0R8vYU1uNn92Bgkxn3bxaumwcPCXWlugiW4K(TM8DgiJ17VJaoohOPuq4tf1Bc06zJYKXxiwAyOQEzHYzu0GU4VR8TsQ1xVcvsqqLETdeAzBVU66nLKqbbwxato6mUwGKYBYI(elnxktuGXKKK6eGb4x3K37pAI3GMl3TzK)9RVUQ6QFAQ4DiLaovVISOiUbe3F3Oppyy9Rnl41xPxOidK0TVVrFf7Ep1tMv6CG50rREjFjK0GAZxmyiueY3m5YHvWd8(SCaxlu7m6tY)IFNErGnkFFM4Tn5RVEb0YMelGN6IcZE6TJMyerCY5kHRxmemoOekI3xCs0aJnvkOnS35C3dERFE54r3sCQbHS7VL4SdKk0jbr(T39tmqid0F5Q7XtIpkUHzMaPqzn1UXoNbrAcaHVKkwBu17LZRQPgG7KZzyRaMyYd0V1nN9lw1EGqKGGo0nRPcmRzLuGzZJ60XIgKUJ7qt6lwHKUHmCWXmykRq35LV(Qafm9oR8hMYe7MTCMpXzD9pQ0thSPd4oHoG9ssnrXRVc7tNSAAEHbNtuQOdENt68BlD5cBJb9Jg3q1VJH5QU3RjY)BytSgCsZ8nouW)6n(EGEkRVrgVeWnmyzNObrymch3gzzykUn0YYirNwvfIQsbAq1)GXHQNfQbHo5QHCL76oEzGsiUu7LOgmoSRXrMYZ8uj(32GwQrQyNY0kdq2aea55hy7LeTPn8UrtUz8i)lRxsevDiojOUxMOT(lPyiansmi3muay1RVE8ftrkrxQY5G7QFJkjoA1qjUWkDNvufkD3evibrOKwL80y2D2CBwtx84JainfttBYJiSosqfaXuWQH9PeBHACUIWs1(mhM1)FIbwYS8EsEbaYg3p9oiEHVgZOlXrGq8UzhcY4MYkTu0hXPFn7lrZ3L9TOC6ioq1ONpUusX6GyA80n2w2zWu)FDmxUhSz5TPMwhm)UxYZEkknEvXikPOA7uiQKUZXBJeSwa)NhzyIBWkKZ0(Gnqbicsy7IUGK29KtA(5HKMX9bGrCCVKVpYlFH0O2hVIE3BsGjpbFLTW5(aVlfNjqjE0DgmiVZ3M7snnlX8rXJhKX35HQieTm9TNt1pwMhVTyFwkF370ZdvtwxoIkLXxqyeF5(Ggl(8hHtyIXqvvWfxdoYYOLTlzzWTiykaykxXUDebJ5nEPznufxEPA))ycTt9hZJSUQF5HiAhQ2eFr0svNalZKqvVujFaY5noMoH1o3dzP5LAtzPam6nnaaOVxLfQDRtgn7I7vb04kS4lIrwVwxZg9qPCRmn8HxP7CzfpaQSnETWSmKCuph9RTqBDxzBYG2it0ZvMrqLaPAqoQj(wxchRSg58SSo8wvzhJab2)RDtp8k2H7grcz1Jw4qvXCDiEoR46)Cdx1QynaBKGPSRilF6dGxiAxLkEVebWd)YjPK2zEUNl4fA4c9rDVeCQag6wP1rDuRghOQlTYmSeTS4pqsKwhbsI)CgICS)IWiqu3LtLqYCkgvrcrO0iLymbmy2IQq4EwmWjnmqMubNFcswdTxTpHiqeYk2Bacd2ggXwxu2dEs4s3itinfMuCR1vPwpD8RMmVmIMn92bYWWoe06xG7uPvasT9uwa3QfOnTMIKj5BzaG7gs4HEkZs92YSfAawvUnKLh7nSg8s)MPaxxukVxuH4MxSm1sYlYUeKVM(xY2SzoXEirfUmVoSZfqTkgT0TbJDPVvO11qQpDXGm4X)OjYB8(Qwc6v2oepbcEIuGXZ8a4rVXaf4RsbbyuansF1u4I(o9iB96RQ)onm6QM6T2Qkk9oB6ey)AcDlK(ID5YlAJZxU(YNPS1Z6AeyQ62aCh5wWBG06ekb4bbl125BGehhhw4SN)0Xf)tPUZTSVERbBb5bX7F(4IFJfF)IdPjrff1T0lHwoUyBm9Fhk0GWeqm64IYZQj)3QGZZe8tmZDCb5pIRpEMLfk5Ag0ww1YXKFNyFQy)idlGfjz7zn6OFxxVSUCrez1gd7ysm1h80muF4zOyLV8q7RFMUKKEOUcgo6cCXqJq4OkSHb4y9EBaMO6IP3paYIq1jTcwFqQZ)UYF2ujXsphxYd6TLCvTkJl5bGYm6l5(yl5q2uniH1tl56yTtl5bOl5bgwYdoHL8Q2zwZxcDXVdR9qBL7eAx8cWNyKRvgfz1Fx0kIXSRA2gV6i9MsZ4snOs)bsB4a)8xKLM8c9pPhSIuzlXhxSlp7RXu7IH0dvXMnxZga1mBg5pZRElgXsE(FpV6iuKgfx9CRaBzg1kTiymzawoCjnZX4NnmCdgK4dqFRUfxKhVuakREwvS4lRenmxA9HwWFcG5p21UG4pAhB4wf127h)PqMbjgzoDBCiJCxg9F2jvD5nKSgE1BWC03R7vVsr)6TVrCpN7egj65ijXyJ)DL)4RCEtWvRoKRVNNYEN3gYBI2kdTSCr50Q(3vEfGLy8Z)GgjXhzdH0mthmeHhbny4qJDMs05mjzzRNV5q(l9iNXzYrsuQHuSk9am0UXy04h0Ymuc93D2bNsSYn0hz3yg4sjHPROL7H2VWKuy7rwZpJ6qpUN8Fp()d]] )