diff --git a/engine/class_modules/apl/mage.cpp b/engine/class_modules/apl/mage.cpp index 24704dfbd1f..23700ca7bea 100644 --- a/engine/class_modules/apl/mage.cpp +++ b/engine/class_modules/apl/mage.cpp @@ -139,93 +139,94 @@ void fire( player_t* p ) action_priority_list_t* default_ = p->get_action_priority_list( "default" ); action_priority_list_t* precombat = p->get_action_priority_list( "precombat" ); action_priority_list_t* cds = p->get_action_priority_list( "cds" ); + action_priority_list_t* fireblast = p->get_action_priority_list( "fireblast" ); action_priority_list_t* ff_combustion = p->get_action_priority_list( "ff_combustion" ); action_priority_list_t* ff_filler = p->get_action_priority_list( "ff_filler" ); - action_priority_list_t* fireblast = p->get_action_priority_list( "fireblast" ); action_priority_list_t* sf_combustion = p->get_action_priority_list( "sf_combustion" ); action_priority_list_t* sf_filler = p->get_action_priority_list( "sf_filler" ); precombat->add_action( "arcane_intellect" ); precombat->add_action( "variable,name=cast_remains_time,value=0.2" ); precombat->add_action( "variable,name=pooling_time,value=10*gcd.max" ); - precombat->add_action( "variable,name=ff_combustion_flamestrike,if=!talent.spellfire_spheres,value=3" ); - precombat->add_action( "variable,name=ff_filler_flamestrike,if=!talent.spellfire_spheres,value=3" ); - precombat->add_action( "variable,name=sf_combustion_flamestrike,if=talent.spellfire_spheres,value=3" ); - precombat->add_action( "variable,name=sf_filler_flamestrike,if=talent.spellfire_spheres,value=3" ); - precombat->add_action( "variable,name=firestarter_delay,if=talent.firestarter,value=18" ); + precombat->add_action( "variable,name=ff_combustion_flamestrike,if=!talent.spellfire_spheres,value=5", "Do on 4 targets if you dont care about prio" ); + precombat->add_action( "variable,name=ff_filler_flamestrike,if=!talent.spellfire_spheres,value=999", "Do on 5 targets if you dont care about prio but this is so close its basically not even worth even if you dont care about prio" ); + precombat->add_action( "variable,name=sf_combustion_flamestrike,if=talent.spellfire_spheres,value=4+(999*!talent.fuel_the_fire)", "Do on 3 targets if you dont care about prio a lot (+5% AoE -10% Prio)" ); + precombat->add_action( "variable,name=sf_filler_flamestrike,if=talent.spellfire_spheres,value=5+(999*!talent.fuel_the_fire)", "Do on 4 targets if you dont care about prio a lot (+4% AoE -10% prio)" ); + precombat->add_action( "variable,name=combustion_delay,value=10+(8*talent.firestarter)-(10*(!talent.firestarter&talent.sunfury_execution))-(10*(expected_combat_length<60)+10*(expected_combat_length<30))", "Delay combustion to stack up buffs for almost all builds. Only exception is SunfuryExecution when NOT firestarter." ); precombat->add_action( "variable,name=15ssteroid_trinket_equipped,op=set,value=equipped.nevermelting_ice_crystal|equipped.lily_of_the_eternal_weave|equipped.sunblood_amethyst|equipped.astral_gladiators_badge_of_ferocity|equipped.arazs_ritual_forge|equipped.freightrunners_flask|equipped.emberwing_feather|equipped.vaelgors_final_stare|equipped.galactic_gladiators_badge_of_ferocity" ); precombat->add_action( "variable,name=10ssteroid_trinket_equipped,op=set,value=equipped.ever_collapsing_void_fissure" ); precombat->add_action( "snapshot_stats" ); precombat->add_action( "mirror_image" ); - precombat->add_action( "frostfire_bolt,if=talent.frostfire_bolt" ); + precombat->add_action( "frostfire_bolt,if=talent.frostfire_bolt", "Precast one of these" ); + precombat->add_action( "meteor,if=!talent.firestarter&talent.sunfury_execution" ); precombat->add_action( "pyroblast" ); default_->add_action( "call_action_list,name=cds" ); - default_->add_action( "run_action_list,name=ff_combustion,if=talent.frostfire_bolt&((!talent.firestarter|time>=variable.firestarter_delay)&(cooldown.combustion.remains<=variable.combustion_precast_time|buff.combustion.up|cooldown.combustion.ready))" ); - default_->add_action( "run_action_list,name=sf_combustion,if=!talent.frostfire_bolt&((!talent.firestarter|time>=variable.firestarter_delay)&(cooldown.combustion.remains<=variable.combustion_precast_time|buff.combustion.up|cooldown.combustion.ready))" ); + default_->add_action( "run_action_list,name=ff_combustion,if=talent.frostfire_bolt&((time>=variable.combustion_delay)&(cooldown.combustion.remains<=variable.combustion_precast_time|buff.combustion.up|cooldown.combustion.ready))", "Combustion Delayed on pull by 10 seconds for most non-firestarter, and 18 seconds for all firestarter." ); + default_->add_action( "run_action_list,name=sf_combustion,if=!talent.frostfire_bolt&((time>=variable.combustion_delay)&(cooldown.combustion.remains<=variable.combustion_precast_time|buff.combustion.up|cooldown.combustion.ready))" ); default_->add_action( "run_action_list,name=ff_filler,if=talent.frostfire_bolt" ); default_->add_action( "run_action_list,name=sf_filler" ); cds->add_action( "variable,name=combustion_precast_time,value=(action.scorch.cast_time*!buff.pyroclasm.up*scorch_execute.active)+(action.fireball.cast_time*!buff.pyroclasm.up*!scorch_execute.active)+(action.pyroblast.cast_time*buff.pyroclasm.up)-variable.cast_remains_time" ); - cds->add_action( "potion,if=time>=(0+(4*(variable.firestarter_delay&talent.spellfire_spheres)+4*(talent.savor_the_moment)))|buff.combustion.remains>6|fight_remains<35" ); - cds->add_action( "use_items,if=buff.combustion.remains>6|cooldown.combustion.remains<3&time>=variable.firestarter_delay-2&talent.frostfire_bolt&variable.15ssteroid_trinket_equipped|fight_remains<20" ); + cds->add_action( "potion,if=time>=(0+(4*(talent.firestarter&talent.spellfire_spheres)+4*(talent.savor_the_moment)+4*(talent.pyroclasm&talent.firestarter&talent.spellfire_spheres)))|buff.combustion.remains>6|fight_remains<35", "Use Potion on pull. Delay by 4 seconds for each of these that are true: [Firestarter Sunfury] [Savor] [Pyroclasm+Firestarter+Sunfury]. Goal is to make pot last all of CDs." ); + cds->add_action( "use_items,if=buff.combustion.remains>6|cooldown.combustion.remains<3&time>=variable.combustion_delay-2&talent.frostfire_bolt&variable.15ssteroid_trinket_equipped|fight_remains<20", "Note for future: check if the 10 second trinkets are actually worse with this line or if we can remove the conditional variables" ); cds->add_action( "ancestral_call,if=buff.combustion.remains>6|fight_remains<20" ); cds->add_action( "berserking,if=buff.combustion.remains>6|fight_remains<20" ); cds->add_action( "blood_fury,if=buff.combustion.remains>6|fight_remains<20" ); cds->add_action( "fireblood,if=buff.combustion.remains>6|fight_remains<10" ); cds->add_action( "invoke_external_buff,name=power_infusion,if=buff.power_infusion.down&(buff.combustion.remains>6|fight_remains<25)" ); + fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(buff.combustion.up|buff.hyperthermia.up)&(hot_streak_spells_in_flight+buff.heating_up.react=1)&gcd.remainsadd_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(action.fireball.executing&action.fireball.execute_remains>0.1|buff.pyroclasm.react&action.pyroblast.executing&action.pyroblast.execute_remains>0.1)&((target.health.pct>=30|!talent.scorch)&buff.heating_up.react)&(hot_streak_spells_in_flight+buff.heating_up.react=1)&gcd.remainsadd_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(target.health.pct<30&talent.scorch)&(hot_streak_spells_in_flight+buff.heating_up.react=0)&action.scorch.executing&buff.heat_shimmer.down&gcd.remainsadd_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&timeadd_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&(time>=variable.combustion_delay&(cooldown.combustion.remains<=variable.combustion_precast_time))&buff.combustion.down&talent.spontaneous_combustion&(action.scorch.executing|action.fireball.executing|action.pyroblast.executing|action.flamestrike.executing)", "When talented into Spontaneous Combustion, spend all Fire Blasts during the pre-cast going into Combustion regardless of Heating Up / Hot Streak status." ); + fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=fight_remains<1", "Spend all available Fire Blasts if fight is ending." ); + ff_combustion->add_action( "combustion,use_off_gcd=1,use_while_casting=1,if=buff.combustion.down&action.fireball.executing&(action.fireball.execute_remainsadd_action( "flamestrike,if=buff.pyroclasm.up&!buff.hot_streak.react&buff.combustion.down&active_enemies>=variable.ff_combustion_flamestrike" ); + ff_combustion->add_action( "flamestrike,if=active_enemies>=variable.ff_combustion_flamestrike&(buff.pyroclasm.up&!buff.hot_streak.react&buff.combustion.down)", "Precast into Combustion. Prioritize Pyroclasm if available." ); ff_combustion->add_action( "pyroblast,if=buff.pyroclasm.up&!buff.hot_streak.react&buff.combustion.down" ); ff_combustion->add_action( "fireball,if=buff.combustion.down" ); - ff_combustion->add_action( "meteor,if=(talent.burnout&buff.combustion.remains<8)|(!talent.burnout&buff.combustion.remains>2)" ); - ff_combustion->add_action( "flamestrike,if=buff.hot_streak.react&active_enemies>=variable.ff_combustion_flamestrike" ); + ff_combustion->add_action( "meteor,if=(talent.burnout&buff.combustion.remains<8)|(!talent.burnout&buff.combustion.remains>2)", "Meteor is used towards the end of Combustion to maximize the Ignite bank for Burnout. If not playing Burnout, just make sure the Meteor lands during Combustion at any time." ); + ff_combustion->add_action( "flamestrike,if=active_enemies>=variable.ff_combustion_flamestrike&(buff.hot_streak.react)", "Spend Hot Streaks on Pyroblast in ST or Flamestrike in AoE." ); ff_combustion->add_action( "pyroblast,if=buff.hot_streak.react" ); - ff_combustion->add_action( "flamestrike,if=buff.pyroclasm.up&cast_time=variable.ff_combustion_flamestrike" ); + ff_combustion->add_action( "flamestrike,if=active_enemies>=variable.ff_combustion_flamestrike&(buff.pyroclasm.up&cast_timeadd_action( "pyroblast,if=buff.pyroclasm.up&cast_timeadd_action( "scorch,if=buff.heat_shimmer.react" ); + ff_combustion->add_action( "scorch,if=buff.heat_shimmer.react|talent.scald&target.health.pct<30&buff.frostfire_empowerment.down" ); ff_combustion->add_action( "fireball" ); ff_combustion->add_action( "call_action_list,name=fireblast" ); - ff_filler->add_action( "meteor,if=!talent.firestarter|time>=variable.firestarter_delay" ); - ff_filler->add_action( "flamestrike,if=active_enemies>=variable.ff_filler_flamestrike&(buff.hot_streak.react)" ); - ff_filler->add_action( "flamestrike,if=active_enemies>=variable.ff_filler_flamestrike&(buff.pyroclasm.up&cooldown.combustion.remains>12|buff.pyroclasm.stack=2)" ); - ff_filler->add_action( "pyroblast,if=buff.hot_streak.react&(cooldown.combustion.remains>=5|timeadd_action( "meteor,if=time>=variable.combustion_delay", "Cast Meteor on CD in filler except when intentionally delaying Combustion" ); + ff_filler->add_action( "pyroblast,if=buff.hot_streak.up&talent.firestarter&timeadd_action( "flamestrike,if=active_enemies>=variable.ff_filler_flamestrike&(buff.hot_streak.react&(cooldown.combustion.remains>=5|timeadd_action( "pyroblast,if=buff.hot_streak.react&(cooldown.combustion.remains>=5|timeadd_action( "flamestrike,if=active_enemies>=variable.ff_filler_flamestrike&(buff.pyroclasm.up&cooldown.combustion.remains>12|buff.pyroclasm.stack=2)", "Spend Pyroclasm immediately if you have 2 stacks available. Otherwise, hold one stack if it lasts until Combustion comes up." ); ff_filler->add_action( "pyroblast,if=buff.pyroclasm.up&cooldown.combustion.remains>12|buff.pyroclasm.stack=2" ); - ff_filler->add_action( "scorch,if=buff.heat_shimmer.react|talent.scald&target.health.pct<30&buff.frostfire_empowerment.down" ); + ff_filler->add_action( "scorch,if=buff.heat_shimmer.react" ); ff_filler->add_action( "fireball" ); ff_filler->add_action( "call_action_list,name=fireblast" ); - fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(target.health.pct>=30|buff.combustion.up|buff.hyperthermia.up|!talent.scorch)&(hot_streak_spells_in_flight+buff.heating_up.react=1)&gcd.remains(variable.pooling_time-(8*talent.spontaneous_combustion.rank))" ); - fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(target.health.pct<30&talent.scorch)&(hot_streak_spells_in_flight+buff.heating_up.react=0)&action.scorch.executing&buff.heat_shimmer.down&gcd.remains(variable.pooling_time-(8*talent.spontaneous_combustion.rank))" ); - fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&(target.health.pct<30&talent.scorch)&(hot_streak_spells_in_flight=0&buff.heating_up.react)&prev_gcd.1.pyroblast&buff.heat_shimmer.down&gcd.remains(variable.pooling_time-(8*talent.spontaneous_combustion.rank))" ); - fireblast->add_action( "fire_blast,use_off_gcd=1,use_while_casting=1,if=cooldown_react&!buff.hot_streak.react&talent.firestarter&(hot_streak_spells_in_flight+buff.heating_up.react=1)&gcd.remainsadd_action( "combustion,use_off_gcd=1,use_while_casting=1,if=action.scorch.executing&(action.scorch.execute_remainsadd_action( "flamestrike,if=buff.combustion.down&!buff.hot_streak.react&buff.pyroclasm.up&active_enemies>=variable.sf_combustion_flamestrike" ); - sf_combustion->add_action( "pyroblast,if=buff.combustion.down&!buff.hot_streak.react&buff.pyroclasm.up" ); - sf_combustion->add_action( "scorch,if=buff.combustion.down&scorch_execute.active" ); + sf_combustion->add_action( "flamestrike,if=active_enemies>=variable.sf_combustion_flamestrike&(buff.combustion.down&!buff.hot_streak.react&buff.pyroclasm.up)" ); + sf_combustion->add_action( "pyroblast,if=buff.combustion.down&!buff.hot_streak.react&buff.pyroclasm.up", "Precast into Combustion. Prioritize Pyroclasm if available." ); + sf_combustion->add_action( "scorch,if=buff.combustion.down&target.health.pct<30" ); sf_combustion->add_action( "fireball,if=buff.combustion.down" ); - sf_combustion->add_action( "meteor,if=(talent.burnout&buff.combustion.remains<8)|(!talent.burnout&buff.combustion.remains>2)" ); - sf_combustion->add_action( "flamestrike,if=(buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react|(buff.pyroclasm.up&cooldown.combustion.remains>12)|buff.pyroclasm.stack>1)&active_enemies>=variable.sf_combustion_flamestrike" ); - sf_combustion->add_action( "flamestrike,if=buff.pyroclasm.up&!buff.hot_streak.up&cast_time=variable.sf_combustion_flamestrike" ); + sf_combustion->add_action( "meteor,if=(talent.burnout&buff.combustion.remains<8)|(!talent.burnout&buff.combustion.remains>2)", "Meteor is used towards the end of Combustion to maximize the Ignite bank for Burnout. If not playing Burnout, just make sure the Meteor lands during Combustion at any time." ); + sf_combustion->add_action( "flamestrike,if=active_enemies>=variable.sf_combustion_flamestrike&(buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2)", "Spend Hot Streaks on Pyroblast in ST or Flamestrike in AoE. The Scorch condition is simply to simulate predictable guaranteed crits during Combustion." ); sf_combustion->add_action( "pyroblast,if=buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2" ); + sf_combustion->add_action( "flamestrike,if=active_enemies>=variable.sf_combustion_flamestrike&(buff.pyroclasm.up&!buff.hot_streak.up&cast_timeadd_action( "pyroblast,if=buff.pyroclasm.up&!buff.hot_streak.up&cast_timeadd_action( "scorch,if=scorch_execute.active|buff.heat_shimmer.react" ); - sf_combustion->add_action( "fireball,if=!talent.scorch" ); sf_combustion->add_action( "scorch" ); - sf_combustion->add_action( "call_action_list,name=fireblast" ); - - sf_filler->add_action( "flamestrike,if=active_enemies>=variable.sf_filler_flamestrike&(buff.hyperthermia.up)" ); - sf_filler->add_action( "flamestrike,if=active_enemies>=variable.sf_filler_flamestrike&(buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2)" ); - sf_filler->add_action( "flamestrike,if=active_enemies>=variable.sf_filler_flamestrike&(buff.pyroclasm.up&cooldown.combustion.remains>12|buff.pyroclasm.stack=2)" ); - sf_filler->add_action( "pyroblast,if=buff.hyperthermia.up" ); - sf_filler->add_action( "pyroblast,if=buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2" ); - sf_filler->add_action( "pyroblast,if=buff.pyroclasm.up&cooldown.combustion.remains>=(12-(12*variable.firestarter_delay))|buff.pyroclasm.stack=2" ); - sf_filler->add_action( "meteor,if=talent.blast_zone&(!talent.firestarter|time>variable.firestarter_delay|buff.combustion.up)" ); - sf_filler->add_action( "meteor,if=!talent.blast_zone&talent.sunfury_execution&cooldown.combustion.remains<12&buff.pyroclasm.stack<2" ); - sf_filler->add_action( "scorch,if=buff.heat_shimmer.react|talent.scald&target.health.pct<30" ); + sf_combustion->add_action( "fireball" ); + sf_combustion->add_action( "call_action_list,name=fireblast,if=!talent.pyroclasm|(buff.pyroclasm.stack<2|action.pyroblast.executing&action.pyroblast.execute_remains>0.2&buff.pyroclasm.stack=2|cooldown.fire_blast.charges_fractional>=2|buff.combustion.remainsadd_action( "pyroblast,if=buff.hot_streak.up&talent.firestarter&timeadd_action( "flamestrike,if=active_enemies>=variable.sf_filler_flamestrike&(buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2|buff.hyperthermia.up)", "Spend Hot Streaks on Pyroblast in ST or Flamestrike in AoE. The Scorch condition is simply to simulate predictable guaranteed crits during execute." ); + sf_filler->add_action( "pyroblast,if=buff.hot_streak.react|prev_gcd.1.scorch&buff.heating_up.react&time-action.scorch.last_used<0.2|buff.hyperthermia.up" ); + sf_filler->add_action( "flamestrike,if=active_enemies>=variable.sf_filler_flamestrike&(buff.pyroclasm.up&(cooldown.combustion.remains>=12|timeadd_action( "pyroblast,if=buff.pyroclasm.up&(cooldown.combustion.remains>=12|timeadd_action( "meteor,if=(!talent.blast_zone&talent.sunfury_execution&cooldown.combustion.remains<12&buff.pyroclasm.stack<2)|(talent.blast_zone&time>variable.combustion_delay)", "Meteor is used on CD with Blast Zone starting from the first Combustion. Without Blast Zone, it's used either purely during Combustion or within 12 seconds before if talented into Sunfury Execution." ); + sf_filler->add_action( "scorch,if=buff.heat_shimmer.react|talent.scald&target.health.pct<30", "Cast Scorch in execute or with a Heat Shimmer proc." ); sf_filler->add_action( "fireball" ); sf_filler->add_action( "call_action_list,name=fireblast" ); }