Cogspark

Cogspark Works · Rotation

Demonology 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
  • in opener: yes · when always
Your talents (click: talented, not talented, not set)
More conditions (2)
your Demonic Tyrant is out
the fight ends within 22 s
Checked
  1. The main loop
  2. Racials (maybe)
  3. Items
  4. Diabolist (maybe)
  5. Soulharvest (maybe)
Before the pull, done once before the fight starts (14 steps)

Before the pull14 lines

  1. Cast Summon Pet
    simcsummon_pet
  2. Record your stats before the pull (sim bookkeeping)
    simcsnapshot_stats
  3. Set in opener to 1
    simcvariable,name=in_opener,op=set,value=1
  4. 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
  5. 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
  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 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 Demonic Tyrant's cooldown is 0
      • the remainder of Summon Demonic Tyrant'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_demonic_tyrant.duration=0|cooldown.summon_demonic_tyrant.duration%%trinket.1.cooldown.duration=0)
  9. 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 Demonic Tyrant's cooldown is 0
      • the remainder of Summon Demonic Tyrant'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_demonic_tyrant.duration=0|cooldown.summon_demonic_tyrant.duration%%trinket.2.cooldown.duration=0)
  10. Set damage trinket priority to 2 when the following holds, otherwise to 1
    all of these:
    • trinket 1 buffs is false
    • trinket 2 buffs is false
    • trinket 2's item level is more than trinket 1's item level
    simcvariable,name=damage_trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&!variable.trinket_2_buffs&trinket.2.ilvl>trinket.1.ilvl
  11. 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.5 plus (1 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.5 plus (1 if trinket 1 can grant Intellect, else 0)) times trinket 1 sync times (1 plus ((trinket 1's item level minus trinket 2's item level) divided by 100))
    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.5+trinket.2.has_buff.intellect)*(variable.trinket_2_sync))>(((trinket.1.cooldown.duration%variable.trinket_1_buff_duration)*(1.5+trinket.1.has_buff.intellect)*(variable.trinket_1_sync))*(1+((trinket.1.ilvl-trinket.2.ilvl)%100)))
  12. Cast Power Siphon
    simcpower_siphon
  13. Cast Demonbolt if Power Siphon isn't active and ((you have Ruination talented and you don't have Grimoire: Imp Lord talented) or (you have Ruination talented and you don't have Summon Doomguard talented))
    simcdemonbolt,if=!buff.power_siphon.up&(talent.ruination&!talent.grimoire_imp_lord|talent.ruination&!talent.summon_doomguard)
  14. Cast Shadow Bolt
    simcshadow_bolt

The main loop6 lines

  1. Drink a potion if your Demonic Tyrant is out or the fight ends within 30 s
    simcpotion,if=pet.demonic_tyrant.active|fight_remains<=30
  2. Get Power Infusion from an ally if your Demonic Tyrant is out
    simcinvoke_external_buff,name=power_infusion,if=pet.demonic_tyrant.active
  3. Is it true that your Demonic Tyrant is out or the fight ends within 22 s?Not set

    If so, go through Racials, then carry on below if nothing there fits

    Used without waiting for the global cooldown
    simccall_action_list,name=racials,if=pet.demonic_tyrant.active|fight_remains<22,use_off_gcd=1
  4. go through Items, then carry on below if nothing there fits

    Used without waiting for the global cooldown
    simccall_action_list,name=items,use_off_gcd=1

    Items7 lines

    1. Use your trinket 1 if (trinket 1 buffs is true and ((your Demonic Tyrant isn't out and trinket 1's on-use cast time is more than 0 s) or 1 if trinket 1's on-use cast time is 0, else 0 is more than 0) and (your Demonic Tyrant is out or (trinket 1's on-use cast time is more than 0 s and Summon Demonic Tyrant comes off cooldown within 4 s) or you don't have Summon Demonic Tyrant talented or (trinket priority is 2 and Summon Demonic Tyrant has more than 20 s of cooldown left and your Demonic Tyrant isn't out and trinket 2 comes off cooldown within the cooldown left on Summon Demonic Tyrant plus 5 s)) and (trinket 2 has no cooldown or trinket 2 is on cooldown or trinket priority is 1)) or trinket 1 buff duration is at least the time left in the fightUsed without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket1,if=variable.trinket_1_buffs&(!pet.demonic_tyrant.active&trinket.1.cast_time>0|!trinket.1.cast_time>0)&(pet.demonic_tyrant.active|trinket.1.cast_time>0&cooldown.summon_demonic_tyrant.remains<=4|!talent.summon_demonic_tyrant|variable.trinket_priority=2&cooldown.summon_demonic_tyrant.remains>20&!pet.demonic_tyrant.active&trinket.2.cooldown.remains<cooldown.summon_demonic_tyrant.remains+5)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|variable.trinket_1_buff_duration>=fight_remains
    2. Use your trinket 2 if (trinket 2 buffs is true and ((your Demonic Tyrant isn't out and trinket 2's on-use cast time is more than 0 s) or 1 if trinket 2's on-use cast time is 0, else 0 is more than 0) and (your Demonic Tyrant is out or (trinket 2's on-use cast time is more than 0 s and Summon Demonic Tyrant comes off cooldown within 4 s) or you don't have Summon Demonic Tyrant talented or (trinket priority is 1 and Summon Demonic Tyrant has more than 20 s of cooldown left and your Demonic Tyrant isn't out and trinket 1 comes off cooldown within the cooldown left on Summon Demonic Tyrant plus 5 s)) and (trinket 1 has no cooldown or trinket 1 is on cooldown or trinket priority is 2)) or trinket 2 buff duration is at least the time left in the fightUsed without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket2,if=variable.trinket_2_buffs&(!pet.demonic_tyrant.active&trinket.2.cast_time>0|!trinket.2.cast_time>0)&(pet.demonic_tyrant.active|trinket.2.cast_time>0&cooldown.summon_demonic_tyrant.remains<=4|!talent.summon_demonic_tyrant|variable.trinket_priority=1&cooldown.summon_demonic_tyrant.remains>20&!pet.demonic_tyrant.active&trinket.1.cooldown.remains<cooldown.summon_demonic_tyrant.remains+5)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|variable.trinket_2_buff_duration>=fight_remains
    3. Use your trinket 1 if trinket 1 buffs is false and (((damage trinket priority is 1 or trinket 2 is on cooldown) and ((trinket 1's on-use cast time is more than 0 s and your Demonic Tyrant isn't out) or 1 if trinket 1's on-use cast time is 0, else 0 is more than 0)) or (less than 20 s into the fight and trinket 2 buffs is true) or the expected cooldown left on Summon Demonic Tyrant is more than 20 s)Used without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_buffs&((variable.damage_trinket_priority=1|trinket.2.cooldown.remains)&(trinket.1.cast_time>0&!pet.demonic_tyrant.active|!trinket.1.cast_time>0)|(time<20&variable.trinket_2_buffs)|cooldown.summon_demonic_tyrant.remains_expected>20)
    4. Use your trinket 2 if trinket 2 buffs is false and (((damage trinket priority is 2 or trinket 1 is on cooldown) and ((trinket 2's on-use cast time is more than 0 s and your Demonic Tyrant isn't out) or 1 if trinket 2's on-use cast time is 0, else 0 is more than 0)) or (less than 20 s into the fight and trinket 1 buffs is true) or the expected cooldown left on Summon Demonic Tyrant is more than 20 s)Used without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_buffs&((variable.damage_trinket_priority=2|trinket.1.cooldown.remains)&(trinket.2.cast_time>0&!pet.demonic_tyrant.active|!trinket.2.cast_time>0)|(time<20&variable.trinket_1_buffs)|cooldown.summon_demonic_tyrant.remains_expected>20)
    5. Use your trinket 1 if trinket 1 buffs is false and (damage trinket priority is 1 or trinket 2 is on cooldown)
      simcuse_item,slot=trinket1,if=!variable.trinket_1_buffs&(variable.damage_trinket_priority=1|trinket.2.cooldown.remains)
    6. Use your trinket 2 if trinket 2 buffs is false and (damage trinket priority is 2 or trinket 1 is on cooldown)
      simcuse_item,slot=trinket2,if=!variable.trinket_2_buffs&(variable.damage_trinket_priority=2|trinket.1.cooldown.remains)
    7. Use the item in your main hand slotUsed without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=main_hand
  5. Is it true that you have Diabolic Ritual talented?Not set

    If so, go through Diabolist, then carry on below if nothing there fits

    simccall_action_list,name=diabolist,if=talent.diabolic_ritual
  6. Is it true that you have Demonic Soul talented?Not set

    If so, go through Soulharvest, then carry on below if nothing there fits

    simccall_action_list,name=soulharvest,if=talent.demonic_soul

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