Cogspark

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.

Your situation
Enemies in range
  • aoe: not set · when Spirit Bomb would hit 3 or more enemies
Your talents (click: talented, not talented, not set)
More conditions (21)
Rending Strike is active
Glaive Flurry is active
the stacks of Art of the Glaive plus your Soul Fragments is at least 20
you have 6 or more Soul Fragments
Voidfall Spending is active
Voidfall Building has 2 or more stacks
Fracture has 0.75 or more charges
Untethered Rage is active
dung meta ok is true
Metamorphosis comes off cooldown within 3 global cooldowns
Spirit Bomb comes off cooldown within 3 global cooldowns
your Soul Fragments (counting ones still forming) is less than fragment target
you have less than 75 Fury
Metamorphosis is off cooldown
Spirit Bomb has more than 3 global cooldowns of cooldown left
dung cd ok is true
fiery demise active is true
Fiery Brand has more than 20 s of cooldown left
execute is true
Fel Devastation is off cooldown
you have less than 50 Fury
Checked
  1. The main loop
  2. Aldrachi reaver (maybe)
  3. Trinkets (maybe)
  4. Ar glaive cycle (maybe)
  5. Ar quick consume (maybe)
  6. Ar fillers (maybe)
  7. Annihilator (maybe)
  8. Anni voidfall spending (maybe)
  9. Anni filler no spend (maybe)
  10. Anni generate fury (maybe)
  11. Anni meta entry (maybe)
  12. Anni pre meta spb (maybe)
  13. Anni cooldowns (maybe)
Before the pull, done once before the fight starts (4 steps)

Before the pull4 lines

  1. Record your stats before the pull (sim bookkeeping)
    simcsnapshot_stats
  2. Cast Sigil of Flame
    simcsigil_of_flame
  3. Cast Sigil of Spite if you use the Aldrachi Reaver hero talents or you have Soul Carver talented
    simcsigil_of_spite,if=hero_tree.aldrachi_reaver|talent.soul_carver
  4. Cast Immolation Aura
    simcimmolation_aura

