# ShmooDude Feral and Guardian script ### ### Options: # Interrupt - Suggests use of interuptting abilities, including stuns/knockbacks on non-boss targets. # # # Not in Melee Range - Suggests movement abilities if available or a forward arrow if you're out of range. # # # Multiple-targets rotation - If this is disabled, the AoE icon is removed # # # Ashamane's Frenzy as main action - Puts the Ashamane's Frenzy suggestion in the main action box. # Requires TimeToDie of 20 seconds or more # If this is off, Ovale will suggest 2 CP Regrowths in the Short CD box. # Shadowmeld as main action - Puts the Shadowmeld suggestion in the main action box. # Requires TimeToDie of 20 seconds or more # Suggested off except on (raid) bosses. # Tiger's Fury multiplier prediction - Applies the Tiger's Fury multiplier if Tiger's Fury is ready. # e.g. If TF is being suggested, any Rip suggestions will assume you use TF first. # # Prevent capping BrS charges - Will suggest Brutal Slash if you are about to reach max charges. # Advantage: Helps not waste charges. # Disadvantage: Will probably not have 3 charges when AoE for the encounter shows up. # BrS at X targets - Minimum number of targets to suggest using Brutal Slash. # This will use all available Brutal Slash charges. # # Only suggest BrS when TF is up # Good for Mythic+ to get the most out of your Brutal Slash charges # Too much haste makes this sub-optimal # Rip - At how many seconds to overwrite a Rip # Default Pandemic # # Rake - At how many seconds to overwrite a Rake # Default 7 or # Pandemic with Ailuro Pouncers Legendary or you are not speced into Bloodtalons # Savage Roar - At how many seconds to overwrite Savage Roar # Default Pandemic # Include(ovale_common) Include(ovale_trinkets_mop) Include(ovale_trinkets_wod) Include(ovale_druid_spells) AddCheckBox(opt_melee_range L(not_in_melee_range) specialization=feral) AddCheckBox(opt_use_consumables "Suggest Prolonged Power Potion" default specialization=feral) AddCheckBox(opt_interrupt L(interrupt) default specialization=feral) AddCheckBox(opt_ashamanes_frenzy_main_action "Ashamane's Frenzy as a main action" default specialization=feral) AddCheckBox(opt_shadowmeld_main_action "Shadowmeld as a main action" specialization=feral) AddCheckBox(opt_tigers_fury_multiplier_predict "Tiger's Fury multiplier prediction" default specialization=feral) AddCheckBox(opt_brutal_slash_use_at_three_always "Prevent capping BrS charges" specialization=feral) AddCheckBox(opt_brutal_slash_use_with_tigers_fury "Only suggest BrS when TF is up" specialization=feral) # AddCheckBox(opt_sync_af_tf "Try to sync Ashamane's with TF" specialization=feral) AddListItem(opt_10_rake_refresh rake_00_default "Rake: Default (7 w/ BT)" specialization=feral default) AddListItem(opt_10_rake_refresh rake_01_pandemic "Rake at Pandemic (duration*0.3)" specialization=feral) AddListItem(opt_10_rake_refresh rake_05 "Rake at 5 seconds" specialization=feral) AddListItem(opt_10_rake_refresh rake_06 "Rake at 6 seconds" specialization=feral) AddListItem(opt_10_rake_refresh rake_07 "Rake at 7 seconds" specialization=feral) AddListItem(opt_10_rake_refresh rake_08 "Rake at 8 seconds" specialization=feral) AddListItem(opt_10_rake_refresh rake_09 "Rake at 9 seconds" specialization=feral) AddListItem(opt_11_rip_refresh rip_00_default "Rip: Default (Pandemic)" specialization=feral default) AddListItem(opt_11_rip_refresh rip_01_pandemic "Rip at Pandemic (duration*0.3)" specialization=feral) AddListItem(opt_11_rip_refresh rip_07 "Rip at 7 seconds" specialization=feral) AddListItem(opt_11_rip_refresh rip_08 "Rip at 8 seconds" specialization=feral) AddListItem(opt_11_rip_refresh rip_09 "Rip at 9 seconds" specialization=feral) AddListItem(opt_11_rip_refresh rip_10 "Rip at 10 seconds" specialization=feral) AddListItem(opt_11_rip_refresh rip_11 "Rip at 11 seconds" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_00_default "Savage Roar: Default (Pandemic)" specialization=feral default) AddListItem(opt_12_savage_roar_refresh savage_roar_01_pandemic "Savage Roar Pandemic (duration*0.3)" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_12 "Savage Roar at 12 seconds" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_13 "Savage Roar at 13 seconds" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_14 "Savage Roar at 14 seconds" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_15 "Savage Roar at 15 seconds" specialization=feral) AddListItem(opt_12_savage_roar_refresh savage_roar_16 "Savage Roar at 16 seconds" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_01 "BrS at 1 target" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_02 "BrS at 2 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_03 "BrS at 3 targets" specialization=feral default) AddListItem(opt_09_desired_targets desired_targets_04 "BrS at 4 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_05 "BrS at 5 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_06 "BrS at 6 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_07 "BrS at 7 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_08 "BrS at 8 targets" specialization=feral) AddListItem(opt_09_desired_targets desired_targets_09 "BrS at 9 targets" specialization=feral) ######################################## ### Helper Variables (Functions) ### ######################################## #variable,name=rake_refresh,value=4.5 #variable,name=rake_refresh,op=mul,value=0.8,if=talent.jagged_wounds.enabled #variable,name=rake_refresh,value=7,if=talent.bloodtalons.enabled&!equipped.ailuro_pouncers AddFunction rake_refresh { unless List(opt_10_rake_refresh rake_00_default) { if List(opt_10_rake_refresh rake_01_pandemic) target.DebuffDuration(rake_debuff) * 0.3 if List(opt_10_rake_refresh rake_05) 5 if List(opt_10_rake_refresh rake_06) 6 if List(opt_10_rake_refresh rake_07) 7 if List(opt_10_rake_refresh rake_08) 8 if List(opt_10_rake_refresh rake_09) 9 } if HasEquippedItem(ailuro_pouncers) or not Talent(bloodtalons_talent) target.DebuffDuration(rake_debuff) * 0.3 7 } #variable,name=savage_roar_refresh,value=10.8 AddFunction savage_roar_refresh { unless List(opt_12_savage_roar_refresh savage_roar_00_default) { if List(opt_12_savage_roar_refresh savage_roar_01_pandemic) BaseDuration(savage_roar_buff) * 0.3 if List(opt_12_savage_roar_refresh savage_roar_12) 12 if List(opt_12_savage_roar_refresh savage_roar_13) 13 if List(opt_12_savage_roar_refresh savage_roar_14) 14 if List(opt_12_savage_roar_refresh savage_roar_15) 15 if List(opt_12_savage_roar_refresh savage_roar_16) 16 } BaseDuration(savage_roar_buff) * 0.3 } #variable,name=rip_refresh,value=7.2 #variable,name=rip_refresh,op=add,value=1.2,if=set_bonus.tier20_4pc #variable,name=rip_refresh,op=mul,value=0.8,if=talent.jagged_wounds.enabled AddFunction rip_refresh { unless List(opt_11_rip_refresh rip_00_default) { if List(opt_11_rip_refresh rip_01_pandemic) target.DebuffDuration(rip_debuff) * 0.3 if List(opt_11_rip_refresh rip_07) 7 if List(opt_11_rip_refresh rip_08) 8 if List(opt_11_rip_refresh rip_09) 9 if List(opt_11_rip_refresh rip_10) 10 if List(opt_11_rip_refresh rip_11) 11 } target.DebuffDuration(rip_debuff) * 0.3 } #variable,name=execute_range,value=25 #variable,name=execute_range,value=100,if=talent.sabertooth.enabled AddFunction execute_range { if Talent(sabertooth_talent) 100 25 } #variable,name=use_thrash,value=0 #variable,name=use_thrash,value=1,if=equipped.luffa_wrappings AddFunction use_thrash { if HasEquippedItem(luffa_wrappings) 1 0 } #variable,name=bt_stack,value=2 #variable,name=bt_stack,value=1,if=equipped.ailuro_pouncers AddFunction bt_stack { if HasEquippedItem(ailuro_pouncers) 1 2 } #desired_targets AddFunction BrutalSlashDesiredTargets asvalue=1 { if List(opt_09_desired_targets desired_targets_02) 2 if List(opt_09_desired_targets desired_targets_03) 3 if List(opt_09_desired_targets desired_targets_04) 4 if List(opt_09_desired_targets desired_targets_05) 5 if List(opt_09_desired_targets desired_targets_06) 6 if List(opt_09_desired_targets desired_targets_07) 7 if List(opt_09_desired_targets desired_targets_08) 8 if List(opt_09_desired_targets desired_targets_09) 9 } #trinket AddFunction FeralUseItemActions { Item(Trinket0Slot text=13 usable=1) Item(Trinket1Slot text=14 usable=1) } #melee_range AddFunction FeralGetInMeleeRange { if CheckBoxOn(opt_melee_range) and target.InRange(shred no) { #wild_charge if target.InRange(wild_charge) Spell(wild_charge) #displacer_beast,if=movement.distance>25 if target.distance() > 25 Spell(displacer_beast) #dash,if=movement.distance>25&buff.displacer_beast.down&buff.wild_charge_movement.down if target.distance() > 25 and BuffExpires(displacer_beast_buff) Spell(dash) Texture(misc_arrowlup help=L(not_in_melee_range)) } } #interrupt AddFunction FeralInterruptActions { if CheckBoxOn(opt_interrupt) and not target.IsFriend() and target.IsInterruptible() { if target.InRange(skull_bash) Spell(skull_bash) if not target.Classification(worldboss) { if target.InRange(mighty_bash) Spell(mighty_bash) if target.distance() < 20 Spell(typhoon) if target.InRange(maim) Spell(maim) if target.distance() < 8 Spell(war_stomp) } } } #Tiger's Fury multiplier prediction AddFunction TFMultPred asvalue=1 { if CheckBoxOn(opt_tigers_fury_multiplier_predict) and BuffExpires(tigers_fury_buff) and SpellCooldown(tigers_fury) <= 0 and ShortCd_TigersFury() 1.15 1 } ######################################## ### Main Action List ### ######################################## #rake,if=buff.prowl.up|buff.shadowmeld.up AddFunction Main_Rake_Prowl { BuffPresent(prowl_buff) or BuffPresent(shadowmeld_buff) } #dash,if=buff.cat_form.down #AddFunction Main_Dash_CatForm #### Unused #{ # BuffExpires(cat_form_buff) #} #cat_form,if=buff.cat_form.down #AddFunction Main_CatForm #### Unused #{ # BuffExpires(cat_form_buff) #} #######call_action_list,name=opener,if=!dot.rip.ticking&time<8 # MODIFICATION: Add target.Classification(worldboss) # REASON: Only use opener on bosses. AddFunction Main_Opener_Conditions { target.DebuffExpires(rip_debuff) and TimeInCombat() < 8 and target.Classification(worldboss) } #######call_action_list,name=cooldowns #AddFunction Main_Cooldowns_Conditions #### Unused #{ # #} #tigers_fury,if=energy.deficit>=60 AddFunction ShortCd_TigersFury { EnergyDeficit() >= 60 } # MODIFICATION: Predator TF # REASON: Suggest TF anytime its ready if TF is already up to maximize buff uptime. AddFunction ShortCd_TigersFury_Predator { UnitInRaid() and Talent(predator_talent) and BuffPresent(tigers_fury_buff) } #berserk,if=energy>=30&(cooldown.tigers_fury.remains>5|buff.tigers_fury.up) # MODIFICATION: SpellCooldown(tigers_fury) <= 0 and ShortCd_TigersFury() # REASON: Make Berserk show up if Tiger's Fury conditions are met AddFunction Cd_Berserk { Energy() >= 30 and { SpellCooldown(tigers_fury) > 5 or BuffPresent(tigers_fury_buff) or TFMultPred() > 1 } } #incarnation,if=energy>=30&(cooldown.tigers_fury.remains>15|buff.tigers_fury.up) # MODIFICATION: SpellCooldown(tigers_fury) <= 0 and ShortCd_TigersFury() # REASON: Make Incarnation show up if Tiger's Fury conditions are met AddFunction Cd_Incarnation { Energy() >= 30 and { SpellCooldown(tigers_fury) > 15 or BuffPresent(tigers_fury_buff) or TFMultPred() > 1 } } #elunes_guidance,if=combo_points=0&energy>=50 AddFunction ShortCd_ElunesGuidance { ComboPoints() == 0 and Energy() >= 50 } #potion,name=prolonged_power,if=target.time_to_die<65|(time_to_die<180&(buff.berserk.up|buff.incarnation.up)) AddFunction Cd_Potion { { target.TimeToDie() < 65 or target.TimeToDie() < 180 and { BuffPresent(berserk_cat_buff) or BuffPresent(incarnation_king_of_the_jungle_buff) } } and CheckBoxOn(opt_use_consumables) and target.Classification(worldboss) } #ashamanes_frenzy,if=combo_points<=2&(!talent.bloodtalons.enabled|buff.bloodtalons.up) # MODIFICATION: AshamanesFrenzy_Main for CheckBoxOn(opt_ashamanes_frenzy_main_action) # REASON: Allows player to choose via checkbox whether to add Azshamane's Frenzy to the Main Icon # MODIFICATION: target.TimeToDie() > 20 # REASON: Does not use Regrowth for Ashamane's Frenzy on targets with less than 20 seconds to live AddFunction Cooldowns_AshamanesFrenzy { CheckBoxOn(opt_ashamanes_frenzy_main_action) and ComboPoints() <= 2 and { not Talent(bloodtalons_talent) or BuffPresent(bloodtalons_buff) } and target.TimeToDie() > 20 } # MODIFICATION: ShortCd_AshamanesFrenzy for CheckBoxOff(opt_ashamanes_frenzy_main_action) # REASON: Allows player to choose via checkbox whether to add Azshamane's Frenzy to the Main Icon AddFunction ShortCd_AshamanesFrenzy { CheckBoxOff(opt_ashamanes_frenzy_main_action) and ComboPoints() <= 2 and { not Talent(bloodtalons_talent) or BuffPresent(bloodtalons_buff) } } #shadowmeld,if=combo_points<5&energy>=action.rake.cost&dot.rake.pmultiplier<2.1&buff.tigers_fury.up&(!talent.bloodtalons.enabled|buff.bloodtalons.up)&(!talent.incarnation.enabled|cooldown.incarnation.remains>18)&!buff.incarnation.up # MODIFICATION: Cooldowns_Shadowmeld for CheckBoxOn(opt_shadowmeld_main_action) # REASON: Allows player to choose via checkbox whether to add Shadowmeld to the Main Icon # MODIFICATION: target.TimeToDie() > BaseDuration(rake_debuff) + 5 # REASON: Does not use Shadowmeld on targets with less than BaseDuration(rake_debuff) + 5 seconds to live # MODIFICATION: target.InRange(rake) # REASON: Cannot move after Shadowmeld so add range check before suggesting AddFunction Cooldowns_Shadowmeld { CheckBoxOn(opt_shadowmeld_main_action) and ComboPoints() < 5 and Energy() >= PowerCost(rake) and target.DebuffPersistentMultiplier(rake_debuff) < 2.1 and { BuffPresent(tigers_fury_buff) or TFMultPred() > 1 } and { not Talent(bloodtalons_talent) or BuffPresent(bloodtalons_buff) } and { not Talent(incarnation_talent) or SpellCooldown(incarnation_king_of_the_jungle) > 18 } and BuffExpires(incarnation_king_of_the_jungle_buff) and target.TimeToDie() > BaseDuration(rake_debuff) + 5 and target.InRange(rake) } # MODIFICATION: Cd_Shadowmeld for CheckBoxOff(opt_shadowmeld_main_action) # REASON: Allows player to choose via checkbox whether to add Shadowmeld to the Main Icon AddFunction Cd_Shadowmeld { CheckBoxOff(opt_shadowmeld_main_action) and ComboPoints() < 5 and Energy() >= PowerCost(rake) and target.DebuffPersistentMultiplier(rake_debuff) < 2.1 and { BuffPresent(tigers_fury_buff) or TFMultPred() > 1 } and { not Talent(bloodtalons_talent) or BuffPresent(bloodtalons_buff) } and { not Talent(incarnation_talent) or SpellCooldown(incarnation_king_of_the_jungle) > 18 } and BuffExpires(incarnation_king_of_the_jungle_buff) and target.TimeToDie() > BaseDuration(rake_debuff) + 5 and target.InRange(rake) } #use_items #AddFunction Cooldowns_Trinket #### Unused #{ # #} #regrowth,if=talent.bloodtalons.enabled&buff.predatory_swiftness.up&buff.bloodtalons.stack10&target.health.pct 10 and target.HealthPercent() < execute_range() } #######run_action_list,name=finishers,if=combo_points>4 AddFunction Main_Finishers_Conditions { ComboPoints() > 4 } #savage_roar,if=buff.savage_roar.down AddFunction Finishers_SavageRoarExpires { BuffExpires(savage_roar_buff) } #rip,target_if=(!ticking|remains<=variable.rip_refresh&target.health.pct>variable.execute_range|(remains<=duration*0.8&persistent_multiplier>dot.rip.pmultiplier))&target.time_to_die>6+2*active_enemies+remains # MODIFICATION: TFMultPred when CheckBoxOn(opt_tigers_fury_multiplier_predict) # REASON: When Tiger's Fury is suggested, treat Rip as if it is already up even if it hasn't been cast yet. AddFunction Finishers_Rip { { target.DebuffExpires(rip_debuff) or target.DebuffRemaining(rip_debuff) <= rip_refresh() and target.HealthPercent() > execute_range() or target.DebuffRemaining(rip_debuff) <= BaseDuration(rip_debuff) * 0.8 and TFMultPred() * PersistentMultiplier(rip_debuff) > target.DebuffPersistentMultiplier(rip_debuff) } and target.TimeToDie() > 6 + 2 * Enemies() + target.DebuffRemaining(rip_debuff) } #savage_roar,if=buff.savage_roar.remains 21 # REASON: Does not use Regrowth for Ashamane's Frenzy on targets with less than 21 seconds to live AddFunction Main_Regrowth_AshamanesFrenzy { CheckBoxOn(opt_ashamanes_frenzy_main_action) and Talent(bloodtalons_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(bloodtalons_buff) and ComboPoints() == 2 and SpellCooldown(ashamanes_frenzy) < 0.75 and target.TimeToDie() > 21 } # MODIFICATION: ShortCd_Regrowth_AshamanesFrenzy for CheckBoxOff(opt_ashamanes_frenzy_main_action) # REASON: Allows player to choose via checkbox whether to add Ashamane's Frenzy to the Main Icon AddFunction ShortCd_Regrowth_AshamanesFrenzy { CheckBoxOff(opt_ashamanes_frenzy_main_action) and Talent(bloodtalons_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(bloodtalons_buff) and ComboPoints() == 2 and SpellCooldown(ashamanes_frenzy) < 0.75 } #regrowth,if=equipped.ailuro_pouncers&talent.bloodtalons.enabled&buff.bloodtalons.down&(buff.predatory_swiftness.stack>2|(buff.predatory_swiftness.stack>1&dot.rake.remains<3)) AddFunction Main_Regrowth_Pouncers { HasEquippedItem(ailuro_pouncers) and Talent(bloodtalons_talent) and BuffExpires(bloodtalons_buff) and { BuffStacks(predatory_swiftness_buff) > 2 or BuffStacks(predatory_swiftness_buff) > 1 and target.DebuffRemaining(rake_debuff) < 3 } } #######run_action_list,name=generators #AddFunction Main_Generators_Conditions #{ # #} #brutal_slash,if=spell_targets.brutal_slash>desired_targets AddFunction Generators_BrutalSlash_DesiredTargets { Enemies() >= BrutalSlashDesiredTargets() and { BuffPresent(tigers_fury_buff) or TFMultPred() > 1 or CheckBoxOff(opt_brutal_slash_use_with_tigers_fury) } } #pool_resource,for_next=1 #thrash_cat,if=refreshable&spell_targets.thrash_cat>2 AddFunction Generators_ThrashCat_3Targets { target.Refreshable(thrash_cat_debuff) and Enemies() > 2 } #rake,target_if=(!ticking|(!talent.bloodtalons.enabled|buff.bloodtalons.up)&remains<=variable.rake_refresh&persistent_multiplier>dot.rake.pmultiplier*0.85)&target.time_to_die>6+remains AddFunction Generators_Rake { { not target.DebuffPresent(rake_debuff) or { not Talent(bloodtalons_talent) or BuffPresent(bloodtalons_buff) } and target.DebuffRemaining(rake_debuff) <= rake_refresh() and PersistentMultiplier(rake_debuff) > target.DebuffPersistentMultiplier(rake_debuff) * 0.85 } and target.TimeToDie() > 6 + target.DebuffRemaining(rake_debuff) } #brutal_slash,if=(buff.tigers_fury.up&(raid_event.adds.in>(1+max_charges-charges_fractional)*recharge_time)) AddFunction Generators_BrutalSlash_3Charges { CheckBoxOn(opt_brutal_slash_use_at_three_always) and Charges(brutal_slash count=0) > 2.66 } #moonfire_cat,target_if=refreshable&target.time_to_die>4+remains AddFunction Generators_MoonfireCat { target.Refreshable(moonfire_cat_debuff) and target.TimeToDie() > 4 + target.DebuffRemaining(moonfire_cat_debuff) } #pool_resource,for_next=1 #thrash_cat,if=refreshable&(variable.use_thrash=1|spell_targets.thrash_cat>1) AddFunction Generators_ThrashCat_Luffa_or_2Targets { target.Refreshable(thrash_cat_debuff) and { use_thrash() == 1 or Enemies() > 1 } } #pool_resource,for_next=1 #swipe_cat,if=spell_targets.swipe_cat>1 AddFunction Generators_SwipeCat { Enemies() > 1 } #shred,if=dot.rake.remains>(action.shred.cost+action.rake.cost-energy)%energy.regen|buff.clearcasting.react AddFunction Generators_Shred { target.DebuffRemaining(rake_debuff) > { PowerCost(shred) + PowerCost(rake) - Energy() } / EnergyRegenRate() or BuffPresent(clearcasting_buff) or target.TimeToDie() <= 6 + target.DebuffRemaining(rake_debuff) } ### actions.default AddFunction FeralDefaultMainActions { #rake,if=buff.prowl.up|buff.shadowmeld.up if Main_Rake_Prowl() Spell(rake) #dash,if=buff.cat_form.down if BuffExpires(cat_form_buff) Spell(dash) #cat_form,if=buff.cat_form.down if BuffExpires(cat_form_buff) Spell(cat_form) #call_action_list,name=opener,if=!dot.rip.ticking&time<8 if Main_Opener_Conditions() FeralOpenerMainActions() #call_action_list,name=cooldowns FeralCooldownsMainActions() #regrowth,if=talent.bloodtalons.enabled&buff.predatory_swiftness.up&buff.bloodtalons.stack10&target.health.pct4 if Main_Finishers_Conditions() FeralFinishersMainActions() unless Main_Finishers_Conditions() { #regrowth,if=talent.bloodtalons.enabled&buff.predatory_swiftness.up&buff.bloodtalons.down&((combo_points=2&&cooldown.ashamanes_frenzy.remains2|(buff.predatory_swiftness.stack>1&dot.rake.remains<3)) if Main_Regrowth_Pouncers() Spell(regrowth text=Pouncers) #run_action_list,name=generators FeralGeneratorsMainActions() } } AddFunction FeralDefaultShortCdActions { unless Main_Rake_Prowl() and Spell(rake) or BuffExpires(cat_form_buff) and Spell(cat_form) { #auto_attack FeralGetInMeleeRange() #call_action_list,name=opener,if=!dot.rip.ticking&time<8 #if Main_Opener_Conditions() FeralOpenerShortCdActions() unless Main_Opener_Conditions() and FeralOpenerShortCdPostConditions() { #call_action_list,name=cooldowns FeralCooldownsShortCdActions() unless Main_Finishers_Conditions() { # MODIFICATION: ShortCd_Regrowth_AshamanesFrenzy for CheckBoxOff(opt_ashamanes_frenzy_main_action) # REASON: Allows player to choose via checkbox whether to add Ashamane's Frenzy to the Main Icon #regrowth,if=talent.bloodtalons.enabled&buff.predatory_swiftness.up&buff.bloodtalons.down&((combo_points=2&&cooldown.ashamanes_frenzy.remains=action.rake.cost&dot.rake.pmultiplier<2.1&buff.tigers_fury.up&(!talent.bloodtalons.enabled|buff.bloodtalons.up)&(!talent.incarnation.enabled|cooldown.incarnation.remains>18)&!buff.incarnation.up # MODIFICATION: Cooldowns_Shadowmeld for CheckBoxOn(opt_shadowmeld_main_action) # REASON: Allows player to choose via checkbox whether to add Shadowmeld to the Main Icon if Cooldowns_Shadowmeld() Spell(shadowmeld) } AddFunction FeralCooldownsShortCdActions { #elunes_guidance,if=combo_points=0&energy>=50 if ShortCd_ElunesGuidance() Spell(elunes_guidance) # MODIFICATION: Show "+TF" text on AF if you should also cast TF # REASON: Instead of TF blocking AF suggestion. #ashamanes_frenzy,if=combo_points<=2&(!talent.bloodtalons.enabled|buff.bloodtalons.up) if ShortCd_AshamanesFrenzy() { if SpellCooldown(tigers_fury) <= 0 and ShortCd_TigersFury() Spell(ashamanes_frenzy text="+TF") Spell(ashamanes_frenzy) } # MODIFICATION: Moved both tigers_fury to below ashamanes_frenzy # REASON: Instead show AF with "+TF" text. #tigers_fury,if=energy.deficit>=60 if ShortCd_TigersFury() Spell(tigers_fury) # MODIFICATION: ShortCd_TigersFury_Predator # REASON: Spam Tiger's Fury with predator in raid to maximize raid uptime of versatility buff if ShortCd_TigersFury_Predator() Spell(tigers_fury text=Pred) } AddFunction FeralCooldownsCdActions { #berserk,if=energy>=30&(cooldown.tigers_fury.remains>5|buff.tigers_fury.up) # MODIFICATION: Display potion if it is time to use your DPS potion with your cooldowns # REASON: Potion won't show up till after Berserk is cast normally if Cd_Berserk() { if Cd_Potion() and Item(prolonged_power_potion usable=1) Spell(berserk_cat text=potion) Spell(berserk_cat) } #incarnation,if=energy>=30&(cooldown.tigers_fury.remains>15|buff.tigers_fury.up) # MODIFICATION: Display potion if it is time to use your DPS potion with your cooldowns # REASON: Potion won't show up till after Incarnation is cast normally if Cd_Incarnation() { if Cd_Potion() and Item(prolonged_power_potion usable=1) Spell(incarnation_king_of_the_jungle text=potion) Spell(incarnation_king_of_the_jungle) } unless ShortCd_ElunesGuidance() and Spell(elunes_guidance) { #potion,name=prolonged_power,if=target.time_to_die<65|(time_to_die<180&(buff.berserk.up|buff.incarnation.up)) if Cd_Potion() Item(prolonged_power_potion usable=1) unless Cooldowns_AshamanesFrenzy() and Spell(ashamanes_frenzy) { #shadowmeld,if=combo_points<5&energy>=action.rake.cost&dot.rake.pmultiplier<2.1&buff.tigers_fury.up&(!talent.bloodtalons.enabled|buff.bloodtalons.up)&(!talent.incarnation.enabled|cooldown.incarnation.remains>18)&!buff.incarnation.up # MODIFICATION: Cd_Shadowmeld for CheckBoxOff(opt_shadowmeld_main_action) # REASON: Allows player to choose via checkbox whether to add Shadowmeld to the Main Icon if Cd_Shadowmeld() Spell(shadowmeld) #use_items FeralUseItemActions() } } } ### actions.finishers AddFunction FeralFinishersMainActions { #pool_resource,for_next=1 #savage_roar,if=buff.savage_roar.down if Finishers_SavageRoarExpires() Spell(savage_roar) unless Finishers_SavageRoarExpires() and SpellUsable(savage_roar) and SpellCooldown(savage_roar) < TimeToEnergyFor(savage_roar) { #pool_resource,for_next=1 #rip,target_if=(!ticking|remains<=variable.rip_refresh&target.health.pct>variable.execute_range|(remains<=duration*0.8&persistent_multiplier>dot.rip.pmultiplier))&target.time_to_die>6+2*active_enemies+remains if Finishers_Rip() Spell(rip) unless Finishers_Rip() and SpellUsable(rip) and SpellCooldown(rip) < TimeToEnergyFor(rip) { #pool_resource,for_next=1 #savage_roar,if=buff.savage_roar.remains= EnergyCost(ferocious_bite max=1) Spell(ferocious_bite) } } } } ### actions.generators AddFunction FeralGeneratorsMainActions { #brutal_slash,if=spell_targets.brutal_slash>desired_targets if Generators_BrutalSlash_DesiredTargets() Spell(brutal_slash) #pool_resource,for_next=1 #thrash_cat,if=refreshable&spell_targets.thrash_cat>2 if Generators_ThrashCat_3Targets() Spell(thrash_cat) unless Generators_ThrashCat_3Targets() and SpellUsable(thrash_cat) and SpellCooldown(thrash_cat) < TimeToEnergyFor(thrash_cat) { #pool_resource,for_next=1 #rake,target_if=(!ticking|(!talent.bloodtalons.enabled|buff.bloodtalons.up)&remains<=variable.rake_refresh&persistent_multiplier>dot.rake.pmultiplier*0.85)&target.time_to_die>6+remains if Generators_Rake() Spell(rake) unless Generators_Rake() and SpellUsable(rake) and SpellCooldown(rake) < TimeToEnergyFor(rake) { #brutal_slash,if=(buff.tigers_fury.up&(raid_event.adds.in>(1+max_charges-charges_fractional)*recharge_time)) if Generators_BrutalSlash_3Charges() Spell(brutal_slash) #moonfire_cat,target_if=refreshable&target.time_to_die>4+remains if Generators_MoonfireCat() Spell(moonfire_cat) #pool_resource,for_next=1 #thrash_cat,if=refreshable&(variable.use_thrash=1|spell_targets.thrash_cat>1) if Generators_ThrashCat_Luffa_or_2Targets() Spell(thrash_cat) unless Generators_ThrashCat_Luffa_or_2Targets() and SpellUsable(thrash_cat) and SpellCooldown(thrash_cat) < TimeToEnergyFor(thrash_cat) { #pool_resource,for_next=1 #swipe_cat,if=spell_targets.swipe_cat>1 if Generators_SwipeCat() Spell(swipe_cat) unless Generators_SwipeCat() and SpellUsable(swipe_cat) and SpellCooldown(swipe_cat) < TimeToEnergyFor(swipe_cat) { #shred,if=dot.rake.remains>(action.shred.cost+action.rake.cost-energy)%energy.regen|buff.clearcasting.react if Generators_Shred() Spell(shred) } } } } } ### actions.opener AddFunction FeralOpenerMainActions { #moonfire_cat,if=talent.lunar_inspiration.enabled&!ticking if Talent(lunar_inspiration_talent) and not target.DebuffPresent(moonfire_cat_debuff) Spell(moonfire_cat) #savage_roar,if=buff.savage_roar.down if BuffExpires(savage_roar_buff) Spell(savage_roar) #regrowth,if=talent.sabertooth.enabled&talent.bloodtalons.enabled&buff.bloodtalons.down&combo_points=5 if Talent(sabertooth_talent) and Talent(bloodtalons_talent) and BuffExpires(predatory_swiftness_buff) and BuffExpires(bloodtalons_buff) and ComboPoints() == 5 Spell(regrowth text=hardcast) } AddFunction FeralOpenerShortCdActions { unless Talent(lunar_inspiration_talent) and not target.DebuffPresent(moonfire_cat_debuff) and Spell(moonfire_cat) or Finishers_SavageRoarExpires() and Spell(savage_roar) { # MODIFICATION: Remove TF display from the opener # REASON: Shows AF instead. #tigers_fury,if=buff.savage_roar.up #if BuffPresent(savage_roar_buff) Spell(tigers_fury) } } AddFunction FeralOpenerShortCdPostConditions { Talent(lunar_inspiration_talent) and not target.DebuffPresent(moonfire_cat_debuff) and Spell(moonfire_cat) or Finishers_SavageRoarExpires() and Spell(savage_roar) or Talent(sabertooth_talent) and Talent(bloodtalons_talent) and BuffExpires(bloodtalons_buff) and ComboPoints() == 5 and Spell(regrowth) } AddFunction FeralOpenerCdActions { unless Talent(lunar_inspiration_talent) and not target.DebuffPresent(moonfire_cat_debuff) and Spell(moonfire_cat) or Finishers_SavageRoarExpires() and Spell(savage_roar) { # MODIFICATION: if BuffPresent(savage_roar_buff) # REASON: Make Berserk/Incarnation show up for the opener #berserk,if=buff.savage_roar.up if BuffPresent(savage_roar_buff) Spell(berserk_cat text="+TF") #incarnation,if=buff.savage_roar.up if BuffPresent(savage_roar_buff) Spell(incarnation_king_of_the_jungle text="+TF") } } AddFunction FeralOpenerCdPostConditions { Talent(lunar_inspiration_talent) and not target.DebuffPresent(moonfire_cat_debuff) and Spell(moonfire_cat) or Finishers_SavageRoarExpires() and Spell(savage_roar) or Talent(sabertooth_talent) and Talent(bloodtalons_talent) and BuffExpires(bloodtalons_buff) and ComboPoints() == 5 and Spell(regrowth) } ### actions.precombat AddFunction FeralPrecombatMainActions { #flask #food #augmentation #regrowth,if=talent.bloodtalons.enabled # MODIFICATION: Talent(bloodtalons_talent) to Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) # REASON: Only suggest Regrowth out of stealth and if there's <15 seconds remaining if Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) Spell(regrowth) #cat_form Spell(cat_form) #savage_roar if BuffRefreshable(savage_roar_buff) Spell(savage_roar) } AddFunction FeralPrecombatMainPostConditions { } AddFunction FeralPrecombatShortCdActions { # MODIFICATION: Talent(bloodtalons_talent) to Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) # REASON: Only suggest Regrowth out of stealth and if there's <15 seconds remaining # MODIFICATION: Remove `or Spell(cat_form)` # REASON: Blocks Prowl from showing up unless Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) and Spell(regrowth) { #prowl Spell(prowl) } } AddFunction FeralPrecombatShortCdPostConditions { # MODIFICATION: Talent(bloodtalons_talent) to Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) # REASON: Only suggest Regrowth out of stealth and if there's <15 seconds remaining # MODIFICATION: Remove `or Spell(cat_form)` # REASON: Blocks Prowl from showing up Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) and Spell(regrowth) } AddFunction FeralPrecombatCdActions { unless Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) and Spell(regrowth) { #snapshot_stats #potion if CheckBoxOn(opt_use_consumables) and target.Classification(worldboss) Item(prolonged_power_potion usable=1) } } AddFunction FeralPrecombatCdPostConditions { # MODIFICATION: Talent(bloodtalons_talent) to Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) # REASON: Only suggest Regrowth out of stealth and if there's <15 seconds remaining # MODIFICATION: Remove `or Spell(cat_form)` # REASON: Blocks Prowl from showing up Talent(bloodtalons_talent) and BuffRemaining(bloodtalons_buff) < 15 and BuffExpires(prowl_buff) and Spell(regrowth) } ### Feral icons. AddCheckBox(opt_druid_feral_aoe L(AOE) default specialization=feral) AddIcon checkbox=!opt_druid_feral_aoe enemies=1 help=shortcd specialization=feral { if not InCombat() FeralPrecombatShortCdActions() unless not InCombat() and FeralPrecombatShortCdPostConditions() { FeralDefaultShortCdActions() } } AddIcon checkbox=opt_druid_feral_aoe help=shortcd specialization=feral { if not InCombat() FeralPrecombatShortCdActions() unless not InCombat() and FeralPrecombatShortCdPostConditions() { FeralDefaultShortCdActions() } } AddIcon enemies=1 help=main specialization=feral { if not InCombat() FeralPrecombatMainActions() unless not InCombat() and FeralPrecombatMainPostConditions() { FeralDefaultMainActions() } } AddIcon checkbox=opt_druid_feral_aoe help=aoe specialization=feral { if not InCombat() FeralPrecombatMainActions() unless not InCombat() and FeralPrecombatMainPostConditions() { FeralDefaultMainActions() } } AddIcon checkbox=!opt_druid_feral_aoe enemies=1 help=cd specialization=feral { if not InCombat() FeralPrecombatCdActions() unless not InCombat() and FeralPrecombatCdPostConditions() { FeralDefaultCdActions() } } AddIcon checkbox=opt_druid_feral_aoe help=cd specialization=feral { if not InCombat() FeralPrecombatCdActions() unless not InCombat() and FeralPrecombatCdPostConditions() { FeralDefaultCdActions() } } ### Required symbols # ailuro_pouncers # ashamanes_frenzy # berserk_cat # berserk_cat_buff # bloodtalons_buff # bloodtalons_talent # brutal_slash # cat_form # cat_form_buff # clearcasting_buff # dash # elunes_guidance # ferocious_bite # fiery_red_maimers_buff # incarnation_king_of_the_jungle # incarnation_king_of_the_jungle_buff # incarnation_talent # luffa_wrappings # lunar_inspiration_talent # maim # mangle # moonfire_cat # moonfire_cat_debuff # predatory_swiftness_buff # prolonged_power_potion # prowl # prowl_buff # rake # rake_debuff # regrowth # rip # rip_debuff # sabertooth_talent # savage_roar # savage_roar_buff # shadowmeld # shadowmeld_buff # shred # swipe_cat # thrash_cat # thrash_cat_debuff # tigers_fury # tigers_fury_buff # wild_charge # wild_charge_bear # wild_charge_cat # Based on SimulationCraft profile "Druid_Guardian_T19P". # class=druid # spec=guardian # talents=3133323 AddCheckBox(opt_interrupt L(interrupt) default specialization=guardian) AddCheckBox(opt_melee_range L(not_in_melee_range) specialization=guardian) AddFunction GuardianUseItemActions { Item(Trinket0Slot usable=1) Item(Trinket1Slot usable=1) } AddFunction GuardianGetInMeleeRange { if CheckBoxOn(opt_melee_range) and Stance(druid_bear_form) and not target.InRange(mangle) or Stance(druid_cat_form) and not target.InRange(shred) { if target.InRange(wild_charge) Spell(wild_charge) Texture(misc_arrowlup help=L(not_in_melee_range)) } } AddFunction GuardianInterruptActions { if CheckBoxOn(opt_interrupt) and not target.IsFriend() and target.IsInterruptible() { if target.InRange(skull_bash) Spell(skull_bash) if not target.Classification(worldboss) { if target.InRange(mighty_bash) Spell(mighty_bash) Spell(typhoon) if target.InRange(maim) Spell(maim) Spell(war_stomp) } } } ### actions.default AddFunction GuardianDefaultMainActions { #pulverize,cycle_targets=1,if=buff.pulverize.down if BuffExpires(pulverize_buff) and target.DebuffGain(thrash_bear_debuff) <= BaseDuration(thrash_bear_debuff) Spell(pulverize) #thrash_bear,if=dot.thrash_bear.remains<4.5 if target.DebuffRemaining(thrash_bear_debuff) < 4.5 Spell(thrash_bear) #mangle Spell(mangle) #pulverize,cycle_targets=1,if=buff.pulverize.remains0.25+(2-charges_fractional)*0.15 if BuffExpires(frenzied_regeneration_buff) and IncomingDamage(5) / MaxHealth() > 0.25 + { 2 - Charges(frenzied_regeneration count=0) } * 0.15 Spell(frenzied_regeneration) #bristling_fur,if=buff.ironfur.remains<2&rage<40 if BuffRemaining(ironfur_buff) < 2 and Rage() < 40 Spell(bristling_fur) } AddFunction GuardianDefaultCdActions { #skull_bash GuardianInterruptActions() #blood_fury Spell(blood_fury_apsp) #berserking Spell(berserking) #arcane_torrent Spell(arcane_torrent_energy) #use_item,slot=trinket2 GuardianUseItemActions() unless { BuffExpires(ironfur_buff) or RageDeficit() < 25 } and Spell(ironfur) or BuffExpires(frenzied_regeneration_buff) and IncomingDamage(6) / MaxHealth() > 0.25 + { 2 - Charges(frenzied_regeneration count=0) } * 0.15 and Spell(frenzied_regeneration) or BuffExpires(pulverize_buff) and target.DebuffGain(thrash_bear_debuff) <= BaseDuration(thrash_bear_debuff) and Spell(pulverize) or target.DebuffRemaining(thrash_bear_debuff) < 4.5 and Spell(thrash_bear) or Spell(mangle) or BuffRemaining(pulverize_buff) < GCD() and target.DebuffGain(thrash_bear_debuff) <= BaseDuration(thrash_bear_debuff) and Spell(pulverize) { #incarnation Spell(incarnation_guardian_of_ursoc) } } ### actions.precombat AddFunction GuardianPrecombatMainActions { #flask,type=flask_of_the_seventh_demon #food,type=azshari_salad #bear_form Spell(bear_form) } AddFunction GuardianPrecombatShortCdPostConditions { Spell(bear_form) } AddFunction GuardianPrecombatCdPostConditions { Spell(bear_form) } ### Guardian icons. AddCheckBox(opt_druid_guardian_aoe L(AOE) default specialization=guardian) AddIcon checkbox=!opt_druid_guardian_aoe enemies=1 help=shortcd specialization=guardian { unless not InCombat() and GuardianPrecombatShortCdPostConditions() { GuardianDefaultShortCdActions() } } AddIcon checkbox=opt_druid_guardian_aoe help=shortcd specialization=guardian { unless not InCombat() and GuardianPrecombatShortCdPostConditions() { GuardianDefaultShortCdActions() } } AddIcon enemies=1 help=main specialization=guardian { if not InCombat() GuardianPrecombatMainActions() GuardianDefaultMainActions() } AddIcon checkbox=opt_druid_guardian_aoe help=aoe specialization=guardian { if not InCombat() GuardianPrecombatMainActions() GuardianDefaultMainActions() } AddIcon checkbox=!opt_druid_guardian_aoe enemies=1 help=cd specialization=guardian { unless not InCombat() and GuardianPrecombatCdPostConditions() { GuardianDefaultCdActions() } } AddIcon checkbox=opt_druid_guardian_aoe help=cd specialization=guardian { unless not InCombat() and GuardianPrecombatCdPostConditions() { GuardianDefaultCdActions() } } ### Required symbols # arcane_torrent_energy # bear_form # berserking # blood_fury_apsp # bristling_fur # frenzied_regeneration # frenzied_regeneration_buff # galactic_guardian_buff # incarnation_guardian_of_ursoc # ironfur # ironfur_buff # thrash_bear_debuff # maim # mangle # mighty_bash # moonfire # moonfire_debuff # pulverize # pulverize_buff # shred # skull_bash # swipe_bear # thrash_bear # thrash_bear_debuff # typhoon # war_stomp # wild_charge