From c7d155ae958111ddf8fe6b584842125f786191c2 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 23 Feb 2026 03:32:46 +0200 Subject: [PATCH 1/7] Initial Affliction APL and Profiles --- engine/class_modules/apl/warlock.cpp | 124 +++++++----------- profiles/MID1_Raid.simc | 4 +- .../MID1/MID1_Generate_Warlock.simc | 102 +++++++------- 3 files changed, 103 insertions(+), 127 deletions(-) diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index 0cd4e9c5b7c..9ce3c78fbae 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -43,89 +43,67 @@ void affliction( player_t* p ) action_priority_list_t* precombat = p->get_action_priority_list( "precombat" ); // action_priority_list_t* aoe = p->get_action_priority_list( "aoe" ); // action_priority_list_t* cleave = p->get_action_priority_list( "cleave" ); - // action_priority_list_t* end_of_fight = p->get_action_priority_list( "end_of_fight" ); + action_priority_list_t* end_of_fight = p->get_action_priority_list( "end_of_fight" ); action_priority_list_t* items = p->get_action_priority_list( "items" ); action_priority_list_t* ogcd = p->get_action_priority_list( "ogcd" ); - // action_priority_list_t* variables = p->get_action_priority_list( "variables" ); + action_priority_list_t* variables = p->get_action_priority_list( "variables" ); + action_priority_list_t* soul_harvester = p->get_action_priority_list( "soul_harvester" ); + action_priority_list_t* hellcaller = p->get_action_priority_list( "hellcaller" ); precombat->add_action( "summon_pet" ); precombat->add_action( "grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled" ); precombat->add_action( "snapshot_stats" ); precombat->add_action( "haunt" ); - default_->add_action( "call_action_list,name=ogcd,if=pet.darkglare.active" ); - default_->add_action( "call_action_list,name=items,if=pet.darkglare.active" ); - default_->add_action( "malevolence,if=!dot.haunt.refreshable&!dot.agony.refreshable&!dot.wither.refreshable" ); - default_->add_action( "summon_darkglare,if=dot.agony.ticking&(dot.corruption.ticking|dot.wither.ticking)" ); - default_->add_action( "dark_harvest,if=talent.dark_harvest&!talent.haunt|!dot.haunt.refreshable&!dot.agony.refreshable&((talent.absolute_corruption&(talent.wither&dot.wither.ticking|!talent.wither&dot.corruption.ticking))|(!talent.absolute_corruption&(talent.wither&dot.wither.refreshable|!talent.wither&dot.corruption.refreshable)))" ); - default_->add_action( "seed_of_corruption,if=active_enemies>=2&soul_shard>1" ); - default_->add_action( "unstable_affliction,if=active_enemies<2&soul_shard>1" ); - default_->add_action( "haunt,if=dot.haunt.refreshable" ); - default_->add_action( "agony,if=dot.agony.refreshable" ); - default_->add_action( "wither,if=talent.wither&(!talent.absolute_corruption&dot.wither.refreshable|talent.absolute_corruption&!dot.wither.ticking)" ); - default_->add_action( "corruption,if=!talent.wither&(!talent.absolute_corruption&dot.corruption.refreshable|talent.absolute_corruption&!dot.corruption.ticking)" ); - default_->add_action( "malefic_grasp,if=pet.darkglare.active" ); - default_->add_action( "drain_soul,interrupt=1" ); + default_->add_action( "call_action_list,name=variables" ); + default_->add_action( "call_action_list,name=end_of_fight" ); + default_->add_action( "call_action_list,name=ogcd" ); + default_->add_action( "call_action_list,name=items" ); + default_->add_action( "call_action_list,name=soul_harvester,if=talent.demonic_soul.enabled" ); + default_->add_action( "call_action_list,name=hellcaller,if=talent.wither.enabled" ); + default_->add_action( "malefic_grasp,if=pet.darkglare.active&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "drain_soul,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "shadow_bolt,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,chain=1,early_chain_if=buff.nightfall.react,if=pet.darkglare.active" ); + default_->add_action( "drain_soul,chain=1,early_chain_if=buff.nightfall.react,interrupt_if=tick_time>0.5" ); default_->add_action( "shadow_bolt" ); - // aoe->add_action( "call_action_list,name=ogcd" ); - // aoe->add_action( "call_action_list,name=items" ); - // aoe->add_action( "call_action_list,name=end_of_fight" ); - // aoe->add_action( "cycling_variable,name=min_agony,op=min,value=dot.agony.remains+(99*!dot.agony.remains)" ); - // aoe->add_action( "haunt,if=debuff.haunt.remains<3" ); - // aoe->add_action( "agony,if=refreshable&active_enemies>10" ); - // aoe->add_action( "agony,target_if=(!(debuff.haunt.remains|dot.seed_of_corruption.remains)&refreshable),if=active_enemies>8&active_dot.agony<(active_enemies-8>?(talent.demonic_soul*1+!talent.demonic_soul*5))" ); - // aoe->add_action( "agony,cycle_targets=1,max_cycle_targets=5,if=!talent.demonic_soul&remains>0&remains<10&fight_remains>dot.agony.remains+5" ); - // aoe->add_action( "agony,cycle_targets=1,max_cycle_targets=5,if=!talent.demonic_soul&active_dot.agony<6&(remains<3)&fight_remains>dot.agony.remains+5" ); - // aoe->add_action( "agony,cycle_targets=1,max_cycle_targets=3,if=talent.demonic_soul&remains>0&remains<10&fight_remains>dot.agony.remains+5" ); - // aoe->add_action( "agony,cycle_targets=1,max_cycle_targets=3,if=talent.demonic_soul&active_dot.agony<4&(remains<3)&fight_remains>dot.agony.remains+5" ); - // aoe->add_action( "unstable_affliction,if=(remains<3|talent.demonic_soul)&fight_remains>remains+5" ); - // aoe->add_action( "dark_harvest,if=talent.dark_harvest" ); - // aoe->add_action( "seed_of_corruption,if=((dot.corruption.remains0)" ); - // aoe->add_action( "summon_darkglare,if=cooldown.invoke_power_infusion_0.duration>0&cooldown.invoke_power_infusion_0.up" ); - // aoe->add_action( "malevolence" ); - // aoe->add_action( "agony,target_if=min:remains,if=remainsadd_action( "wither,target_if=min:(remains*(remains>0)),if=!talent.absolute_corruption&refreshable&!(action.seed_of_corruption.in_flight|dot.seed_of_corruption.remains>0)" ); - // aoe->add_action( "corruption,target_if=min:(remains*(remains>0)),if=!talent.absolute_corruption&refreshable&!(action.seed_of_corruption.in_flight|dot.seed_of_corruption.remains>0)" ); - // aoe->add_action( "unstable_affliction,if=remainsremains+5" ); - // aoe->add_action( "malefic_grasp,if=talent.summon_darkglare&talent.malefic_grasp" ); - // aoe->add_action( "drain_soul,if=talent.drain_soul" ); - // aoe->add_action( "shadow_bolt" ); - - // cleave->add_action( "call_action_list,name=ogcd" ); - // cleave->add_action( "call_action_list,name=items" ); - // cleave->add_action( "call_action_list,name=end_of_fight" ); - // cleave->add_action( "agony,target_if=min:remains,if=(talent.absolute_corruption&remains<3|!talent.absolute_corruption&remains<5)&fight_remains>dot.agony.remains+5" ); - // cleave->add_action( "wither,target_if=min:remains,if=(talent.wither&!talent.absolute_corruption&remains<5)&fight_remains>dot.wither.remains+5" ); - // cleave->add_action( "corruption,target_if=min:remains,if=!talent.wither&(!talent.absolute_corruption&remains<5)&!(action.seed_of_corruption.in_flight|dot.seed_of_corruption.remains>0)&fight_remains>dot.corruption.remains+5" ); - // cleave->add_action( "haunt,if=talent.demonic_soul&buff.nightfall.react<2-prev_gcd.1.drain_soul|debuff.haunt.remains<3" ); - // cleave->add_action( "unstable_affliction,if=(remains<5|talent.demonic_soul)&fight_remains>remains+5" ); - // cleave->add_action( "dark_harvest,if=talent.dark_harvest" ); - // cleave->add_action( "summon_darkglare" ); - // cleave->add_action( "malevolence" ); - // cleave->add_action( "drain_soul,if=talent.demonic_soul&buff.nightfall.react&target.health.pct<20" ); - // cleave->add_action( "agony,if=refreshable" ); - // cleave->add_action( "wither,if=refreshable" ); - // cleave->add_action( "unstable_affliction,if=refreshable" ); - // cleave->add_action( "drain_soul,if=buff.nightfall.react" ); - // cleave->add_action( "shadow_bolt,if=buff.nightfall.react" ); - // cleave->add_action( "wither,if=refreshable" ); - // cleave->add_action( "corruption,if=refreshable" ); - // cleave->add_action( "drain_soul,chain=1,early_chain_if=buff.nightfall.react,interrupt_if=tick_time>0.5" ); - // cleave->add_action( "shadow_bolt" ); - - // end_of_fight->add_action( "drain_soul,if=talent.demonic_soul&active_enemies<4&(fight_remains<5&buff.nightfall.react|prev_gcd.1.haunt&buff.nightfall.react=2)" ); - - items->add_action( "use_item,slot=trinket1" ); - items->add_action( "use_item,slot=trinket2" ); - - ogcd->add_action( "potion,if=pet.darkglare.active" ); - ogcd->add_action( "berserking,use_off_gcd=1" ); - ogcd->add_action( "blood_fury" ); - ogcd->add_action( "fireblood" ); - ogcd->add_action( "ancestral_call" ); - - // variables->add_action( "variable,name=cds_active,op=set,value=(!talent.summon_darkglare|pet.darkglare.remains|cooldown.summon_darkglare.remains>20)" ); + soul_harvester->add_action( "haunt,if=buff.nightfall.react<2-prev_gcd.1.drain_soul" ); + soul_harvester->add_action( "agony,if=!ticking|refreshable" ); + soul_harvester->add_action( "corruption,if=!ticking|refreshable" ); + soul_harvester->add_action( "drain_soul,if=buff.nightfall.react>1" ); + soul_harvester->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + soul_harvester->add_action( "summon_darkglare,if=soul_shard<3" ); + soul_harvester->add_action( "dark_harvest,if=soul_shard<3&execute_time<((dot.agony.remainsadd_action( "malefic_grasp,if=pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|soul_shard>1|(talent.shard_instability&buff.shard_instability.react)" ); + + hellcaller->add_action( "haunt,if=cooldown.haunt.ready" ); + hellcaller->add_action( "agony,if=!ticking|refreshable" ); + hellcaller->add_action( "wither,if=!ticking|refreshable" ); + hellcaller->add_action( "agony,if=dot.agony.remains<20&cooldown.summon_darkglare.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); + hellcaller->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + hellcaller->add_action( "summon_darkglare" ); + hellcaller->add_action( "dark_harvest,if=execute_time<((dot.agony.remainsadd_action( "malevolence" ); + hellcaller->add_action( "malefic_grasp,if=pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|buff.malevolence.remains|soul_shard>4|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "unstable_affliction,if=soul_shard&fight_remains<8" ); + end_of_fight->add_action( "drain_soul,if=buff.nightfall.react&fight_remains<5" ); + end_of_fight->add_action( "shadow_bolt,if=buff.nightfall.react&fight_remains<5" ); + + ogcd->add_action( "potion,use_off_gcd=1,if=!talent.summon_darkglare|pet.darkglare.active|fight_remains<32" ); + ogcd->add_action( "berserking,use_off_gcd=1,if=!talent.summon_darkglare|pet.darkglare.active|fight_remains<14" ); + ogcd->add_action( "blood_fury,if=!talent.summon_darkglare|pet.darkglare.active|fight_remains<17" ); + ogcd->add_action( "fireblood,if=!talent.summon_darkglare|pet.darkglare.active|fight_remains<10" ); + ogcd->add_action( "ancestral_call,if=!talent.summon_darkglare|pet.darkglare.active|fight_remains<17" ); + + 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" ); + + variables->add_action( "variable,name=cds_active,op=set,value=!talent.summon_darkglare|cooldown.summon_darkglare.remains>20|pet.darkglare.remains" ); } //affliction_apl_end diff --git a/profiles/MID1_Raid.simc b/profiles/MID1_Raid.simc index 0d2f04efc73..98ff86ddf74 100644 --- a/profiles/MID1_Raid.simc +++ b/profiles/MID1_Raid.simc @@ -61,8 +61,8 @@ MID1_Priest_Shadow_Archon.simc # MID1_Shaman_Enhancement_DRE.simc # MID1_Shaman_Enhancement_Totemic.simc -# # MID1_Warlock_Affliction_Soul_Harvester.simc -# MID1_Warlock_Affliction.simc +MID1_Warlock_Affliction_Soul_Harvester.simc +MID1_Warlock_Affliction_Hellcaller.simc # # MID1_Warlock_Demonology_Soul_Harvester.simc # MID1_Warlock_Demonology.simc MID1_Warlock_Destruction.simc diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index c11f32fbc05..1978964fb6f 100644 --- a/profiles/generators/MID1/MID1_Generate_Warlock.simc +++ b/profiles/generators/MID1/MID1_Generate_Warlock.simc @@ -1,60 +1,58 @@ -# # warlock="MID1_Warlock_Affliction_Soul_Harvester" -# # spec=affliction -# # level=80 -# # race=orc -# # role=spell -# # position=back -# # professions=alchemy=100/jewelcrafting=100 -# # talents=CkQAAAAAAAAAAAAAAAAAAAAAAAmZmZmZEzmBmtZmZY2GAAAwMjZWmZM2MzMLMzMDAYmxyyADYCmhtADbzAAAAAAAAAzMzmB -# # default_pet=sayaad +warlock="MID1_Warlock_Affliction_Soul_Harvester" +spec=affliction +level=90 +race=pandaren +role=spell +position=ranged_back +talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjttBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZmxgZmZGAwMwA +default_pet=sayaad -# # head=hexflame_covens_allseeing_eye,id=212074,bonus_id=1540/10299/1808,gem_id=213743 -# # neck=silken_advisors_favor,id=225575,bonus_id=1540/10299/10376/8781,gem_id=213482/213482 -# # shoulders=hexflame_covens_altar,id=212072,bonus_id=6652/10376/10354/10273/1498/10255,ilevel=639 -# # back=hexflame_covens_shawl,id=212069,bonus_id=1540/10299 -# # chest=hexflame_covens_ritual_harness,id=212077,bonus_id=6652/10376/10354/10273/1498/10255,ilevel=639,enchant_id=7364 -# # wrists=consecrated_cuffs,id=222815,bonus_id=10421/9633/8902/11144/10222/1485/1808/8795/10520/8960,gem_id=213461,enchant_id=7397,crafted_stats=32/36 -# # hands=hexflame_covens_sleeves,id=212075,bonus_id=6652/10376/10354/10273/1498/10255,ilevel=639 -# # waist=burrowers_cinch,id=221158,bonus_id=4786/3131/10299/523,ilevel=639,gem_id=213461 -# # legs=hexflame_covens_leggings,id=212073,bonus_id=6652/10376/10354/10273/1498/10255,ilevel=639,enchant_id=7534 -# # feet=consecrated_slippers,id=222814,bonus_id=10421/9633/8902/11144/10222/1485/10520/8960,crafted_stats=32/40 -# # finger1=seal_of_the_poisoned_pact,id=225578,bonus_id=6652/10354/10268/1514/10255/10395/8781,ilevel=639,gem_id=213461/213461,enchant_id=7340 -# # finger2=key_to_the_unseeming,id=212447,bonus_id=10256/11086/6652/1514/10255/10395/8781,ilevel=639,gem_id=213467/213491,enchant_id=7340 -# # trinket1=mad_queens_mandate,id=212454,bonus_id=1540/10299/10376 -# # trinket2=spymasters_web,id=220202,bonus_id=6652/10354/10269/1511/10255,ilevel=639 -# # main_hand=sovereigns_disdain,id=212394,bonus_id=1540/10299/10376,enchant_id=7460 -# # off_hand=broodtwisters_grim_catalyst,id=212387,bonus_id=1540/10299/10376 +head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/13575,ilevel=289,gem_id=240983,enchant_id=7961 +neck=eternal_voidsong_chain,id=249368,ilevel=289,gem_id=240890 +shoulder=abyssal_immolators_fury,id=250040,bonus_id=13574/13574,ilevel=289,enchant_id=8031 +back=adherents_silken_shroud,id=239656,bonus_id=8960/12214/13454/13622/13667/9627,crafted_stats=36/49 +chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575/13575,ilevel=289,enchant_id=7987 +wrist=voracious_wristwraps,id=249315,ilevel=289,gem_id=240890 +hands=abyssal_immolators_grasps,id=250043,bonus_id=13574/13574,ilevel=289 +waist=whisperinscribed_sash,id=249376,ilevel=289,gem_id=240890 +legs=abyssal_immolators_pillars,id=250041,bonus_id=13575/13575,ilevel=289,enchant_id=7935 +feet=slippers_of_the_midnight_flame,id=249305,bonus_id=4786/4800/12803/12806/1532,enchant_id=7993 +finger1=eye_of_midnight,id=249920,ilevel=289,gem_id=240898/240898,enchant_id=7997 +finger2=masterwork_sindorei_band,id=240949,bonus_id=8960/12214/13453/13622/13667/9627,gem_id=240898,enchant_id=7997,crafted_stats=32/36 +trinket1=emberwing_feather,id=250144,ilevel=289 +trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 +main_hand=belomelorn_the_shattered_talon,id=249283,ilevel=289,enchant_id=7981 +off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 -# # save=MID1_Warlock_Affliction_Soul_Harvester.simc +save=MID1_Warlock_Affliction_Soul_Harvester.simc -# warlock=MID1_Warlock_Affliction_Hellcaller -# level=80 -# race=maghar_orc -# role=spell -# position=back -# professions=alchemy=100/jewelcrafting=100 -# spec=affliction -# talents=CkQAAAAAAAAAAAAAAAAAAAAAAAzMzMzMjYWMwsNzMDzyAAAAmZmZWMzMWmZmZDmZAAzYBGYWMaMDIzGYZGAAAAAAAAMjZD -# default_pet=sayaad +warlock=MID1_Warlock_Affliction_Hellcaller +spec=affliction +level=90 +race=pandaren +role=spell +position=ranged_back +talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZZWmZmlxAAWgBmFjGzAysBWGAAAmBAAmZAzMjxwwMjZmZGMzMzAAmBG +default_pet=sayaad -# head=elysian_flame_crown,id=221131,bonus_id=3215/12361/12239/1808,gem_id=213743 -# neck=salhadaars_folly,id=242406,bonus_id=1533/12361/12239/8781,gem_id=213470/213491 -# shoulder=inquisitors_gaze_of_madness,id=237698,bonus_id=12675/1533/12361 -# back=reshii_wraps,id=235499,bonus_id=9893/12239,enchant_id=7403,gem_id=238042 -# chest=inquisitors_robes_of_madness,id=237703,bonus_id=12676/12361/1533,enchant_id=7364 -# wrist=consecrated_cuffs,id=222815,bonus_id=10421/9633/8902/12053/12050/1485/1808/11109/8960/8791,enchant_id=7397,gem_id=213491,crafted_stats=36/49 -# hands=inquisitors_clutches_of_madness,id=237701,bonus_id=12675/1533/12361 -# waist=durable_information_securing_container,id=242664,bonus_id=1489/12352/12239,gem_id=213491,titan_disc_id=1236275 -# legs=inquisitors_leggings_of_madness,id=237699,bonus_id=12676/1533/12361,enchant_id=7534 -# feet=interlopers_silken_striders,id=243305,bonus_id=1533/12361/12239/13504,enchant_id=7424 -# finger1=logic_gate_alpha,id=237567,bonus_id=1533/12361/12239/8781,enchant_id=7334,gem_id=213491/213491 -# finger2=band_of_the_shattered_soul,id=242405,bonus_id=1533/12361/12239/8781,enchant_id=7346,gem_id=213479/213455 -# trinket1=arazs_ritual_forge,id=242402,bonus_id=1533/12361/12239 -# trinket2=astral_antenna,id=242395,bonus_id=1533/12361/12239 -# main_hand=voidglass_kris,id=237728,bonus_id=1533/12361/12239,enchant_id=7445 -# off_hand=vagabonds_torch,id=222566,bonus_id=10421/9633/8902/12053/12050/1485/11300/8960/8795,crafted_stats=36/49 +head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/13575,ilevel=289,gem_id=240983,enchant_id=7961 +neck=eternal_voidsong_chain,id=249368,ilevel=289,gem_id=240890 +shoulder=abyssal_immolators_fury,id=250040,bonus_id=13574/13574,ilevel=289,enchant_id=8031 +back=adherents_silken_shroud,id=239656,bonus_id=8960/12214/13454/13622/13667/9627,crafted_stats=36/49 +chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575/13575,ilevel=289,enchant_id=7987 +wrist=voracious_wristwraps,id=249315,ilevel=289,gem_id=240890 +hands=abyssal_immolators_grasps,id=250043,bonus_id=13574/13574,ilevel=289 +waist=whisperinscribed_sash,id=249376,ilevel=289,gem_id=240890 +legs=abyssal_immolators_pillars,id=250041,bonus_id=13575/13575,ilevel=289,enchant_id=7935 +feet=slippers_of_the_midnight_flame,id=249305,bonus_id=4786/4800/12803/12806/1532,enchant_id=7993 +finger1=eye_of_midnight,id=249920,ilevel=289,gem_id=240898/240898,enchant_id=7997 +finger2=masterwork_sindorei_band,id=240949,bonus_id=8960/12214/13453/13622/13667/9627,gem_id=240898,enchant_id=7997,crafted_stats=32/36 +trinket1=emberwing_feather,id=250144,ilevel=289 +trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 +main_hand=belomelorn_the_shattered_talon,id=249283,ilevel=289,enchant_id=7981 +off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 -# save=MID1_Warlock_Affliction.simc +save=MID1_Warlock_Affliction_Hellcaller.simc # # warlock="MID1_Warlock_Demonology_Soul_Harvester" From 20900c75a8edc3252adcdcc98ee5a73dd38d7f01 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 23 Feb 2026 04:02:36 +0200 Subject: [PATCH 2/7] [Warlock] Fixing output file name of MID1_Warlock_Affliction.simc --- profiles/MID1_Raid.simc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/profiles/MID1_Raid.simc b/profiles/MID1_Raid.simc index 98ff86ddf74..69fa3e8988e 100644 --- a/profiles/MID1_Raid.simc +++ b/profiles/MID1_Raid.simc @@ -61,7 +61,7 @@ MID1_Priest_Shadow_Archon.simc # MID1_Shaman_Enhancement_DRE.simc # MID1_Shaman_Enhancement_Totemic.simc -MID1_Warlock_Affliction_Soul_Harvester.simc +MID1_Warlock_Affliction.simc MID1_Warlock_Affliction_Hellcaller.simc # # MID1_Warlock_Demonology_Soul_Harvester.simc # MID1_Warlock_Demonology.simc From e423127ccdaba4d7ee3b7078ee8e0df8abd1aae8 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 23 Feb 2026 04:06:37 +0200 Subject: [PATCH 3/7] [Warlock] Fixing missed generator file name --- profiles/generators/MID1/MID1_Generate_Warlock.simc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index 1978964fb6f..6a45f246926 100644 --- a/profiles/generators/MID1/MID1_Generate_Warlock.simc +++ b/profiles/generators/MID1/MID1_Generate_Warlock.simc @@ -24,7 +24,7 @@ trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 main_hand=belomelorn_the_shattered_talon,id=249283,ilevel=289,enchant_id=7981 off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 -save=MID1_Warlock_Affliction_Soul_Harvester.simc +save=MID1_Warlock_Affliction.simc warlock=MID1_Warlock_Affliction_Hellcaller spec=affliction From 3d95821cb5645cba35616dc39ee4c7084815dcb4 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 9 Mar 2026 02:09:00 +0200 Subject: [PATCH 4/7] [Warlock] Updates to Affliction APL: Adding Cleave and AoE APLs, as well as updating the profile --- engine/class_modules/apl/warlock.cpp | 92 ++++++++++++++++--- .../MID1/MID1_Generate_Warlock.simc | 50 +++++----- 2 files changed, 102 insertions(+), 40 deletions(-) diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index 9ce3c78fbae..6279d6defae 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -41,56 +41,118 @@ void affliction( 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* aoe = p->get_action_priority_list( "aoe" ); - // action_priority_list_t* cleave = p->get_action_priority_list( "cleave" ); + action_priority_list_t* aoe = p->get_action_priority_list( "aoe" ); + action_priority_list_t* cleave = p->get_action_priority_list( "cleave" ); action_priority_list_t* end_of_fight = p->get_action_priority_list( "end_of_fight" ); action_priority_list_t* items = p->get_action_priority_list( "items" ); action_priority_list_t* ogcd = p->get_action_priority_list( "ogcd" ); action_priority_list_t* variables = p->get_action_priority_list( "variables" ); action_priority_list_t* soul_harvester = p->get_action_priority_list( "soul_harvester" ); action_priority_list_t* hellcaller = p->get_action_priority_list( "hellcaller" ); + action_priority_list_t* SH_aoe = p->get_action_priority_list( "SH_aoe" ); + action_priority_list_t* SH_cleave = p->get_action_priority_list( "SH_cleave" ); + action_priority_list_t* HC_aoe = p->get_action_priority_list( "HC_aoe" ); + action_priority_list_t* HC_cleave = p->get_action_priority_list( "HC_cleave" ); precombat->add_action( "summon_pet" ); precombat->add_action( "grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled" ); precombat->add_action( "snapshot_stats" ); + precombat->add_action( "seed_of_corruption,if=talent.sow_the_seeds&active_enemies>1" ); precombat->add_action( "haunt" ); default_->add_action( "call_action_list,name=variables" ); default_->add_action( "call_action_list,name=end_of_fight" ); default_->add_action( "call_action_list,name=ogcd" ); default_->add_action( "call_action_list,name=items" ); - default_->add_action( "call_action_list,name=soul_harvester,if=talent.demonic_soul.enabled" ); - default_->add_action( "call_action_list,name=hellcaller,if=talent.wither.enabled" ); - default_->add_action( "malefic_grasp,if=pet.darkglare.active&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "call_action_list,name=aoe,if=active_enemies>2" ); + default_->add_action( "call_action_list,name=cleave,if=active_enemies=2" ); + default_->add_action( "call_action_list,name=st,if=active_enemies<2" ); + default_->add_action( "seed_of_corruption,if=talent.nocturnal_yield&active_enemies>1&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,if=pet.darkglare.active&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "drain_soul,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "shadow_bolt,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,chain=1,early_chain_if=buff.nightfall.react,if=pet.darkglare.active" ); default_->add_action( "drain_soul,chain=1,early_chain_if=buff.nightfall.react,interrupt_if=tick_time>0.5" ); default_->add_action( "shadow_bolt" ); - soul_harvester->add_action( "haunt,if=buff.nightfall.react<2-prev_gcd.1.drain_soul" ); + st->add_action( "call_action_list,name=soul_harvester,if=talent.demonic_soul" ); + st->add_action( "call_action_list,name=hellcaller,if=talent.wither" ); + + cleave->add_action( "call_action_list,name=SH_cleave,if=talent.demonic_soul" ); + cleave->add_action( "call_action_list,name=HC_cleave,if=talent.wither" ); + + aoe->add_action( "call_action_list,name=SH_aoe,if=talent.demonic_soul" ); + aoe->add_action( "call_action_list,name=HC_aoe,if=talent.wither" ); + + soul_harvester->add_action( "haunt,if=buff.nightfall.react<2" ); soul_harvester->add_action( "agony,if=!ticking|refreshable" ); soul_harvester->add_action( "corruption,if=!ticking|refreshable" ); + soul_harvester->add_action( "summon_darkglare,if=soul_shard<3|cooldown.dark_harvest.remains" ); + soul_harvester->add_action( "dark_harvest,if=soul_shard<3&execute_time<(dot.agony.remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); soul_harvester->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); - soul_harvester->add_action( "summon_darkglare,if=soul_shard<3" ); - soul_harvester->add_action( "dark_harvest,if=soul_shard<3&execute_time<((dot.agony.remainsadd_action( "malefic_grasp,if=pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|soul_shard>1|(talent.shard_instability&buff.shard_instability.react)" ); + soul_harvester->add_action( "unstable_affliction,if=pet.darkglare.active|soul_shard>1|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "haunt,if=buff.nightfall.react<2" ); + SH_cleave->add_action( "seed_of_corruption,if=!dot.corruption.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + SH_cleave->add_action( "dark_harvest" ); + SH_cleave->add_action( "agony,if=refreshable" ); + SH_cleave->add_action( "summon_darkglare" ); + SH_cleave->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); + SH_cleave->add_action( "drain_soul,if=!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); + SH_cleave->add_action( "shadow_bolt,if=!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); + SH_cleave->add_action( "unstable_affliction,if=pet.darkglare.active|(!talent.patient_zero&!talent.sow_the_seeds)" ); + SH_cleave->add_action( "seed_of_corruption" ); + + SH_aoe->add_action( "haunt,if=buff.nightfall.react<2" ); + SH_aoe->add_action( "seed_of_corruption,if=!dot.corruption.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + SH_aoe->add_action( "dark_harvest" ); + SH_aoe->add_action( "agony,target_if=min:remains,if=active_dot.agony<5&remains<5" ); + SH_aoe->add_action( "summon_darkglare" ); + SH_aoe->add_action( "seed_of_corruption" ); + SH_aoe->add_action( "agony,target_if=min:remains,if=remainsadd_action( "haunt,if=cooldown.haunt.ready" ); hellcaller->add_action( "agony,if=!ticking|refreshable" ); hellcaller->add_action( "wither,if=!ticking|refreshable" ); + hellcaller->add_action( "dark_harvest,if=execute_time<(dot.agony.remainsadd_action( "agony,if=dot.agony.remains<20&cooldown.summon_darkglare.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); - hellcaller->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); hellcaller->add_action( "summon_darkglare" ); - hellcaller->add_action( "dark_harvest,if=execute_time<((dot.agony.remainsadd_action( "malevolence" ); - hellcaller->add_action( "malefic_grasp,if=pet.darkglare.active&pet.darkglare.remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|buff.malevolence.remains|soul_shard>4|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); + hellcaller->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + + HC_cleave->add_action( "haunt,if=cooldown.haunt.ready" ); + HC_cleave->add_action( "seed_of_corruption,if=talent.patient_zero&talent.sow_the_seeds&!dot.wither.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption" ); + HC_cleave->add_action( "wither,target_if=min:remains,if=remains<5&!(action.seed_of_corruption.in_flight|dot.seed_of_corruption.remains>0)&fight_remains>remains+5" ); + HC_cleave->add_action( "agony,if=refreshable" ); + HC_cleave->add_action( "dark_harvest" ); + HC_cleave->add_action( "summon_darkglare" ); + HC_cleave->add_action( "malevolence" ); + HC_cleave->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|(!talent.patient_zero&!talent.sow_the_seeds)" ); + HC_cleave->add_action( "seed_of_corruption" ); + HC_cleave->add_action( "unstable_affliction,if=buff.shard_instability.react" ); + HC_cleave->add_action( "drain_soul,if=buff.nightfall.react>1" ); + HC_cleave->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + + HC_aoe->add_action( "haunt,if=cooldown.haunt.ready" ); + HC_aoe->add_action( "seed_of_corruption,if=!dot.wither.ticking&!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( "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( "agony,target_if=min:remains,if=remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active" ); + HC_aoe->add_action( "drain_soul,if=buff.nightfall.react>1" ); + HC_aoe->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); - end_of_fight->add_action( "unstable_affliction,if=soul_shard&fight_remains<8" ); + end_of_fight->add_action( "unstable_affliction,if=soul_shard&fight_remains<8&(!talent.patient_zero&!talent.sow_the_seeds)" ); end_of_fight->add_action( "drain_soul,if=buff.nightfall.react&fight_remains<5" ); end_of_fight->add_action( "shadow_bolt,if=buff.nightfall.react&fight_remains<5" ); diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index 6a45f246926..b5a02213914 100644 --- a/profiles/generators/MID1/MID1_Generate_Warlock.simc +++ b/profiles/generators/MID1/MID1_Generate_Warlock.simc @@ -4,24 +4,24 @@ level=90 race=pandaren role=spell position=ranged_back -talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjttBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZmxgZmZGAwMwA +talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjtlBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZGzgZmZGAwMwA default_pet=sayaad -head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/13575,ilevel=289,gem_id=240983,enchant_id=7961 -neck=eternal_voidsong_chain,id=249368,ilevel=289,gem_id=240890 -shoulder=abyssal_immolators_fury,id=250040,bonus_id=13574/13574,ilevel=289,enchant_id=8031 -back=adherents_silken_shroud,id=239656,bonus_id=8960/12214/13454/13622/13667/9627,crafted_stats=36/49 -chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575/13575,ilevel=289,enchant_id=7987 -wrist=voracious_wristwraps,id=249315,ilevel=289,gem_id=240890 -hands=abyssal_immolators_grasps,id=250043,bonus_id=13574/13574,ilevel=289 -waist=whisperinscribed_sash,id=249376,ilevel=289,gem_id=240890 -legs=abyssal_immolators_pillars,id=250041,bonus_id=13575/13575,ilevel=289,enchant_id=7935 +head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/1808,enchant_id=7961,gem_id=240983,ilevel=289 +neck=eternal_voidsong_chain,id=249368,bonus_id=12806/13577/13668,gem_id=240916 +shoulder=echoing_void_mantle,id=249328,bonus_id=12806/13577,enchant_id=8001 +back=adherents_silken_shroud,id=239656,bonus_id=12214/13622/13667/9627/8960/12384/8795,crafted_stats=36/49 +chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575,enchant_id=7987,ilevel=289 +wrist=martyrs_bindings,id=239648,bonus_id=12214/13622/13667/12066/9627/1808/8960/12384/8795,gem_id=240916,crafted_stats=32/36 +hands=abyssal_immolators_grasps,id=250043,bonus_id=13574,ilevel=289 +waist=clasp_of_compliance,id=251102,bonus_id=12806/13577/1808,gem_id=240916 +legs=abyssal_immolators_pillars,id=250041,bonus_id=13575,enchant_id=7935,ilevel=289 feet=slippers_of_the_midnight_flame,id=249305,bonus_id=4786/4800/12803/12806/1532,enchant_id=7993 -finger1=eye_of_midnight,id=249920,ilevel=289,gem_id=240898/240898,enchant_id=7997 -finger2=masterwork_sindorei_band,id=240949,bonus_id=8960/12214/13453/13622/13667/9627,gem_id=240898,enchant_id=7997,crafted_stats=32/36 +finger1=eye_of_midnight,id=249920,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916/240916 +finger2=occlusion_of_void,id=251217,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916 trinket1=emberwing_feather,id=250144,ilevel=289 trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 -main_hand=belomelorn_the_shattered_talon,id=249283,ilevel=289,enchant_id=7981 +main_hand=belomelorn_the_shattered_talon,id=251111,bonus_id=12806/13577,enchant_id=8039 off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 save=MID1_Warlock_Affliction.simc @@ -35,21 +35,21 @@ position=ranged_back talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZZWmZmlxAAWgBmFjGzAysBWGAAAmBAAmZAzMjxwwMjZmZGMzMzAAmBG default_pet=sayaad -head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/13575,ilevel=289,gem_id=240983,enchant_id=7961 -neck=eternal_voidsong_chain,id=249368,ilevel=289,gem_id=240890 -shoulder=abyssal_immolators_fury,id=250040,bonus_id=13574/13574,ilevel=289,enchant_id=8031 -back=adherents_silken_shroud,id=239656,bonus_id=8960/12214/13454/13622/13667/9627,crafted_stats=36/49 -chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575/13575,ilevel=289,enchant_id=7987 -wrist=voracious_wristwraps,id=249315,ilevel=289,gem_id=240890 -hands=abyssal_immolators_grasps,id=250043,bonus_id=13574/13574,ilevel=289 -waist=whisperinscribed_sash,id=249376,ilevel=289,gem_id=240890 -legs=abyssal_immolators_pillars,id=250041,bonus_id=13575/13575,ilevel=289,enchant_id=7935 +head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/1808,enchant_id=7961,gem_id=240983,ilevel=289 +neck=eternal_voidsong_chain,id=249368,bonus_id=12806/13577/13668,gem_id=240916 +shoulder=echoing_void_mantle,id=249328,bonus_id=12806/13577,enchant_id=8001 +back=adherents_silken_shroud,id=239656,bonus_id=12214/13622/13667/9627/8960/12384/8795,crafted_stats=36/49 +chest=abyssal_immolators_dreadrobe,id=250045,bonus_id=13575,enchant_id=7987,ilevel=289 +wrist=martyrs_bindings,id=239648,bonus_id=12214/13622/13667/12066/9627/1808/8960/12384/8795,gem_id=240916,crafted_stats=32/36 +hands=abyssal_immolators_grasps,id=250043,bonus_id=13574,ilevel=289 +waist=clasp_of_compliance,id=251102,bonus_id=12806/13577/1808,gem_id=240916 +legs=abyssal_immolators_pillars,id=250041,bonus_id=13575,enchant_id=7935,ilevel=289 feet=slippers_of_the_midnight_flame,id=249305,bonus_id=4786/4800/12803/12806/1532,enchant_id=7993 -finger1=eye_of_midnight,id=249920,ilevel=289,gem_id=240898/240898,enchant_id=7997 -finger2=masterwork_sindorei_band,id=240949,bonus_id=8960/12214/13453/13622/13667/9627,gem_id=240898,enchant_id=7997,crafted_stats=32/36 +finger1=eye_of_midnight,id=249920,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916/240916 +finger2=occlusion_of_void,id=251217,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916 trinket1=emberwing_feather,id=250144,ilevel=289 trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 -main_hand=belomelorn_the_shattered_talon,id=249283,ilevel=289,enchant_id=7981 +main_hand=belomelorn_the_shattered_talon,id=251111,bonus_id=12806/13577,enchant_id=8039 off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 save=MID1_Warlock_Affliction_Hellcaller.simc From 31b7949739b66ece4b93e3e686531820a0d16812 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 9 Mar 2026 02:23:06 +0200 Subject: [PATCH 5/7] [Warlock] Fix missing action list --- engine/class_modules/apl/warlock.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index 6279d6defae..72b9edb13dd 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -43,6 +43,7 @@ void affliction( player_t* p ) action_priority_list_t* precombat = p->get_action_priority_list( "precombat" ); action_priority_list_t* aoe = p->get_action_priority_list( "aoe" ); action_priority_list_t* cleave = p->get_action_priority_list( "cleave" ); + action_priority_list_t* st = p->get_action_priority_list( "st" ); action_priority_list_t* end_of_fight = p->get_action_priority_list( "end_of_fight" ); action_priority_list_t* items = p->get_action_priority_list( "items" ); action_priority_list_t* ogcd = p->get_action_priority_list( "ogcd" ); From adda9b76b11bb64073442452903fa3894806d338 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Mon, 9 Mar 2026 02:42:15 +0200 Subject: [PATCH 6/7] [Warlock] Updates to the cleave APL and fix a typo in the profile --- engine/class_modules/apl/warlock.cpp | 6 +++--- profiles/generators/MID1/MID1_Generate_Warlock.simc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index 72b9edb13dd..a9cc078c0fb 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -134,9 +134,9 @@ void affliction( player_t* p ) HC_cleave->add_action( "summon_darkglare" ); HC_cleave->add_action( "malevolence" ); HC_cleave->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|(!talent.patient_zero&!talent.sow_the_seeds)" ); - HC_cleave->add_action( "seed_of_corruption" ); - HC_cleave->add_action( "unstable_affliction,if=buff.shard_instability.react" ); + HC_cleave->add_action( "unstable_affliction,if=(pet.darkglare.active|buff.malevolence.remains|soul_shard>4|buff.shard_instability.react|buff.cascading_calamity.remainsadd_action( "seed_of_corruption,if=talent.patient_zero&talent.sow_the_seeds" ); + HC_cleave->add_action( "unstable_affliction,if=buff.shard_instability.react|(talent.cascading_calamity&buff.cascading_calamity.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); HC_cleave->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index b5a02213914..5ba3a2655d1 100644 --- a/profiles/generators/MID1/MID1_Generate_Warlock.simc +++ b/profiles/generators/MID1/MID1_Generate_Warlock.simc @@ -21,7 +21,7 @@ finger1=eye_of_midnight,id=249920,bonus_id=12806/13577/13668,enchant_id=7967,gem finger2=occlusion_of_void,id=251217,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916 trinket1=emberwing_feather,id=250144,ilevel=289 trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 -main_hand=belomelorn_the_shattered_talon,id=251111,bonus_id=12806/13577,enchant_id=8039 +main_hand=splitshroud_stinger,id=251111,bonus_id=12806/13577,enchant_id=8039 off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 save=MID1_Warlock_Affliction.simc @@ -49,7 +49,7 @@ finger1=eye_of_midnight,id=249920,bonus_id=12806/13577/13668,enchant_id=7967,gem finger2=occlusion_of_void,id=251217,bonus_id=12806/13577/13668,enchant_id=7967,gem_id=240916 trinket1=emberwing_feather,id=250144,ilevel=289 trinket2=gaze_of_the_alnseer,id=249343,ilevel=289 -main_hand=belomelorn_the_shattered_talon,id=251111,bonus_id=12806/13577,enchant_id=8039 +main_hand=splitshroud_stinger,id=251111,bonus_id=12806/13577,enchant_id=8039 off_hand=grimoire_of_the_eternal_light,id=249276,ilevel=289 save=MID1_Warlock_Affliction_Hellcaller.simc From d43bd67668d384b2dc7db4f4f086850976b4bc86 Mon Sep 17 00:00:00 2001 From: Xerfall Date: Thu, 12 Mar 2026 02:45:09 +0200 Subject: [PATCH 7/7] [Warlock] Updates to simplify APL hero tree fragments, and allow AoE APL to cast UA if not talented in StS --- engine/class_modules/apl/warlock.cpp | 96 +++++++++---------- .../MID1/MID1_Generate_Warlock.simc | 2 +- 2 files changed, 45 insertions(+), 53 deletions(-) diff --git a/engine/class_modules/apl/warlock.cpp b/engine/class_modules/apl/warlock.cpp index a9cc078c0fb..c9620f2b28a 100644 --- a/engine/class_modules/apl/warlock.cpp +++ b/engine/class_modules/apl/warlock.cpp @@ -41,93 +41,88 @@ void affliction( 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* aoe = p->get_action_priority_list( "aoe" ); - action_priority_list_t* cleave = p->get_action_priority_list( "cleave" ); - action_priority_list_t* st = p->get_action_priority_list( "st" ); action_priority_list_t* end_of_fight = p->get_action_priority_list( "end_of_fight" ); action_priority_list_t* items = p->get_action_priority_list( "items" ); action_priority_list_t* ogcd = p->get_action_priority_list( "ogcd" ); action_priority_list_t* variables = p->get_action_priority_list( "variables" ); action_priority_list_t* soul_harvester = p->get_action_priority_list( "soul_harvester" ); action_priority_list_t* hellcaller = p->get_action_priority_list( "hellcaller" ); - action_priority_list_t* SH_aoe = p->get_action_priority_list( "SH_aoe" ); + action_priority_list_t* SH_st = p->get_action_priority_list( "SH_st" ); action_priority_list_t* SH_cleave = p->get_action_priority_list( "SH_cleave" ); - action_priority_list_t* HC_aoe = p->get_action_priority_list( "HC_aoe" ); + action_priority_list_t* SH_aoe = p->get_action_priority_list( "SH_aoe" ); + action_priority_list_t* HC_st = p->get_action_priority_list( "HC_st" ); action_priority_list_t* HC_cleave = p->get_action_priority_list( "HC_cleave" ); + action_priority_list_t* HC_aoe = p->get_action_priority_list( "HC_aoe" ); precombat->add_action( "summon_pet" ); precombat->add_action( "grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled" ); precombat->add_action( "snapshot_stats" ); - precombat->add_action( "seed_of_corruption,if=talent.sow_the_seeds&active_enemies>1" ); - precombat->add_action( "haunt" ); + 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)" ); default_->add_action( "call_action_list,name=variables" ); default_->add_action( "call_action_list,name=end_of_fight" ); default_->add_action( "call_action_list,name=ogcd" ); default_->add_action( "call_action_list,name=items" ); - default_->add_action( "call_action_list,name=aoe,if=active_enemies>2" ); - default_->add_action( "call_action_list,name=cleave,if=active_enemies=2" ); - default_->add_action( "call_action_list,name=st,if=active_enemies<2" ); + default_->add_action( "call_action_list,name=soul_harvester,if=hero_tree.soul_harvester" ); + default_->add_action( "call_action_list,name=hellcaller,if=hero_tree.hellcaller" ); default_->add_action( "seed_of_corruption,if=talent.nocturnal_yield&active_enemies>1&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,if=pet.darkglare.active&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "drain_soul,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "shadow_bolt,if=buff.nightfall.react&(buff.nightfall.react=buff.nightfall.max_stack|buff.nightfall.remainsadd_action( "malefic_grasp,chain=1,early_chain_if=buff.nightfall.react,if=pet.darkglare.active" ); default_->add_action( "drain_soul,chain=1,early_chain_if=buff.nightfall.react,interrupt_if=tick_time>0.5" ); default_->add_action( "shadow_bolt" ); - st->add_action( "call_action_list,name=soul_harvester,if=talent.demonic_soul" ); - st->add_action( "call_action_list,name=hellcaller,if=talent.wither" ); - - cleave->add_action( "call_action_list,name=SH_cleave,if=talent.demonic_soul" ); - cleave->add_action( "call_action_list,name=HC_cleave,if=talent.wither" ); + soul_harvester->add_action( "call_action_list,name=SH_st,if=active_enemies=1" ); + soul_harvester->add_action( "call_action_list,name=SH_cleave,if=active_enemies=2" ); + soul_harvester->add_action( "call_action_list,name=SH_aoe,if=active_enemies>2" ); - aoe->add_action( "call_action_list,name=SH_aoe,if=talent.demonic_soul" ); - aoe->add_action( "call_action_list,name=HC_aoe,if=talent.wither" ); + hellcaller->add_action( "call_action_list,name=HC_st,if=active_enemies=1" ); + 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" ); - soul_harvester->add_action( "haunt,if=buff.nightfall.react<2" ); - soul_harvester->add_action( "agony,if=!ticking|refreshable" ); - soul_harvester->add_action( "corruption,if=!ticking|refreshable" ); - soul_harvester->add_action( "summon_darkglare,if=soul_shard<3|cooldown.dark_harvest.remains" ); - soul_harvester->add_action( "dark_harvest,if=soul_shard<3&execute_time<(dot.agony.remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); - soul_harvester->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); - soul_harvester->add_action( "unstable_affliction,if=pet.darkglare.active|soul_shard>1|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "haunt,if=buff.nightfall.react<2" ); + SH_st->add_action( "agony,if=!ticking|refreshable" ); + SH_st->add_action( "corruption,if=!ticking|refreshable" ); + SH_st->add_action( "summon_darkglare,if=soul_shard<3|cooldown.dark_harvest.remains" ); + SH_st->add_action( "dark_harvest,if=soul_shard<3&execute_time<(dot.agony.remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); + SH_st->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + SH_st->add_action( "unstable_affliction,if=pet.darkglare.active|soul_shard>1|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "haunt,if=buff.nightfall.react<2" ); - SH_cleave->add_action( "seed_of_corruption,if=!dot.corruption.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + 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( "dark_harvest" ); SH_cleave->add_action( "agony,if=refreshable" ); SH_cleave->add_action( "summon_darkglare" ); - SH_cleave->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); - SH_cleave->add_action( "drain_soul,if=!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); - SH_cleave->add_action( "shadow_bolt,if=!talent.patient_zero&!talent.sow_the_seeds&buff.nightfall.react>1" ); + SH_cleave->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|(!talent.patient_zero&!talent.sow_the_seeds)" ); SH_cleave->add_action( "seed_of_corruption" ); SH_aoe->add_action( "haunt,if=buff.nightfall.react<2" ); - SH_aoe->add_action( "seed_of_corruption,if=!dot.corruption.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + SH_aoe->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_aoe->add_action( "dark_harvest" ); SH_aoe->add_action( "agony,target_if=min:remains,if=active_dot.agony<5&remains<5" ); SH_aoe->add_action( "summon_darkglare" ); - SH_aoe->add_action( "seed_of_corruption" ); + 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( "agony,target_if=min:remains,if=remainsadd_action( "haunt,if=cooldown.haunt.ready" ); - hellcaller->add_action( "agony,if=!ticking|refreshable" ); - hellcaller->add_action( "wither,if=!ticking|refreshable" ); - hellcaller->add_action( "dark_harvest,if=execute_time<(dot.agony.remainsadd_action( "agony,if=dot.agony.remains<20&cooldown.summon_darkglare.remainsadd_action( "summon_darkglare" ); - hellcaller->add_action( "malevolence" ); - hellcaller->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|buff.malevolence.remains|soul_shard>4|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); - hellcaller->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); + SH_aoe->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "haunt,if=cooldown.haunt.ready" ); + HC_st->add_action( "agony,if=!ticking|refreshable" ); + HC_st->add_action( "wither,if=!ticking|refreshable" ); + HC_st->add_action( "dark_harvest,if=execute_time<(dot.agony.remainsadd_action( "agony,if=dot.agony.remains<20&cooldown.summon_darkglare.remainsadd_action( "summon_darkglare" ); + HC_st->add_action( "malevolence" ); + HC_st->add_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active&pet.darkglare.remainsadd_action( "unstable_affliction,if=pet.darkglare.active|buff.malevolence.remains|soul_shard>4|(talent.shard_instability&buff.shard_instability.react)|buff.cascading_calamity.remainsadd_action( "haunt,if=cooldown.haunt.ready" ); - HC_cleave->add_action( "seed_of_corruption,if=talent.patient_zero&talent.sow_the_seeds&!dot.wither.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption" ); + HC_cleave->add_action( "seed_of_corruption,if=talent.sow_the_seeds&!dot.wither.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); HC_cleave->add_action( "wither,target_if=min:remains,if=remains<5&!(action.seed_of_corruption.in_flight|dot.seed_of_corruption.remains>0)&fight_remains>remains+5" ); HC_cleave->add_action( "agony,if=refreshable" ); HC_cleave->add_action( "dark_harvest" ); @@ -137,21 +132,18 @@ void affliction( player_t* p ) HC_cleave->add_action( "unstable_affliction,if=(pet.darkglare.active|buff.malevolence.remains|soul_shard>4|buff.shard_instability.react|buff.cascading_calamity.remainsadd_action( "seed_of_corruption,if=talent.patient_zero&talent.sow_the_seeds" ); HC_cleave->add_action( "unstable_affliction,if=buff.shard_instability.react|(talent.cascading_calamity&buff.cascading_calamity.remainsadd_action( "drain_soul,if=buff.nightfall.react>1" ); - HC_cleave->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); HC_aoe->add_action( "haunt,if=cooldown.haunt.ready" ); - HC_aoe->add_action( "seed_of_corruption,if=!dot.wither.ticking&!dot.seed_of_corruption.ticking&!prev.seed_of_corruption&!action.seed_of_corruption.in_flight" ); + 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( "summon_darkglare" ); HC_aoe->add_action( "malevolence" ); - HC_aoe->add_action( "seed_of_corruption" ); + HC_aoe->add_action( "seed_of_corruption,if=talent.sow_the_seeds" ); + HC_aoe->add_action( "unstable_affliction,if=(pet.darkglare.active|buff.malevolence.remains|soul_shard>4|buff.shard_instability.react|buff.cascading_calamity.remainsadd_action( "unstable_affliction,if=buff.shard_instability.react" ); HC_aoe->add_action( "agony,target_if=min:remains,if=remainsadd_action( "malefic_grasp,if=talent.malefic_grasp&pet.darkglare.active" ); - HC_aoe->add_action( "drain_soul,if=buff.nightfall.react>1" ); - HC_aoe->add_action( "shadow_bolt,if=buff.nightfall.react>1" ); end_of_fight->add_action( "unstable_affliction,if=soul_shard&fight_remains<8&(!talent.patient_zero&!talent.sow_the_seeds)" ); end_of_fight->add_action( "drain_soul,if=buff.nightfall.react&fight_remains<5" ); diff --git a/profiles/generators/MID1/MID1_Generate_Warlock.simc b/profiles/generators/MID1/MID1_Generate_Warlock.simc index 5ba3a2655d1..8630a8b617a 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=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjtlBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZGzgZmZGAwMwA +talents=CkQAAAAAAAAAAAAAAAAAAAAAAwMzMzoZhhZmZmlBAAYmZxyMzsMzAAjllBGwEMDbBG2GAAAmBAAwMDzMjBGmZmZGzgZmZGAwMwA default_pet=sayaad head=abyssal_immolators_smoldering_flames,id=250042,bonus_id=13575/1808,enchant_id=7961,gem_id=240983,ilevel=289