Cogspark Works · Rotation
Vengeance Demon Hunter
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
- Aldrachi reaver (maybe)
- Trinkets (maybe)
- Ar glaive cycle (maybe)
- Ar quick consume (maybe)
- Ar fillers (maybe)
- Annihilator (maybe)
- Anni voidfall spending (maybe)
- Anni filler no spend (maybe)
- Anni generate fury (maybe)
- Anni meta entry (maybe)
- Anni pre meta spb (maybe)
- Anni cooldowns (maybe)
Before the pull, done once before the fight starts (4 steps)
Before the pull4 lines
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Sigil of Flame
simc
sigil_of_flame - Cast Sigil of Spite if you use the Aldrachi Reaver hero talents or you have Soul Carver talented
simc
sigil_of_spite,if=hero_tree.aldrachi_reaver|talent.soul_carver - Cast Immolation Aura
simc
immolation_aura
The main loop20 lines
- Set aoe to true when the following holds, otherwise falseSpirit Bomb would hit 3 or more enemies
simc
variable,name=aoe,value=spell_targets.spirit_bomb>=3 - Set execute to true when the following holds, otherwise falsethe fight ends within 20 s
simc
variable,name=execute,value=fight_remains<20 - Set is dungeon to true when the following holds, otherwise falseany of these:
- the sim's fight style is DungeonRoute
- the sim's fight style is DungeonSlice
simc
variable,name=is_dungeon,value=fight_style.dungeonroute|fight_style.dungeonslice - Reset dung pull ttd to its starting valueWorked out across every enemy
simc
cycling_variable,name=dung_pull_ttd,op=reset - Set dung pull ttd to the larger of itself and the time until the target diesWorked out across every enemy
simc
cycling_variable,name=dung_pull_ttd,op=max,value=target.time_to_die - Set dung next pull to true when the following holds, otherwise falseall of these:
- is dungeon is true
- the fight has add waves
- the time left in the current pull is less than 12 s
- any of these:
- the next add wave includes a boss
- the number of adds in the next add wave is at least 3
simc
variable,name=dung_next_pull,value=variable.is_dungeon&raid_event.adds.exists&raid_event.pull.remains<12&(raid_event.adds.has_boss|raid_event.adds.count>=3) - Set dung cd ok to true when the following holds, otherwise falseany of these:
- execute is true
- is dungeon is false
- all of these:
- dung pull ttd is more than 12
- dung next pull is false
simc
variable,name=dung_cd_ok,value=variable.execute|!variable.is_dungeon|(variable.dung_pull_ttd>12&!variable.dung_next_pull) - Set dung meta ok to true when the following holds, otherwise falseany of these:
- execute is true
- is dungeon is false
- all of these:
- dung pull ttd is more than 15 minus (5 if you use the Annihilator hero talents, else 0)
- dung next pull is false
simc
variable,name=dung_meta_ok,value=variable.execute|!variable.is_dungeon|(variable.dung_pull_ttd>(15-5*hero_tree.annihilator)&!variable.dung_next_pull) - Set trinket 1 buffs to true when the following holds, otherwise falseany of these:
- trinket 1 has an on-use effect that grants a stat buff
- trinket 1 can grant Agility
- trinket 1 can grant Mastery
- trinket 1 can grant Versatility
- trinket 1 can grant Haste
- trinket 1 can grant Critical Strike
trinket.1.has_buff.attack_power
simc
variable,name=trinket_1_buffs,value=trinket.1.has_use_buff|(trinket.1.has_buff.agility|trinket.1.has_buff.mastery|trinket.1.has_buff.versatility|trinket.1.has_buff.haste|trinket.1.has_buff.crit|trinket.1.has_buff.attack_power) - Set trinket 2 buffs to true when the following holds, otherwise falseany of these:
- trinket 2 has an on-use effect that grants a stat buff
- trinket 2 can grant Agility
- trinket 2 can grant Mastery
- trinket 2 can grant Versatility
- trinket 2 can grant Haste
- trinket 2 can grant Critical Strike
trinket.2.has_buff.attack_power
simc
variable,name=trinket_2_buffs,value=trinket.2.has_use_buff|(trinket.2.has_buff.agility|trinket.2.has_buff.mastery|trinket.2.has_buff.versatility|trinket.2.has_buff.haste|trinket.2.has_buff.crit|trinket.2.has_buff.attack_power) - 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 stat buff's duration times trinket 2's stat buff's base value is more than trinket 1's stat buff's duration times trinket 1's stat buff's base value
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.proc.any_dps.duration)*trinket.2.proc.any_dps.default_value)>((trinket.1.proc.any_dps.duration)*trinket.1.proc.any_dps.default_value) - 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 - Set fiery demise active to true when the following holds, otherwise falseall of these:
- you have Fiery Demise talented
- Fiery Brand is on the target
simc
variable,name=fiery_demise_active,value=talent.fiery_demise&dot.fiery_brand.ticking - Set fragment target to 5 plus (1 if you have tier 2 of your apex talent talented, else 0) when the following holds, otherwise to (fiery demise active times 3) plus ((1 if fiery demise active is false, else 0) times (5 minus (1 if Metamorphosis is active, else 0)))you use the Aldrachi Reaver hero talents
simc
variable,name=fragment_target,op=setif,value=5+apex.2,value_else=variable.fiery_demise_active*3+!variable.fiery_demise_active*(5-buff.metamorphosis.up),condition=hero_tree.aldrachi_reaver - Start auto-attacking
simc
auto_attack - Cast Disrupt if the target is casting
simc
disrupt,if=target.debuff.casting.react - Cast Infernal StrikeUsed without waiting for the global cooldown
simc
infernal_strike,use_off_gcd=1 - Cast Demon Spikes if Demon Spikes isn't active and you are in combatUsed without waiting for the global cooldown
simc
demon_spikes,use_off_gcd=1,if=!buff.demon_spikes.up&in_combat Is it true that you use the Aldrachi Reaver hero talents?Not set
If so, switch to Aldrachi reaver, and nothing below is checked
simc
run_action_list,name=aldrachi_reaver,if=hero_tree.aldrachi_reaverAldrachi reaver15 lines
- Cast Sigil of Flame
simc
sigil_of_flame - Cast Immolation Aura if you are in combat
simc
immolation_aura,if=in_combat - Cast Metamorphosis if Untethered Rage is active or (Metamorphosis isn't active and dung meta ok is true)Used without waiting for the global cooldown
simc
metamorphosis,use_off_gcd=1,if=buff.untethered_rage.up|(!buff.metamorphosis.up&variable.dung_meta_ok) - Cast Soul Cleave if aoe is false and your Soul Fragments (counting ones still forming) is at least fragment target and (Glaive Flurry isn't active or Rending Strike isn't active or prio slashes is false)
simc
soul_cleave,if=!variable.aoe&soul_fragments.total>=variable.fragment_target&!(buff.glaive_flurry.up&buff.rending_strike.up&variable.prio_slashes) - Set anchor rem to (1 if anchor at is more than 0, else 0) times (20 minus (the time since the fight started minus anchor at))Seconds left on the Reaver's Mark stacks applied by the last Fracture-second cycle
simc
variable,name=anchor_rem,value=(variable.anchor_at>0)*(20-(time-variable.anchor_at)) - Set prio slashes to true when the following holds, otherwise falseany of these:Slash-second only while the Mark has time to spare; otherwise go Fracture-second to refresh it
- aoe is true
- execute is true
- anchor rem is more than 11 minus (3 if (you have Soul Carver talented and Soul Carver comes off cooldown within 6 s), else 0) minus (1.5 if (you have Sigil of Spite talented and Sigil of Spite comes off cooldown within 6 s), else 0)
simc
variable,name=prio_slashes,value=variable.aoe|variable.execute|variable.anchor_rem>11-3*(talent.soul_carver&cooldown.soul_carver.remains<6)-1.5*(talent.sigil_of_spite&cooldown.sigil_of_spite.remains<6) go through Trinkets, then carry on below if nothing there fits
simc
call_action_list,name=trinketsTrinkets6 lines
- Use your trinket 1 if trinket 1 buffs is true and dung cd ok is true and (trinket 2 has no cooldown or trinket 2 is on cooldown or trinket priority is 1)
simc
use_item,slot=trinket1,if=variable.trinket_1_buffs&variable.dung_cd_ok&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1) - Use your trinket 2 if trinket 2 buffs is true and dung cd ok is true and (trinket 1 has no cooldown or trinket 1 is on cooldown or trinket priority is 2)
simc
use_item,slot=trinket2,if=variable.trinket_2_buffs&variable.dung_cd_ok&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2) - Use your trinket 1 if trinket 1 buffs is false and (damage trinket priority is 1 or trinket 2 is on cooldown or trinket 2's cooldown is 0 s) and the time left on the global cooldown is more than 0.1 sUsed 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.2.cooldown.duration=0)&gcd.remains>0.1 - Use your trinket 2 if trinket 2 buffs is false and (damage trinket priority is 2 or trinket 1 is on cooldown or trinket 1's cooldown is 0 s) and the time left on the global cooldown is more than 0.1 sUsed 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.1.cooldown.duration=0)&gcd.remains>0.1 - Use your trinket 1 if execute is true
simc
use_item,slot=trinket1,if=variable.execute - Use your trinket 2 if execute is true
simc
use_item,slot=trinket2,if=variable.execute
- Cast Reaver's Glaive if Rending Strike isn't active and Glaive Flurry isn't active and (execute is true or prio slashes is true or anchor rem is at most 4 global cooldowns or the stacks of Art of the Glaive plus your Soul Fragments is at least 18 minus (1 if Metamorphosis is active, else 0))
simc
reavers_glaive,if=!buff.rending_strike.up&!buff.glaive_flurry.up&(variable.execute|variable.prio_slashes|variable.anchor_rem<=4*gcd.max|buff.art_of_the_glaive.stack+soul_fragments>=(18-buff.metamorphosis.up)) Is it true that Rending Strike is active or Glaive Flurry is active?Not set
If so, go through Ar glaive cycle, then carry on below if nothing there fits
simc
call_action_list,name=ar_glaive_cycle,if=buff.rending_strike.up|buff.glaive_flurry.up- Cast Fiery Brand if Fiery Brand has 2 or more charges or fiery demise active is false or execute is true
simc
fiery_brand,if=charges>=2|!variable.fiery_demise_active|variable.execute - Cast Sigil of Spite if dung cd ok is true and Reaver's Glaive isn't active
simc
sigil_of_spite,if=variable.dung_cd_ok&!buff.reavers_glaive.up Is it true that the stacks of Art of the Glaive plus your Soul Fragments is at least 20 or (aoe is true and you have 6 or more Soul Fragments)?Not set
If so, go through Ar quick consume, then carry on below if nothing there fits
simc
call_action_list,name=ar_quick_consume,if=buff.art_of_the_glaive.stack+soul_fragments>=20|variable.aoe&soul_fragments>=6- Cast Fel Devastation if dung cd ok is true and you have more than 85 Fury and (you have more than 1 Soul Fragment still forming or aoe is true)
simc
fel_devastation,if=variable.dung_cd_ok&fury>85&(soul_fragments.inactive>1|variable.aoe) - Cast Soul Carver if dung cd ok is true and (fiery demise active is true or execute is true)
simc
soul_carver,if=variable.dung_cd_ok&(variable.fiery_demise_active|variable.execute) go through Ar fillers, then carry on below if nothing there fits
simc
call_action_list,name=ar_fillersAr fillers5 lines
- Cast Fracture if Warblade's Hunger is active
simc
fracture,if=buff.warblades_hunger.stack - Cast Soul Cleave if (aoe is false or your Fury is at least 2 times Soul Cleave's cost or Fracture has 1 or more charges or Fracture comes off cooldown within one global cooldown) and (Glaive Flurry isn't active or Rending Strike isn't active or prio slashes is false)
simc
soul_cleave,if=(!variable.aoe|fury>=2*action.soul_cleave.cost|cooldown.fracture.charges>=1|cooldown.fracture.remains<=gcd.max)&!(buff.glaive_flurry.up&buff.rending_strike.up&variable.prio_slashes) - Cast Fracture
simc
fracture - Cast Felblade
simc
felblade - Cast Fel Devastation
simc
fel_devastation
Is it true that you use the Annihilator hero talents?Not set
If so, switch to Annihilator, and nothing below is checked
simc
run_action_list,name=annihilator,if=hero_tree.annihilatorAnnihilator16 lines
- Get Power Infusion from an ally if Voidfall Spending has exactly 3 stacks or execute is true
simc
invoke_external_buff,name=power_infusion,if=buff.voidfall_spending.stack=3|variable.execute Is it true that Voidfall Spending is active?Not set
If so, go through Anni voidfall spending, then carry on below if nothing there fits
simc
call_action_list,name=anni_voidfall_spending,if=buff.voidfall_spending.up- Cast Sigil of Flame if your Soul Fragments is at most 2 plus (1 if you have Soul Sigils talented, else 0)
simc
sigil_of_flame,if=soul_fragments<=2+talent.soul_sigils - Cast Fracture if Voidfall Building has 2 or more stacks and your Soul Fragments (counting ones still forming) is at least fragment target
simc
fracture,if=buff.voidfall_building.stack>=2&soul_fragments.total>=variable.fragment_target Is it true that Voidfall Building has 2 or more stacks and Fracture has 0.75 or more charges?Not set
If so, go through Anni generate fury, then carry on below if nothing there fits
simc
call_action_list,name=anni_generate_fury,if=buff.voidfall_building.stack>=2&cooldown.fracture.charges_fractional>=0.75Is it true that Untethered Rage is active or (dung meta ok is true and Metamorphosis comes off cooldown within 3 global cooldowns)?Not set
If so, go through Anni meta entry, then carry on below if nothing there fits
simc
call_action_list,name=anni_meta_entry,if=buff.untethered_rage.up|(variable.dung_meta_ok&cooldown.metamorphosis.remains<3*gcd.max)Is it true that dung cd ok is true and (you don't have Fiery Demise talented or fiery demise active is true or Fiery Brand has more than 20 s of cooldown left or execute is true)?Not set
If so, go through Anni cooldowns, then carry on below if nothing there fits
simc
call_action_list,name=anni_cooldowns,if=variable.dung_cd_ok&(!talent.fiery_demise|variable.fiery_demise_active|cooldown.fiery_brand.remains>20|variable.execute)- Cast Fracture if Fracture is fully recharged within one global cooldown
simc
fracture,if=full_recharge_time<gcd.max - Cast Immolation Aura if (you have Fallout talented and aoe is true) or (you have Charred Flesh talented and fiery demise active is true)
simc
immolation_aura,if=(talent.fallout&variable.aoe)|(talent.charred_flesh&variable.fiery_demise_active) - Cast Spirit Bomb if your Soul Fragments is at least fragment target
simc
spirit_bomb,if=soul_fragments>=variable.fragment_target - Cast Immolation Aura
simc
immolation_aura - Cast Sigil of Flame
simc
sigil_of_flame - Cast Fracture if you have 4 or fewer Soul Fragments (counting ones still forming) or you have less than 40 Fury
simc
fracture,if=soul_fragments.total<=4|fury<40 - Cast Soul Cleave if ((you don't have tier 3 of your apex talent talented or Untethered Rage is active or Seething Anger has fewer than 10 stacks) and Metamorphosis is on cooldown) or you don't have Sigil of Spite talented or Sigil of Spite isn't waiting to trigger
simc
soul_cleave,if=!(apex.3&!buff.untethered_rage.up&buff.seething_anger.stack>=10)&!cooldown.metamorphosis.up|(!talent.sigil_of_spite|!action.sigil_of_spite.placed) - Cast Felblade
simc
felblade - Cast Throw Glaive
simc
throw_glaive
Read from ActionPriorityLists/default/demonhunter_vengeance.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 (1 steps)
Before the pull1 line
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats
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=cooldownsCooldowns7 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 - Cast Metamorphosis
simc
metamorphosis
go through Assisted Combat, then carry on below if nothing there fits
simc
call_action_list,name=assisted_combatAssisted Combat13 lines
- Cast MetamorphosisThis is the default action priority list from the game's Assisted Combat system. This is for Blizzard automation and is not included in the game's Assisted Combat system.
simc
metamorphosis - Cast Throw Glaive if Reaver's Glaive is active
simc
throw_glaive,if=buff.reavers_glaive.up - Cast Fracture if Rending Strike is active
simc
fracture,if=buff.rending_strike.up - Cast Soul Cleave if Glaive Flurry is active
simc
soul_cleave,if=buff.glaive_flurry.up - Cast Soul Carver
simc
soul_carver - Cast Sigil of Spite if your distance to the target is at most 30
simc
sigil_of_spite,if=target.distance<=30 - Cast Sigil of Flame if your distance to the target is at most 30 and Sigil of Flame isn't on the target
simc
sigil_of_flame,if=target.distance<=30&!dot.sigil_of_flame.ticking - Cast Immolation Aura if there is more than one enemy
simc
immolation_aura,if=active_enemies>1 - Cast Spirit Bomb if Soul Fragments has 4 or more stacks
simc
spirit_bomb,if=buff.soul_fragments.stack>=4 - Cast Fracture
simc
fracture - Cast Soul Cleave
simc
soul_cleave - Cast Throw Glaive
simc
throw_glaive
Read from ActionPriorityLists/assisted_combat/demonhunter_vengeance.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.