Cogspark

Cogspark Works · Rotation

Devastation Evoker

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
  • weapon buffs: no · when never
  • weapon stat value: no · when never
  • trinket 1 ogcd cast: no · when never
  • trinket 2 ogcd cast: no · when never
Your talents (click: talented, not talented, not set)
More conditions (5)
Ancient Flame is active
Dragonrage is active
can use empower is true
Tip the Scales is active
Fire Breath Damage is missing from the target or due for a refresh
Checked
  1. The main loop
  2. Trinkets
  3. Sc (maybe)
  4. Es (maybe)
  5. Fb sc (maybe)
  6. Green (maybe)
  7. Fs (maybe)
  8. Fb fs (maybe)
Before the pull, done once before the fight starts (26 steps)

Before the pull26 lines

  1. Record your stats before the pull (sim bookkeeping)
    simcsnapshot_stats
  2. Set trinket 1 buffs to true when the following holds, otherwise false
    any of these:
    • trinket 1 can grant Intellect
    • trinket 1 can grant Mastery
    • trinket 1 can grant Versatility
    • trinket 1 can grant Haste
    • trinket 1 can grant Critical Strike
    simcvariable,name=trinket_1_buffs,value=trinket.1.has_buff.intellect|trinket.1.has_buff.mastery|trinket.1.has_buff.versatility|trinket.1.has_buff.haste|trinket.1.has_buff.crit
  3. Set trinket 2 buffs to true when the following holds, otherwise false
    any of these:
    • trinket 2 can grant Intellect
    • trinket 2 can grant Mastery
    • trinket 2 can grant Versatility
    • trinket 2 can grant Haste
    • trinket 2 can grant Critical Strike
    simcvariable,name=trinket_2_buffs,value=trinket.2.has_buff.intellect|trinket.2.has_buff.mastery|trinket.2.has_buff.versatility|trinket.2.has_buff.haste|trinket.2.has_buff.crit
  4. Set weapon buffs to 0
    simcvariable,name=weapon_buffs,value=0
  5. Set weapon sync to 1 when the following holds, otherwise to 0.5
    never
    simcvariable,name=weapon_sync,op=setif,value=1,value_else=0.5,condition=0
  6. Set weapon stat value to 0
    simcvariable,name=weapon_stat_value,value=0
  7. 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 Dragonrage's cooldown is 0
      • the remainder of Dragonrage'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.dragonrage.duration=0|cooldown.dragonrage.duration%%trinket.1.cooldown.duration=0)
  8. 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 Dragonrage's cooldown is 0
      • the remainder of Dragonrage'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.dragonrage.duration=0|cooldown.dragonrage.duration%%trinket.2.cooldown.duration=0)
  9. Set trinket 1 manual to true when the following holds, otherwise false
    trinket 1 is Font of Venomous Rage
    simcvariable,name=trinket_1_manual,value=trinket.1.is.font_of_venomous_rage
  10. Set trinket 2 manual to true when the following holds, otherwise false
    trinket 2 is Font of Venomous Rage
    simcvariable,name=trinket_2_manual,value=trinket.2.is.font_of_venomous_rage
  11. Set trinket 1 ogcd cast to 0
    simcvariable,name=trinket_1_ogcd_cast,value=0
  12. Set trinket 2 ogcd cast to 0
    simcvariable,name=trinket_2_ogcd_cast,value=0
  13. Set trinket 1 exclude to true when the following holds, otherwise false
    any of these:
    • trinket 1 is Ruby Whelp Shell
    • trinket 1 is Whispering Incarnate Icon
    simcvariable,name=trinket_1_exclude,value=trinket.1.is.ruby_whelp_shell|trinket.1.is.whispering_incarnate_icon
  14. Set trinket 2 exclude to true when the following holds, otherwise false
    any of these:
    • trinket 2 is Ruby Whelp Shell
    • trinket 2 is Whispering Incarnate Icon
    simcvariable,name=trinket_2_exclude,value=trinket.2.is.ruby_whelp_shell|trinket.2.is.whispering_incarnate_icon
  15. 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 sync times trinket 2's stat buff's base value is more than trinket 1's stat buff's duration times trinket 1 sync 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)*(variable.trinket_2_sync)*trinket.2.proc.any_dps.default_value)>((trinket.1.proc.any_dps.duration)*(variable.trinket_1_sync)*trinket.1.proc.any_dps.default_value)
  16. Set trinket priority to 3 when the following holds, otherwise to trinket priority
    any of these:
    • all of these:
      • trinket 1 buffs is false
      • trinket 2 buffs is false
    • weapon stat value times weapon sync is more than the larger of (trinket 2's stat buff's duration times trinket 2 sync times trinket 2's stat buff's base value) and (trinket 1's stat buff's duration times trinket 1 sync times trinket 1's stat buff's base value)
    Only updated when weapon buffs is true
    simcvariable,name=trinket_priority,op=setif,if=variable.weapon_buffs,value=3,value_else=variable.trinket_priority,condition=!variable.trinket_1_buffs&!variable.trinket_2_buffs|variable.weapon_stat_value*variable.weapon_sync>(((trinket.2.proc.any_dps.duration)*(variable.trinket_2_sync)*trinket.2.proc.any_dps.default_value)<?((trinket.1.proc.any_dps.duration)*(variable.trinket_1_sync)*trinket.1.proc.any_dps.default_value))
  17. Set trinket priority to (1 if trinket 1 is Signet of the Priory, else 0) plus (2 if trinket 2 is Signet of the Priory, else 0)
    all of these:
    • you have Signet of the Priory equipped
    • trinket priority is 3
    simcvariable,name=trinket_priority,op=set,value=trinket.1.is.signet_of_the_priory+2*trinket.2.is.signet_of_the_priory,if=equipped.signet_of_the_priory&variable.trinket_priority=3
  18. 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
  19. Set r1 cast time to 1.0 times spell_haste
    simcvariable,name=r1_cast_time,value=1.0*spell_haste
  20. Reset dr prep time to its starting valuedr prep time starts each fight at 6
    simcvariable,name=dr_prep_time,default=6,op=reset
  21. Reset dr prep time aoe to its starting valuedr prep time aoe starts each fight at 4
    simcvariable,name=dr_prep_time_aoe,default=4,op=reset
  22. Set can use empower to 1
    any of these:
    • you don't have Animosity talented
    • you don't have Dragonrage talented
    can use empower starts each fight at 1
    simcvariable,name=can_use_empower,value=1,default=1,if=!talent.animosity|!talent.dragonrage
  23. Cast Verdant Embrace if you have Scarlet Adaptation talented
    simcverdant_embrace,if=talent.scarlet_adaptation
  24. Cast Hover if you have Slipstream talented
    simchover,if=talent.slipstream
  25. Cast Hover if you have Slipstream talented
    simchover,if=talent.slipstream
  26. Cast Living Flame
    simcliving_flame

