Cogspark

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.

Your situation
Enemies in range
Target health
Your talents (click: talented, not talented, not set)
Checked
  1. The main loop
  2. Helpers
  3. Ogcd
  4. Items
  5. AoE hc (maybe)
  6. AoE dia (maybe)
Before the pull, done once before the fight starts (15 steps)

Before the pull15 lines

  1. Cast Summon Pet
    simcsummon_pet
  2. Set trinket 1 buffs to true when the following holds, otherwise false
    trinket 1 has an on-use effect that grants a stat buff
    simcvariable,name=trinket_1_buffs,value=trinket.1.has_use_buff
  3. Set trinket 2 buffs to true when the following holds, otherwise false
    trinket 2 has an on-use effect that grants a stat buff
    simcvariable,name=trinket_2_buffs,value=trinket.2.has_use_buff
  4. Set trinket 1 sync to 1 when the following holds, otherwise to 0.5
    all 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
    simcvariable,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)
  5. Set trinket 2 sync to 1 when the following holds, otherwise to 0.5
    all 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
    simcvariable,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)
  6. Set trinket 1 buff duration to trinket 1's stat buff's duration
    simcvariable,name=trinket_1_buff_duration,value=trinket.1.proc.any_dps.duration
  7. Set trinket 2 buff duration to trinket 2's stat buff's duration
    simcvariable,name=trinket_2_buff_duration,value=trinket.2.proc.any_dps.duration
  8. Set trinket priority to 2 when the following holds, otherwise to 1
    any 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
    simcvariable,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))
  9. Cast Grimoire of Sacrifice if you have Grimoire of Sacrifice talented
    simcgrimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
  10. Record your stats before the pull (sim bookkeeping)
    simcsnapshot_stats
  11. Cast Cataclysm if there are 2 or more enemies and the next add wave starts in more than 15 s (or never)
    simccataclysm,if=active_enemies>=2&raid_event.adds.in>15
  12. Cast Soul Fire
    simcsoul_fire
  13. Cast Cataclysm
    simccataclysm
  14. Cast Immolate if there are 2 or more enemies and you have Roaring Blaze talented
    simcimmolate,if=active_enemies>=2&talent.roaring_blaze
  15. Cast Incinerate
    simcincinerate

The main loop20 lines

  1. go through Helpers, then carry on below if nothing there fits

    simccall_action_list,name=variables

    Helpers4 lines

    1. Set infernal active to true when the following holds, otherwise false
      any of these:
      • your Infernal is out
      • Summon Infernal's cooldown minus the cooldown left on Summon Infernal is less than 20 s
      simcvariable,name=infernal_active,op=set,value=pet.infernal.active|(cooldown.summon_infernal.duration-cooldown.summon_infernal.remains)<20
    2. 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
      simcvariable,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
    3. Set trinket 1 will lose cast to true when the following holds, otherwise false
      all 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
      • Summon Infernal has more than 20 s of cooldown left
      simcvariable,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
    4. Set trinket 2 will lose cast to true when the following holds, otherwise false
      all 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
      • Summon Infernal has more than 20 s of cooldown left
      simcvariable,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
  2. go through Ogcd, then carry on below if nothing there fits

    simccall_action_list,name=ogcd

    Ogcd6 lines

    1. Drink a potion if infernal active is true or you don't have Summon Infernal talented
      simcpotion,if=variable.infernal_active|!talent.summon_infernal
    2. 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
      simcinvoke_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
    3. 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
      simcberserking,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
    4. 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
      simcblood_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
    5. 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
      simcfireblood,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
    6. 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
      simcancestral_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
  3. go through Items, then carry on below if nothing there fits

    simccall_action_list,name=items

    Items5 lines

    1. 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
      simcuse_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)
    2. 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
      simcuse_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)
    3. 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
      simcuse_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)
    4. 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
      simcuse_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)
    5. Use the item in your main hand slotUsed without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=main_hand
  4. 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

    simccall_action_list,name=aoe_hc,if=active_enemies>=2&talent.wither
  5. Is 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

    simccall_action_list,name=aoe_dia,if=active_enemies>=2&talent.diabolic_ritual
  6. Cast Soul Fire if you have 4 or fewer Soul Shards
    simcsoul_fire,if=soul_shard<=4
  7. Cast Conflagrate if Conflagrate has 2 or more charges
    simcconflagrate,if=action.conflagrate.charges>=2
  8. Cast Chaos Bolt if you have Diabolic Ritual talented and (demonic_art or ritual length is less than Chaos Bolt's cast time) and the target is above 20% health
    simcchaos_bolt,if=talent.diabolic_ritual&(demonic_art|(variable.ritual_length<action.chaos_bolt.execute_time))&target.health.pct>20
  9. Cast Conflagrate if you have 4.2 or fewer Soul Shards and Backdraft has fewer than 1 stack
    simcconflagrate,if=soul_shard<=4.2&buff.backdraft.stack<1
  10. Cast Summon Infernal
    simcsummon_infernal
  11. Cast Malevolence
    simcmalevolence
  12. Cast Shadowburn if ((not demonic_art and (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)
    simcshadowburn,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)
  13. 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
    simcwither,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
  14. 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
    simcimmolate,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
  15. Cast Conflagrate if you have 4.4 or fewer Soul Shards and Backdraft has fewer than 1 stack
    simcconflagrate,if=soul_shard<=4.4&buff.backdraft.stack<1
  16. Cast Ruination
    simcruination
  17. Cast Cataclysm if you have Lake of Fire talented
    simccataclysm,if=talent.lake_of_fire
  18. 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)
    simcchaos_bolt,if=(talent.wither&(soul_shard>=4|buff.malevolence.up|pet.infernal.active|fight_remains<=15))|(talent.diabolic_ritual&variable.ritual_length>4)
  19. Cast Infernal Bolt if you have 3 or fewer Soul Shards
    simcinfernal_bolt,if=soul_shard<=3
  20. Cast Incinerate
    simcincinerate

Read from ActionPriorityLists/default/warlock_destruction.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.