## Feral Druid ## August 21, 2022 ## Changes: ## - druid.owlweave_cat=1 checks to druid.owlweave_cat. ## - Convert BT pool_resource to wait expression (x2). ## - Add interruptible Fleshcraft if you have nothing else to do. ## - Revise holding Convoke, Berserk, Inc for Rip if you won't rip. ## - Support filler Regrowth while pooling for Bloodtalons. ## - Work on Adaptive Swarm support. actions.precombat+=/variable,name=fourcp_bite,value=0 # Defines what ability to use as a filler. Shred = 0, Non-snapshot Rake = 1, Snapshot Rake = 2, LI = 3, Swipe = 4 actions.precombat+=/variable,name=filler,value=1 actions.precombat+=/variable,name=rip_ticks,value=7 # If I'm not going to use Rip, pretend Rip is up for CDs and such. actions.precombat+=/variable,name=ripped,value=active_dot.rip>0|druid.rip.ticks_gained_on_refresh<=variable.rip_ticks actions.precombat+=/kindred_spirits actions.precombat+=/bottled_flayedwing_toxin actions.precombat+=/fleshcraft,if=soulbind.pustule_eruption.enabled|soulbind.volatile_solvent.enabled actions.precombat+=/prowl,if=buff.moonkin_form.down actions.precombat+=/cat_form,if=buff.moonkin_form.down # Cache of acquired treasures does not seem to work yet and has to be seen actions.precombat+=/variable,name=on_use_trinket,value=0 actions.precombat+=/variable,name=on_use_trinket,op=add,if=(trinket.1.has_use_buff&trinket.1.cooldown.duration)|trinket.1.is.inscrutable_quantum_device,value=1 actions.precombat+=/variable,name=on_use_trinket,op=add,if=(trinket.2.has_use_buff&trinket.2.cooldown.duration)|trinket.2.is.inscrutable_quantum_device,value=2 actions.precombat+=/variable,name=max_trinket_hold,value=61 actions=run_action_list,name=balance,strict=1,if=buff.moonkin_form.up&!druid.owlweave_cat actions+=/call_action_list,name=owlweave,strict=1,if=druid.owlweave_cat # Prowl whenever possible actions+=/prowl actions+=/tigers_fury,if=buff.cat_form.down actions+=/cat_form,if=buff.cat_form.down ## actions+=/variable,name=shortest_ttd,value=target.time_to_die ## actions+=/cycling_variable,name=shortest_ttd,op=min,value=target.time_to_die # One shot stealth actions+=/run_action_list,name=stealth,strict=1,if=buff.shadowmeld.up|buff.prowl.up actions+=/skull_bash actions+=/call_action_list,name=setup,strict=1,if=active_dot.rip=0&fight_remains>=12 actions+=/call_action_list,name=cooldown # Necrolord: Cast 3 or 4 combo point rips on single target outside of berserk or during berserk if feral frenzy is up OR apply a 5cp Rip when TF is up and will soon fall off. actions+=/rip,if=covenant.necrolord&(!talent.bloodtalons.enabled|buff.bloodtalons.up)&spell_targets.thrash_cat=1&(combo_points>2&refreshable&druid.rip.ticks_gained_on_refresh>variable.rip_ticks&(!buff.bs_inc.up|cooldown.bs_inc.up|(buff.bs_inc.up&cooldown.feral_frenzy.up))|combo_points=5&buff.tigers_fury.up&buff.tigers_fury.remains<4&druid.rip.ticks_gained_on_refresh>5) actions+=/run_action_list,name=finisher,strict=1,if=combo_points>=(5-variable.fourcp_bite) actions+=/primal_wrath,if=druid.primal_wrath.ticks_gained_on_refresh>=20&combo_points>=2,line_cd=5 # Multi-gcd stealth actions+=/call_action_list,name=stealth,strict=1,if=buff.bs_inc.up actions+=/regrowth,if=settings.filler_regrowth&talent.bloodtalons.enabled&buff.bloodtalons.down&active_bt_triggers=0&1.5*gcd.max<(((115-23*buff.incarnation_king_of_the_jungle.up)-(energy.current+3.5*energy.regen+(40*buff.clearcasting.up)))/energy.regen) # The most expensive BT cycle (Thresh Shred Swipe cost 115 energy, make sure we can make that in 4 globals) actions+=/wait,sec=((115-23*buff.incarnation_king_of_the_jungle.up)-(energy.current+3.5*energy.regen+(40*buff.clearcasting.up)))/energy.regen,if=talent.bloodtalons.enabled&buff.bloodtalons.down&active_bt_triggers=0 ## actions+=/pool_resource,if=talent.bloodtalons.enabled&buff.bloodtalons.down&(energy+3.5*energy.regen+(40*buff.clearcasting.up))<(115-23*buff.incarnation_king_of_the_jungle.up)&active_bt_triggers=0 actions+=/run_action_list,name=bloodtalons,if=talent.bloodtalons.enabled&buff.bloodtalons.down actions+=/ferocious_bite,cycle_targets=1,if=buff.apex_predators_craving.up actions+=/pool_resource,for_next=1 actions+=/rake,cycle_targets=1,if=(refreshable|persistent_multiplier>dot.rake.pmultiplier)&druid.rake.ticks_gained_on_refresh>spell_targets.swipe_cat*2-2 actions+=/lunar_inspiration,cycle_targets=1,if=(refreshable|persistent_multiplier>dot.lunar_inspiration.pmultiplier)&druid.lunar_inspiration.ticks_gained_on_refresh>spell_targets.swipe_cat*2-2 actions+=/pool_resource,for_next=1 actions+=/thrash_cat,cycle_targets=1,if=refreshable&druid.thrash_cat.ticks_gained_on_refresh>(4+spell_targets.thrash_cat*4)%(1+mastery_value)-conduit.taste_for_blood.enabled-covenant.necrolord&(!buff.bs_inc.up|spell_targets.thrash_cat>1) actions+=/pool_resource,for_next=1 actions+=/brutal_slash,if=(raid_event.adds.in>(1+max_charges-charges_fractional)*recharge_time)&(spell_targets.brutal_slash*action.brutal_slash.damage%action.brutal_slash.cost)>(action.shred.damage%action.shred.cost) actions+=/swipe_cat,if=spell_targets.swipe_cat>1+buff.bs_inc.up*2 actions+=/thrash_cat,if=spell_targets.thrash_cat>3 actions+=/shred,if=buff.clearcasting.up&(buff.sudden_ambush.down&buff.shadowmeld.down|buff.bs_inc.up) actions+=/call_action_list,name=filler actions.bloodtalons=rake,cycle_targets=1,if=(!ticking|(1.2*persistent_multiplier>=dot.rake.pmultiplier)|(active_bt_triggers=2&refreshable))&buff.bt_rake.down actions.bloodtalons+=/lunar_inspiration,cycle_targets=1,if=refreshable&buff.bt_moonfire.down actions.bloodtalons+=/thrash_cat,cycle_targets=1,if=refreshable&buff.bt_thrash.down&druid.thrash_cat.ticks_gained_on_refresh>(4+spell_targets.thrash_cat*4)%(1+mastery_value)-conduit.taste_for_blood.enabled actions.bloodtalons+=/brutal_slash,if=buff.bt_brutal_slash.down actions.bloodtalons+=/swipe_cat,if=buff.bt_swipe.down&spell_targets.swipe_cat>1 actions.bloodtalons+=/shred,if=buff.bt_shred.down actions.bloodtalons+=/swipe_cat,if=buff.bt_swipe.down actions.bloodtalons+=/thrash_cat,if=buff.bt_thrash.down actions.cooldown=adaptive_swarm,cycle_targets=1,if=((!dot.adaptive_swarm_damage.ticking|dot.adaptive_swarm_damage.remains<2)&(dot.adaptive_swarm_damage.stack<3|!dot.adaptive_swarm_heal.stack>1)&!buff.adaptive_swarm_heal_in_flight.up&!buff.adaptive_swarm_damage_in_flight.up)&target.time_to_die>5|active_enemies>2&!dot.adaptive_swarm_damage.ticking&energy<35&target.time_to_die>5 actions.cooldown+=/fleshcraft,if=(soulbind.pustule_eruption|soulbind.volatile_solvent),interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent actions.cooldown+=/trinket1,if=((cooldown.convoke_the_spirits.remains<2&(buff.bs_inc.up|cooldown.bs_inc.remains>10))|boss&fight_remains<20)|(cooldown.convoke_the_spirits.remains-2>variable.max_trinket_hold)|variable.on_use_trinket=0|(variable.on_use_trinket=2&(cooldown.convoke_the_spirits.remains>22|boss&fight_remains<20|trinket.2.cooldown.remains>20)) actions.cooldown+=/trinket2,if=((cooldown.convoke_the_spirits.remains<2&(buff.bs_inc.up|cooldown.bs_inc.remains>10)&(trinket.1.cooldown.remains>=2|variable.on_use_trinket=2))|boss&fight_remains<20)|((cooldown.convoke_the_spirits.remains-2+60*((trinket.1.cooldown.remains=3)))>variable.max_trinket_hold)|variable.on_use_trinket=0|(variable.on_use_trinket=1&(cooldown.convoke_the_spirits.remains>22|boss&fight_remains<20|trinket.1.cooldown.remains>20)) # This should use any other equippable stuff, since both trinket slots are already accounted for. actions.cooldown+=/use_items # Cast Tiger's Fury before (or immediatly after) casting Feral Frenzy if Berserk is NOT on cooldown. actions.cooldown+=/tigers_fury,sync=feral_frenzy,if=cooldown.bs_inc.up actions.cooldown+=/feral_frenzy,cycle_targets=1,if=combo_points<3&target.time_to_die>7&(buff.savage_roar.up|!talent.savage_roar.enabled)&(!cooldown.tigers_fury.up|cooldown.bs_inc.up)|boss&fight_remains<8&fight_remains>2 # TODO: Need to sync with with ravenous frenzy when we run frenzyband, or atleast check if its worth it actions.cooldown+=/berserk,if=variable.ripped&(cooldown.convoke_the_spirits.up|cooldown.convoke_the_spirits.remains>32|boss&fight_remains<20) actions.cooldown+=/incarnation,if=variable.ripped&(cooldown.convoke_the_spirits.up|boss&fight_remains<30) # Try and not waste TF energy, but also just use it for zerk and incarns actions.cooldown+=/tigers_fury,if=energy.deficit>40|buff.bs_inc.up|(talent.predator.enabled&shortest_ttd<3)|(active_dot.rip=0&buff.bloodtalons.up) # Might be wrong to use Smeld on Rake in very very niche situations, but very rarely actions.cooldown+=/shadowmeld,if=buff.tigers_fury.up&buff.bs_inc.down&combo_points<4&buff.sudden_ambush.down&dot.rake.pmultiplier<1.6&energy>40&druid.rake.ticks_gained_on_refresh>spell_targets.swipe_cat*2-2&target.time_to_die>5 actions.cooldown+=/berserking,if=buff.tigers_fury.up|buff.bs_inc.up actions.cooldown+=/potion,if=buff.bs_inc.up|boss&fight_remains4&combo_points<5&(dot.rake.ticking|spell_targets.thrash_cat>1)&energy.deficit>=20&cooldown.bs_inc.remains>10)|boss&fight_remains<5|(buff.bs_inc.up&buff.bs_inc.remains>12) # Maybe there should be more conditions on the conduit actions.cooldown+=/empower_bond,if=buff.tigers_fury.up|(conduit.deep_allegiance.enabled) # Give priority to on-use weapon actions.cooldown+=/use_item,name=jotungeirr_destinys_call actions.cooldown+=/use_items actions.filler=rake,cycle_targets=1,if=variable.filler=1&refreshable&dot.rake.pmultiplier<=1.2*persistent_multiplier actions.filler+=/rake,if=variable.filler=2 actions.filler+=/lunar_inspiration,if=variable.filler=3 actions.filler+=/swipe,if=variable.filler=4 actions.filler+=/swipe_cat,if=spell_targets.swipe_cat=1&!buff.clearcasting.up actions.filler+=/shred,if=buff.sudden_ambush.down actions.filler+=/regrowth,if=settings.filler_regrowth&selection_time>1.5*gcd.max ## actions.filler+=/fleshcraft,if=soulbind.pustule_eruption.enabled|soulbind.volatile_solvent.enabled,interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent actions.finisher=pool_resource,for_next=1 actions.finisher+=/savage_roar,if=buff.savage_roar.remains<3 actions.finisher+=/primal_wrath,if=(druid.primal_wrath.ticks_gained_on_refresh>3*(spell_targets.primal_wrath+1)&spell_targets.primal_wrath>1)|spell_targets.primal_wrath>(3+1*talent.sabertooth.enabled) actions.finisher+=/rip,cycle_targets=1,if=refreshable&druid.rip.ticks_gained_on_refresh>variable.rip_ticks&((buff.tigers_fury.up|!ticking)&(buff.bloodtalons.up|!talent.bloodtalons.enabled)|!talent.sabertooth.enabled)&(spell_targets.primal_wrath=1|!talent.primal_wrath.enabled)&(active_dot.rip=0|ticking&active_dot.rip=1|!runeforge.draught_of_deep_focus|!talent.sabertooth.enabled) actions.finisher+=/savage_roar,if=buff.savage_roar.remains<(combo_points+1)*6*0.3 actions.finisher+=/ferocious_bite,max_energy=1,cycle_targets=1 actions.finisher+=/ferocious_bite,cycle_targets=1,if=buff.bs_inc.up&talent.soul_of_the_forest.enabled|cooldown.convoke_the_spirits.remains<1&covenant.night_fae actions.finisher+=/regrowth,if=settings.filler_regrowth&selection_time>1.5*gcd.max actions.owlweave=starsurge,if=buff.heart_of_the_wild.up actions.owlweave+=/sunfire,line_cd=4*gcd actions.owlweave+=/moonfire,line_cd=4*gcd,if=buff.moonkin_form.up&spell_targets.thrash_cat<2&!talent.lunar_inspiration.enabled&energy<60&!buff.clearcasting.up actions.owlweave+=/heart_of_the_wild,if=energy<30&dot.rip.remains>4.5&(cooldown.tigers_fury.remains>=6.5|runeforge.cateye_curio)&buff.clearcasting.stack<1&!buff.apex_predators_craving.up&!buff.bloodlust.up&!buff.bs_inc.up&(cooldown.convoke_the_spirits.remains>6.5|!covenant.night_fae)&(!covenant.necrolord|cooldown.adaptive_swarm.remains>=5|dot.adaptive_swarm_damage.remains>7) actions.owlweave+=/moonkin_form,if=energy<30&dot.rip.remains>4.5&(cooldown.tigers_fury.remains>=4.5|runeforge.cateye_curio)&buff.clearcasting.stack<1&!buff.apex_predators_craving.up&!buff.bloodlust.up&(!buff.bs_inc.up|covenant.necrolord&talent.savage_roar.enabled&buff.bs_inc.remains>6)&(cooldown.convoke_the_spirits.remains>6.5|!covenant.night_fae)&(!covenant.necrolord|cooldown.adaptive_swarm.remains>=5|dot.adaptive_swarm_damage.remains>7)&fight_remains>7 actions.setup=lunar_inspiration,if=covenant.necrolord&spell_targets.thrash_cat<4&combo_points<5&!ticking&!buff.bs_inc.up actions.setup+=/pool_resource,for_next=1 actions.setup+=/savage_roar,if=talent.feral_frenzy.enabled&cooldown.feral_frenzy.up&!buff.savage_roar.up&combo_points>1&dot.rake.ticking&(dot.lunar_inspiration.ticking|!talent.lunar_inspiration.enabled) ## actions.setup+=/pool_resource,if=talent.bloodtalons.enabled&buff.bloodtalons.down&(energy+3.5*energy.regen+(40*buff.clearcasting.up))<(115-23*buff.incarnation_king_of_the_jungle.up)&active_bt_triggers=0 actions.setup+=/wait,sec=((115-23*buff.incarnation_king_of_the_jungle.up)-(energy.current+3.5*energy.regen+(40*buff.clearcasting.up)))/energy.regen,if=talent.bloodtalons.enabled&buff.bloodtalons.down&active_bt_triggers=0 actions.setup+=/call_action_list,name=bloodtalons,if=talent.bloodtalons.enabled&buff.bloodtalons.down&(combo_points<5|spell_targets.thrash_cat=1) actions.setup+=/call_action_list,name=cooldown actions.setup+=/call_action_list,name=finisher,strict=1,if=combo_points>3&(buff.bloodtalons.up|!talent.bloodtalons.enabled) actions.stealth=pool_resource,for_next=1 actions.stealth+=/swipe_cat,if=buff.bs_inc.up&spell_targets.swipe_cat>3&runeforge.frenzyband # Rake needs roughly 50% of its length at a minimum to surpass shreds dpe actions.stealth+=/rake,cycle_targets=1,if=(dot.rake.pmultiplier<1.5|refreshable)&druid.rake.ticks_gained_on_refresh>2|(persistent_multiplier>dot.rake.pmultiplier&buff.bs_inc.up&spell_targets.thrash_cat<3&covenant.necrolord)|buff.bs_inc.remains<1 actions.stealth+=/lunar_inspiration,if=spell_targets.thrash_cat<3&refreshable&druid.lunar_inspiration.ticks_gained_on_refresh>5&(combo_points=4|dot.lunar_inspiration.remains<5|!dot.lunar_inspiration.ticking) # Brutal Slash is better than stealth Shred at 3 targets actions.stealth+=/brutal_slash,if=spell_targets.brutal_slash>2 actions.stealth+=/pool_resource,for_next=1 actions.stealth+=/shred,if=combo_points<4&spell_targets.thrash_cat<5 actions.balance=sunfire,if=buff.eclipse_solar.down&buff.eclipse_lunar.down&(refreshable|(active_enemies>1&active_dot.sunfire10+cast_time|buff.eclipse_lunar.remains>10+cast_time actions.balance+=/starfire,if=buff.eclipse_lunar.remains>cast_time|buff.eclipse_solar.down&solar_eclipse>0|buff.eclipse_solar.down&lunar_eclipse-action.wrath.in_flight<1 actions.balance+=/wrath,if=buff.eclipse_solar.remains>cast_time|buff.eclipse_lunar.down&lunar_eclipse-action.wrath.in_flight>0