diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index 4f4aba25006..6b9a603c91a 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -14,9 +14,18 @@ namespace warlock_apl{ std::string flask( const player_t* p ) { - if ( p->true_level >= 90 ) return "flask_of_the_magisters_2"; + std::string lvl90_flask = "disabled"; + + switch ( p->specialization() ) + { + case WARLOCK_AFFLICTION: lvl90_flask = "flask_of_the_shattered_sun_2"; break; + case WARLOCK_DEMONOLOGY: lvl90_flask = "flask_of_the_magisters_2"; break; + case WARLOCK_DESTRUCTION: lvl90_flask = "flask_of_the_magisters_2"; break; + } + + if ( p->true_level >= 90 ) return lvl90_flask; return ( p->true_level >= 80 ) ? "flask_of_alchemical_chaos_3" : "disabled"; - } +} std::string food( const player_t* p ) { @@ -55,8 +64,14 @@ void affliction( player_t* p ) action_priority_list_t* variables = p->get_action_priority_list( "variables" ); precombat->add_action( "summon_pet" ); + precombat->add_action( "variable,name=trinket_1_buffs,value=trinket.1.has_use_buff" ); + precombat->add_action( "variable,name=trinket_2_buffs,value=trinket.2.has_use_buff" ); + precombat->add_action( "variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&(trinket.1.cooldown.duration%%cooldown.summon_darkglare.duration=0|cooldown.summon_darkglare.duration%%trinket.1.cooldown.duration=0)" ); + precombat->add_action( "variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&(trinket.2.cooldown.duration%%cooldown.summon_darkglare.duration=0|cooldown.summon_darkglare.duration%%trinket.2.cooldown.duration=0)" ); + precombat->add_action( "variable,name=trinket_1_buff_duration,value=trinket.1.proc.any_dps.duration" ); + precombat->add_action( "variable,name=trinket_2_buff_duration,value=trinket.2.proc.any_dps.duration" ); + precombat->add_action( "variable,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.cooldown.duration%variable.trinket_2_buff_duration)*(1+0.5*trinket.2.has_buff.intellect)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%variable.trinket_1_buff_duration)*(1+0.5*trinket.1.has_buff.intellect)*(variable.trinket_1_sync))" ); precombat->add_action( "grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice" ); - precombat->add_action( "snapshot_stats" ); precombat->add_action( "seed_of_corruption,if=(hero_tree.soul_harvester&active_enemies>1)|active_enemies>2" ); precombat->add_action( "haunt,if=active_enemies<2|(hero_tree.hellcaller&active_enemies<3)" ); @@ -79,8 +94,11 @@ void affliction( player_t* p ) hellcaller->add_action( "call_action_list,name=HC_cleave,if=active_enemies=2" ); hellcaller->add_action( "call_action_list,name=HC_aoe,if=active_enemies>2" ); - items->add_action( "use_item,use_off_gcd=1,slot=trinket1,if=variable.cds_active" ); - items->add_action( "use_item,use_off_gcd=1,slot=trinket2,if=variable.cds_active" ); + items->add_action( "use_item,use_off_gcd=1,slot=trinket1,if=(variable.darkglare_active|!talent.summon_darkglare|variable.trinket_1_will_lose_cast)&(variable.trinket_priority=1|!trinket.2.has_cooldown|(trinket.2.cooldown.remains|variable.trinket_priority=2&cooldown.summon_darkglare.remains>20&!variable.darkglare_active&trinket.2.cooldown.remains=fight_remains)" ); + items->add_action( "use_item,slot=trinket2,if=(variable.darkglare_active|!talent.summon_darkglare|variable.trinket_2_will_lose_cast)&(variable.trinket_priority=2|!trinket.1.has_cooldown|(trinket.1.cooldown.remains|variable.trinket_priority=1&cooldown.summon_darkglare.remains>20&!variable.darkglare_active&trinket.1.cooldown.remains=fight_remains)" ); + items->add_action( "use_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_buffs&(!variable.trinket_1_buffs&(trinket.2.cooldown.remains|!variable.trinket_2_buffs)|talent.summon_darkglare&cooldown.summon_darkglare.remains_expected>20&!prev_gcd.1.summon_darkglare|!talent.summon_darkglare)" ); + items->add_action( "use_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_buffs&(!variable.trinket_2_buffs&(trinket.1.cooldown.remains|!variable.trinket_1_buffs)|talent.summon_darkglare&cooldown.summon_darkglare.remains_expected>20&!prev_gcd.1.summon_darkglare|!talent.summon_darkglare)" ); + items->add_action( "use_item,use_off_gcd=1,slot=main_hand" ); ogcd->add_action( "potion,use_off_gcd=1,if=variable.cds_active|fight_remains<32" ); ogcd->add_action( "berserking,use_off_gcd=1,if=variable.cds_active|fight_remains<14" ); @@ -89,8 +107,8 @@ void affliction( player_t* p ) ogcd->add_action( "ancestral_call,use_off_gcd=1,if=variable.cds_active|fight_remains<17" ); SH_st->add_action( "haunt", "Haunt on CD for apex, regardless of Nightfall stacks" ); - SH_st->add_action( "agony,if=refreshable" ); - SH_st->add_action( "corruption,if=refreshable" ); + SH_st->add_action( "agony,if=remains<3" ); + SH_st->add_action( "corruption,if=remains<3" ); SH_st->add_action( "dark_harvest,if=soul_shard<3&execute_time<(dot.agony.remainsadd_action( "summon_darkglare,if=cooldown.dark_harvest.remains", "use Dark Harvest only outside Darkglare" ); SH_st->add_action( "malefic_grasp,if=buff.nightfall.react>1|pet.darkglare.remainsadd_action( "dark_harvest", "Do not care about losing shards in 2+ targets" ); SH_aoe->add_action( "agony,target_if=min:remains,if=active_dot.agony<5&remains<5", "Maintain ~5 agonies (will be 6 with Shared Agony)" ); SH_aoe->add_action( "summon_darkglare" ); - SH_aoe->add_action( "seed_of_corruption,if=talent.sow_the_seeds" ); - SH_aoe->add_action( "unstable_affliction,if=!talent.sow_the_seeds" ); + SH_aoe->add_action( "seed_of_corruption,if=talent.sow_the_seeds|(!pet.darkglare.active&active_enemies>9)" ); + SH_aoe->add_action( "unstable_affliction,if=!talent.sow_the_seeds|buff.shard_instability.react" ); SH_aoe->add_action( "agony,target_if=min:remains,if=remainsadd_action( "malefic_grasp,if=pet.darkglare.remainsadd_action( "haunt" ); SH_cleave->add_action( "seed_of_corruption,if=(!dot.corruption.ticking|dot.corruption.refreshable)&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + SH_cleave->add_action( "unstable_affliction,cycle_targets=1,if=!ticking&cooldown.dark_harvest.remainsadd_action( "dark_harvest", "Do not care about losing shards in 2+ targets" ); SH_cleave->add_action( "agony,target_if=refreshable" ); SH_cleave->add_action( "summon_darkglare" ); @@ -134,11 +153,11 @@ void affliction( player_t* p ) HC_aoe->add_action( "haunt" ); HC_aoe->add_action( "seed_of_corruption,if=(!dot.wither.ticking|dot.wither.refreshable)&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); HC_aoe->add_action( "dark_harvest" ); - HC_aoe->add_action( "agony,target_if=min:remains,if=active_dot.agonyadd_action( "agony,target_if=min:remains,if=active_dot.agony<(10+(8*!talent.sow_the_seeds))&remains<5" ); HC_aoe->add_action( "summon_darkglare" ); HC_aoe->add_action( "malevolence" ); - HC_aoe->add_action( "seed_of_corruption" ); - HC_aoe->add_action( "unstable_affliction,if=buff.shard_instability.react" ); + HC_aoe->add_action( "seed_of_corruption,if=talent.sow_the_seeds|(!pet.darkglare.active&active_enemies>(5+talent.cull_the_weak))" ); + HC_aoe->add_action( "unstable_affliction,if=!talent.sow_the_seeds|buff.shard_instability.react" ); HC_aoe->add_action( "agony,target_if=min:remains,if=remainsadd_action( "malefic_grasp,if=pet.darkglare.remainsadd_action( "summon_darkglare" ); HC_cleave->add_action( "malevolence" ); HC_cleave->add_action( "malefic_grasp,if=pet.darkglare.remainsadd_action( "unstable_affliction,if=!talent.sow_the_seeds&!talent.patient_zero&(pet.darkglare.remains|buff.malevolence.remains|soul_shard>4|buff.shard_instability.react|buff.cascading_calamity.remainsadd_action( "unstable_affliction,if=!talent.sow_the_seeds&!talent.patient_zero&(pet.darkglare.remains|buff.malevolence.remains|soul_shard>4|buff.shard_instability.react|(talent.cascading_calamity&buff.cascading_calamity.remainsadd_action( "seed_of_corruption,if=talent.patient_zero&talent.sow_the_seeds" ); end_of_fight->add_action( "unstable_affliction,if=soul_shard&fight_remains<8&(!talent.patient_zero&!talent.sow_the_seeds)" ); @@ -159,7 +178,10 @@ void affliction( player_t* p ) end_of_fight->add_action( "shadow_bolt,if=buff.nightfall.react&fight_remains<5" ); variables->add_action( "variable,name=cds_active,op=set,value=!talent.summon_darkglare|pet.darkglare.remains" ); + variables->add_action( "variable,name=darkglare_active,op=set,value=pet.darkglare.active|(cooldown.summon_darkglare.duration-cooldown.summon_darkglare.remains)<20" ); variables->add_action( "cycling_variable,name=min_agony,op=min,value=dot.agony.remains+(99*!dot.agony.remains)" ); + variables->add_action( "variable,name=trinket_1_will_lose_cast,value=((floor((fight_remains%trinket.1.cooldown.duration)+1)!=floor((fight_remains+(cooldown.summon_darkglare.duration-cooldown.summon_darkglare.remains))%cooldown.summon_darkglare.duration))&(floor((fight_remains%trinket.1.cooldown.duration)+1))!=(floor(((fight_remains-cooldown.summon_darkglare.remains)%trinket.1.cooldown.duration)+1))|((floor((fight_remains%trinket.1.cooldown.duration)+1)=floor((fight_remains+(cooldown.summon_darkglare.duration-cooldown.summon_darkglare.remains))%cooldown.summon_darkglare.duration))&(((fight_remains-cooldown.summon_darkglare.remains%%trinket.1.cooldown.duration)-cooldown.summon_darkglare.remains-variable.trinket_1_buff_duration)>0)))&cooldown.summon_darkglare.remains>20" ); + variables->add_action( "variable,name=trinket_2_will_lose_cast,value=((floor((fight_remains%trinket.2.cooldown.duration)+1)!=floor((fight_remains+(cooldown.summon_darkglare.duration-cooldown.summon_darkglare.remains))%cooldown.summon_darkglare.duration))&(floor((fight_remains%trinket.2.cooldown.duration)+1))!=(floor(((fight_remains-cooldown.summon_darkglare.remains)%trinket.2.cooldown.duration)+1))|((floor((fight_remains%trinket.2.cooldown.duration)+1)=floor((fight_remains+(cooldown.summon_darkglare.duration-cooldown.summon_darkglare.remains))%cooldown.summon_darkglare.duration))&(((fight_remains-cooldown.summon_darkglare.remains%%trinket.2.cooldown.duration)-cooldown.summon_darkglare.remains-variable.trinket_2_buff_duration)>0)))&cooldown.summon_darkglare.remains>20" ); } //affliction_apl_end diff --git a/engine/class_modules/apl/warlock.hpp b/engine/class_modules/apl/warlock.hpp index 533e07b5857..a49f2a0e5c7 100644 --- a/engine/class_modules/apl/warlock.hpp +++ b/engine/class_modules/apl/warlock.hpp @@ -7,7 +7,7 @@ struct player_t; namespace warlock_apl{ std::string potion( const player_t* ); - std:: string flask( const player_t* ); + std::string flask( const player_t* ); std::string food( const player_t* ); std::string rune( const player_t* ); std::string temporary_enchant( const player_t* ); diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index 110bbcea272..089609dd664 100644 --- a/profiles/generators/MID1/MID1_Generate_Warlock.simc +++ b/profiles/generators/MID1/MID1_Generate_Warlock.simc @@ -4,7 +4,7 @@ level=90 race=pandaren role=spell position=ranged_back -talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjllBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZGzgZmZGAwMwA +talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZZ2MzsMzAAjllBGwEMDbBG2GAAAmBAAwMDzMjxwwMmZmxgZmZGAwMwA warlock.default_pet=sayaad head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/1808,enchant_id=7961,gem_id=240983,ilevel=289