## Fire Mage ## https://github.com/simulationcraft/simc/ ## April 7, 2022 ## Changes: ## - Use fight_remains rather than target.time_to_die for last-second ability usages. ## - Loosen cast requirements for Combustion (i.e., don't hold it for a fresh Meteor cast). ## - Enable strict checking on a few forks in the APL to reduce workload. ## - Adjust a Pyroblast entry that does not model well in-game (sim tested at no significant DPS impact). ## - Convert all buff.X.react entries to buff.X.up, an almost insignificant DPS gain in sims. ## - Use hardcoded variables to reduce CPU workload. ## Executed before combat begins. Accepts non-harmful actions only. actions.precombat+=/arcane_intellect ## APL Variable Option: If set to a non-zero value, the Combustion action and cooldowns that are constrained to only be used when Combustion is up will not be used during the simulation. # actions.precombat+=/variable,name=disable_combustion,op=reset ## APL Variable Option: This variable specifies whether Combustion should be used during Firestarter. # actions.precombat+=/variable,name=firestarter_combustion,default=-1,value=!talent.pyroclasm,if=variable.firestarter_combustion<0 ## APL Variable Option: This variable specifies the number of targets at which Hot Streak Flamestrikes outside of Combustion should be used. # actions.precombat+=/variable,name=hot_streak_flamestrike,if=variable.hot_streak_flamestrike=0,value=2*talent.flame_patch+4*!talent.flame_patch ## APL Variable Option: This variable specifies the number of targets at which Hard Cast Flamestrikes outside of Combustion should be used as filler. # actions.precombat+=/variable,name=hard_cast_flamestrike,if=variable.hard_cast_flamestrike=0,value=3*talent.flame_patch+6*!talent.flame_patch ## APL Variable Option: This variable specifies the number of targets at which Hot Streak Flamestrikes are used during Combustion. # actions.precombat+=/variable,name=combustion_flamestrike,if=variable.combustion_flamestrike=0,value=3*talent.flame_patch+6*!talent.flame_patch ## APL Variable Option: This variable specifies the number of targets at which Arcane Explosion outside of Combustion should be used. # actions.precombat+=/variable,name=arcane_explosion,if=variable.arcane_explosion=0,value=99*talent.flame_patch+2*!talent.flame_patch ## APL Variable Option: This variable specifies the percentage of mana below which Arcane Explosion will not be used. # actions.precombat+=/variable,name=arcane_explosion_mana,default=40,op=reset ## APL Variable Option: The number of targets at which Shifting Power can used during Combustion. # actions.precombat+=/variable,name=combustion_shifting_power,if=variable.combustion_shifting_power=0,value=variable.combustion_flamestrike ## APL Variable Option: The time remaining on a cast when Combustion can be used in seconds. # actions.precombat+=/variable,name=combustion_cast_remains,default=0.7,op=reset ## APL Variable Option: This variable specifies the number of seconds of Fire Blast that should be pooled past the default amount. # actions.precombat+=/variable,name=overpool_fire_blasts,default=0,op=reset ## APL Variable Option: How long before Combustion should Empyreal Ordnance be used? # actions.precombat+=/variable,name=empyreal_ordnance_delay,default=18,op=reset ## If Combustion is disabled, schedule the first Combustion far after the fight ends. # actions.precombat+=/variable,name=time_to_combustion,value=fight_remains+100,if=variable.disable_combustion ## The duration of a Sun King's Blessing Combustion. # actions.precombat+=/variable,name=skb_duration,value=dbc.effect.828420.base_value # The number of seconds of Fire Blast recharged by Mirrors of Torment. # actions.precombat+=/variable,name=mot_recharge_amount,value=dbc.effect.871274.base_value ## Whether a usable item used to buff Combustion is equipped. # actions.precombat+=/variable,name=combustion_on_use,value=equipped.gladiators_badge|equipped.macabre_sheet_music|equipped.inscrutable_quantum_device|equipped.sunblood_amethyst|equipped.empyreal_ordnance|equipped.flame_of_battle|equipped.wakeners_frond|equipped.instructors_divine_bell|equipped.shadowed_orb_of_torment ## How long before Combustion should trinkets that trigger a shared category cooldown on other trinkets not be used? # actions.precombat+=/variable,name=on_use_cutoff,value=20,if=variable.combustion_on_use # actions.precombat+=/variable,name=on_use_cutoff,value=25,if=equipped.macabre_sheet_music # actions.precombat+=/variable,name=on_use_cutoff,value=20+variable.empyreal_ordnance_delay,if=equipped.empyreal_ordnance actions.precombat+=/fleshcraft actions.precombat+=/use_item,name=soul_igniter,if=!variable.combustion_on_use&!equipped.dreadfire_vessel&!talent.firestarter actions.precombat+=/use_item,name=shadowed_orb_of_torment actions.precombat+=/mirror_image actions.precombat+=/pyroblast,if=!prev.pyroblast ## Executed every time the actor is available. actions=counterspell,if=!runeforge.disciplinary_command ## Newfound Resolve is something that can't be modeled. ## actions+=/newfound_resolve,use_while_casting=1,if=(buff.combustion.up|buff.sun_kings_blessing_ready.react)&buff.newfound_resolve.down ## The combustion_timing action list schedules when Combustion will be used and stores the result in variable.time_to_combustion. ## actions+=/call_action_list,name=combustion_timing # Variable that estimates whether Shifting Power will be used before Combustion is ready. ## actions+=/variable,name=shifting_power_before_combustion,op=set,value=(active_enemiescooldown.shifting_power.duration)&variable.time_to_combustion-cooldown.shifting_power.remains>action.shifting_power.full_reduction&(cooldown.rune_of_power.remains-cooldown.shifting_power.remains>5|!talent.rune_of_power) actions+=/shifting_power,if=buff.combustion.down&action.fire_blast.charges<=1&!(buff.infernal_cascade.up&buff.hot_streak.react)&variable.shifting_power_before_combustion # Save Radiant Spark for Combustion, but otherwise use it on cooldown. actions+=/radiant_spark,if=buff.combustion.down&(variable.time_to_combustion>cooldown-5) # Deathborne should always be used with Combustion. With Death's Fathom, it should be used early so that Deathborne will have more stacks during Combustion. actions+=/deathborne,if=buff.combustion.down&buff.rune_of_power.down&variable.time_to_combustioncooldown-30*runeforge.sinful_delight # For Venthyr, use a Fire Blast charge during Mirrors of Torment cast to avoid capping charges. actions+=/fire_blast,use_while_casting=1,if=action.mirrors_of_torment.executing&full_recharge_time-action.mirrors_of_torment.execute_remains<4&!hot_streak_spells_in_flight&!buff.hot_streak.up actions+=/use_item,effect_name=gladiators_badge,if=variable.time_to_combustion>cooldown-5 actions+=/use_item,name=empyreal_ordnance,if=variable.time_to_combustion<=variable.empyreal_ordnance_delay&variable.time_to_combustion>variable.empyreal_ordnance_delay-5 actions+=/use_item,name=shadowed_orb_of_torment,if=(variable.time_to_combustion<=variable.combustion_precast_time+2|fight_remains=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=macabre_sheet_music,if=variable.time_to_combustion<=5 # If using a steroid on-use item, always use Dreadfire Vessel outside of Combustion. Otherwise, prioritize using Dreadfire Vessel with Combustion only if Infernal Cascade is enabled and a usage won't be lost over the duration of the fight. This adds a small value to the cooldown of Dreadfire Vessel when doing this calculation because it is unrealstic to assume that it will be used perfectly on cooldown. actions+=/use_item,name=dreadfire_vessel,if=(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0)&(buff.infernal_cascade.stack=buff.infernal_cascade.max_stack|!conduit.infernal_cascade|variable.combustion_on_use|variable.time_to_combustion>interpolated_fight_remains%%(cooldown+10)) ## New Soul Igniter entry, relies on shared item CD information that is not yet supported. Replaces the previous line when functional. actions+=/use_item,name=soul_igniter,if=(variable.time_to_combustion>=30*(variable.on_use_cutoff>0)|(!trinket.1.is.soul_igniter&trinket.1.usable&trinket.1.cooldown.remains|!trinket.2.is.soul_igniter&trinket.2.usable&trinket.2.cooldown.remains))&(!equipped.dreadfire_vessel|cooldown.dreadfire_vessel.remains>5) # Trigger Soul Igniter early with Infernal Cascade or when it was precast. actions+=/cancel_buff,name=soul_ignition,if=!conduit.infernal_cascade&time<5|buff.infernal_cascade.stack=buff.infernal_cascade.max_stack # Items that do not benefit Combustion should just be used outside of Combustion at some point. actions+=/use_item,name=inscrutable_quantum_device,if=equipped.gladiators_badge&(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=flame_of_battle,if=equipped.gladiators_badge&(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=wakeners_frond,if=equipped.gladiators_badge&(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=instructors_divine_bell,if=equipped.gladiators_badge&(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=sunblood_amethyst,if=equipped.gladiators_badge&(buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0) actions+=/use_item,name=scars_of_fraternal_strife,if=buff.scars_of_fraternal_strife_4.down actions+=/use_items,if=buff.combustion.down&variable.time_to_combustion>=variable.on_use_cutoff|variable.on_use_cutoff=0 # Use Frost Nova to trigger Grisly Icicle. actions+=/frost_nova,if=runeforge.grisly_icicle&buff.combustion.down&(variable.time_to_combustion>cooldown|variable.time_to_combustioncooldown.buff_disciplinary_command.duration|variable.time_to_combustion<5) actions+=/arcane_explosion,if=runeforge.disciplinary_command&cooldown.buff_disciplinary_command.ready&buff.disciplinary_command_arcane.down&!buff.disciplinary_command.up&(variable.time_to_combustion+execute_time+action.frostbolt.cast_time>cooldown.buff_disciplinary_command.duration|variable.time_to_combustion<5&!talent.rune_of_power) actions+=/frostbolt,if=runeforge.disciplinary_command&cooldown.buff_disciplinary_command.remainscooldown.buff_disciplinary_command.duration|variable.time_to_combustion<5) actions+=/frost_nova,if=runeforge.disciplinary_command&cooldown.buff_disciplinary_command.ready&buff.disciplinary_command_frost.down&!buff.disciplinary_command.up&(variable.time_to_combustion>cooldown.buff_disciplinary_command.duration|variable.time_to_combustion<5) # Pool as many Fire Blasts as possible for Combustion. Subtract out of the fractional component of the number of Fire Blasts that will naturally recharge during the Combustion phase because pooling anything past that will not grant an extra Fire Blast during Combustion. actions+=/variable,use_off_gcd=1,use_while_casting=1,name=fire_blast_pooling,value=variable.extended_combustion_remains=buff.rune_of_power.duration&variable.time_to_combustion>action.fire_blast.full_recharge_time|variable.time_to_combustion>fight_remains)&(!runeforge.sun_kings_blessing|active_enemies>=variable.hard_cast_flamestrike|buff.sun_kings_blessing_ready.up|buff.sun_kings_blessing.react>=buff.sun_kings_blessing.max_stack-1|fight_remains3*gcd.max,if=!variable.fire_blast_pooling&runeforge.sun_kings_blessing # Variable that controls Phoenix Flames usage to ensure its charges are pooled for Combustion. Only use Phoenix Flames outside of Combustion when full charges can be obtained during the next Combustion. ## actions+=/variable,name=phoenix_pooling,if=active_enemies=variable.combustion_flamestrike,value=variable.time_to_combustion0 # Adjust the variable that controls Fire Blast usage to ensure its charges are also pooled for Rune of Power. actions+=/variable,use_off_gcd=1,use_while_casting=1,name=fire_blast_pooling,value=(!runeforge.sun_kings_blessing|buff.sun_kings_blessing.stack>buff.sun_kings_blessing.max_stack-1)&cooldown.rune_of_power.remains0&active_enemies>=variable.hard_cast_flamestrike&!firestarter.active&!buff.hot_streak.up&(buff.heating_up.up&action.flamestrike.execute_remains<0.5|charges_fractional>=2) # During Firestarter, Fire Blasts are used similarly to during Combustion. Generally, they are used to generate Hot Streaks when crits will not be wasted and with Blaster Master, they should be spread out to maintain the Blaster Master buff. actions+=/fire_blast,use_off_gcd=1,use_while_casting=1,if=firestarter.active&variable.time_to_combustion>0&!variable.fire_blast_pooling&(!action.fireball.executing&!action.pyroblast.in_flight&buff.heating_up.react|action.fireball.executing&!buff.hot_streak.react|action.pyroblast.in_flight&buff.heating_up.react&!buff.hot_streak.react) # Avoid capping Fire Blast charges while channeling Shifting Power actions+=/fire_blast,use_while_casting=1,if=action.shifting_power.executing&full_recharge_time0&buff.rune_of_power.down&buff.combustion.down actions+=/scorch actions.active_talents=living_bomb,if=active_enemies>1&buff.combustion.down&(variable.time_to_combustion>cooldown.living_bomb.duration|variable.time_to_combustion<=0) actions.active_talents+=/meteor,if=variable.time_to_combustion<=0|buff.combustion.remains>travel_time|(cooldown.meteor.durationaction.meteor.cooldown|fight_remainsgcd.remains+1.5*gcd.max*(buff.sun_kings_blessing.max_stack-buff.sun_kings_blessing.stack)) # Other cooldowns that should be used with Combustion should only be used with an actual Combustion cast and not with a Sun King's Blessing proc. actions.combustion_phase+=/call_action_list,name=combustion_cooldowns,strict=1,if=variable.extended_combustion_remains>variable.skb_duration actions.combustion_phase+=/call_action_list,name=active_talents # If Sun King's Blessing stacks are high, cancel them before Combustion so that the Sun King's Blessing proc can be safely delayed until after Combustion without risk of expiration. actions.combustion_phase+=/cancel_buff,name=sun_kings_blessing,if=!set_bonus.tier28_4pc&buff.combustion.down&buff.sun_kings_blessing.stack>2&talent.rune_of_power&cooldown.rune_of_power.remains<20 # If Combustion is down, precast something before activating it. actions.combustion_phase+=/flamestrike,if=buff.combustion.down&cooldown.combustion.remains=variable.combustion_flamestrike actions.combustion_phase+=/pyroblast,if=buff.combustion.down&buff.sun_kings_blessing_ready.up&buff.sun_kings_blessing_ready.remains>cast_time actions.combustion_phase+=/pyroblast,if=buff.combustion.down&buff.pyroclasm.react&buff.pyroclasm.remains>cast_time actions.combustion_phase+=/fireball,if=buff.combustion.down&cooldown.combustion.remainsvariable.skb_duration # Without Infernal Cascade, just use Fire Blasts when they won't munch crits and when Firestorm is down. actions.combustion_phase+=/fire_blast,use_off_gcd=1,use_while_casting=1,if=!conduit.infernal_cascade&!variable.fire_blast_pooling&(!set_bonus.tier28_4pc|debuff.mirrors_of_torment.down|buff.sun_kings_blessing_ready.down|action.pyroblast.executing)&buff.combustion.up&!buff.firestorm.react&!buff.hot_streak.react&hot_streak_spells_in_flight+buff.heating_up.react*(gcd.remains>0)<2 # With Infernal Cascade, Fire Blast use should be additionally constrained so that it is not be used unless Infernal Cascade is about to expire or there are more than enough Fire Blasts to extend Infernal Cascade to the end of Combustion. ## actions.combustion_phase+=/variable,use_off_gcd=1,use_while_casting=1,name=expected_fire_blasts,op=set,value=action.fire_blast.charges_fractional+(variable.extended_combustion_remains-buff.infernal_cascade.duration)%cooldown.fire_blast.duration,if=conduit.infernal_cascade ## actions.combustion_phase+=/variable,use_off_gcd=1,use_while_casting=1,name=needed_fire_blasts,op=set,value=ceil(variable.extended_combustion_remains%(buff.infernal_cascade.duration-gcd.max)),if=conduit.infernal_cascade # Use Shifting Power during Combustion when there are not enough Fire Blasts available to fully extend infernal cascade and only when Rune of Power is on cooldown. actions.combustion_phase+=/variable,use_off_gcd=1,use_while_casting=1,name=use_shifting_power,value=firestarter.remainsvariable.extended_combustion_remains)|active_enemies>=variable.combustion_shifting_power,if=covenant.night_fae actions.combustion_phase+=/fire_blast,use_off_gcd=1,use_while_casting=1,if=conduit.infernal_cascade&!variable.fire_blast_pooling&(!set_bonus.tier28_4pc|debuff.mirrors_of_torment.down|buff.sun_kings_blessing_ready.down|action.pyroblast.executing)&(variable.expected_fire_blasts>=variable.needed_fire_blasts|buff.combustion.remains0)<2 # Spend Hot Streaks during Combustion at high priority. actions.combustion_phase+=/flamestrike,if=(buff.hot_streak.up&active_enemies>=variable.combustion_flamestrike)|(buff.firestorm.up&active_enemies>=variable.combustion_flamestrike-runeforge.firestorm) # Radiant Spark should be used with a Hot Streak ready to use immediately after the cast finishes. This will naturally set up a Hot Streak spent for the final stack of Radiant Spark. actions.combustion_phase+=/radiant_spark,if=buff.combustion.up&2*buff.hot_streak.react+buff.heating_up.react+hot_streak_spells_in_flight=2 actions.combustion_phase+=/pyroblast,if=buff.firestorm.up actions.combustion_phase+=/pyroblast,if=buff.hot_streak.up&buff.combustion.up actions.combustion_phase+=/pyroblast,if=prev_gcd.1.scorch&buff.heating_up.up&active_enemiesexecute_time+action.flamestrike.cast_time&buff.rune_of_power.remains=variable.combustion_flamestrike actions.combustion_phase+=/flamestrike,if=buff.sun_kings_blessing_ready.up&buff.sun_kings_blessing_ready.remains>cast_time&active_enemies>=variable.combustion_flamestrike actions.combustion_phase+=/rune_of_power,if=buff.sun_kings_blessing_ready.up&buff.sun_kings_blessing_ready.remains>execute_time+action.pyroblast.cast_time&buff.rune_of_power.remainscast_time # Pyroclasm procs should be used in Combustion at higher priority than Phoenix Flames and Scorch. actions.combustion_phase+=/pyroblast,if=buff.pyroclasm.react&buff.pyroclasm.remains>cast_time&buff.combustion.remains>cast_time&active_enemiesexecute_time|buff.heating_up.react+hot_streak_spells_in_flight<2) # Use Phoenix Flames and Scorch in Combustion to help generate Hot Streaks when Fire Blasts are not available or need to be conserved. actions.combustion_phase+=/phoenix_flames,if=buff.combustion.up&travel_timecast_time # If there isn't enough time left in Combustion for a Phoenix Flames or Scorch to hit inside of Combustion, use something else. actions.combustion_phase+=/living_bomb,if=buff.combustion.remains1 actions.combustion_phase+=/dragons_breath,if=buff.combustion.remains=variable.combustion_flamestrike)-variable.combustion_cast_remains ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,value=variable.combustion_ready_time ## Delay Combustion for after Firestarter unless variable.firestarter_combustion is set. ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,op=max,value=firestarter.remains,if=talent.firestarter&!variable.firestarter_combustion ## Delay Combustion for Radiant Spark if it will come off cooldown soon. ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,op=max,value=cooldown.radiant_spark.remains,if=covenant.kyrian&cooldown.radiant_spark.remains-10=2 ## Delay Combustion for the Empyreal Ordnance buff if the player is using that trinket. ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,op=max,value=variable.empyreal_ordnance_delay-(cooldown.empyreal_ordnance.duration-cooldown.empyreal_ordnance.remains)*!cooldown.empyreal_ordnance.ready,if=equipped.empyreal_ordnance ## Delay Combustion for Gladiators Badge, unless it would be delayed longer than 20 seconds. ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,op=max,value=cooldown.gladiators_badge_345228.remains,if=equipped.gladiators_badge&cooldown.gladiators_badge_345228.remains-20=3&raid_event.adds.duration>15 ## Raid Events: Always use Combustion with vulnerability raid events, override any delays listed above to make sure it gets used here. ## actions.combustion_timing+=/variable,use_off_gcd=1,use_while_casting=1,name=time_to_combustion,value=raid_event.vulnerable.in*!raid_event.vulnerable.up,if=raid_event.vulnerable.exists&variable.combustion_ready_timefight_remains-20 actions.rop_phase=flamestrike,if=active_enemies>=variable.hot_streak_flamestrike&(buff.hot_streak.up|buff.firestorm.up) actions.rop_phase+=/fireball,if=buff.deathborne.up&runeforge.deaths_fathom&variable.time_to_combustion=2 actions.rop_phase+=/flamestrike,if=active_enemies>=variable.hard_cast_flamestrike&buff.sun_kings_blessing_ready.up&buff.sun_kings_blessing_ready.remains>cast_time actions.rop_phase+=/pyroblast,if=buff.sun_kings_blessing_ready.up&buff.sun_kings_blessing_ready.remains>cast_time actions.rop_phase+=/pyroblast,if=buff.firestorm.up actions.rop_phase+=/pyroblast,if=buff.hot_streak.up # Use one Fire Blast early in RoP if you don't have either Heating Up or Hot Streak yet and either: (a) have more than two already, (b) have Alexstrasza's Fury ready to use, or (c) Searing Touch is active. Don't do this while hard casting Flamestrikes or when Sun King's Blessing is ready. actions.rop_phase+=/fire_blast,use_off_gcd=1,use_while_casting=1,if=!variable.fire_blast_pooling&buff.sun_kings_blessing_ready.down&active_enemies=2|(talent.alexstraszas_fury&cooldown.dragons_breath.ready)|searing_touch.active)) # Use Fire Blast either during a Fireball/Pyroblast cast when Heating Up is active or during execute with Searing Touch. actions.rop_phase+=/fire_blast,use_off_gcd=1,use_while_casting=1,if=!variable.fire_blast_pooling&!firestarter.active&buff.sun_kings_blessing_ready.down&(((action.fireball.executing&(action.fireball.execute_remains<0.5|!runeforge.firestorm)|action.pyroblast.executing&(action.pyroblast.execute_remains<0.5|!runeforge.firestorm))&buff.heating_up.react)|(searing_touch.active&(buff.heating_up.react&!action.scorch.executing|!buff.hot_streak.react&!buff.heating_up.react&action.scorch.executing&!hot_streak_spells_in_flight))) actions.rop_phase+=/call_action_list,name=active_talents actions.rop_phase+=/pyroblast,if=buff.pyroclasm.react&cast_time=variable.hard_cast_flamestrike|active_enemies>=variable.hot_streak_flamestrike) actions.rop_phase+=/scorch,if=searing_touch.active actions.rop_phase+=/dragons_breath,if=active_enemies>2 actions.rop_phase+=/arcane_explosion,if=active_enemies>=variable.arcane_explosion&mana.pct>=variable.arcane_explosion_mana&target.within10 # With enough targets, it is a gain to cast Flamestrike as filler instead of Fireball. actions.rop_phase+=/flamestrike,if=active_enemies>=variable.hard_cast_flamestrike actions.rop_phase+=/fireball actions.standard_rotation=flamestrike,if=active_enemies>=variable.hot_streak_flamestrike&(buff.hot_streak.up|buff.firestorm.up) actions.standard_rotation+=/fireball,if=buff.deathborne.up&runeforge.deaths_fathom&variable.time_to_combustion=2 actions.standard_rotation+=/pyroblast,if=buff.firestorm.up actions.standard_rotation+=/pyroblast,if=buff.hot_streak.up&buff.hot_streak.remains=variable.hard_cast_flamestrike&buff.sun_kings_blessing_ready.up&(cooldown.rune_of_power.remains+action.rune_of_power.execute_time+cast_time>buff.sun_kings_blessing_ready.remains|!talent.rune_of_power)&variable.time_to_combustion+cast_time>buff.sun_kings_blessing_ready.remains actions.standard_rotation+=/pyroblast,if=buff.hot_streak.up&searing_touch.active actions.standard_rotation+=/pyroblast,if=buff.pyroclasm.react&cast_time1)&(active_dot.ignite<2|active_enemies>=variable.hard_cast_flamestrike|active_enemies>=variable.hot_streak_flamestrike) actions.standard_rotation+=/call_action_list,name=active_talents actions.standard_rotation+=/dragons_breath,if=active_enemies>1 actions.standard_rotation+=/scorch,if=searing_touch.active actions.standard_rotation+=/arcane_explosion,if=active_enemies>=variable.arcane_explosion&mana.pct>=variable.arcane_explosion_mana&target.within10 # With enough targets, it is a gain to cast Flamestrike as filler instead of Fireball. actions.standard_rotation+=/flamestrike,if=active_enemies>=variable.hard_cast_flamestrike actions.standard_rotation+=/fireball