Skip to content

Commit 1e4191b

Browse files
jordanritzie19Dreamgrove
andcommitted
[Feral] Update dslice support
dreamgrove/dreamgrove@67f37a2 Co-authored-by: Dreamgrove <dreamgrove@github.com>
1 parent 5c6e708 commit 1e4191b

1 file changed

Lines changed: 30 additions & 28 deletions

File tree

engine/class_modules/apl/feral_apl.inc

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,54 +15,55 @@ precombat->add_action( "variable,name=regrowth,op=reset","optional variable that
1515
precombat->add_action( "variable,name=easy_swipe,op=reset","optional variable that forgoes shredding in AoE. Turned off by default" );
1616
precombat->add_action( "prowl,if=!buff.prowl.up" );
1717

18-
def->add_action( "prowl,if=buff.bs_inc.down&!buff.prowl.up" );
18+
def->add_action( "prowl,if=buff.bs_inc.down&!buff.prowl.up&!buff.shadowmeld.up" );
1919
def->add_action( "cat_form,if=!buff.cat_form.up&!talent.fluid_form" );
2020
def->add_action( "invoke_external_buff,name=power_infusion,if=buff.bs_inc.up|!talent.berserk_heart_of_the_lion","Line up <a href='https://www.wowhead.com/spell=10060/power-infusion'>Power Infusion</a> with <a href='https://www.wowhead.com/spell=106951/berserk'>Berserk</a>." );
2121
def->add_action( "auto_attack,if=!buff.prowl.up&!buff.shadowmeld.up" );
22-
def->add_action( "rake,if=time<1&buff.prowl.up" );
22+
def->add_action( "rake,if=time<1&buff.prowl.up|talent.killing_strikes&(buff.prowl.up|buff.shadowmeld.up)&combo_points=5","rake on pull, also rake at the start of a dungeon pull to get into combat with killing strikes" );
2323
def->add_action( "tigers_fury,target_if=max:time_to_die,if=(hero_tree.wildstalker&(!talent.bloodtalons|buff.bloodtalons.up)&dot.rip.refreshable&combo_points>=3&talent.rip_and_tear|combo_points=5)&(fight_remains<=15|cooldown.bs_inc.remains>20&target.time_to_die>5|cooldown.bs_inc.ready&target.time_to_die>12|target.time_to_die=fight_remains)" );
2424
def->add_action( "natures_vigil,if=spell_targets.swipe_cat>0&variable.regrowth" );
2525
def->add_action( "renewal,if=spell_targets.swipe_cat>0&variable.regrowth" );
2626
def->add_action( "adaptive_swarm,target_if=dot.adaptive_swarm_damage.stack<3&(!dot.adaptive_swarm_damage.ticking|dot.adaptive_swarm_damage.remains<2),if=!action.adaptive_swarm_damage.in_flight&(spell_targets=1|!talent.unbridled_swarm)&(dot.rip.ticking|hero_tree.druid_of_the_claw)","TODO: maybe nerf this since the sim seems to be netting more uptime than real-life players" );
2727
def->add_action( "adaptive_swarm,target_if=max:(1+dot.adaptive_swarm_damage.stack)*dot.adaptive_swarm_damage.stack<3*time_to_die,if=buff.cat_form.up&dot.adaptive_swarm_damage.stack<3&talent.unbridled_swarm.enabled&spell_targets.swipe_cat>1&dot.rip.ticking","TODO: simplify the targeting logic. Realistically its just being sent at a target with 2 or fewer stacks. The current line is too much overhead." );
2828
def->add_action( "variable,name=need_bt,value=talent.bloodtalons&buff.bloodtalons.stack<=1","variable that tells us when we want to prioritize proccing bt, currently thats at 0 or 1 stack of bloodtalons" );
29+
def->add_action( "cancel_buff,name=apex_predators_craving,if=buff.bs_inc.up&talent.saber_jaws","is this cringe? yes it is. Complain on the forums" );
2930
def->add_action( "ferocious_bite,if=buff.apex_predators_craving.up&!(variable.need_bt&active_bt_triggers=2)&(!buff.bs_inc.up|buff.ravage.up)" );
3031
def->add_action( "call_action_list,name=cooldown,if=dot.rip.ticking" );
3132
def->add_action( "call_action_list,name=rip_variable,if=talent.rip_and_tear&spell_targets=1&hero_tree.wildstalker&buff.tigers_fury.up&!buff.bs_inc.up&(buff.bloodtalons.up|!talent.bloodtalons)","limit how often we check what rips new pandemic'd duration would be." );
3233
def->add_action( "rip,if=talent.rip_and_tear&spell_targets=1&hero_tree.wildstalker&buff.tigers_fury.up&!buff.bs_inc.up&(buff.bloodtalons.up|!talent.bloodtalons)&(combo_points>=3&refreshable&cooldown.tigers_fury.remains>25|buff.tigers_fury.remains<5&variable.rip_duration>cooldown.tigers_fury.remains&cooldown.tigers_fury.remains>=dot.rip.remains)","with rip and tear, as wildstalker, we do 3cp rips" );
33-
def->add_action( "call_action_list,name=builder,if=(buff.bs_inc.up&!buff.ravage.up&!buff.coiled_to_spring.up&hero_tree.druid_of_the_claw&talent.coiled_to_spring&spell_targets<=2)|buff.bloodtalons.stack=0&active_bt_triggers=2" );
34+
def->add_action( "variable,name=stealth_bonus,value=buff.sudden_ambush.up|buff.prowl.up|buff.shadowmeld.up" );
35+
def->add_action( "call_action_list,name=builder,if=(buff.bs_inc.up&!buff.ravage.up&!buff.coiled_to_spring.up&hero_tree.druid_of_the_claw&talent.coiled_to_spring&spell_targets<=2)|spell_targets=1&buff.bloodtalons.stack=0&active_bt_triggers=2" );
36+
def->add_action( "call_action_list,name=aoe_builder,if=spell_targets>=2&buff.bloodtalons.stack=0&active_bt_triggers=2" );
3437
def->add_action( "wait,sec=!cooldown.tigers_fury.remains,if=combo_points=5&cooldown.tigers_fury.remains<3&spell_targets=1" );
3538
def->add_action( "call_action_list,name=finisher,if=combo_points=5" );
3639
def->add_action( "call_action_list,name=builder,if=spell_targets.swipe_cat=1&combo_points<5" );
3740
def->add_action( "call_action_list,name=aoe_builder,if=spell_targets.swipe_cat>=2&combo_points<5" );
38-
def->add_action( "tigers_fury,if=(!cooldown.bs_inc.remains|cooldown.bs_inc.remains>20)","if we cant do anything else, then sure, tigers fury early" );
41+
def->add_action( "tigers_fury,if=(!cooldown.bs_inc.remains|cooldown.bs_inc.remains>20)&(fight_remains<=15|cooldown.bs_inc.remains>20&target.time_to_die>5|cooldown.bs_inc.ready&target.time_to_die>12|target.time_to_die=fight_remains)","if we cant do anything else, then sure, tigers fury early" );
3942
def->add_action( "regrowth,if=buff.predatory_swiftness.up&variable.regrowth" );
4043

41-
aoe_builder->add_action( "thrash_cat,target_if=max:time_to_die,if=refreshable&!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)&remains<time_to_die","maintain thrash highest prio" );
42-
aoe_builder->add_action( "brutal_slash,target_if=min:time_to_die,if=(cooldown.brutal_slash.full_recharge_time<4|time_to_die<4|raid_event.adds.remains<4|(buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw))&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))","avoid capping brs charges. Also send brutal slashes/ws swipe in aoe, even if we need to proc bloodtalons, during berserk." );
43-
aoe_builder->add_action( "swipe_cat,target_if=min:time_to_die,if=talent.wild_slashes&(time_to_die<4|raid_event.adds.remains<4|buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw)&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))" );
44-
aoe_builder->add_action( "swipe_cat,if=time_to_die<4|(talent.wild_slashes&spell_targets.swipe_cat>4&!(variable.need_bt&buff.bt_swipe.up))","with wild slashes we swipe at 5+ targets over raking/moonfire" );
45-
aoe_builder->add_action( "prowl,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&gcd.remains=0&!buff.sudden_ambush.up&!buff.clearcasting.at_max_stacks" );
46-
aoe_builder->add_action( "shadowmeld,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&!buff.sudden_ambush.up&!buff.prowl.up&!buff.clearcasting.at_max_stacks" );
44+
aoe_builder->add_action( "thrash_cat,target_if=max:time_to_die,if=refreshable&!talent.thrashing_claws&remains<time_to_die","maintain thrash highest prio" );
45+
aoe_builder->add_action( "brutal_slash,target_if=min:time_to_die,if=(buff.bloodtalons.stack>0|!active_bt_triggers=2)&buff.bs_inc.up&spell_targets.brutal_slash>=3-hero_tree.druid_of_the_claw|!(variable.need_bt&buff.bt_swipe.up)&(cooldown.brutal_slash.full_recharge_time<4|time_to_die<4|raid_event.adds.remains<4)","During berserk, in aoe, we ignore bloodtalons in order to cast more brutal slashes/wild slashes swipes" );
46+
aoe_builder->add_action( "swipe_cat,target_if=min:time_to_die,if=talent.wild_slashes&((buff.bloodtalons.stack>0|!active_bt_triggers=2)&buff.bs_inc.up&spell_targets.swipe_cat>=3-hero_tree.druid_of_the_claw|!(variable.need_bt&buff.bt_swipe.up)&(time_to_die<4|raid_event.adds.remains<4))","TODO: recheck this line" );
47+
aoe_builder->add_action( "swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>=5&!(variable.need_bt&buff.bt_swipe.up)","with wild slashes we swipe at 5+ targets over raking/moonfire" );
48+
aoe_builder->add_action( "prowl,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&gcd.remains=0&!buff.sudden_ambush.up&!buff.clearcasting.at_max_stacks","TODO: update/check new meld/prowl logic for aoe" );
49+
aoe_builder->add_action( "prowl,if=buff.bs_inc.remains<1&!buff.shadowmeld.up&(fight_style.dungeonroute|fight_style.dungeonslice)","we use prowl here just to trigger killing strikes combat reset" );
50+
aoe_builder->add_action( "shadowmeld,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=(!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&!variable.stealth_bonus&!buff.clearcasting.at_max_stacks)&(!fight_style.dungeonroute&!fight_style.dungeonslice|!buff.killing_strikes_combat.up&!buff.incarnation_avatar_of_ashamane.up)","in dungeon sims, in non-boss combat, we want to save shadowmeld until we can use it to trigger a killing strikes reset" );
4751
aoe_builder->add_action( "rake,target_if=refreshable,if=talent.doubleclawed_rake&!(variable.need_bt&buff.bt_rake.up)&!buff.clearcasting.at_max_stacks","dcr rake > moonfire" );
48-
aoe_builder->add_action( "swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>2&!(variable.need_bt&buff.bt_swipe.up)","at 3t with wild slashes, swipe is better than moonfiring/st rake" );
49-
aoe_builder->add_action( "rake,target_if=max:dot.rake.ticking,if=!dot.rake.ticking&hero_tree.wildstalker","if wildstalker make sure you have at least one rake up" );
50-
aoe_builder->add_action( "moonfire_cat,target_if=refreshable,if=!(variable.need_bt&buff.bt_moonfire.up)&!buff.clearcasting.at_max_stacks","li moonfire is better than non-dcr rake in aoe if we already have 1 rake" );
51-
aoe_builder->add_action( "rake,target_if=refreshable,if=!(variable.need_bt&buff.bt_rake.up)&!buff.clearcasting.at_max_stacks" );
52+
aoe_builder->add_action( "swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>=3&!(variable.need_bt&buff.bt_swipe.up)","at 3t with wild slashes, swipe is better than moonfiring/st rake" );
53+
aoe_builder->add_action( "rake,target_if=max:dot.rake.ticking,if=!dot.rake.ticking&hero_tree.wildstalker","if wildstalker make sure you have at least one rake up TODO: check if this should be higher priority, or rake count should be higher" );
54+
aoe_builder->add_action( "moonfire_cat,target_if=refreshable,if=!(variable.need_bt&buff.bt_moonfire.up)&!buff.clearcasting.at_max_stacks","li moonfire is better than non-dcr rake in aoe if we already have 1 rake TODO: see if this is still true with real vines implementation" );
5255
aoe_builder->add_action( "brutal_slash,if=!(variable.need_bt&buff.bt_swipe.up)","fillers" );
5356
aoe_builder->add_action( "swipe_cat,if=!(variable.need_bt&buff.bt_swipe.up)" );
54-
aoe_builder->add_action( "shred,if=!buff.sudden_ambush.up&!variable.easy_swipe&!(variable.need_bt&buff.bt_shred.up)" );
55-
aoe_builder->add_action( "thrash_cat,if=!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)" );
56-
aoe_builder->add_action( "rake,target_if=max:ticks_gained_on_refresh,if=talent.doubleclawed_rake&buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down","fallback bt actions" );
57+
aoe_builder->add_action( "rake,target_if=refreshable,if=!(variable.need_bt&buff.bt_rake.up)" );
58+
aoe_builder->add_action( "thrash_cat,if=!(variable.need_bt&buff.bt_thrash.up)&spell_targets>=3" );
59+
aoe_builder->add_action( "shred,if=!(variable.need_bt&buff.bt_shred.up)" );
60+
aoe_builder->add_action( "thrash_cat,if=!(variable.need_bt&buff.bt_thrash.up)","fallback bt actions" );
5761
aoe_builder->add_action( "moonfire_cat,target_if=max:ticks_gained_on_refresh,if=variable.need_bt&buff.bt_moonfire.down" );
58-
aoe_builder->add_action( "rake,target_if=max:ticks_gained_on_refresh,if=buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down" );
5962
aoe_builder->add_action( "shred,if=variable.need_bt&buff.bt_shred.down&!variable.easy_swipe" );
6063
aoe_builder->add_action( "rake,target_if=pmultiplier<1.6,if=variable.need_bt&buff.bt_rake.down" );
61-
aoe_builder->add_action( "thrash_cat,if=variable.need_bt&buff.bt_thrash.down" );
6264

63-
builder->add_action( "variable,name=stealth_bonus,value=buff.sudden_ambush.up|buff.prowl.up|buff.shadowmeld.up" );
64-
builder->add_action( "prowl,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip)" );
65-
builder->add_action( "shadowmeld,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip)&buff.bs_inc.up","TODO: with incarnation and dungeonslice/dungeonroute, we almost certainly want to split meld use away from prowl use to take advantage of Killing Strikes" );
65+
builder->add_action( "prowl,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip|prev_gcd.1.primal_wrath)" );
66+
builder->add_action( "shadowmeld,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip|prev_gcd.1.primal_wrath)&buff.bs_inc.up" );
6667
builder->add_action( "rake,if=(refreshable&persistent_multiplier>=pmultiplier|remains<2|persistent_multiplier>pmultiplier)&!(variable.need_bt&buff.bt_rake.up)&(hero_tree.wildstalker|!buff.bs_inc.up|variable.stealth_bonus)","freely upgrade rakes unless you're dotc inside berserk-- in which case only upgrade to stealth rakes" );
6768
builder->add_action( "shred,if=variable.stealth_bonus&buff.bs_inc.up" );
6869
builder->add_action( "brutal_slash,if=cooldown.brutal_slash.full_recharge_time<4&!(variable.need_bt&buff.bt_swipe.up)" );
@@ -98,13 +99,14 @@ cooldown->add_action( "berserk,if=buff.tigers_fury.up&!variable.holdBerserk" );
9899
cooldown->add_action( "feral_frenzy,if=combo_points<=1+buff.bs_inc.up" );
99100
cooldown->add_action( "convoke_the_spirits,if=fight_remains<5|buff.bs_inc.up&buff.bs_inc.remains<5-talent.ashamanes_guidance|buff.tigers_fury.up&!variable.holdConvoke&(combo_points<=4|buff.bs_inc.up&combo_points<=3)","always line up convoke with berserk if you can" );
100101

101-
finisher->add_action( "primal_wrath,target_if=max:dot.bloodseeker_vines.ticking,if=spell_targets.primal_wrath>1&((dot.primal_wrath.remains<6.5&!buff.bs_inc.up|dot.primal_wrath.refreshable)|(!talent.rampant_ferocity.enabled&(spell_targets.primal_wrath>1&!dot.bloodseeker_vines.ticking&!buff.ravage.up|spell_targets.primal_wrath>6+talent.ravage)))","maintain/upgrade pws, if we have 6.5+s left on pw, we will instead bite if we have rampant ferocity talented. Without rampant, we will bite a vined target with 6 or fewer targets. If we have Ravage, we use specifically Ravage at 7 or fewer targets." );
102-
finisher->add_action( "rip,target_if=refreshable,if=(!talent.primal_wrath|spell_targets=1)&(buff.bloodtalons.up|!talent.bloodtalons)&(buff.tigers_fury.up|dot.rip.remains<cooldown.tigers_fury.remains)&(remains<fight_remains|remains<4&buff.ravage.up)","rip if single target or pw isnt up. Rip with bloodtalons if talented. If tigers fury will be up before rip falls off, then delay refresh" );
103-
finisher->add_action( "call_action_list,name=aoe_builder,if=hero_tree.druid_of_the_claw&buff.bs_inc.up&!buff.ravage.up&spell_targets>=2","only bite with ravage in aoe with berserk" );
102+
finisher->add_action( "primal_wrath,target_if=min:dot.primal_wrath.ticking,if=spell_targets.primal_wrath>1&(dot.primal_wrath.remains<6.5&!buff.bs_inc.up|dot.primal_wrath.refreshable)","primal wrath in pandemic during berserk, or with 6.5s left outside berserk" );
103+
finisher->add_action( "rip,target_if=refreshable,if=(!talent.primal_wrath|spell_targets=1)&(buff.bloodtalons.up|!talent.bloodtalons)&(buff.tigers_fury.up|dot.rip.remains<cooldown.tigers_fury.remains)&(remains<fight_remains|remains<4&buff.ravage.up)","rip instead in single target" );
104+
finisher->add_action( "call_action_list,name=aoe_builder,if=hero_tree.druid_of_the_claw&buff.bs_inc.up&!buff.ravage.up&spell_targets>=2","only bite with ravage in aoe during berserk" );
105+
finisher->add_action( "pool_resource,for_next=1","bite > clip pw if pw isnt talented / its single target / sub-7 targets + vine up / sub 8 targets + ravage up / rampant talented" );
106+
finisher->add_action( "ferocious_bite,target_if=max:dot.bloodseeker_vines.ticking,if=(hero_tree.wildstalker&spell_targets>1|buff.bs_inc.up)&(spell_targets=1|!talent.primal_wrath|talent.rampant_ferocity|buff.ravage.up|dot.bloodseeker_vines.ticking&spell_targets<7)","low energy bite during berserk/wildstalker aoe" );
104107
finisher->add_action( "pool_resource,for_next=1" );
105-
finisher->add_action( "ferocious_bite,target_if=max:dot.bloodseeker_vines.ticking,if=buff.bs_inc.up|spell_targets>1&hero_tree.wildstalker" );
106-
finisher->add_action( "pool_resource,for_next=1" );
107-
finisher->add_action( "ferocious_bite,max_energy=1,target_if=max:dot.bloodseeker_vines.ticking,if=!buff.bs_inc.up" );
108+
finisher->add_action( "ferocious_bite,max_energy=1,if=(!talent.primal_wrath|spell_targets=1|talent.rampant_ferocity|buff.ravage.up)" );
109+
finisher->add_action( "primal_wrath,if=spell_targets.primal_wrath>1","primal wrath fallback (2+ targets, no vine or 7+ targets, wildstalker, no rampant)" );
108110

109111
cd_variable->add_action( "variable,name=convokeCountRemaining,value=floor(((fight_remains-variable.convoke_cd)%cooldown.convoke_the_spirits.duration)+(fight_remains>cooldown.convoke_the_spirits.remains))","TLDR, maximize number of cooldown overlaps whilst minimizing number of casts lost." );
110112
cd_variable->add_action( "variable,name=zerkCountRemaining,value=floor(((fight_remains-variable.bs_inc_cd)%cooldown.bs_inc.duration)+(fight_remains>cooldown.bs_inc.remains))" );

0 commit comments

Comments
 (0)