Cogspark Works · Rotation
Unholy Death Knight
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
- Racials (maybe)
- High priority
- Trinkets (maybe)
- Cooldowns
- AoE (maybe)
- Single target (maybe)
Before the pull, done once before the fight starts (12 steps)
Before the pull12 lines
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Raise Dead
simc
raise_dead - 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 duration to 0 when the following holds, otherwise to trinket 1's stat buff's durationnever
simc
variable,name=trinket_1_duration,op=setif,value=0,value_else=trinket.1.proc.any_dps.duration,condition=0 - Set trinket 2 duration to 0 when the following holds, otherwise to trinket 2's stat buff's durationnever
simc
variable,name=trinket_2_duration,op=setif,value=0,value_else=trinket.2.proc.any_dps.duration,condition=0 - Set trinket 1 high value to 2 when the following holds, otherwise to 1trinket 1 is Treacherous Transmitter
simc
variable,name=trinket_1_high_value,op=setif,value=2,value_else=1,condition=trinket.1.is.treacherous_transmitter - Set trinket 2 high value to 2 when the following holds, otherwise to 1trinket 2 is Treacherous Transmitter
simc
variable,name=trinket_2_high_value,op=setif,value=2,value_else=1,condition=trinket.2.is.treacherous_transmitter - Set trinket 1 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 1 buffs is true
- you have Dark Transformation talented
- the remainder of trinket 1's cooldown divided by Dark Transformation's cooldown is 0
simc
variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&talent.dark_transformation&trinket.1.cooldown.duration%%cooldown.dark_transformation.duration=0 - Set trinket 2 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 2 buffs is true
- you have Dark Transformation talented
- the remainder of trinket 2's cooldown divided by Dark Transformation's cooldown is 0
simc
variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&talent.dark_transformation&trinket.2.cooldown.duration%%cooldown.dark_transformation.duration=0 - 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
- any of these:
- trinket 2 has a cooldown
- trinket 1 has no cooldown
- all of these:
- trinket 2 buffs is true
- trinket 2's cooldown divided by trinket 2 duration times (1.5 plus (1 if trinket 2 can grant Strength, else 0)) times trinket 2 sync times trinket 2 high value times (1 plus ((trinket 2's item level minus trinket 1's item level) divided by 100)) is more than trinket 1's cooldown divided by trinket 1 duration times (1.5 plus (1 if trinket 1 can grant Strength, else 0)) times trinket 1 sync times trinket 1 high value 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&(trinket.2.has_cooldown|!trinket.1.has_cooldown)|variable.trinket_2_buffs&((trinket.2.cooldown.duration%variable.trinket_2_duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync)*(variable.trinket_2_high_value)*(1+((trinket.2.ilvl-trinket.1.ilvl)%100)))>((trinket.1.cooldown.duration%variable.trinket_1_duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync)*(variable.trinket_1_high_value)*(1+((trinket.1.ilvl-trinket.2.ilvl)%100))) - all of these:
- 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 at least 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
The main loop8 lines
- Start auto-attacking
simc
auto_attack go through Helpers, then carry on below if nothing there fits
Choose Action list to runsimc
call_action_list,name=variablesHelpers4 lines
- Set st planning to 1 when the following holds, otherwise to 0all of these:Variables
- there is a single enemy
- any of these:
- the fight has no add waves
- the time until the next add wave is 0
- the next add wave starts in more than 15 s (or never)
- the fight has no pulls
- all of these:
- the fight has pulls
- the next pull starts in more than 15 s (or never)
simc
variable,name=st_planning,op=setif,value=1,value_else=0,condition=active_enemies=1&(!raid_event.adds.exists|!raid_event.adds.in|raid_event.adds.in>15|!raid_event.pull.exists|raid_event.pull.exists&raid_event.pull.in>15) - Set adds remain to true when the following holds, otherwise falseall of these:
- there are 2 or more enemies
- any of these:
- the fight has no add waves
- the fight has no pulls
- the time left in the current add wave is more than 5 s
- the time left in the current pull is more than 5 s
simc
variable,name=adds_remain,value=active_enemies>=2&((!raid_event.adds.exists|!raid_event.pull.exists)|raid_event.adds.remains>5|raid_event.pull.remains>5) - Set cds active to true when the following holds, otherwise falseany of these:
- your Army Ghoul is out
- Forbidden Knowledge is active
- all of these:
- Dark Transformation is active
- Dark Transformation has more than 5 s left
simc
variable,name=cds_active,value=pet.army_ghoul.active|buff.forbidden_knowledge.up|buff.dark_transformation.up&buff.dark_transformation.remains>5 - Set epidemic prio to true when the following holds, otherwise falseany of these:
- all of these:
- there are 3 or more enemies
- Forbidden Knowledge isn't active
- all of these:
- there are 4 or more enemies
- Forbidden Knowledge is active
simc
variable,name=epidemic_prio,value=active_enemies>=3&!buff.forbidden_knowledge.up|active_enemies>=4&buff.forbidden_knowledge.up - all of these:
Is it true that st planning is true or adds remain is true or the fight ends within 30 s?Not set
If so, go through Racials, then carry on below if nothing there fits
simc
call_action_list,name=racials,if=variable.st_planning|variable.adds_remain|fight_remains<30go through High priority, then carry on below if nothing there fits
simc
call_action_list,name=high_priorityHigh priority3 lines
- Drink a potion if (st planning is true or adds remain is true) and cds active is true
simc
potion,if=(variable.st_planning|variable.adds_remain)&variable.cds_active - Get Power Infusion from an ally if your Army Ghoul is out or Forbidden Knowledge is active or Dark Transformation is activeUse<a href = 'https://www.wowhead.com/spell=10060/power-infusion'> Power Infusion</ a> while<a href = 'https://www.wowhead.com/spell=1233448/dark-transformation'> Dark Transformation</ a> is up
simc
invoke_external_buff,name=power_infusion,if=pet.army_ghoul.active|buff.forbidden_knowledge.up|buff.dark_transformation.up - Cast Scourge Strike if Vampiric Strike is active and Essence of the Blood Queen is active and Essence of the Blood Queen has less than 3 global cooldowns left, or isn't active
simc
scourge_strike,if=buff.vampiric_strike.up&buff.essence_of_the_blood_queen.up&buff.essence_of_the_blood_queen.remains<gcd*3
Is it true that st planning is true or adds remain is true or the fight ends within 30 s?Not set
If so, go through Trinkets, then carry on below if nothing there fits
simc
call_action_list,name=trinkets,if=variable.st_planning|variable.adds_remain|fight_remains<30go through Cooldowns, then carry on below if nothing there fits
simc
call_action_list,name=cooldownsCooldowns4 lines
- Cast Outbreak if (you don't have Blightburst talented or (you have Blightburst talented and (Putrefy has more than 2 global cooldowns of cooldown left or less than 5 s into the fight))) and Dread Plague isn't on any enemy and ((more than 2 global cooldowns of the fight remain and the fight has no add waves) or (the fight has add waves and the time left in the current add wave is more than 2 global cooldowns))Cooldowns
simc
outbreak,if=(!talent.blightburst|talent.blightburst&(cooldown.putrefy.remains>gcd.max*2|time<5))&dot.dread_plague.active_dots=0&(fight_remains>gcd.max*2&!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.remains>gcd.max*2) - Cast Death and Decay if there are 3 or more enemies and you have Cycle of Death talented and (Festering Scythe Tt is active or you don't have Festering Scythe talented) and the charges of Putrefy is less than the maximum charges of Putrefy and ((the fight has add waves and the time left in the current add wave is at least Death and Decay's duration times 0.75) or (the fight has no add waves and at least Death and Decay's duration times 0.75 of the fight remain)) and ((the fight has add waves and the number of adds in the next add wave is less than the number of enemies) or the fight has no add waves or the charges of Death and Decay is the maximum charges of Death and Decay)
simc
death_and_decay,if=active_enemies>=3&talent.cycle_of_death&(buff.festering_scythe_tt.up|!talent.festering_scythe)&(cooldown.putrefy.charges<cooldown.putrefy.max_charges&(raid_event.adds.exists&raid_event.adds.remains>=duration*0.75|!raid_event.adds.exists&fight_remains>=duration*0.75)&(raid_event.adds.exists&raid_event.adds.count<active_enemies|!raid_event.adds.exists|charges=max_charges)) - Cast Army of the Dead if (st planning is true or adds remain is true) and (Festering Scythe Tt is active or you don't have Festering Scythe talented)
simc
army_of_the_dead,if=(variable.st_planning|variable.adds_remain)&(buff.festering_scythe_tt.up|!talent.festering_scythe) - Cast Dark Transformation if ((st planning is true or adds remain is true) and Blightfall isn't active and (your Army Ghoul is out or Army of the Dead has more than 30 s of cooldown left or you don't have Army of the Dead talented)) or (Blightfall is active and (((there are 3 or fewer enemies or the next pull includes a boss) and you have Reaping talented and you have Soul Reaper talented and Soul Reaper Debuff is active on the target and Soul Reaper Debuff has less than 2 global cooldowns left on the target, or isn't active) or the fight ends within 3 s or (the fight has add waves and the time left in the current add wave is less than 3 s) or (Dark Transformation is active and Dark Transformation has less than 2 global cooldowns left, or isn't active) or (trinket 1's stat buff is active and trinket 1's stat buff has less than 2 global cooldowns left, or isn't active) or (trinket 2's stat buff is active and trinket 2's stat buff has less than 2 global cooldowns left, or isn't active) or Dark Transformation comes off cooldown within 3 s))
simc
dark_transformation,if=(variable.st_planning|variable.adds_remain)&!buff.blightfall.up&(pet.army_ghoul.active|cooldown.army_of_the_dead.remains>30|!talent.army_of_the_dead)|buff.blightfall.up&((active_enemies<=3|raid_event.pull.has_boss)&(talent.reaping&talent.soul_reaper&debuff.soul_reaper_debuff.up&debuff.soul_reaper_debuff.remains<gcd*2)|fight_remains<3|raid_event.adds.exists&raid_event.adds.remains<3|buff.dark_transformation.up&buff.dark_transformation.remains<gcd*2|trinket.1.proc.any_dps.up&trinket.1.proc.any_dps.remains<gcd*2|trinket.2.proc.any_dps.up&trinket.2.proc.any_dps.remains<gcd*2|cooldown.dark_transformation.remains<3)
Is it true that there are 3 or more enemies?Not set
If so, go through AoE, then carry on below if nothing there fits
simc
call_action_list,name=aoe,if=active_enemies>=3Is it true that there are fewer than 3 enemies?Not set
If so, go through Single target, then carry on below if nothing there fits
simc
call_action_list,name=single_target,if=active_enemies<3
Read from ActionPriorityLists/default/deathknight_unholy.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 (2 steps)
Before the pull2 lines
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Raise Dead
simc
raise_dead
The main loop3 lines
- Start auto-attacking
simc
auto_attack go through Cooldowns, then carry on below if nothing there fits
simc
call_action_list,name=cooldownsCooldowns6 lines
- Use your trinketsSome cooldowns are not used by the Assisted Combat system. This simple default cooldown usage has been provided by simc.
simc
use_items - Drink a potion
simc
potion - Cast Blood Fury
simc
blood_fury - Cast Berserking
simc
berserking - Cast Fireblood
simc
fireblood - Cast Ancestral Call
simc
ancestral_call
go through Assisted Combat, then carry on below if nothing there fits
simc
call_action_list,name=assisted_combatAssisted Combat20 lines
- Cast Raise Dead if you have no pet outThis is the default action priority list from the game's Assisted Combat system.
simc
raise_dead,if=!pet.any.active - Cast Outbreak if Virulent Plague isn't on the target
simc
outbreak,if=!dot.virulent_plague.ticking - Cast Outbreak if Blightfall is active
simc
outbreak,if=buff.blightfall.up - Cast Army of the Dead
simc
army_of_the_dead - Cast Dark Transformation if you have a pet out
simc
dark_transformation,if=pet.any.active - Cast Death Coil if you have 50 or more Runic Power and there are 3 or fewer enemies and Forbidden Knowledge is active
simc
death_coil,if=runic_power>=50&active_enemies<=3&buff.forbidden_knowledge.up - Cast Epidemic if you have 50 or more Runic Power and there are more than 4 enemies and Virulent Plague is on the target and Forbidden Knowledge is active
simc
epidemic,if=runic_power>=50&active_enemies>4&dot.virulent_plague.ticking&buff.forbidden_knowledge.up - Cast Scourge Strike if Lesser Ghoul Ready has 3 or more stacks
simc
scourge_strike,if=buff.lesser_ghoul_ready.stack>=3 - Cast Soul Reaper if Reaping is active
simc
soul_reaper,if=buff.reaping.up - Cast Soul Reaper if the target is at or below 35% health
simc
soul_reaper,if=target.health.pct<=35 - Cast Festering Strike if Festering Scythe is active and Festering Scythe Tt isn't active
simc
festering_strike,if=buff.festering_scythe.up&buff.festering_scythe_tt.down - Cast Putrefy if Lesser Ghoul Counter is active
simc
putrefy,if=buff.lesser_ghoul_counter.up - Cast Death Coil if Sudden Doom is active and there are 3 or fewer enemies
simc
death_coil,if=buff.sudden_doom.up&active_enemies<=3 - Cast Epidemic if Virulent Plague is on the target and there are more than 4 enemies and Sudden Doom is active
simc
epidemic,if=dot.virulent_plague.ticking&active_enemies>4&buff.sudden_doom.up - Cast Scourge Strike if Lesser Ghoul Ready has 1 or fewer stacks
simc
scourge_strike,if=buff.lesser_ghoul_ready.stack<=1 - Cast Festering Strike if Lesser Ghoul Ready has 2 or fewer stacks
simc
festering_strike,if=buff.lesser_ghoul_ready.stack<=2 - Cast Scourge Strike if the target is at or below 0% healthLeftover line from old Unholy, references Festering Wounds. Since this can never trigger in game, giving it a condition thatll never be met. (Overridden from 'debuff.unknown_spell_194310.up')
simc
scourge_strike,if=target.health.pct<=0 - Cast Festering Strike
simc
festering_strike - Cast Death Coil
simc
death_coil
Read from ActionPriorityLists/assisted_combat/deathknight_unholy.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.