diff --git a/engine/class_modules/apl/apl_evoker.cpp b/engine/class_modules/apl/apl_evoker.cpp index a0a1ce8887b..6ff6cc98eb7 100644 --- a/engine/class_modules/apl/apl_evoker.cpp +++ b/engine/class_modules/apl/apl_evoker.cpp @@ -78,11 +78,12 @@ void devastation( player_t* p ) precombat->add_action( "hover,if=talent.slipstream" ); precombat->add_action( "living_flame" ); - default_->add_action( "potion,if=(!talent.dragonrage|buff.dragonrage.up)|fight_remains<35" ); + default_->add_action( "potion,if=!talent.dragonrage|buff.dragonrage.up|fight_remains<35" ); default_->add_action( "variable,name=next_dragonrage,value=cooldown.dragonrage.remains?(cooldown.fire_breath.remains-8))" ); default_->add_action( "invoke_external_buff,name=power_infusion,if=buff.dragonrage.up|fight_remains<35" ); default_->add_action( "variable,name=can_use_empower,op=set,value=cooldown.dragonrage.remains>=gcd.max*variable.dr_prep_time,if=talent.animosity&talent.dragonrage" ); default_->add_action( "variable,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))" ); + default_->add_action( "variable,name=cb_ready,op=set,value=(active_enemies>=4|active_enemies>=3&talent.volatility.rank=2)&talent.charged_blast&buff.charged_blast.stack>=15" ); default_->add_action( "variable,name=use_tts,op=set,value=(cooldown.eternity_surge.remains<=action.fire_breath.usable_in),if=talent.legacy_of_the_lifebinder" ); default_->add_action( "quell,use_off_gcd=1,if=target.debuff.casting.react" ); default_->add_action( "call_action_list,name=trinkets" ); @@ -90,19 +91,23 @@ void devastation( player_t* p ) default_->add_action( "run_action_list,name=fs" ); sc->add_action( "deep_breath,if=buff.strafing_run.remains<=gcd.max*2,cancel_if=gcd.remains<=0", "SC Action List. Use Deep Breath to optimise for Strafing Run" ); - sc->add_action( "dragonrage,if=target.time_to_die>=30&raid_event.adds.in>=60|!raid_event.adds.exists|raid_event.adds.in=0" ); + sc->add_action( "dragonrage,if=target.time_to_die>=30&raid_event.adds.in>=60|!raid_event.adds.exists|raid_event.adds.in=0|talent.rising_fury_4&fight_remains<=50|fight_remains<=20" ); sc->add_action( "hover,use_off_gcd=1,if=raid_event.movement.in<6&!buff.hover.up&gcd.remains>=0.5|talent.slipstream&gcd.remains>=0.5" ); sc->add_action( "azure_sweep,if=(buff.essence_burst.down|!buff.essence_burst.at_max_stacks)&set_bonus.mid1_2pc&cooldown.eternity_surge.remains<=6", "Use 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." ); sc->add_action( "call_action_list,name=es", "Swell Gaming with EoI is good, With EH its bad" ); sc->add_action( "tip_the_scales,use_off_gcd=1,if=action.fire_breath.ready" ); sc->add_action( "call_action_list,name=fb_sc" ); sc->add_action( "deep_breath,if=active_enemies>=2,cancel_if=gcd.remains=0", "Using DB whenever is neutral at 2T and a gain above" ); - sc->add_action( "disintegrate,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" ); - sc->add_action( "pyre,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" ); - sc->add_action( "disintegrate,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" ); + sc->add_action( "unbound_flame,if=!buff.essence_burst.at_max_stacks&buff.unbound_flame.remains<=(buff.unbound_flame.stack+3)*gcd.max*2" ); + sc->add_action( "unbound_flame,if=!buff.essence_burst.up&active_enemies>2&buff.mass_disintegrate_stacks.up" ); + sc->add_action( "disintegrate,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|!variable.cb_ready)", "Dedicated Mass Disintegrate" ); + sc->add_action( "pyre,target_if=max:target.health.pct,if=active_enemies>=5|active_enemies>=4&talent.volatility.rank=2|variable.cb_ready" ); + sc->add_action( "disintegrate,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", "Dedicated Normal Disintegrate" ); + sc->add_action( "azure_sweep,if=active_enemies>3&!buff.essence_burst.at_max_stacks&!buff.iridescence_blue.up" ); sc->add_action( "living_flame,if=buff.burnout.up&buff.leaping_flames.up&active_enemies<=1+buff.leaping_flames.stack" ); sc->add_action( "unbound_flame,if=!buff.essence_burst.at_max_stacks" ); sc->add_action( "azure_sweep" ); + sc->add_action( "azure_strike,if=!talent.ruby_embers&!talent.engulfing_blaze&active_enemies>=2" ); sc->add_action( "living_flame,if=raid_event.movement.in>execute_time|buff.hover.up" ); sc->add_action( "call_action_list,name=green,if=talent.ancient_flame&!buff.ancient_flame.up&talent.scarlet_adaptation&!buff.dragonrage.up" ); sc->add_action( "azure_strike" ); @@ -111,7 +116,7 @@ void devastation( player_t* p ) fs->add_action( "dragonrage,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" ); fs->add_action( "hover,use_off_gcd=1,if=raid_event.movement.in<6&!buff.hover.up&gcd.remains>=0.5&!variable.use_pyre_fs" ); fs->add_action( "tip_the_scales,use_off_gcd=1,if=buff.dragonrage.up&variable.use_tts" ); - fs->add_action( "call_action_list,name=es,if=variable.can_use_empower|buff.tip_the_scales.up", "Target Match with ES (Hitting everything is priority over lower ranks)" ); + fs->add_action( "eternity_surge,empower_to=1,target_if=max:target.health.pct,if=target.time_to_die>duration&(variable.can_use_empower|buff.tip_the_scales.up)", "Upranking is just not worth it for FS (might be when playing salvo but playing salvo on FS is unrealistic in the first place)" ); fs->add_action( "call_action_list,name=fb_fs,if=variable.can_use_empower&dot.fire_breath_damage.refreshable&!buff.tip_the_scales.up", "Upranking in 2-3T is back on the menu boys" ); fs->add_action( "pyre,target_if=max:target.health.pct,if=variable.use_pyre_fs" ); fs->add_action( "disintegrate,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" ); @@ -119,29 +124,30 @@ void devastation( player_t* p ) fs->add_action( "unbound_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)", "Aim at the ones that are burning" ); fs->add_action( "living_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" ); fs->add_action( "azure_sweep", "Sweep is worse than LF with procs" ); + fs->add_action( "azure_strike,if=!talent.ruby_embers&!talent.engulfing_blaze&active_enemies>=2" ); fs->add_action( "living_flame,if=raid_event.movement.in>execute_time" ); fs->add_action( "call_action_list,name=green,if=talent.ancient_flame&!buff.ancient_flame.up&talent.scarlet_adaptation&!buff.dragonrage.up&active_enemies<4" ); fs->add_action( "azure_strike" ); - es->add_action( "eternity_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", "Pick optimal Eternity Surge Rank" ); - es->add_action( "eternity_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" ); - es->add_action( "eternity_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" ); - es->add_action( "eternity_surge,empower_to=1,target_if=max:target.health.pct" ); + es->add_action( "eternity_surge,empower_to=4,target_if=max:target.health.pct,if=((active_enemies>=4+4*talent.eternitys_span)&(active_enemies<=6+4*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=4+3*talent.eternitys_span-talent.star_salvo)&talent.star_salvo)&target.time_to_die>duration", "Pick optimal Eternity Surge Rank" ); + es->add_action( "eternity_surge,empower_to=3,target_if=max:target.health.pct,if=((active_enemies>=3+2*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=3+2*talent.eternitys_span-talent.star_salvo)&talent.star_salvo)&target.time_to_die>duration" ); + es->add_action( "eternity_surge,empower_to=2,target_if=max:target.health.pct,if=((active_enemies>=2+2*talent.eternitys_span)&!talent.star_salvo|(active_enemies>=2+1*talent.eternitys_span-talent.star_salvo)&talent.star_salvo)&target.time_to_die>duration" ); + es->add_action( "eternity_surge,empower_to=1,target_if=max:target.health.pct,if=target.time_to_die>duration" ); - fb_fs->add_action( "fire_breath,empower_to=1,target_if=max:target.health.pct,if=active_enemies=1|variable.use_pyre_fs", "Fire Breath Upranking" ); - fb_fs->add_action( "fire_breath,empower_to=2,target_if=max:target.health.pct,if=active_enemies=2|buff.dragonrage.up|buff.rising_fury.up" ); - fb_fs->add_action( "fire_breath,empower_to=3,target_if=max:target.health.pct,if=active_enemies>=3", "Cap at R3 since R4 is just sort of bad for all cases" ); + fb_fs->add_action( "fire_breath,empower_to=1,target_if=max:target.health.pct,if=(active_enemies=1|variable.use_pyre_fs)&target.time_to_die>duration", "Fire Breath Upranking" ); + fb_fs->add_action( "fire_breath,empower_to=2,target_if=max:target.health.pct,if=(active_enemies=2|buff.dragonrage.up|buff.rising_fury.up)&target.time_to_die>duration" ); + fb_fs->add_action( "fire_breath,empower_to=3,target_if=max:target.health.pct,if=active_enemies>=3&target.time_to_die>duration", "Cap at R3 since R4 is just sort of bad for all cases" ); - fb_sc->add_action( "fire_breath,empower_to=1,target_if=max:target.health.pct,if=active_enemies=1|active_enemies>4", "Fire Breath Upranking" ); - fb_sc->add_action( "fire_breath,empower_to=2,target_if=max:target.health.pct,if=active_enemies=2" ); - fb_sc->add_action( "fire_breath,empower_to=3,target_if=max:target.health.pct,if=active_enemies=3" ); - fb_sc->add_action( "fire_breath,empower_to=4,target_if=max:target.health.pct,if=active_enemies=4" ); + fb_sc->add_action( "fire_breath,empower_to=1,target_if=max:target.health.pct,if=(active_enemies=1|active_enemies>4)&target.time_to_die>duration", "Fire Breath Upranking" ); + fb_sc->add_action( "fire_breath,empower_to=2,target_if=max:target.health.pct,if=active_enemies=2&target.time_to_die>duration" ); + fb_sc->add_action( "fire_breath,empower_to=3,target_if=max:target.health.pct,if=active_enemies=3&target.time_to_die>duration" ); + fb_sc->add_action( "fire_breath,empower_to=4,target_if=max:target.health.pct,if=active_enemies=4&target.time_to_die>duration" ); green->add_action( "emerald_blossom", "Green Spells for Ancient Flame" ); green->add_action( "verdant_embrace" ); - trinkets->add_action( "use_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)", "Trinket Spaghetti" ); - trinkets->add_action( "use_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" ); + trinkets->add_action( "use_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.is.hex_lords_dooming_idol|time>=120)|trinket.1.proc.any_dps.duration>=fight_remains|!trinket.1.is.hex_lords_dooming_idol&trinket.1.cooldown.duration<=60&(variable.next_dragonrage>20|!talent.dragonrage)&(!buff.dragonrage.up|variable.trinket_priority=1)&!variable.trinket_1_manual)", "Trinket Spaghetti" ); + trinkets->add_action( "use_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.is.hex_lords_dooming_idol|time>=120)|trinket.2.proc.any_dps.duration>=fight_remains|!trinket.2.is.hex_lords_dooming_idol&trinket.2.cooldown.duration<=60&(variable.next_dragonrage>20|!talent.dragonrage)&(!buff.dragonrage.up|variable.trinket_priority=2)&!variable.trinket_2_manual" ); trinkets->add_action( "use_item,slot=main_hand,if=variable.weapon_buffs&((variable.trinket_2_buffs&(trinket.2.cooldown.remains|trinket.2.cooldown.duration<=20)|!variable.trinket_2_buffs|variable.trinket_2_exclude|variable.trinket_priority=3)&(variable.trinket_1_buffs&(trinket.1.cooldown.remains|trinket.1.cooldown.duration<=20)|!variable.trinket_1_buffs|variable.trinket_1_exclude|variable.trinket_priority=3)&(!cooldown.fire_breath.up|(!cooldown.fire_breath.up)|active_enemies>=3))&(variable.next_dragonrage>20|!talent.dragonrage)&(!buff.dragonrage.up|variable.trinket_priority=3|variable.trinket_priority=1&trinket.1.cooldown.remains|variable.trinket_priority=2&trinket.2.cooldown.remains)" ); trinkets->add_action( "use_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))" ); trinkets->add_action( "use_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))" );