The main loop20 lines

  1. Set aoe to true when the following holds, otherwise false
    Spirit Bomb would hit 3 or more enemies
    simcvariable,name=aoe,value=spell_targets.spirit_bomb>=3
  2. Set execute to true when the following holds, otherwise false
    the fight ends within 20 s
    simcvariable,name=execute,value=fight_remains<20
  3. Set is dungeon to true when the following holds, otherwise false
    any of these:
    • the sim's fight style is DungeonRoute
    • the sim's fight style is DungeonSlice
    simcvariable,name=is_dungeon,value=fight_style.dungeonroute|fight_style.dungeonslice
  4. Reset dung pull ttd to its starting valueWorked out across every enemy
    simccycling_variable,name=dung_pull_ttd,op=reset
  5. Set dung pull ttd to the larger of itself and the time until the target diesWorked out across every enemy
    simccycling_variable,name=dung_pull_ttd,op=max,value=target.time_to_die
  6. Set dung next pull to true when the following holds, otherwise false
    all 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
    simcvariable,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)
  7. Set dung cd ok to true when the following holds, otherwise false
    any of these:
    • execute is true
    • is dungeon is false
    • all of these:
      • dung pull ttd is more than 12
      • dung next pull is false
    simcvariable,name=dung_cd_ok,value=variable.execute|!variable.is_dungeon|(variable.dung_pull_ttd>12&!variable.dung_next_pull)
  8. Set dung meta ok to true when the following holds, otherwise false
    any 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
    simcvariable,name=dung_meta_ok,value=variable.execute|!variable.is_dungeon|(variable.dung_pull_ttd>(15-5*hero_tree.annihilator)&!variable.dung_next_pull)
  9. Set trinket 1 buffs to true when the following holds, otherwise false
    any 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
    simcvariable,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)
  10. Set trinket 2 buffs to true when the following holds, otherwise false
    any 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
    simcvariable,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)
  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 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
    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.proc.any_dps.duration)*trinket.2.proc.any_dps.default_value)>((trinket.1.proc.any_dps.duration)*trinket.1.proc.any_dps.default_value)
  12. 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 at least 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
  13. Set fiery demise active to true when the following holds, otherwise false
    all of these:
    • you have Fiery Demise talented
    • Fiery Brand is on the target
    simcvariable,name=fiery_demise_active,value=talent.fiery_demise&dot.fiery_brand.ticking
  14. 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
    simcvariable,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
  15. Start auto-attacking
    simcauto_attack
  16. Cast Disrupt if the target is casting
    simcdisrupt,if=target.debuff.casting.react
  17. Cast Infernal StrikeUsed without waiting for the global cooldown
    simcinfernal_strike,use_off_gcd=1
  18. Cast Demon Spikes if Demon Spikes isn't active and you are in combatUsed without waiting for the global cooldown
    simcdemon_spikes,use_off_gcd=1,if=!buff.demon_spikes.up&in_combat
  19. Is it true that you use the Aldrachi Reaver hero talents?Not set

    If so, switch to Aldrachi reaver, and nothing below is checked

    simcrun_action_list,name=aldrachi_reaver,if=hero_tree.aldrachi_reaver

    Aldrachi reaver15 lines

    1. Cast Sigil of Flame
      simcsigil_of_flame
    2. Cast Immolation Aura if you are in combat
      simcimmolation_aura,if=in_combat
    3. 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
      simcmetamorphosis,use_off_gcd=1,if=buff.untethered_rage.up|(!buff.metamorphosis.up&variable.dung_meta_ok)
    4. 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)
      simcsoul_cleave,if=!variable.aoe&soul_fragments.total>=variable.fragment_target&!(buff.glaive_flurry.up&buff.rending_strike.up&variable.prio_slashes)
    5. 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
      simcvariable,name=anchor_rem,value=(variable.anchor_at>0)*(20-(time-variable.anchor_at))
    6. Set prio slashes to true when the following holds, otherwise false
      any of these:
      • 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)
      Slash-second only while the Mark has time to spare; otherwise go Fracture-second to refresh it
      simcvariable,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)
    7. go through Trinkets, then carry on below if nothing there fits

      simccall_action_list,name=trinkets

      Trinkets6 lines

      1. 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)
        simcuse_item,slot=trinket1,if=variable.trinket_1_buffs&variable.dung_cd_ok&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)
      2. 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)
        simcuse_item,slot=trinket2,if=variable.trinket_2_buffs&variable.dung_cd_ok&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)
      3. 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
        simcuse_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
      4. 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
        simcuse_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
      5. Use your trinket 1 if execute is true
        simcuse_item,slot=trinket1,if=variable.execute
      6. Use your trinket 2 if execute is true
        simcuse_item,slot=trinket2,if=variable.execute
    8. 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))
      simcreavers_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))
    9. 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

      simccall_action_list,name=ar_glaive_cycle,if=buff.rending_strike.up|buff.glaive_flurry.up
    10. Cast Fiery Brand if Fiery Brand has 2 or more charges or fiery demise active is false or execute is true
      simcfiery_brand,if=charges>=2|!variable.fiery_demise_active|variable.execute
    11. Cast Sigil of Spite if dung cd ok is true and Reaver's Glaive isn't active
      simcsigil_of_spite,if=variable.dung_cd_ok&!buff.reavers_glaive.up
    12. 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

      simccall_action_list,name=ar_quick_consume,if=buff.art_of_the_glaive.stack+soul_fragments>=20|variable.aoe&soul_fragments>=6
    13. 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)
      simcfel_devastation,if=variable.dung_cd_ok&fury>85&(soul_fragments.inactive>1|variable.aoe)
    14. Cast Soul Carver if dung cd ok is true and (fiery demise active is true or execute is true)
      simcsoul_carver,if=variable.dung_cd_ok&(variable.fiery_demise_active|variable.execute)
    15. go through Ar fillers, then carry on below if nothing there fits

      simccall_action_list,name=ar_fillers

      Ar fillers5 lines

      1. Cast Fracture if Warblade's Hunger is active
        simcfracture,if=buff.warblades_hunger.stack
      2. 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)
        simcsoul_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)
      3. Cast Fracture
        simcfracture
      4. Cast Felblade
        simcfelblade
      5. Cast Fel Devastation
        simcfel_devastation
  20. Is it true that you use the Annihilator hero talents?Not set

    If so, switch to Annihilator, and nothing below is checked

    simcrun_action_list,name=annihilator,if=hero_tree.annihilator

    Annihilator16 lines

    1. Get Power Infusion from an ally if Voidfall Spending has exactly 3 stacks or execute is true
      simcinvoke_external_buff,name=power_infusion,if=buff.voidfall_spending.stack=3|variable.execute
    2. 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

      simccall_action_list,name=anni_voidfall_spending,if=buff.voidfall_spending.up
    3. Cast Sigil of Flame if your Soul Fragments is at most 2 plus (1 if you have Soul Sigils talented, else 0)
      simcsigil_of_flame,if=soul_fragments<=2+talent.soul_sigils
    4. Cast Fracture if Voidfall Building has 2 or more stacks and your Soul Fragments (counting ones still forming) is at least fragment target
      simcfracture,if=buff.voidfall_building.stack>=2&soul_fragments.total>=variable.fragment_target
    5. 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

      simccall_action_list,name=anni_generate_fury,if=buff.voidfall_building.stack>=2&cooldown.fracture.charges_fractional>=0.75
    6. Is 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

      simccall_action_list,name=anni_meta_entry,if=buff.untethered_rage.up|(variable.dung_meta_ok&cooldown.metamorphosis.remains<3*gcd.max)
    7. 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

      simccall_action_list,name=anni_cooldowns,if=variable.dung_cd_ok&(!talent.fiery_demise|variable.fiery_demise_active|cooldown.fiery_brand.remains>20|variable.execute)
    8. Cast Fracture if Fracture is fully recharged within one global cooldown
      simcfracture,if=full_recharge_time<gcd.max
    9. Cast Immolation Aura if (you have Fallout talented and aoe is true) or (you have Charred Flesh talented and fiery demise active is true)
      simcimmolation_aura,if=(talent.fallout&variable.aoe)|(talent.charred_flesh&variable.fiery_demise_active)
    10. Cast Spirit Bomb if your Soul Fragments is at least fragment target
      simcspirit_bomb,if=soul_fragments>=variable.fragment_target
    11. Cast Immolation Aura
      simcimmolation_aura
    12. Cast Sigil of Flame
      simcsigil_of_flame
    13. Cast Fracture if you have 4 or fewer Soul Fragments (counting ones still forming) or you have less than 40 Fury
      simcfracture,if=soul_fragments.total<=4|fury<40
    14. 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
      simcsoul_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)
    15. Cast Felblade
      simcfelblade
    16. Cast Throw Glaive
      simcthrow_glaive

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