Cogspark Works · Rotation
Destruction Warlock
The priority list SimulationCraft plays this spec with · engine build 20261019-1860cd1-w8a2c73d · game data 12.1.5.70448
§1How to read this
A rotation in SimulationCraft is a priority list, not a sequence. Every time the character can act, the sim starts at the top of The main loop and does the first line whose conditions hold. Lower lines only happen when nothing above them fits.
- The page shows the list as a decision tree: set what you know about the fight and your talents, and it lights the lists the sim checks, in order.
- Cast lines use the ability. Hover, focus or tap an icon or a name for its tooltip.
- Go through another list: its lines are checked in order; when none of them fits, the sim comes back and carries on with the next line here.
- Switch to another list: the rest of this list is skipped and the choice is made from that list alone.
- Helpers are values the list works out on the spot, such as “are we holding a cooldown”. Setting one takes no time and the list carries on. The tree works out the ones your situation settles.
The list is written to perform well in the sim, not to be the only right way to play. Every line keeps its original simc text under the simc toggle at its right, and the list author’s note where there is one.
§2Decision tree
Set what you know. The tree lights the lists the sim checks, top to bottom; in each list it presses the first ability whose conditions hold and that is ready. Readiness (cooldowns, resources) isn’t in the list, so a lit ability is the first one allowed, not a promise it is cast.
- The main loop
- Helpers
- Ogcd
- Items
- AoE hc (maybe)
- AoE dia (maybe)
Before the pull, done once before the fight starts (15 steps)
Before the pull15 lines
- Cast Summon Pet
simc
summon_pet - Set trinket 1 buffs to true when the following holds, otherwise falsetrinket 1 has an on-use effect that grants a stat buff
simc
variable,name=trinket_1_buffs,value=trinket.1.has_use_buff - Set trinket 2 buffs to true when the following holds, otherwise falsetrinket 2 has an on-use effect that grants a stat buff
simc
variable,name=trinket_2_buffs,value=trinket.2.has_use_buff - Set trinket 1 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 1 buffs is true
- any of these:
- the remainder of trinket 1's cooldown divided by Summon Infernal's cooldown is 0
- the remainder of Summon Infernal's cooldown divided by trinket 1's cooldown is 0
simc
variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&(trinket.1.cooldown.duration%%cooldown.summon_infernal.duration=0|cooldown.summon_infernal.duration%%trinket.1.cooldown.duration=0) - Set trinket 2 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 2 buffs is true
- any of these:
- the remainder of trinket 2's cooldown divided by Summon Infernal's cooldown is 0
- the remainder of Summon Infernal's cooldown divided by trinket 2's cooldown is 0
simc
variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&(trinket.2.cooldown.duration%%cooldown.summon_infernal.duration=0|cooldown.summon_infernal.duration%%trinket.2.cooldown.duration=0) - Set trinket 1 buff duration to trinket 1's stat buff's duration
simc
variable,name=trinket_1_buff_duration,value=trinket.1.proc.any_dps.duration - Set trinket 2 buff duration to trinket 2's stat buff's duration
simc
variable,name=trinket_2_buff_duration,value=trinket.2.proc.any_dps.duration - Set trinket priority to 2 when the following holds, otherwise to 1any of these:
- all of these:
- trinket 1 buffs is false
- trinket 2 buffs is true
- all of these:
- trinket 2 buffs is true
- trinket 2's cooldown divided by trinket 2 buff duration times (1 plus (0.5 if trinket 2 can grant Intellect, else 0)) times trinket 2 sync is more than trinket 1's cooldown divided by trinket 1 buff duration times (1 plus (0.5 if trinket 1 can grant Intellect, else 0)) times trinket 1 sync
simc
variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&variable.trinket_2_buffs|variable.trinket_2_buffs&((trinket.2.cooldown.duration%variable.trinket_2_buff_duration)*(1+0.5*trinket.2.has_buff.intellect)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%variable.trinket_1_buff_duration)*(1+0.5*trinket.1.has_buff.intellect)*(variable.trinket_1_sync)) - all of these:
- Cast Grimoire of Sacrifice if you have Grimoire of Sacrifice talented
simc
grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled - Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Cataclysm if there are 2 or more enemies and the next add wave starts in more than 15 s (or never)
simc
cataclysm,if=active_enemies>=2&raid_event.adds.in>15 - Cast Soul Fire
simc
soul_fire - Cast Cataclysm
simc
cataclysm - Cast Immolate if there are 2 or more enemies and you have Roaring Blaze talented
simc
immolate,if=active_enemies>=2&talent.roaring_blaze - Cast Incinerate
simc
incinerate
The main loop20 lines
go through Helpers, then carry on below if nothing there fits
simc
call_action_list,name=variablesHelpers4 lines
- Set infernal active to true when the following holds, otherwise falseany of these:
- your Infernal is out
- Summon Infernal's cooldown minus the cooldown left on Summon Infernal is less than 20 s
simc
variable,name=infernal_active,op=set,value=pet.infernal.active|(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains)<20 - Set ritual length to the time left on Diabolic Ritual: Mother of Chaos plus the time left on Diabolic Ritual: Overlord plus the time left on Diabolic Ritual: Pit Lordritual length starts each fight at 0
simc
variable,name=ritual_length,value=buff.diabolic_ritual_mother_of_chaos.remains+buff.diabolic_ritual_overlord.remains+buff.diabolic_ritual_pit_lord.remains,default=0,op=set - Set trinket 1 will lose cast to true when the following holds, otherwise falseall of these:
- any of these:
- all of these:
- ((the time left in the fight divided by trinket 1's cooldown) plus 1), rounded down isn't ((the time left in the fight plus Summon Infernal's cooldown minus the cooldown left on Summon Infernal) divided by Summon Infernal's cooldown), rounded down
- ((the time left in the fight divided by trinket 1's cooldown) plus 1), rounded down isn't (((the time left in the fight minus the cooldown left on Summon Infernal) divided by trinket 1's cooldown) plus 1), rounded down
- all of these:
- ((the time left in the fight divided by trinket 1's cooldown) plus 1), rounded down is ((the time left in the fight plus Summon Infernal's cooldown minus the cooldown left on Summon Infernal) divided by Summon Infernal's cooldown), rounded down
- the time left in the fight minus (the remainder of the cooldown left on Summon Infernal divided by trinket 1's cooldown) minus the cooldown left on Summon Infernal minus trinket 1 buff duration is more than 0 s
- all of these:
- Summon Infernal has more than 20 s of cooldown left
simc
variable,name=trinket_1_will_lose_cast,value=((floor((fight_remains%trinket.1.cooldown.duration)+1)!=floor((fight_remains+(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains))%cooldown.summon_infernal.duration))&(floor((fight_remains%trinket.1.cooldown.duration)+1))!=(floor(((fight_remains-cooldown.summon_infernal.remains)%trinket.1.cooldown.duration)+1))|((floor((fight_remains%trinket.1.cooldown.duration)+1)=floor((fight_remains+(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains))%cooldown.summon_infernal.duration))&(((fight_remains-cooldown.summon_infernal.remains%%trinket.1.cooldown.duration)-cooldown.summon_infernal.remains-variable.trinket_1_buff_duration)>0)))&cooldown.summon_infernal.remains>20 - any of these:
- Set trinket 2 will lose cast to true when the following holds, otherwise falseall of these:
- any of these:
- all of these:
- ((the time left in the fight divided by trinket 2's cooldown) plus 1), rounded down isn't ((the time left in the fight plus Summon Infernal's cooldown minus the cooldown left on Summon Infernal) divided by Summon Infernal's cooldown), rounded down
- ((the time left in the fight divided by trinket 2's cooldown) plus 1), rounded down isn't (((the time left in the fight minus the cooldown left on Summon Infernal) divided by trinket 2's cooldown) plus 1), rounded down
- all of these:
- ((the time left in the fight divided by trinket 2's cooldown) plus 1), rounded down is ((the time left in the fight plus Summon Infernal's cooldown minus the cooldown left on Summon Infernal) divided by Summon Infernal's cooldown), rounded down
- the time left in the fight minus (the remainder of the cooldown left on Summon Infernal divided by trinket 2's cooldown) minus the cooldown left on Summon Infernal minus trinket 2 buff duration is more than 0 s
- all of these:
- Summon Infernal has more than 20 s of cooldown left
simc
variable,name=trinket_2_will_lose_cast,value=((floor((fight_remains%trinket.2.cooldown.duration)+1)!=floor((fight_remains+(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains))%cooldown.summon_infernal.duration))&(floor((fight_remains%trinket.2.cooldown.duration)+1))!=(floor(((fight_remains-cooldown.summon_infernal.remains)%trinket.2.cooldown.duration)+1))|((floor((fight_remains%trinket.2.cooldown.duration)+1)=floor((fight_remains+(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains))%cooldown.summon_infernal.duration))&(((fight_remains-cooldown.summon_infernal.remains%%trinket.2.cooldown.duration)-cooldown.summon_infernal.remains-variable.trinket_2_buff_duration)>0)))&cooldown.summon_infernal.remains>20 - any of these:
go through Ogcd, then carry on below if nothing there fits
simc
call_action_list,name=ogcdOgcd6 lines
- Drink a potion if infernal active is true or you don't have Summon Infernal talented
simc
potion,if=variable.infernal_active|!talent.summon_infernal - Get Power Infusion from an ally if infernal active is true or you don't have Summon Infernal talented or (the fight ends within the expected cooldown left on Summon Infernal plus 10 s plus Invoke Power Infusion 0's cooldown and more than Invoke Power Infusion 0's cooldown of the fight remain) or the fight ends within the expected cooldown left on Summon Infernal plus 15 s
simc
invoke_external_buff,name=power_infusion,if=variable.infernal_active|!talent.summon_infernal|(fight_remains<cooldown.summon_infernal.remains_expected+10+cooldown.invoke_power_infusion_0.duration&fight_remains>cooldown.invoke_power_infusion_0.duration)|fight_remains<cooldown.summon_infernal.remains_expected+15 - Cast Berserking if infernal active is true or you don't have Summon Infernal talented or (the fight ends within the expected cooldown left on Summon Infernal plus Berserking's cooldown and more than Berserking's cooldown of the fight remain) or the fight ends within the expected cooldown left on Summon Infernal
simc
berserking,if=variable.infernal_active|!talent.summon_infernal|(fight_remains<(cooldown.summon_infernal.remains_expected+cooldown.berserking.duration)&(fight_remains>cooldown.berserking.duration))|fight_remains<cooldown.summon_infernal.remains_expected - Cast Blood Fury if infernal active is true or you don't have Summon Infernal talented or (the fight ends within the expected cooldown left on Summon Infernal plus 10 s plus Blood Fury's cooldown and more than Blood Fury's cooldown of the fight remain) or the fight ends within the cooldown left on Summon Infernal
simc
blood_fury,if=variable.infernal_active|!talent.summon_infernal|(fight_remains<cooldown.summon_infernal.remains_expected+10+cooldown.blood_fury.duration&fight_remains>cooldown.blood_fury.duration)|fight_remains<cooldown.summon_infernal.remains - Cast Fireblood if infernal active is true or you don't have Summon Infernal talented or (the fight ends within the expected cooldown left on Summon Infernal plus 10 s plus Fireblood's cooldown and more than Fireblood's cooldown of the fight remain) or the fight ends within the expected cooldown left on Summon Infernal
simc
fireblood,if=variable.infernal_active|!talent.summon_infernal|(fight_remains<cooldown.summon_infernal.remains_expected+10+cooldown.fireblood.duration&fight_remains>cooldown.fireblood.duration)|fight_remains<cooldown.summon_infernal.remains_expected - Cast Ancestral Call if infernal active is true or you don't have Summon Infernal talented or (the fight ends within the expected cooldown left on Summon Infernal plus Berserking's cooldown and more than Berserking's cooldown of the fight remain) or the fight ends within the expected cooldown left on Summon Infernal
simc
ancestral_call,if=variable.infernal_active|!talent.summon_infernal|(fight_remains<(cooldown.summon_infernal.remains_expected+cooldown.berserking.duration)&(fight_remains>cooldown.berserking.duration))|fight_remains<cooldown.summon_infernal.remains_expected
go through Items, then carry on below if nothing there fits
simc
call_action_list,name=itemsItems5 lines
- Use your trinket 1 if ((infernal active is true or you don't have Summon Infernal talented or trinket 1 will lose cast is true) and (trinket priority is 1 or trinket 2 has no cooldown or trinket 2 is on cooldown or (trinket priority is 2 and Summon Infernal has more than 20 s of cooldown left and infernal active is false and trinket 2 comes off cooldown within the cooldown left on Summon Infernal)) and trinket 1 buffs is true) or trinket 1 buff duration plus 1 is at least the time left in the fight
simc
use_item,slot=trinket1,if=(variable.infernal_active|!talent.summon_infernal|variable.trinket_1_will_lose_cast)&(variable.trinket_priority=1|!trinket.2.has_cooldown|(trinket.2.cooldown.remains|variable.trinket_priority=2&cooldown.summon_infernal.remains>20&!variable.infernal_active&trinket.2.cooldown.remains<cooldown.summon_infernal.remains))&variable.trinket_1_buffs|(variable.trinket_1_buff_duration+1>=fight_remains) - Use your trinket 2 if ((infernal active is true or you don't have Summon Infernal talented or trinket 2 will lose cast is true) and (trinket priority is 2 or trinket 1 has no cooldown or trinket 1 is on cooldown or (trinket priority is 1 and Summon Infernal has more than 20 s of cooldown left and infernal active is false and trinket 1 comes off cooldown within the cooldown left on Summon Infernal)) and trinket 2 buffs is true) or trinket 2 buff duration plus 1 is at least the time left in the fight
simc
use_item,slot=trinket2,if=(variable.infernal_active|!talent.summon_infernal|variable.trinket_2_will_lose_cast)&(variable.trinket_priority=2|!trinket.1.has_cooldown|(trinket.1.cooldown.remains|variable.trinket_priority=1&cooldown.summon_infernal.remains>20&!variable.infernal_active&trinket.1.cooldown.remains<cooldown.summon_infernal.remains))&variable.trinket_2_buffs|(variable.trinket_2_buff_duration+1>=fight_remains) - Use your trinket 1 if trinket 1 buffs is false and ((trinket 1 buffs is false and (trinket 2 is on cooldown or trinket 2 buffs is false)) or (you have Summon Infernal talented and the expected cooldown left on Summon Infernal is more than 20 s and your last spell on the global cooldown wasn't Summon Infernal) or you don't have Summon Infernal talented)Used without waiting for the global cooldown
simc
use_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_buffs&(!variable.trinket_1_buffs&(trinket.2.cooldown.remains|!variable.trinket_2_buffs)|talent.summon_infernal&cooldown.summon_infernal.remains_expected>20&!prev_gcd.1.summon_infernal|!talent.summon_infernal) - Use your trinket 2 if trinket 2 buffs is false and ((trinket 2 buffs is false and (trinket 1 is on cooldown or trinket 1 buffs is false)) or (you have Summon Infernal talented and the expected cooldown left on Summon Infernal is more than 20 s and your last spell on the global cooldown wasn't Summon Infernal) or you don't have Summon Infernal talented)Used without waiting for the global cooldown
simc
use_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_buffs&(!variable.trinket_2_buffs&(trinket.1.cooldown.remains|!variable.trinket_1_buffs)|talent.summon_infernal&cooldown.summon_infernal.remains_expected>20&!prev_gcd.1.summon_infernal|!talent.summon_infernal) - Use the item in your main hand slotUsed without waiting for the global cooldown
simc
use_item,use_off_gcd=1,slot=main_hand
Is it true that there are 2 or more enemies and you have Wither talented?Not set
If so, go through AoE hc, then carry on below if nothing there fits
simc
call_action_list,name=aoe_hc,if=active_enemies>=2&talent.witherIs it true that there are 2 or more enemies and you have Diabolic Ritual talented?Not set
If so, go through AoE dia, then carry on below if nothing there fits
simc
call_action_list,name=aoe_dia,if=active_enemies>=2&talent.diabolic_ritual- Cast Soul Fire if you have 4 or fewer Soul Shards
simc
soul_fire,if=soul_shard<=4 - Cast Conflagrate if Conflagrate has 2 or more charges
simc
conflagrate,if=action.conflagrate.charges>=2 - Cast Chaos Bolt if you have Diabolic Ritual talented and (
demonic_artor ritual length is less than Chaos Bolt's cast time) and the target is above 20% healthsimc
chaos_bolt,if=talent.diabolic_ritual&(demonic_art|(variable.ritual_length<action.chaos_bolt.execute_time))&target.health.pct>20 - Cast Conflagrate if you have 4.2 or fewer Soul Shards and Backdraft has fewer than 1 stack
simc
conflagrate,if=soul_shard<=4.2&buff.backdraft.stack<1 - Cast Summon Infernal
simc
summon_infernal - Cast Malevolence
simc
malevolence - Cast Shadowburn if ((not
demonic_artand (ritual length is more than 2 or you have Wither talented)) or the target is at or below 20% health) and (Fiendish Cruelty is active or you have Conflagration of Chaos talented) and (you don't have Wither talented or you have 4 or more Soul Shards or Malevolence is active or your Infernal is out or the fight ends within 15 s)simc
shadowburn,if=((!demonic_art&(variable.ritual_length>2|talent.wither))|target.health.pct<=20)&(buff.fiendish_cruelty.up|talent.conflagration_of_chaos)&(!talent.wither|soul_shard>=4|buff.malevolence.up|pet.infernal.active|fight_remains<=15) - Cast Wither if (the time left on Wither minus (5 if (Chaos Bolt is in flight and you have Internal Combustion talented), else 0) is less than Wither's duration times 0.3 or Wither is missing from the target or due for a refresh or (the time left on Wither minus Chaos Bolt's cast time is less than 5 s and you have Internal Combustion talented and Chaos Bolt is off cooldown)) and (you don't have Soul Fire talented or the cooldown left on Soul Fire plus Soul Fire's cast time is more than the time left on Wither minus (5 if you have Internal Combustion talented, else 0)) and (you don't have Cataclysm talented or the cooldown left on Cataclysm plus Cataclysm's cast time is more than the time left on Wither) and the target lives more than 8 s longer
simc
wither,if=(((dot.wither.remains-5*(action.chaos_bolt.in_flight&talent.internal_combustion))<dot.wither.duration*0.3)|refreshable|(dot.wither.remains-action.chaos_bolt.execute_time)<5&talent.internal_combustion&action.chaos_bolt.usable)&(!talent.soul_fire|cooldown.soul_fire.remains+action.soul_fire.cast_time>(dot.wither.remains-5*talent.internal_combustion))&(!talent.cataclysm|(cooldown.cataclysm.remains+action.cataclysm.cast_time)>dot.wither.remains)&target.time_to_die>8 - Cast Immolate if (the time left on Immolate minus (5 if (Chaos Bolt is in flight and you have Internal Combustion talented), else 0) is less than Immolate's duration times 0.3 or Immolate is missing from the target or due for a refresh or (the time left on Immolate minus Chaos Bolt's cast time is less than 5 s and you have Internal Combustion talented and Chaos Bolt is off cooldown)) and (you don't have Soul Fire talented or the cooldown left on Soul Fire plus Soul Fire's cast time is more than the time left on Immolate minus (5 if you have Internal Combustion talented, else 0)) and (you don't have Cataclysm talented or Cataclysm has more than the time left on Immolate of cooldown left) and the target lives more than 8 s longer
simc
immolate,if=(((dot.immolate.remains-5*(action.chaos_bolt.in_flight&talent.internal_combustion))<dot.immolate.duration*0.3)|refreshable|(dot.immolate.remains-action.chaos_bolt.execute_time)<5&talent.internal_combustion&action.chaos_bolt.usable)&(!talent.soul_fire|cooldown.soul_fire.remains+action.soul_fire.cast_time>(dot.immolate.remains-5*talent.internal_combustion))&(!talent.cataclysm|cooldown.cataclysm.remains>dot.immolate.remains)&target.time_to_die>8 - Cast Conflagrate if you have 4.4 or fewer Soul Shards and Backdraft has fewer than 1 stack
simc
conflagrate,if=soul_shard<=4.4&buff.backdraft.stack<1 - Cast Ruination
simc
ruination - Cast Cataclysm if you have Lake of Fire talented
simc
cataclysm,if=talent.lake_of_fire - Cast Chaos Bolt if (you have Wither talented and (you have 4 or more Soul Shards or Malevolence is active or your Infernal is out or the fight ends within 15 s)) or (you have Diabolic Ritual talented and ritual length is more than 4)
simc
chaos_bolt,if=(talent.wither&(soul_shard>=4|buff.malevolence.up|pet.infernal.active|fight_remains<=15))|(talent.diabolic_ritual&variable.ritual_length>4) - Cast Infernal Bolt if you have 3 or fewer Soul Shards
simc
infernal_bolt,if=soul_shard<=3 - Cast Incinerate
simc
incinerate
Read from ActionPriorityLists/default/warlock_destruction.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.
Blizzard’s own suggestion system (the one-button rotation), as simc carries it. It is simpler than SimulationCraft’s list and is not what Cogspark simulates.
§2Decision tree
Set what you know. The tree lights the lists the sim checks, top to bottom; in each list it presses the first ability whose conditions hold and that is ready. Readiness (cooldowns, resources) isn’t in the list, so a lit ability is the first one allowed, not a promise it is cast.
- The main loop
- Cooldowns
- Assisted Combat
Before the pull, done once before the fight starts (5 steps)
Before the pull5 lines
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Summon Pet
simc
summon_pet - Cast Grimoire of Sacrifice if you have Grimoire of Sacrifice talented
simc
grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled - Cast Soul Fire
simc
soul_fire - Cast Incinerate
simc
incinerate
The main loop2 lines
go through Cooldowns, then carry on below if nothing there fits
simc
call_action_list,name=cooldownsCooldowns7 lines
- Drink a potionSome cooldowns are not used by the Assisted Combat system. This simple default cooldown usage has been provided by simc.
simc
potion - Cast Blood Fury
simc
blood_fury - Cast Berserking
simc
berserking - Cast Fireblood
simc
fireblood - Cast Ancestral Call
simc
ancestral_call - Use your trinkets
simc
use_items - Cast Summon Infernal
simc
summon_infernal
go through Assisted Combat, then carry on below if nothing there fits
simc
call_action_list,name=assisted_combatAssisted Combat27 lines
- Cast Grimoire of Sacrifice if you have a pet out and Grimoire of Sacrifice isn't activeThis is the default action priority list from the game's Assisted Combat system.
simc
grimoire_of_sacrifice,if=pet.any.active&buff.grimoire_of_sacrifice.down - Cast Cataclysm
simc
cataclysm - Cast Wither if Immolate isn't on the target and you don't have Wither talented
simc
wither,if=!dot.immolate.ticking&!talent.wither - Cast Wither if Wither isn't on the target and you have Wither talented
simc
wither,if=!dot.wither.ticking&talent.wither - Cast Infernal Bolt if Infernal Bolt is active and Infernal Bolt has at most 5 s left, or isn't active
simc
infernal_bolt,if=buff.infernal_bolt.up&buff.infernal_bolt.remains<=5 - Cast Incinerate if Infernal Bolt is active and Infernal Bolt has at most 5 s left, or isn't active
simc
incinerate,if=buff.infernal_bolt.up&buff.infernal_bolt.remains<=5 - Cast Summon InfernalThis is for Blizzard automation and is not included in the game's Assisted Combat system.
simc
summon_infernal - Cast Malevolence
simc
malevolence - Cast Channel Demonfire if your distance to the target is at most 40
simc
channel_demonfire,if=target.distance<=40 - Cast Rain of Fire if there are more than 3 enemies
simc
rain_of_fire,if=active_enemies>3 - Cast Rain of Fire if there are more than 3 enemies
simc
rain_of_fire,if=active_enemies>3 - Cast Soul Fire if you have 4 or fewer Soul Shards
simc
soul_fire,if=soul_shard<=4 - Cast Shadowburn if there are 2 or fewer enemies
simc
shadowburn,if=active_enemies<=2 - Cast Conflagrate if Backdraft isn't active and you have 1.5 or more Soul Shards and there are 2 or fewer enemies
simc
conflagrate,if=buff.backdraft.down&soul_shard>=1.5&active_enemies<=2 - Cast Ruination if there are 2 or fewer enemies and you have 4 or more Soul Shards
simc
ruination,if=active_enemies<=2&soul_shard>=4,cooldown_allow_casting_success=1 - Cast Chaos Bolt if there are 2 or fewer enemies and you have 4 or more Soul Shards
simc
chaos_bolt,if=active_enemies<=2&soul_shard>=4,cooldown_allow_casting_success=1 - Cast Ruination if there are 2 or fewer enemies and you have 2 or more Soul ShardsRitual of Ruin buff no longer exists (Overridden from 'active_enemies<=2&soul_shard>=2&buff.ritual_of_ruin.up')
simc
ruination,if=active_enemies<=2&soul_shard>=2,cooldown_allow_casting_success=1 - Cast Chaos Bolt if there are 2 or fewer enemies and you have 2 or more Soul ShardsRitual of Ruin buff no longer exists (Overridden from 'active_enemies<=2&soul_shard>=2&buff.ritual_of_ruin.up')
simc
chaos_bolt,if=active_enemies<=2&soul_shard>=2,cooldown_allow_casting_success=1 - Cast Ruination if there are 2 or fewer enemies
simc
ruination,if=active_enemies<=2 - Cast Chaos Bolt if there are 2 or fewer enemies
simc
chaos_bolt,if=active_enemies<=2 - Cast Infernal Bolt if Backdraft has 2 or more stacks
simc
infernal_bolt,if=buff.backdraft.stack>=2 - Cast Incinerate if Backdraft has 2 or more stacks
simc
incinerate,if=buff.backdraft.stack>=2 - Cast Conflagrate if Conflagrate has 2 or more charges
simc
conflagrate,if=charges>=2 - Cast Infernal Bolt
simc
infernal_bolt,cooldown_allow_casting_success=1 - Cast Incinerate
simc
incinerate,cooldown_allow_casting_success=1 - Cast Infernal Bolt
simc
infernal_bolt - Cast Incinerate
simc
incinerate
Read from ActionPriorityLists/assisted_combat/warlock_destruction.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.