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.
- The main loop
- Racials (maybe)
- Items
- Diabolist (maybe)
- Soulharvest (maybe)
Before the pull, done once before the fight starts (14 steps)
Before the pull14 lines
- Cast Summon Pet
simc
summon_pet - Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Set in opener to 1
simc
variable,name=in_opener,op=set,value=1 - 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 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 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 Demonic Tyrant's cooldown is 0
- the remainder of Summon Demonic Tyrant'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_demonic_tyrant.duration=0|cooldown.summon_demonic_tyrant.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 Demonic Tyrant's cooldown is 0
- the remainder of Summon Demonic Tyrant'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_demonic_tyrant.duration=0|cooldown.summon_demonic_tyrant.duration%%trinket.2.cooldown.duration=0) - Set damage trinket priority to 2 when the following holds, otherwise to 1all 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
simc
variable,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 - 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.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))
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.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))) - all of these:
- Cast Power Siphon
simc
power_siphon - 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))
simc
demonbolt,if=!buff.power_siphon.up&(talent.ruination&!talent.grimoire_imp_lord|talent.ruination&!talent.summon_doomguard) - Cast Shadow Bolt
simc
shadow_bolt
The main loop6 lines
- Drink a potion if your Demonic Tyrant is out or the fight ends within 30 s
simc
potion,if=pet.demonic_tyrant.active|fight_remains<=30 - Get Power Infusion from an ally if your Demonic Tyrant is out
simc
invoke_external_buff,name=power_infusion,if=pet.demonic_tyrant.active 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 cooldownsimc
call_action_list,name=racials,if=pet.demonic_tyrant.active|fight_remains<22,use_off_gcd=1go through Items, then carry on below if nothing there fits
Used without waiting for the global cooldownsimc
call_action_list,name=items,use_off_gcd=1Items7 lines
- 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
simc
use_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 - 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
simc
use_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 - 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
simc
use_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) - 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
simc
use_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) - Use your trinket 1 if trinket 1 buffs is false and (damage trinket priority is 1 or trinket 2 is on cooldown)
simc
use_item,slot=trinket1,if=!variable.trinket_1_buffs&(variable.damage_trinket_priority=1|trinket.2.cooldown.remains) - Use your trinket 2 if trinket 2 buffs is false and (damage trinket priority is 2 or trinket 1 is on cooldown)
simc
use_item,slot=trinket2,if=!variable.trinket_2_buffs&(variable.damage_trinket_priority=2|trinket.1.cooldown.remains) - 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 you have Diabolic Ritual talented?Not set
If so, go through Diabolist, then carry on below if nothing there fits
simc
call_action_list,name=diabolist,if=talent.diabolic_ritualIs it true that you have Demonic Soul talented?Not set
If so, go through Soulharvest, then carry on below if nothing there fits
simc
call_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.
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.
This list has no branches to choose between: it is one ladder.
- 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 Power Siphon
simc
power_siphon - Cast Demonbolt if Power Siphon isn't active
simc
demonbolt,if=!buff.power_siphon.up - Cast Shadow Bolt
simc
shadow_bolt
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 Demonic Tyrant if Dreadstalkers is active
simc
summon_demonic_tyrant,if=buff.dreadstalkers.up
go through Assisted Combat, then carry on below if nothing there fits
simc
call_action_list,name=assisted_combatAssisted Combat13 lines
- Cast Summon Felguard if you have no pet outThis is the default action priority list from the game's Assisted Combat system.
simc
summon_felguard,if=!pet.any.active,cooldown_allow_casting_success=1 - Cast Summon Felguard if Track Pets is active
simc
summon_felguard,if=buff.unknown_spell_1245326.up,cooldown_allow_casting_success=1 - Cast Call Dreadstalkers
simc
call_dreadstalkers - Cast Ruination
simc
ruination - Cast Hand of Gul'dan
simc
hand_of_guldan - Cast Infernal Bolt if Infernal Bolt is active
simc
infernal_bolt,if=buff.infernal_bolt.up - Cast Shadow Bolt if Infernal Bolt is active
simc
shadow_bolt,if=buff.infernal_bolt.up - Cast Summon Demonic TyrantThis is for Blizzard automation and is not included in the game's Assisted Combat system.
simc
summon_demonic_tyrant - Cast Demonbolt if Demonic Core is active
simc
demonbolt,if=buff.demonic_core.up - Cast Power Siphon
simc
power_siphon - Cast Infernal Bolt
simc
infernal_bolt,cooldown_allow_casting_success=1 - Cast Shadow Bolt
simc
shadow_bolt,cooldown_allow_casting_success=1
Read from ActionPriorityLists/assisted_combat/warlock_demonology.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.