-- 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 GetSpellInfo, GetSpellTexture = C_Spell.GetSpellInfo, 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 }, -- TODO: Summon Overfiend from Avatar of Destruction }, 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 4% for 10 sec. accrued_vitality = { 71953, 386613, 2 }, -- Drain Life heals for 15% of the amount drained over 7.5 sec. amplify_curse = { 71934, 328774, 1 }, -- Your next Curse of Exhaustion, Curse of Tongues or Curse of Weakness cast within 15 sec is amplified. Curse of Exhaustion Reduces the target's movement speed by an additional 20%. Curse of Tongues Increases casting time by an additional 40%. Curse of Weakness Enemy is unable to critically strike. banish = { 71944, 710, 1 }, -- Banishes an enemy Demon, Aberration, or Elemental, preventing any action for 30 sec. Limit 1. Casting Banish again on the target will cancel the effect. burning_rush = { 71949, 111400, 1 }, -- Increases your movement speed by 50%, but also damages you for 4% of your maximum health every 1 sec. Movement impairing effects may not reduce you below 100% of normal movement speed. Lasts until canceled. curses_of_enfeeblement = { 71951, 386105, 1 }, -- Grants access to the following abilities: Curse of Tongues: Forces the target to speak in Demonic, increasing the casting time of all spells by 30% for 1 min. Curses: A warlock can only have one Curse active per target. Curse of Exhaustion: Reduces the target's movement speed by 50% for 12 sec. Curses: A warlock can only have one Curse active per target. dark_accord = { 71956, 386659, 1 }, -- Reduces the cooldown of Unending Resolve by 45 sec. dark_pact = { 71936, 108416, 1 }, -- Sacrifices 20% of your current health to shield you for 200% of the sacrificed health plus an additional 28,917 for 20 sec. Usable while suffering from control impairing effects. darkfury = { 71941, 264874, 1 }, -- Reduces the cooldown of Shadowfury by 15 sec and increases its radius by 2 yards. demon_skin = { 71952, 219272, 2 }, -- Your Soul Leech absorption now passively recharges at a rate of 0.2% of maximum health every 1 sec, and may now absorb up to 10% of maximum health. Increases your armor by 45%. demonic_circle = { 100941, 268358, 1 }, -- Summons a Demonic Circle for 15 min. Cast Demonic Circle: Teleport to teleport to its location and remove all movement slowing effects. You also learn: Demonic Circle: Teleport Teleports you to your Demonic Circle and removes all movement slowing effects. demonic_embrace = { 71930, 288843, 1 }, -- Stamina increased by 10%. demonic_fortitude = { 71922, 386617, 1 }, -- Increases you and your pets' maximum health by 5%. 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 90 sec. demonic_inspiration = { 71928, 386858, 1 }, -- Increases the attack speed of your primary pet by 5%. Increases Grimoire of Sacrifice damage by 10%. demonic_resilience = { 71917, 389590, 2 }, -- Reduces the chance you will be critically struck by 2%. All damage your primary demon takes is reduced by 8%. demonic_tactics = { 71925, 452894, 1 }, -- Your spells have a 5% increased chance to deal a critical strike. You gain 10% more of the Critical Strike stat from all sources. fel_armor = { 71950, 386124, 2 }, -- When Soul Leech absorbs damage, 5% of damage taken is absorbed and spread out over 5 sec. Reduces damage taken by 1.5%. 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 90%. fel_pact = { 71932, 386113, 1 }, -- Reduces the cooldown of Fel Domination by 60 sec. fel_synergy = { 71924, 389367, 2 }, -- Soul Leech also heals you for 8% and your pet for 25% of the absorption it grants. fiendish_stride = { 71948, 386110, 1 }, -- Reduces the damage dealt by Burning Rush by 10%. Burning Rush increases your movement speed by an additional 20%. frequent_donor = { 71937, 386686, 1 }, -- Reduces the cooldown of Dark Pact by 15 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 5 enemies within 10 yds to flee in fear, disorienting them for 20 sec. Damage may cancel the effect. ichor_of_devils = { 71937, 386664, 1 }, -- Dark Pact sacrifices only 5% of your current health for the same shield value. lifeblood = { 71940, 386646, 2 }, -- When you use a Healthstone, gain 4% Leech for 20 sec. mortal_coil = { 71947, 6789, 1 }, -- Horrifies an enemy target into fleeing, incapacitating for 3 sec and healing you for 20% of maximum health. nightmare = { 71916, 386648, 1 }, -- Increases the amount of damage required to break your fear effects by 60%. pact_of_gluttony = { 71926, 386689, 1 }, -- Healthstones you conjure for yourself are now Demonic Healthstones and can be used multiple times in combat. Demonic Healthstones cannot be traded. Demonic Healthstone 60 sec cooldown. resolute_barrier = { 71915, 389359, 2 }, -- Attacks received that deal at least 5% of your health decrease Unending Resolve's cooldown by 10 sec. Cannot occur more than once every 30 sec. sargerei_technique = { 93179, 405955, 2 }, -- Incinerate damage increased by 5%. shadowflame = { 71941, 384069, 1 }, -- Slows enemies in a 12 yard cone in front of you by 70% for 6 sec. shadowfury = { 71942, 30283, 1 }, -- Stuns all enemies within 8 yds for 3 sec. socrethars_guile = { 93178, 405936, 2 }, -- Immolate damage increased by 10%. soul_conduit = { 71939, 215941, 1 }, -- Every Soul Shard you spend has a 5% chance to be refunded. soul_leech = { 71933, 108370, 1 }, -- All single-target damage done by you and your minions grants you and your pet shadowy shields that absorb 3% of the damage dealt, up to 10% of maximum health. soul_link = { 71923, 108415, 2 }, -- 5% of all damage you take is taken by your demon pet instead. While Grimoire of Sacrifice is active, your Stamina is increased by 3%. soulburn = { 71957, 385899, 1 }, -- Consumes a Soul Shard, unlocking the hidden power of your spells. Demonic Circle: Teleport: Increases your movement speed by 50% and makes you immune to snares and roots for 6 sec. Demonic Gateway: Can be cast instantly. Drain Life: Gain an absorb shield equal to the amount of healing done for 30 sec. This shield cannot exceed 30% of your maximum health. Health Funnel: Restores 140% more health and reduces the damage taken by your pet by 30% for 10 sec. Healthstone: Increases the healing of your Healthstone by 30% and increases your maximum health by 20% for 12 sec. strength_of_will = { 71956, 317138, 1 }, -- Unending Resolve reduces damage taken by an additional 15%. sweet_souls = { 71927, 386620, 1 }, -- Your Healthstone heals you for an additional 10% 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 50%. teachings_of_the_black_harvest = { 71938, 385881, 1 }, -- Your primary pets gain a bonus effect. Imp: Successful Singe Magic casts grant the target 4% damage reduction for 5 sec. Voidwalker: Reduces the cooldown of Shadow Bulwark by 30 sec. Felhunter: Reduces the cooldown of Devour Magic by 5 sec. Sayaad: Reduces the cooldown of Seduction by 10 sec and causes the target to walk faster towards the demon. teachings_of_the_satyr = { 71935, 387972, 1 }, -- Reduces the cooldown of Amplify Curse by 15 sec. wrathful_minion = { 71946, 386864, 1 }, -- Increases the damage done by your primary pet by 5%. Increases Grimoire of Sacrifice damage by 10%. -- Destruction ashen_remains = { 71969, 387252, 1 }, -- Chaos Bolt, Shadowburn, and Incinerate deal 5% increased damage to targets afflicted by Immolate. avatar_of_destruction = { 101998, 456975, 1 }, -- Consuming Ritual of Ruin summons an Overfiend for 8 sec. Summon Overfiend backdraft = { 72067, 196406, 1 }, -- Conflagrate reduces the cast time of your next Incinerate, Chaos Bolt, or Soul Fire by 30%. Maximum 2 charges. backlash = { 71983, 387384, 1 }, -- Increases your critical strike chance by 3%. Physical attacks against you have a 25% chance to make your next Incinerate instant cast. This effect can only occur once every 6 sec. blistering_atrophy = { 101996, 456939, 1 }, -- Increases the damage of Shadowburn by 20%. The critical strike chance of Shadowburn is increased by an additional 50% when damaging a target that is at or below 30% health. burn_to_ashes = { 71964, 387153, 1 }, -- Chaos Bolt and Rain of Fire increase the damage of your next 2 Incinerates by 15%. Shadowburn increases the damage of your next Incinerate by 15%. Stacks up to 6 times. cataclysm = { 71974, 152108, 1 }, -- Calls forth a cataclysm at the target location, dealing 39,235 Shadowflame damage to all enemies within 8 yards and afflicting them with Immolate. channel_demonfire = { 72064, 196447, 1 }, -- Launches 17 bolts of felfire over 2.3 sec at random targets afflicted by your Immolate within 40 yds. Each bolt deals 3,713 Fire damage to the target and 1,477 Fire damage to nearby enemies. chaos_incarnate = { 71966, 387275, 1 }, -- Chaos Bolt, Rain of Fire, and Shadowburn always gain at least 70% of the maximum benefit from your Mastery: Chaotic Energies. conflagrate = { 72068, 17962, 1 }, -- Triggers an explosion on the target, dealing 19,616 Fire damage. Reduces the cast time of your next Incinerate or Chaos Bolt by 30% for 10 sec. Generates 5 Soul Shard Fragments. conflagration_of_chaos = { 72061, 387108, 1 }, -- Conflagrate and Shadowburn have a 50% 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 8 casts of Chaos Bolt by 25% or your next 8 casts of Rain of Fire by 35%. 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 80%. demonfire_mastery = { 101993, 456946, 1 }, -- Increases the damage of Channel Demonfire by 30% and it deals damage 35% faster. devastation = { 72066, 454735, 1 }, -- Increases the critical strike chance of your Destruction spells by 5%. diabolic_embers = { 71968, 387173, 1 }, -- Incinerate now generates 100% additional Soul Shard Fragments. 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 }, -- Rips a hole in time and space, opening a random portal that damages your target: Shadowy Tear Deals 99,592 Shadow damage over 14 sec. Unstable Tear Deals 85,195 Chaos damage over 6 sec. Chaos Tear Fires a Chaos Bolt, dealing 33,226 Chaos damage. This Chaos Bolt always critically strikes and your critical strike chance increases its damage. Generates 3 Soul Shard Fragments. emberstorm = { 72062, 454744, 1 }, -- Increases the damage done by your Fire spells by 2% and reduces the cast time of your Incinerate spell by 20%. eradication = { 71984, 196412, 1 }, -- Chaos Bolt and Shadowburn increases the damage you deal to the target by 5% for 7 sec. explosive_potential = { 72059, 388827, 1 }, -- Reduces the cooldown of Conflagrate by 2 sec. fiendish_cruelty = { 101994, 456943, 1 }, -- When Shadowburn fails to kill a target that is at or below 30% health, its cooldown is reduced by 5 sec. fire_and_brimstone = { 71982, 196408, 1 }, -- Incinerate now also hits all enemies near your target for 25% damage. flashpoint = { 71972, 387259, 1 }, -- When your Immolate deals periodic damage to a target above 80% health, gain 2% Haste for 10 sec. Stacks up to 3 times. 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 6,410 additional Shadow damage. Lasts until canceled or until you summon a demon pet. havoc = { 71979, 80240, 1 }, -- Marks a target with Havoc for 12 sec, causing your single target spells to also strike the Havoc victim for 60% of the damage dealt. improved_chaos_bolt = { 101992, 456951, 1 }, -- Increases the damage of Chaos Bolt by 10% and reduces its cast time by 0.5 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 5% and increases the critical strike chance of your next Incinerate or Soul Fire by 35%. inferno = { 71974, 270545, 1 }, -- Rain of Fire damage is increased by 20% and its Soul Shard cost is reduced by 1. internal_combustion = { 71980, 266134, 1 }, -- Chaos Bolt consumes up to 5 sec of Immolate's damage over time effect on your target, instantly dealing that much damage. master_ritualist = { 71962, 387165, 1 }, -- Ritual of Ruin requires 5 less Soul Shards spent. mayhem = { 71979, 387506, 1 }, -- Your single target spells have a 25% chance to apply Havoc to a nearby enemy for 5.0 sec. Havoc Marks a target with Havoc for 5.0 sec, causing your single target spells to also strike the Havoc victim for 60% of the damage dealt. power_overwhelming = { 71965, 387279, 1 }, -- Consuming Soul Shards increases your Mastery by 0.5% for 10 sec for each shard spent. Gaining a stack does not refresh the duration. pyrogenics = { 71975, 387095, 1 }, -- Enemies affected by your Rain of Fire take 5% increased damage from your Fire spells. raging_demonfire = { 72063, 387166, 1 }, -- Channel Demonfire fires an additional 2 bolts. Each bolt increases the remaining duration of Immolate on all targets hit by 0.5 sec. rain_of_chaos = { 71960, 266086, 1 }, -- While your initial Infernal is active, every Soul Shard you spend has a 15% chance to summon an additional Infernal that lasts 8 sec. rain_of_fire = { 72069, 5740, 1 }, -- Calls down a rain of hellfire, dealing 28,756 Fire damage over 6.0 sec to enemies in the area. reverse_entropy = { 71980, 205148, 1 }, -- Your spells have a chance to grant you 15% Haste for 8 sec. ritual_of_ruin = { 71970, 387156, 1 }, -- Every 20 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 50%. roaring_blaze = { 72065, 205184, 1 }, -- Conflagrate increases your Channel Demonfire, Immolate, Incinerate, and Conflagrate damage to the target by 25% for 8 sec. rolling_havoc = { 71961, 387569, 1 }, -- Each time your spells duplicate from Havoc, gain 1% increased damage for 6 sec. Stacks up to 5 times. ruin = { 71967, 387103, 1 }, -- Increases the critical strike damage of your Destruction spells by 5%. scalding_flames = { 71973, 388832, 1 }, -- Increases the damage of Immolate by 25% and its duration by 3 sec. shadowburn = { 72060, 17877, 1 }, -- Blasts a target for 15,728 Shadowflame damage, gaining 50% critical strike chance on targets that have 20% or less health. Restores 1 Soul Shard and refunds a charge if the target dies within 5 sec. soul_fire = { 71978, 6353, 1 }, -- Burns the enemy's soul, dealing 65,915 Fire damage and applying Immolate. Generates 1 Soul Shard. summon_infernal = { 71985, 1122, 1 }, -- Summons an Infernal from the Twisting Nether, impacting for 8,299 Fire damage and stunning all enemies in the area for 2 sec. The Infernal will serve you for 30 sec, dealing 7,607 damage to all nearby enemies every 1.5 sec and generating 1 Soul Shard Fragment every 0.5 sec. summoners_embrace = { 71971, 453105, 1 }, -- Increases the damage dealt by your spells and your demon by 3%. unstable_rifts = { 102427, 457064, 1 }, -- Bolts from Dimensional Rift now deal 25% of damage dealt to nearby enemies as Fire damage. -- Diabolist abyssal_dominion = { 94831, 429581, 1 }, -- Summon Infernal becomes empowered, dealing 40% increased damage. When your Summon Infernal ends, it fragments into two smaller Infernals at 50% effectiveness that lasts 10 sec. annihilans_bellow = { 94836, 429072, 1 }, -- Howl of Terror cooldown is reduced by 15 sec and range is increased by 5 yds. cloven_souls = { 94849, 428517, 1 }, -- Enemies damaged by your Overlord have their souls cloven, increasing damage taken by you and your pets by 5% for 15 sec. cruelty_of_kerxan = { 94848, 429902, 1 }, -- Summon Infernal grants Diabolic Ritual and reduces its duration by 3 sec. diabolic_ritual = { 94855, 428514, 1, "diabolist" }, -- Spending a Soul Shard on a damaging spell grants Diabolic Ritual for 20 sec. While Diabolic Ritual is active, each Soul Shard spent on a damaging spell reduces its duration by 1 sec. When Diabolic Ritual expires you gain Demonic Art, causing your next 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. flames_of_xoroth = { 94833, 429657, 1 }, -- Fire damage increased 2% and damage dealt by your demons is increased 2%. gloom_of_nathreza = { 94843, 429899, 1 }, -- Enemies marked by your Havoc take 5% increased damage from your single target spells. infernal_bulwark = { 94852, 429130, 1 }, -- Unending Resolve grants Soul Leech equal to 10% of your maximum health and increases the maximum amount Soul Leech can absorb by 10% for 8 sec. infernal_machine = { 94848, 429917, 1 }, -- Your Soul Shard spending abilities decrease the duration of Diabolic Ritual by 1 additional sec while your Infernal is active. infernal_vitality = { 94852, 429115, 1 }, -- Unending Resolve heals you for 30% of your maximum health over 10 sec. ruination = { 94830, 428522, 1 }, -- Summoning a Pit Lord causes your next Chaos Bolt to become Ruination. Ruination secrets_of_the_coven = { 94826, 428518, 1 }, -- Mother of Chaos empowers your next Incinerate to become Infernal Bolt. Infernal Bolt 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. touch_of_rancora = { 94856, 429893, 1 }, -- Demonic Art increases the damage of your next Chaos Bolt, Rain of Fire, or Shadowburn by 100% and reduces its cast time by 50%. -- Hellcaller aura_of_enfeeblement = { 94822, 440059, 1 }, -- While Unending Resolve is active, enemies within 30 yds are affected by Curse of Tongues and Curse of Weakness at 100% effectiveness. blackened_soul = { 94837, 440043, 1 }, -- Spending Soul Shards on damaging spells will further corrupt enemies affected by your Wither, increasing its stack count by 1. Each time Wither increases it has a chance to become acute, dealing 6,460 Shadowflame damage to its host every 1 sec until 1 stack remains. Wither will always become acute after reaching 8 stacks or when its host reaches 20% health. bleakheart_tactics = { 94854, 440051, 1 }, -- Wither damage increased 20%. When Wither gains a stack from Blackened Soul, it has a chance to gain an additional stack. curse_of_the_satyr = { 94822, 440057, 1 }, -- Curse of Weakness is empowered and transforms into Curse of the Satyr. Curse of the Satyr hatefury_rituals = { 94854, 440048, 1 }, -- Wither deals 50% increased periodic damage but its duration is 25% shorter. illhoofs_design = { 94835, 440070, 1 }, -- Sacrifice 10% of your maximum health. Soul Leech now absorbs an additional 15% of your maximum health. malevolence = { 94842, 442726, 1 }, -- Dark magic erupts from you and corrupts your soul for 20 sec, causing enemies suffering from your Wither to take 47,445 Shadowflame damage and increase its stack count by 3. While corrupted your active Withers are acute, your haste is increased by 15% and Chaos Bolt grants 1 additional stack of Wither. mark_of_perotharn = { 94844, 440045, 1 }, -- Critical strike damage dealt by Wither is increased by 10%. 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 }, -- Wither damage increased by 25%. Blackened Soul deals 2% increased damage per stack of Wither. seeds_of_their_demise = { 94829, 440055, 1 }, -- Blackened Soul damage increased by 30%. When Blackened Soul deals damage, you have a chance to gain 2 stacks of Flashpoint. wither = { 94840, 445465, 1, "hellcaller" }, -- Replaces Immolate. Bestows a vile malediction upon the target, burning the sinew and muscle of its host, dealing 3,008 Shadowflame damage immediately and an additional 69,530 Shadowflame damage over 21 sec. Periodic damage generates 1 Soul Shard Fragment and has a 50% chance to generate an additional 1 on critical strikes. xalans_cruelty = { 94845, 440040, 1 }, -- Your Fire spells gain 10% more critical strike chance from all sources. Your Shadow spells gain 10% more critical strike chance from all sources. xalans_ferocity = { 94853, 440044, 1 }, -- Shadow damage increased by 2%. Fire damage increased by 2%. zevrims_resilience = { 94835, 440065, 1 }, -- Dark Pact heals you for 2,522 every 1 sec while active. } ) -- PvP Talents spec:RegisterPvpTalents( { bane_of_havoc = 164, -- (461917) bonds_of_fel = 5401, -- (353753) Encircle enemy players with Bonds of Fel. If any affected player leaves the 8 yd radius they explode, dealing 74,083 Fire damage split amongst all nearby enemies. call_observer = 5544, -- (201996) Summons a demonic Observer to keep a watchful eye over the area for 20 sec. Anytime an enemy within 30 yards casts a harmful magical spell, the Observer will deal up to 8% of the target's maximum health in Shadow damage. fel_fissure = 157, -- (200586) gateway_mastery = 5382, -- (248855) impish_instincts = 5580, -- (409835) nether_ward = 3508, -- (212295) Surrounds the caster with a shield that lasts 3 sec, reflecting all harmful spells cast on you. shadow_rift = 5393, -- (353294) Conjure a Shadow Rift at the target location lasting 2 sec. Enemy players within the rift when it expires are teleported to your Demonic Circle. Must be within 40 yds of your Demonic Circle to cast. soul_rip = 5607, -- (410598) Fracture the soul of up to 3 target players within 20 yds into the shadows, reducing their damage done by 25% and healing received by 25% for 8 sec. Souls are fractured up to 20 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 local summon_demon = GetSpellInfo( 180284 ) SUMMON_DEMON_TEXT = summon_demon and summon_demon.name or "Summon Demon" class.abilityList.summon_pet = "|T136082:0|t |cff00ccff[" .. SUMMON_DEMON_TEXT .. "]|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", 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 = "shadowburn", nodebuff = "shadowburn", 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", 20240808, [[Hekili:T3Z2YTnUs(T4AQOi6lkI02tsoRLEyp7lZuBnNh8zRZdBTMIsIYMvOi1ssLeVLl9TVa8ciU0naifLDYutnvLjreS7gn67ObXdUp8pF4(1bfHp8hEt9Uz6NM(PjUF29AVhUV45DHpC)UGvFj4rYFjjyl5p)pcZlY2VQiknH(SNJtdwtbrE6(SvKN)urXU8)2h(WJrfpTF5KvPB)qE029Xb03yvwWMc6)E1hE4(L7JIl(TKhwcG)PF(gcbeSV4P0ShU)(OT)DcKJwVoSA4H5RE4E6WVA6hVY76)2Hf)ZNcpS4FfKr(dcIJsoSyCEAwXHfPBCE4(4O8ICkvgveUL(x(JYPDysWY4W1p8V3m5wggNMLr(JC)INc9Z3NSkiooKqc7Zd9t3SX)XvRPV89b1Ca83yvgbzzrbpC)ycXCyrr0wcjo)WcVPhwm6WIvPPXRt)wYK89B3MM4hLSjmljiEsw42GOKC2yDoS4LxQarwuYxclMu4ojkFcgQlHo)O9MWWfd2uiE2HfFnGqHeEWK6b775VC)Mn1dqeF0jabtrHBY9Fmy7YOIsAdG886e552bYZfK880tEonOKaXSGO1(HFnmPysW615tc)ov0OcEYpB)UQFpFxyCSFrq2JHf6MxZNDyXTmgYY088seVj6XNk8ztT7ORQpuqe3LebBePsEE7(WC)9jzbFnmok5r)8DrjRJdLKPymNgjhFke(AiJ7veetNlYYx1OKTSbWK)wezctMHH(RcYlkNfIYcO0iV8aGWLoa7zgWwXAR1LXzJeE)1i8(AIHOGNhNwW)VhEwVf8DMKRYy3LfLsOONpSGi05Iaqp)WVVkE)Ao6QLz)uqUFJIhKkmSsPEcXRBw2gjQKRWmhzGGUZgCXmaGBmzeMXMTbj7dI1PPqHG)69zLU3oS4IYfdQHajrtNkVwzr7Qe0(xKP33csiRXfPhwq8UWMQKb)nIlSdl(T6Pc5XjXHuj(VrFjIiYHfBJO)7a2lvcIj1Ubz)wfCEIqjHuPjYFeTL4PDnDMeVp8YgOTmS89xtP6S8IjunKB0RH49QOrOAWWsncpuvmuncxdAeyUPmQAEQ0iGiOJuJWZGgHNrncVUOriyJ1Jk1DlVu3sEzSbratJJd3BztkKv925KfCzIC2UWvL6Ax0evabVv0SFys42OW8gjKwxMYpFEJe0tbFnDfBk704KtnOhkx8x7S3n5WBB57AJcZOHtwCxAHHnoE0gSAnd0KiGfAICRB1QKwkEjBG)32qY9ij(z6Fgs)drR8hwSll9Rr03KyfNonUSzaut4PK)mR6TAOyYZ)hKFkIa3KWOQNBeyltPEa4btPX9pA04UKQzhfqS3ocUaIhIasVsx4hcbecJ)tugpwUK0FVkbvU1gQc99LA)qPT2UmuJ(LKS1xtZYwysr5cCpQYbh53jjTh7N)uq26kt0Uk)6DKF9MwsCvAYM4GhZO5RdKctl5q9w7xLY7DnwVylxY4GWhNCBlskFgjseWi1BrHeiUzYTv(hRyezbpsJ5FDiz1GclYpK8LQyd4MopfKKeg3okDr(erwyJPtCoAyDAXKMFxWlCvKWOpwLHuLEzDwSP(RJQkwGlWss5CLqfpVkoSjTuQOHS)tj5dv4FxPNPwK)uyqCXtt2TQGLlfBn5PaIuZY9zjqoyuQ1r1AWQSN9lNPccJT6kvkjPC6iYAtKuYti6kLsdcdJQPIlIjSctsuFzACbKDp7Lxb8ntvnU(WIRWNoxiWmOuYsIHPhdZ6a)WbBU8j05Isqeve6im80IbE2nfhFw36meAUXe)qlZWbNsCNA)0Tr7RL3h81aIiofERBlFPsHqKK5kPrvZOIpMwJiw80DL96IBohsHxRvlxCBXTcykEhqTS72b7UFSHBtimIDe2sGHiUBdSMO2LKtOcsq9zru)tSiT5KiKhvjvkBR2kfAot6jRIscRNZe)SedQbFneYrlJnfexL5bXhpTQYv1w2VkA8kN3AkTN23oLgpGwpEIjbmsXofHTtGXKTbF3suwfxbGpV0DK15WIwW0eAf9VfVN6dSz1RYaF7clnmIPcHBTn45Nc32kYrGvn(3raIFR8uUExyCQOPbuBh(lJd()cfurxhwQKYjnl431DsBbAzsRekMWY8z)BPGwvismDgCVI)aPYG7cuU830nrHgbcVLhIz0vXpNVvVdiSqW4xOQTAZhHKvrNH7ssoS1RRdiCSEPI5crsqDrvwW46)Tu4iOYDsryx7wWAjjHqEv81Plc0XkrzUjlKa(LXHSzpwuOy6W1tAH3RiA1xitDLnuPXHEJKHOxvggAFopJNVKuYqKXsqGy7Zzq5cjqiA45WIZRe7s5FzU1ENsAcMB5OniDKOXv8V3Sqwz3vCv8mn5E2Stu2KMPoc9ti0jESdijzzHinO)ACFB7clyL2BsJlo6CM(aI(w(oYs5Zcpro71BWcvUkmbMUMiRtmz7)Wvxkuvgb2hLuNnjR8CNXha5AcRjnoALF42LHzIHqAxaPcbVst6IUigK)uyUOYaF00Kj0QaYeQiut(daXnI71Aqtz0f3XJW6yPDB0fsCFoaXMdAIhf04owuSTJbdp8KuuQPcV0GCasGEf8mw7hsGSRJwfOikv79J)XcEbe8(vBGSDInrWF4fCs8QdLW93etJAbLdPnlLFsvH8UM38IIDpr7lE4PSOQh0HiiK4Z4wX0eE5Tq)UU4JqrpUrf(aEhlf49v87gIg6SojNsh61VmAq5EFKFXHlHpHLfQaBA)t8Rj1TEL3hlRXHiXp(yRBRuv5s7fhBP5yrOniXPyj3bnf1FiZUAGR)k3AD1AkM3vC9Tofxvl4LlvfU3BD7PQhoaX9Klhw346WojwhMoXLffVsYJ1r(20MD3IJBCx99AvcnKh7chOXu)vLtvPPith2rsbfQY4OX2Gh6qxt6xjvHMrDctPrS8SkwMam4nVmalNEMnewZHzXgaPK79XMHSUSrhlkpGvSfrSihadC(4Lrg1u8u5UxquTJpAw4SJX4Z4w0HN1IrImY4u3uMpYgRTYFuJREn5nXy2rjFn9lH(7s)wygvUEp1BH)uMSVXb263HWKRlQQC4z06T(5PswhiH)KS2)BbzXPR(sonc5OhtasWqkvy95PvNhXUNZsFmmjAvE7gjReXHy64kB8bU1FZl9MwwLTURt9DmubYE9uIBQeDP2bV1lDo4q0YyIaIXlaP5vLNkACmsjSG78qtIXIPUIN1xnFLosFQi7YSOT5fPjgQUkye9SuXSHyZjluF5q9w1l6iY(DjZ7gltUyxw4Q0TldkGsXGJB0e8cBXKgLwqSqOzBOs8PBJsknnWs7qsNExO8cPmRHUhpejDSD5PzpAQ2tm)GDXulaBc2tIP4(PqrKBEtJKA2sAdVqxw4rNuR7afuDhWJNr841Ihzl614jAJEgulfN)CIqiqw30BGDz470e9eKJblg87mHZkO5uZi9dJZjtWP0cYvZzDHsgOJmkpZmkSM)Y7nGrbIt7yuYU56GKRHJ4tzaAcJvZjNqDWudnITnkOaDvx6bLYuhMjgonqceNPZaI6GTAM4XntuYkRdtLsEx2(Lp7)TNcJ3rYGlmogI)(TNIY3fwUxHSAk6hTQg6k856MshmxToqEEwqEEDM88eipzx5DG8CNO2B4JL5CBJYYsllR7Mmci3NfUMeMZwIWt63YlZmU(mXb9YAKCoV0rVdURggDbMdyhMMEgMMEhZ00KcIMPPhW0eXfUTwYBoQdpiwhFT(9WT1tLtn5jWOZGpyZHsWPKrnUSCZxqR5YTL)ahK5dBGB8aGM6lteIxbcrZl6onBb9ylIoaAEQCCKmnpDTEE6A580gDyhfhNUmTipWmZvYx4rsAcP0Cgi4ipG84nrRaY7hCyTzVRMSIyeZAYfUZ1n7twMPqti2n5jWOXYdHknDE58Z6SLk0scp2QyJUYCtYxUgxxB0wRgnJQj3uKCs0t8v6gBIttZAuuKQiYhmP640SnMK)YzZ0dSlgAUItjbAbaD4kZ3GnDRNXYGufQ2oD6k2RfZgY50pfRG9NjBmNnhlb0vw6XOQ8doC0VzypVsxx5eqrpXQRcsklkf5VsCbewFYKs3CO94lv8eDmSFVb(xwFKxzNt2OIlPfdQq(3R8nfvJW1PjVN8a6PgT8arrRCi59csw3oMQ3qz0rLaKaXQcfcfRO4jsTF1bPBAaGX58NxJygNUNuJy2G9UBeZiu)PyfS)mzJ1t5ymIbfE)ryedkZjvL(UxuYXWhzMRB25xn7Vj3gqaFWzAMKvnrLM24yKbij9CFGoIcA7EA2V1rITReFTJBzRbPe2yAY6OsgfEHx1WlvyKhu(iyaJ76Fva94r5ZaMijZfIVMDkK2qra1aea6keLDiO(0QauDo4SXfMeyRvCeror(Ffn3flPh2wJI33dVMKdRVQ00(dTQDh9rkzKudjx)KYcodFstEaBBL6s)y)21RtAAM7oNDmERayS9gQM9WBX6vLnVqvblQqmy3QYB2lkPOkjv6(1TpV8DKSZQ0hcJnEctc)E4Q9fHD5qLyQRt1uKKF4ojmqLAPqBpuWI241CH9oj01QkCoTuxxZc(d9e1Cnl4qu6wLCffoCe64mZK(iiqUpN(uUq3ozTWGm473X2PEgaESCMBJCGnCkwus49dgRaD1yYqvan3Skv(fiXqUmnzpD3QcZUEQ)n7wzs7gpSbZbYoRPbcKCijCOdwLfK)evfEf)5CwGSuoEemTyP(gsQIK4()7u3Ow9eRpLpMpGe)KDYDQI(WOiMbjjTnFZa2TRMA9MJ4S5O5mty)zZb3D5F(fbe2Tdt97vVA17H7OJOXW3R9rh5ZwUNnLj(OTXUyP1iThiYHvH0d0TuXU0Y)pW((myiJfcJg2OUIrvpoXVaASrtvQcZOhLyXQ)mcQ2sZT4fnVMBnL2YMBrg0Uu9QYQTM6RQM4uj2DCA6A)n7ZEMJRbRPQ9voEUmhZLHaOQN)teZLAFTCYynVf6noEwlGamdrq1Q8vLf)NDtfbjROrbqZ5iioU0HaTh0iKa9XvFuZ)ij4O7)gXbpHKikcLFLwJ2UR8du(gAr)FFzXQEp9ey8)UNS0TMg3l1PzW(I06VzRux7e3vto87)Nr0pPGU)Tdl(7Pjemv(433uGDTDoibf0nm79InSHMrp297ogrP6hTrf8aoKtiWncwKVP5WmiWXzj13LvdtJ2kuQ(fseys13vJ(bCJGf5t4omdY8QHNmAanJXGUwJCgHnVafAR5blxPB4wHu99dim7ZAKE9jKlQaB2eI)ZWmWeq6XwcuJcTMTpnSa)eb2xhA(MtOGHcSzQxAfmuESLa1iFWSPYHf4NiW(6qZ3EcfmuGTkj3eTNoAMBmNuWla4)RK897OX7rbDZ353MYEFyX)9HfQ(0(F(3oSGWEYE(WI1rL1ZFndM)6GQxlXjgwGJd2bu24uc7pAwWOdQkNuGJd2tj)yqG9HFhiRO6MH(9DkVimFE9vr2sxQ9f8Nma)x09Fr32a43i6oDxy1iYPn8lbkJhx2bKK)hFzzENoG7CHRZzZGETlgZgSSPNMx(k0ruddhN3zeiooJ6hztO7Mxu8nntwMH9lV0tM5BoVSRmJ3PFkz89VYulX7mFQdHWmbN5EtB0gGz9FWeR)ukh)bJabto2izFeYXMHnMCSX38nNx2vMXpqIXgZreObU1LiaMJMHg8Nma)x09Fr32a43i6UZbsba8tTdi7C(3lY(iCazg2MdKc5nFZ5LDLz8o9tjJVVQhiVE7bYYaPEdKJTZ5FVi7Jqo2mSnhi1RVCSD8YUYm(bsmEcAPLBAwz67K(EXkLv)RwxfCUUiS(0CjbqOd6LLq9hFkuQ7jHaSVsVvkdBxLDLU61foKdsGg8aqOayKnkt(0SidBKd7ITGhOl4vwcr7tEBrYXZCqwspEaJSBadlB5TejSZOHS8U8z7WwaYo4fsau50Cylahw2WNqydchHbzEb45Bqg0EiQ(sTbUeSrAsCBboydKlHcTnzUTisO7ZLqayNPBlGheZUEigaggEpcWhEEpcIoEE)PXLh4gTX((K((oTvB67vJMVRuVxo7wLhR3tplVzTav5XcafBpT77UACIb)jdWVr0TsnkqQxz(OX6G)7mN77SPV8IXbPFxdMn1PzY2tY0ibyhvAIizCBSUiOVLAsskzOb)jdWVr0TzPBpfXga4FcKUbWIoPB7itJeGDuPjIKXTvI(JzKQlTwTPrli5OfL23UTghU9iv57ClmYGgMas(mQorxyMMgT9O0EMPXHBpsnZmrhMyIjt1TKj)L4fEfdyuDahOFjFHrMUHlIvTnQVXzg2O6aoSFMzC4IyfV)93LLUAsqYZ(R3LRlUhSXn04rOWJDa(rg(eSclBy6v6a2TxP24WfXkE)SBhpfFCdnE0V2HdFlwiaK(n9kDa72V2zC4IyDO3p0tn8TbY0uol)eeqRMfX33kipjGdYwA3AmGL5RgyBHGZrlRzXbnqJfW(VQ3x4BdKTynbzq2s7wJHoVQBLP(J27GPwu4m0eRXYj5LxWZwrF6kg3rVZh7EX0j3EoIcf55aGG(bKL(Mxj9MMyvooZhRV4bgBLlf611i96IqVMxADyzl(kUM9HFYwZuP3361Sjif6niL6yUdL4f5mGYU)yzwlK(DRp3Nn7gup2P5t55tvnTRQxN)QStcYqxjNkG9uEYKXaEVyUQrj2mlpP7D9qbEK9Le8IruchAV8eLrKhcBI9nPsc4kxUCTaeuHT67GA30zryTvxZ8s0J4DpV8SdzJxhOfjLA0u)6hDdaGO72)TnhbG9FBZraypwIWAELHXIYPClAXa(GVfTyi6O3IwmaFKBrBTLLHtgbBB8jrLVoAvaa)L7jOafXBZGiBGb8bx2adrhTSbgGpszdqNenrI1bFeyDms3DBvbpSovQVXjI2xr9iugeyDKHYHCoO7ffIaRJSNjhskejsGEble)(djSosohM)5b38JP0mG6SnXVKQyagZUw3vWbn5q)MxoiwCgK4uoLzvDkZYejs9bb2NMVflh(9FBBZhYKp2(fmHEVlqxQPx11PBIIzFFxZNW6TSzI3C1xgTzgDhwNpD0zSR56d)UYRDXSputvKrb)8MANCj9MFyw7n)XL1FajMn9Y0DZkVSRTbas136YYlDKzIvNLDPj2b45bcpVEdVQkerNAL3zN1W19Y2RwXztNC7LS7qJzMBNPxLMUcUDM6Ym37ON5kT6YRsd5a3QlDzM3CPmRiuQPHmE5fHHHULDsJtP9h6cD6btNABCKw8RFRfLg3rrNSlFzigQChmiXGq75GUqaEieayluinZhecqQu1k8bWD8(IXcCcTLJ(CVPosJhDP9CVoPn4PL2r2T(lglWe7aTRxSSJ0EZLNSSvmpERyUC2WorBaZGSNzqBuDh2egZlec7bZGSTzq7YAh2hgZY9oiIdG3kXLrdvfdM2l3yKaKAk4i8Jzf4KIf1lNP5U3c)ETFZ7Pb(vpck6yxgXh(9F5xAIcmxruVmdFF6Dxq538FUGWeFRvpVQurY4Bti4ATeOlfHZRVDJQkSW(D8KSiOBCrx)5UUwfSg0axsjV8YqCKxVZBkzMFyXp93mQ4m2wLgXRmXAwRHtt)BWNghZH4z8ltWW)LXXiOn(Dj41)7IJDmYUYk0M0qFoo39(7IJzzE5Rju7K5Fd(kgy3svFO6HqMVRFddm9IV5mYUYk0MUyFK579NWaCzEHlVZgb9kFLn3kRZND9vJflI7OZaQblHuoB8zsdeyCc)wB(oJeX6D3qahJd0wki8PI8nnA9SrAY4YflnmuLVmszmkAqxS3v8wp14RxHkbiitVMbcTwTxwD9PssOGaRZGjhvgxhqs5nyXqIL2lJjkWAKKeAaGr4xNL35o5wNrTxECZj)7xEzv1v(0m(7okoCkF1yrrCliU7MjFC046xBU3lVqVirgjOBFxR(k29QQJiR06aZPJw(Y9IlPb5EUy0yOiKV62ZhxbpW7lZrmTqLZMpj)l2D5fb2O89583MLV8YzqlBcSawQlsm7zxp5wTiIroxWDTIHGXrLqH)EItGgAytLcAJhCo3DG3QONpDY1eNAqi7URjo7aPcvsGNF7C3TAiKrQVC19ekXhfZWCJajxznvUrqNdrACaHTKYxBu579ZlQPgG78Z5yRa6yYJuVndN)jJApqiItqh6M7ucM1SskWm5rD2uEds3WCOj8LQqq3qeo4ygmLvO7uZxEHJcMDJr(tJYuZnN5CxIZ66FuQvoAMoG7)5OMxsO3jE5fyF6Kvt9lmcmj21qzfbllfuQtiDxwENySnImZsBfGxxLWeaWBlC)hBIh)Jgdv21LM5QQdWBf)3WwP14NVX96yox0x56a6ST(YC8Cap5GvUIghI2GKSBKLr6y3qlRefDAvvlRkDWrv)Jgou9Sqoo2BVymZ(qDVYmskkzQjxuBo7316lu6zoYe)RBCp1iTN6TJ4zLYWKVVD6KDrtacyk76z6L4n1o(Mj3E10jUNxVmZRos8Dr96D7aXHuenf0z5iksewxnMJMQf9CyYz8tivbERdDT(nQugO16LmbkP78Qef6NumjejPKgfNgZVXuqb10fl6pastYQ5MSqcRJeYeqetnvO)yICsokEEyj76GbZ6)pX2pzwEhjRharS7MDdeVWvHz0NOKqiE7mrcz3vALwi2QOKVM(Lq)DPFlmJoI9uJn(tlLumoOgJr0TTx0p1m3ppLj3dEcamPTxNQYUNZsFmmjAv(ekPiBwNlMR(ZX7IeSs6mNgzyIh6kK3O9bBNdqeKW2fnPZT3qh18ZbjjQ78adg6ob3YKx(mHrveTIEJIsGjR8fsBq1DEoNZptGsRQ)myqENRjp5kAw8zBJhQAdFNfffxUa032NQFSmlABErAcBVjvZYwrwxmypPXNtyeF5oVwl(ShHty8H3vvojBJBZWOfTlzyWDiopaykwpYDebd)wV0nTlgtEPA3nBeAN5oLf0F1HaaIOTOwASfrd1udSiAC10tM8biNx5Wn5w7SpKL2xQlfDdWO3mpaG(wv0RUToP1SlUxfqJRWIVigzD6CfPudLYUIqXgELUZ5v8aOIs50bZYqYrdC0VMcT1ELTBh1fzIbUUtCQei16YsnXx7cubndo201qyYIzSzC4DQ8vAbcSNCZgXyv2e3HKaYQhn3zoRXje)XqJzjHzcSwzTfyt4mkEbrqqDaSc2BR81BLWeEGCwjL0nd9dCv9qd8yikUhN7jWGalTZQIA5ikLDowMRgVnk3rcI0Qiqq8NXqeZIGhgE86UmQesMtY8msWgLM74JUObMDOEg2NpeC6hJejvaM0XAtKJrXjIo2CTr5ckIlrDNriRuMWi2cSutpqIG7krcPTmU89YGm16OIF56liIO5ZUEKimmdbLg04gzAfGu7oL5Xm)bACSTUDcoPgb43IeXQJ0SuTpy7GQKrReAs8S5nmgp1WM8ctPwivCuH42xSmBxYl2CBtFj9VKUzJpXWkXwqzQMyheJAvmc8N7n1MgfIwQfHgJgdYGN3M2KbWBKDbOxzaH)iF4WtbApKjGN1jnuGRmf4Hrb0KpKZQm870dg3lVi)70i7R6I6AZZO078z3c7GK3kPYID5Yl6jvOC9LntBwpRlBHUcUdWDe75XrcRtOeGdeSK7FYrcCCCyHZE(Ldl(xcTdDzJuxd2CYdIkE6WIFRjLJf7tIdZZR7HAcTCyX2i6)oGRJSjGyYHfLNiw2VvbNNi4NyM7WcYFevFiylRDZLnqBzvpEt(DI9P8IjAwaZJtlA6Su3(UEzC5IiYQmMMZLYmxWJps9PvIIv2Yd9Gu0OljOhQQGHJopBm0WfxReByeowVZeGjQUy69JGSiuD02G1heA1YlCNptqS0XYLCVbBjxwRs7sUhOmJ6sUl2soKnvnsyd0sUkw71sUh6sUNMLCVJyjVQ)Xv8Lqx87XAp0MuFlTTPb4tnKRrgfz1Fx4kIXSlA3zX6i9MrtDtoOsxHnO3HDGxstIFM(N0tYsIOL4dl2LL(1iQDXa6PyzZMlBga1mBk5pZQERgIL88)rw1zwjjmQ65gb2YuQvAEWOZaSy4skMJXpmE4gmiXhG(w9lUihwnfKw9mQyXwwjAy20OiDG)4bZFmRDbXFuoN2DkQT3o(tUidIpYC6olrg5Uu6)SxQ6I7rAn8Q3Z7WVx3CKLI(17Oe)2G3lms0ZrsIXe)7c3Pxy9(YlxMjBFphPTZVlK3TkRm067fMr3iI(YRaSeJFGtuij2iBjK2z6OXi8iObdhAS1uIkNjonDT)M9zppGCgRjhbrPwsXO0dWq7hJrHFqlZqj0FZzhmkXi3qDK9JzGlLeKSIwUhAdAtsHDazn)mQd9W9K88x9WF49RF8HcY)9W)p]] )