The main loop10 lines

  1. Drink a potion if you don't have Dragonrage talented or Dragonrage is active or the fight ends within 35 s
    simcpotion,if=(!talent.dragonrage|buff.dragonrage.up)|fight_remains<35
  2. Set next dragonrage to the larger of the cooldown left on Dragonrage and (the smaller of (the cooldown left on Eternity Surge minus 8) and (the cooldown left on Fire Breath minus 8))
    simcvariable,name=next_dragonrage,value=cooldown.dragonrage.remains<?((cooldown.eternity_surge.remains-8)>?(cooldown.fire_breath.remains-8))
  3. Get Power Infusion from an ally if Dragonrage is active or the fight ends within 35 s
    simcinvoke_external_buff,name=power_infusion,if=buff.dragonrage.up|fight_remains<35
  4. Set can use empower to true when the following holds, otherwise false
    Dragonrage has at least one global cooldown times dr prep time of cooldown left
    Only updated when you have Animosity talented and you have Dragonrage talented
    simcvariable,name=can_use_empower,op=set,value=cooldown.dragonrage.remains>=gcd.max*variable.dr_prep_time,if=talent.animosity&talent.dragonrage
  5. Set use pyre fs to true when the following holds, otherwise false
    all of these:
    • you have Legacy of the Lifebinder talented
    • any of these:
      • there are 5 or more enemies
      • all of these:
        • there are 3 or more enemies
        • any of these:
          • your rank in Volatility is 2
          • you have Feed the Flames talented
    simcvariable,name=use_pyre_fs,op=set,value=talent.legacy_of_the_lifebinder&(active_enemies>=5|active_enemies>=3&(talent.volatility.rank=2|talent.feed_the_flames))
  6. Set use tts to true when the following holds, otherwise false
    Eternity Surge comes off cooldown within the time until Fire Breath can be used
    Only updated when you have Legacy of the Lifebinder talented
    simcvariable,name=use_tts,op=set,value=(cooldown.eternity_surge.remains<=action.fire_breath.usable_in),if=talent.legacy_of_the_lifebinder
  7. Cast Quell if the target is castingUsed without waiting for the global cooldown
    simcquell,use_off_gcd=1,if=target.debuff.casting.react
  8. go through Trinkets, then carry on below if nothing there fits

    simccall_action_list,name=trinkets

    Trinkets8 lines

    1. Use your trinket 1 if (Dragonrage is active and (Rising Fury has 4 or more stacks or you don't have Rising Fury talented or you have Legacy of the Lifebinder talented) and ((trinket 2 buffs is true and Fire Breath is on cooldown and trinket 2 is on cooldown) or (Tip the Scales is active and trinket priority is 1) or Fire Breath is on cooldown or there are 3 or more enemies) and (trinket 2 has no cooldown or trinket 2 is on cooldown or trinket priority is 1 or trinket 2 exclude is true) and trinket 1 manual is false) or trinket 1's stat buff's duration is at least the time left in the fight or (trinket 1's cooldown is at most 60 s and (next dragonrage is more than 20 or you don't have Dragonrage talented) and (Dragonrage isn't active or trinket priority is 1) and trinket 1 manual is false)Trinket Spaghetti
      simcuse_item,slot=trinket1,if=(buff.dragonrage.up&(buff.rising_fury.stack>=4|!talent.rising_fury|talent.legacy_of_the_lifebinder)&((variable.trinket_2_buffs&!cooldown.fire_breath.up&trinket.2.cooldown.remains)|buff.tip_the_scales.up&variable.trinket_priority=1|(!cooldown.fire_breath.up)|active_enemies>=3)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1|variable.trinket_2_exclude)&!variable.trinket_1_manual|trinket.1.proc.any_dps.duration>=fight_remains|trinket.1.cooldown.duration<=60&(variable.next_dragonrage>20|!talent.dragonrage)&(!buff.dragonrage.up|variable.trinket_priority=1)&!variable.trinket_1_manual)
    2. Use your trinket 2 if (Dragonrage is active and (Rising Fury has 4 or more stacks or you don't have Rising Fury talented or you have Legacy of the Lifebinder talented) and ((trinket 1 buffs is true and Fire Breath is on cooldown and trinket 1 is on cooldown) or (Tip the Scales is active and trinket priority is 2) or Fire Breath is on cooldown or there are 3 or more enemies) and (trinket 1 has no cooldown or trinket 1 is on cooldown or trinket priority is 2 or trinket 1 exclude is true) and trinket 2 manual is false) or trinket 2's stat buff's duration is at least the time left in the fight or (trinket 2's cooldown is at most 60 s and (next dragonrage is more than 20 or you don't have Dragonrage talented) and (Dragonrage isn't active or trinket priority is 2) and trinket 2 manual is false)
      simcuse_item,slot=trinket2,if=buff.dragonrage.up&(buff.rising_fury.stack>=4|!talent.rising_fury|talent.legacy_of_the_lifebinder)&((variable.trinket_1_buffs&!cooldown.fire_breath.up&trinket.1.cooldown.remains)|buff.tip_the_scales.up&variable.trinket_priority=2|(!cooldown.fire_breath.up)|active_enemies>=3)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2|variable.trinket_1_exclude)&!variable.trinket_2_manual|trinket.2.proc.any_dps.duration>=fight_remains|trinket.2.cooldown.duration<=60&(variable.next_dragonrage>20|!talent.dragonrage)&(!buff.dragonrage.up|variable.trinket_priority=2)&!variable.trinket_2_manual
    3. Use your trinket 1 if trinket 1 buffs is false and trinket 1 manual is false and (damage trinket priority is 1 or trinket 2 is on cooldown or trinket 2 is Spymasters Web or trinket 2's cooldown is 0 s) and the time left on the global cooldown is more than 0.1 s and your last spell on the global cooldown wasn't Deep Breath and (next dragonrage is more than 20 or you don't have Dragonrage talented or trinket 2 buffs is false or (trinket 2 is Spymasters Web and (Spymaster's Report has fewer than 5 stacks or at least 130 s plus next dragonrage of the fight remain)))Used without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_buffs&!variable.trinket_1_manual&(variable.damage_trinket_priority=1|trinket.2.cooldown.remains|trinket.2.is.spymasters_web|trinket.2.cooldown.duration=0)&(gcd.remains>0.1&!prev_gcd.1.deep_breath)&(variable.next_dragonrage>20|!talent.dragonrage|!variable.trinket_2_buffs|trinket.2.is.spymasters_web&(buff.spymasters_report.stack<5|fight_remains>=130+variable.next_dragonrage))
    4. Use your trinket 2 if trinket 2 buffs is false and trinket 2 manual is false and (damage trinket priority is 2 or trinket 1 is on cooldown or trinket 1 is Spymasters Web or trinket 1's cooldown is 0 s) and the time left on the global cooldown is more than 0.1 s and your last spell on the global cooldown wasn't Deep Breath and (next dragonrage is more than 20 or you don't have Dragonrage talented or trinket 1 buffs is false or (trinket 1 is Spymasters Web and (Spymaster's Report has fewer than 5 stacks or at least 130 s plus next dragonrage of the fight remain)))Used without waiting for the global cooldown
      simcuse_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_buffs&!variable.trinket_2_manual&(variable.damage_trinket_priority=2|trinket.1.cooldown.remains|trinket.1.is.spymasters_web|trinket.1.cooldown.duration=0)&(gcd.remains>0.1&!prev_gcd.1.deep_breath)&(variable.next_dragonrage>20|!talent.dragonrage|!variable.trinket_1_buffs|trinket.1.is.spymasters_web&(buff.spymasters_report.stack<5|fight_remains>=130+variable.next_dragonrage))
    5. Use your trinket 1 if trinket 1 buffs is false and trinket 1 manual is false and (damage trinket priority is 1 or trinket 2 is on cooldown or trinket 2 is Spymasters Web or trinket 2's cooldown is 0 s) and (next dragonrage is more than 20 or you don't have Dragonrage talented or trinket 2 buffs is false or (trinket 2 is Spymasters Web and (Spymaster's Report has fewer than 5 stacks or at least 130 s plus next dragonrage of the fight remain)))
      simcuse_item,slot=trinket1,if=!variable.trinket_1_buffs&!variable.trinket_1_manual&(variable.damage_trinket_priority=1|trinket.2.cooldown.remains|trinket.2.is.spymasters_web|trinket.2.cooldown.duration=0)&(!variable.trinket_1_ogcd_cast)&(variable.next_dragonrage>20|!talent.dragonrage|!variable.trinket_2_buffs|trinket.2.is.spymasters_web&(buff.spymasters_report.stack<5|fight_remains>=130+variable.next_dragonrage))
    6. Use your trinket 2 if trinket 2 buffs is false and trinket 2 manual is false and (damage trinket priority is 2 or trinket 1 is on cooldown or trinket 1 is Spymasters Web or trinket 1's cooldown is 0 s) and (next dragonrage is more than 20 or you don't have Dragonrage talented or trinket 1 buffs is false or (trinket 1 is Spymasters Web and (Spymaster's Report has fewer than 5 stacks or at least 130 s plus next dragonrage of the fight remain)))
      simcuse_item,slot=trinket2,if=!variable.trinket_2_buffs&!variable.trinket_2_manual&(variable.damage_trinket_priority=2|trinket.1.cooldown.remains|trinket.1.is.spymasters_web|trinket.1.cooldown.duration=0)&(!variable.trinket_2_ogcd_cast)&(variable.next_dragonrage>20|!talent.dragonrage|!variable.trinket_1_buffs|trinket.1.is.spymasters_web&(buff.spymasters_report.stack<5|fight_remains>=130+variable.next_dragonrage))
    7. Use Font of Venomous Rage if Dragonrage isn't active
      simcuse_item,name=font_of_venomous_rage,if=!buff.dragonrage.up
  9. Is it true that you have Mass Disintegrate talented?Not set

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

    simcrun_action_list,name=sc,if=talent.mass_disintegrate

    Sc17 lines

    1. Cast Deep Breath if Strafing Run has at most 2 global cooldowns left, or isn't activeCancel the channel when the global cooldown is overSC Action List. Use Deep Breath to optimise for Strafing Run
      simcdeep_breath,if=buff.strafing_run.remains<=gcd.max*2,cancel_if=gcd.remains<=0
    2. Cast Dragonrage if (the target lives at least 30 s longer and the next add wave starts in at least 60 s (or never)) or the fight has no add waves or the time until the next add wave is 0 s
      simcdragonrage,if=target.time_to_die>=30&raid_event.adds.in>=60|!raid_event.adds.exists|raid_event.adds.in=0
    3. Cast Hover if (the next movement phase starts within 6 s and Hover isn't active and the time left on the global cooldown is at least 0.5 s) or (you have Slipstream talented and the time left on the global cooldown is at least 0.5 s)Used without waiting for the global cooldown
      simchover,use_off_gcd=1,if=raid_event.movement.in<6&!buff.hover.up&gcd.remains>=0.5|talent.slipstream&gcd.remains>=0.5
    4. Cast Azure Sweep if (Essence Burst isn't active or Essence Burst isn't at maximum stacks) and you have the 2-piece set bonus (mid1) and Eternity Surge comes off cooldown within 6 sUse Azure Sweep if Eternity Surge is reasonably Soon. This is not a magic number, it's just simpler than writing out the expansion to account for azure sweep stacks.
      simcazure_sweep,if=(buff.essence_burst.down|!buff.essence_burst.at_max_stacks)&set_bonus.mid1_2pc&cooldown.eternity_surge.remains<=6
    5. go through Es, then carry on below if nothing there fits

      Swell Gaming with EoI is good, With EH its bad
      simccall_action_list,name=es

      Es4 lines

      1. Cast Eternity Surge if (the number of enemies is 4 plus (4 if you have Eternity's Span talented, else 0) and you don't have Star Salvo talented) or (the number of enemies is at least 4 plus (4 if you have Eternity's Span talented, else 0) minus (1 if you have Star Salvo talented, else 0) and you have Star Salvo talented)target on the enemy with the highest target's healthEmpower it to rank 4Pick optimal Eternity Surge Rank
        simceternity_surge,empower_to=4,target_if=max:target.health.pct,if=(active_enemies=4+4*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=4+4*talent.eternitys_span-talent.star_salvo)&talent.star_salvo
      2. Cast Eternity Surge if (the number of enemies is 3 plus (3 if you have Eternity's Span talented, else 0) and you don't have Star Salvo talented) or (the number of enemies is at least 3 plus (3 if you have Eternity's Span talented, else 0) minus (1 if you have Star Salvo talented, else 0) and you have Star Salvo talented)target on the enemy with the highest target's healthEmpower it to rank 3
        simceternity_surge,empower_to=3,target_if=max:target.health.pct,if=(active_enemies=3+3*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=3+3*talent.eternitys_span-talent.star_salvo)&talent.star_salvo
      3. Cast Eternity Surge if (the number of enemies is 2 plus (2 if you have Eternity's Span talented, else 0) and you don't have Star Salvo talented) or (the number of enemies is at least 2 plus (2 if you have Eternity's Span talented, else 0) minus (1 if you have Star Salvo talented, else 0) and you have Star Salvo talented)target on the enemy with the highest target's healthEmpower it to rank 2
        simceternity_surge,empower_to=2,target_if=max:target.health.pct,if=(active_enemies=2+2*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=2+2*talent.eternitys_span-talent.star_salvo)&talent.star_salvo
      4. Cast Eternity Surgetarget on the enemy with the highest target's healthEmpower it to rank 1
        simceternity_surge,empower_to=1,target_if=max:target.health.pct
    6. Cast Tip the Scales if Fire Breath can be used nowUsed without waiting for the global cooldown
      simctip_the_scales,use_off_gcd=1,if=action.fire_breath.ready
    7. go through Fb sc, then carry on below if nothing there fits

      simccall_action_list,name=fb_sc

      Fb sc4 lines

      1. Cast Fire Breath if there is a single enemy or there are more than 4 enemiestarget on the enemy with the highest target's healthEmpower it to rank 1Fire Breath Upranking
        simcfire_breath,empower_to=1,target_if=max:target.health.pct,if=active_enemies=1|active_enemies>4
      2. Cast Fire Breath if there are exactly 2 enemiestarget on the enemy with the highest target's healthEmpower it to rank 2
        simcfire_breath,empower_to=2,target_if=max:target.health.pct,if=active_enemies=2
      3. Cast Fire Breath if there are exactly 3 enemiestarget on the enemy with the highest target's healthEmpower it to rank 3
        simcfire_breath,empower_to=3,target_if=max:target.health.pct,if=active_enemies=3
      4. Cast Fire Breath if there are exactly 4 enemiestarget on the enemy with the highest target's healthEmpower it to rank 4
        simcfire_breath,empower_to=4,target_if=max:target.health.pct,if=active_enemies=4
    8. Cast Deep Breath if there are 2 or more enemiesCancel the channel when the global cooldown is overUsing DB whenever is neutral at 2T and a gain above
      simcdeep_breath,if=active_enemies>=2,cancel_if=gcd.remains=0
    9. Cast Disintegrate if (the next movement phase starts in more than 2 s (or never) or Hover is active) and Mass Disintegrate Stacks is active and Charged Blast has fewer than 15 stacksStop channeling when you have Volatility talented and there are 8 or more enemies and something higher in the list is readyRecast it early to keep the channel going when the ticks left on Disintegrate is at most 1 and Mass Disintegrate Stacks is active
      simcdisintegrate,early_chain_if=ticks_remain<=1&buff.mass_disintegrate_stacks.up,if=(raid_event.movement.in>2|buff.hover.up)&buff.mass_disintegrate_stacks.up&buff.charged_blast.stack<15,interrupt_if=talent.volatility&active_enemies>=8
    10. Cast Pyre if ((there are 5 or more enemies or (there are 4 or more enemies and your rank in Volatility is 2)) and Mass Disintegrate Stacks isn't active) or (there are 3 or more enemies and you have Charged Blast talented and Charged Blast has 15 or more stacks)target on the enemy with the highest target's health
      simcpyre,target_if=max:target.health.pct,if=(active_enemies>=5|active_enemies>=4&talent.volatility.rank=2)&!buff.mass_disintegrate_stacks.up|active_enemies>=3&talent.charged_blast&buff.charged_blast.stack>=15
    11. Cast Disintegrate if the next movement phase starts in more than 2 s (or never) or Hover is activetarget on the enemy with the highest time left on Fire Breath DamageStop channeling when the ticks left on Disintegrate is at most 1 and there are 3 or more enemies and something higher in the list is readyRecast it early to keep the channel going when the ticks left on Disintegrate is at most 1
      simcdisintegrate,target_if=max:dot.fire_breath_damage.remains,if=(raid_event.movement.in>2|buff.hover.up),early_chain_if=ticks_remain<=1,interrupt_if=ticks_remain<=1&active_enemies>=3
    12. Cast Living Flame if Burnout is active and Leaping Flames is active and the number of enemies is at most 1 plus the stacks of Leaping Flames
      simcliving_flame,if=buff.burnout.up&buff.leaping_flames.up&active_enemies<=1+buff.leaping_flames.stack
    13. Cast Unbound Flame if Essence Burst isn't at maximum stacks
      simcunbound_flame,if=!buff.essence_burst.at_max_stacks
    14. Cast Azure Sweep
      simcazure_sweep
    15. Cast Living Flame if the next movement phase starts in more than Living Flame's cast time (or never) or Hover is active
      simcliving_flame,if=raid_event.movement.in>execute_time|buff.hover.up
    16. Is it true that you have Ancient Flame talented and Ancient Flame isn't active and you have Scarlet Adaptation talented and Dragonrage isn't active?Not set

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

      simccall_action_list,name=green,if=talent.ancient_flame&!buff.ancient_flame.up&talent.scarlet_adaptation&!buff.dragonrage.up
    17. Cast Azure Strike
      simcazure_strike
  10. switch to Fs, and nothing below is checked

    simcrun_action_list,name=fs

    Fs15 lines

    1. Cast Fire Breath if Dragonrage comes off cooldown within 2 global cooldowns and Fire Breath Damage isn't on any enemy and (the target lives at least 15 s longer or the fight has no add waves) and use pyre fs is truetarget on the enemy with the highest target's healthEmpower it to rank 1Flameshaper Action List. AoE Precast for Dragonrage Pyres
      simcfire_breath,target_if=max:target.health.pct,empower_to=1,if=cooldown.dragonrage.remains<gcd.max*2&active_dot.fire_breath_damage=0&(target.time_to_die>=15|!raid_event.adds.exists)&variable.use_pyre_fs
    2. Cast Dragonrage if (the target lives at least 30 s longer and the next add wave starts in at least 60 s (or never)) or (the target lives at least 15 s longer and there are more than 4 enemies) or the fight has no add waves or the time until the next add wave is 0 s
      simcdragonrage,if=target.time_to_die>=30&raid_event.adds.in>=60|target.time_to_die>=15&active_enemies>4|!raid_event.adds.exists|raid_event.adds.in=0
    3. Cast Hover if the next movement phase starts within 6 s and Hover isn't active and the time left on the global cooldown is at least 0.5 s and use pyre fs is falseUsed without waiting for the global cooldown
      simchover,use_off_gcd=1,if=raid_event.movement.in<6&!buff.hover.up&gcd.remains>=0.5&!variable.use_pyre_fs
    4. Cast Tip the Scales if Dragonrage is active and use tts is trueUsed without waiting for the global cooldown
      simctip_the_scales,use_off_gcd=1,if=buff.dragonrage.up&variable.use_tts
    5. Is it true that can use empower is true or Tip the Scales is active?Not set

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

      Target Match with ES (Hitting everything is priority over lower ranks)
      simccall_action_list,name=es,if=variable.can_use_empower|buff.tip_the_scales.up
    6. Is it true that can use empower is true and Fire Breath Damage is missing from the target or due for a refresh and Tip the Scales isn't active?Not set

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

      Upranking in 2-3T is back on the menu boys
      simccall_action_list,name=fb_fs,if=variable.can_use_empower&dot.fire_breath_damage.refreshable&!buff.tip_the_scales.up
    7. Cast Pyre if use pyre fs is truetarget on the enemy with the highest target's health
      simcpyre,target_if=max:target.health.pct,if=variable.use_pyre_fs
    8. Cast Disintegrate if the next movement phase starts in more than 2 s (or never) or Hover is activetarget on the enemy with the highest time left on Fire Breath DamageStop channeling when the ticks left on Disintegrate is at most 1 and something higher in the list is readyRecast it on its last tick to keep the channel goingRecast it early to keep the channel going when the ticks left on Disintegrate is at most 1
      simcdisintegrate,target_if=max:dot.fire_breath_damage.remains,chain=1,if=(raid_event.movement.in>2|buff.hover.up),early_chain_if=ticks_remain<=1,interrupt_if=ticks_remain<=1
    9. Cast Deep Breath if you have Imminent Destruction talented and Fire Breath Damage isn't on any enemy and there are 4 or more enemiesStop channeling when the global cooldown is over and something higher in the list is readyCancel the channel when the global cooldown is overQueue the token deep breath condition
      simcdeep_breath,if=talent.imminent_destruction&active_dot.fire_breath_damage=0&active_enemies>=4,cancel_if=gcd.remains=0,interrupt_if=gcd.remains=0
    10. Cast Unbound Flame if Essence Burst isn't at maximum stacks and (you don't have Scorching Embers talented or Fire Breath Damage is on at least one enemy)target on the enemy with the highest time left on Fire Breath DamageAim at the ones that are burning
      simcunbound_flame,target_if=max:dot.fire_breath_damage.remains,if=!buff.essence_burst.at_max_stacks&(!talent.scorching_embers|active_dot.fire_breath_damage>0)
    11. Cast Living Flame if Burnout is active or (Leaping Flames is active and there are 4 or more enemies) or ((Leaping Flames is active or Ancient Flame is active) and the next movement phase starts in more than Living Flame's cast time (or never))
      simcliving_flame,if=buff.burnout.up|buff.leaping_flames.up&active_enemies>=4|(buff.leaping_flames.up|buff.ancient_flame.up)&raid_event.movement.in>execute_time
    12. Cast Azure SweepSweep is worse than LF with procs
      simcazure_sweep
    13. Cast Living Flame if the next movement phase starts in more than Living Flame's cast time (or never)
      simcliving_flame,if=raid_event.movement.in>execute_time
    14. Is it true that you have Ancient Flame talented and Ancient Flame isn't active and you have Scarlet Adaptation talented and Dragonrage isn't active and there are fewer than 4 enemies?Not set

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

      simccall_action_list,name=green,if=talent.ancient_flame&!buff.ancient_flame.up&talent.scarlet_adaptation&!buff.dragonrage.up&active_enemies<4
    15. Cast Azure Strike
      simcazure_strike

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