Register

Leafkiller's MoP Feral/Guardian Ovale Script

Face-rippin fun.

Moderator: Forum Administrators

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 01, 2012 2:33 pm

aggixx wrote:
Leafkiller wrote:I just pushed a new version of the script - in Nerien's 2.1.3. It has support for faster combo point recognition and also a change that (hopefully) will make the Ravage code work for the pvp 4 piece set. If anyone is using that, please let me know if the script is calling out Ravage every 30 seconds per the set bonus.


It's always worked for me with older versions when I've PvPed. Maybe I'm delusional.


It had a conditional that checked for the Incarnation talent point...

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 01, 2012 4:51 pm

Jeshu wrote:I know how I want to implement it now. Something like the following:
Code: Select all
pool while PoolingConditions() {
    OtherActions()
}

If PoolingConditions() is true, then pool energy for OtherActions(). If PoolingConditions() is false, then fall through directly to OtherActions().

I'm going to wait a few days before implementing this so I can think this through a bit more, but this would fit with how Ovale currently works. I don't really like the syntax I've come up with because it doesn't read nicely, so I'm open to suggestions.


Assuming I am interpreting it correctly, I don't like the structure you are proposing. Remember, I can already implement pooling by using the following construct (this also shows a correct countdown on the node I am planning on executing or any node that will be ready sooner that is earlier in the script):
Code: Select all
if {pooling conditions} {
    if energy >=50 or {BuffRemains(Berserk) > 1 and energy > 25} doPooledActivity()
}
if not {pooling conditions} {
    doTheRemainderOfTheScript()
}


My issue is that every time I add a new pooling condition, I have to restructure the script beyond that point into two blocks. The latest DoC+HotW rotation currently has four instances of pooling. I am considering adding at least one more for the fillers at the end of the script. With five instances of pooling I end up with a lot of nested blocks. Your proposed solution will simplify it a little in that I won't need two blocks per pooled condition, but (it looks like) it will still be necessary to nest the remainder of the script into a block, which means I will have a lot of nested blocks. Nested blocks are a pain to maintain and error prone, which is what I am trying to avoid.

My goal in requesting a new capability was to support a construct similar to the one we are using in Simc, where we can drop in a pooling statement anywhere without making any changes to the remainder of the script. I realize there is a fundamental difference between Ovale and Simc, since Simc loops through the action list finding the first action that is executable while Ovale evaluates all the nodes, and recommends the highest priority node that happens soonest, picking the first one it sees if more than one node are equal.

Coming back to the construct I am asking for. I was thinking about what the Simc construct "actions+=/pool_resource,wait=0.1," is actually doing. It is not a loop, but rather it is like a "C" continue statement. This works great for Simc since it can simply stop evaluating the script at that point and go back to the top of it, but not as cleanly for Ovale since it wants to evaluate all of the nodes below and make a recommendation. However, if you look at the pooling construct that already works for Ovale, it is a workaround for the lack of a continue statement. Basically, I am looking for a new kind of control statement that will tell Ovale to stop evaluating nodes - like a "continue" statement. Something like the following could work:
Code: Select all
if {conditions} {
    # do some stuff
    Continue
}
# do the remainder of the script


All "Continue" does is stop processing the remainder of the script and pick the appropriate node from what has already been evaluated. I can take care of the cooldown portion by adding the "if energy > N" conditionals as needed, but that is already supported in Ovale. I realize as I am writing this, that I don't really need the complexity of an energy pooling statement, I simply need a way to tell Ovale to stop processing the rest of the script at a given point without having to enclose it in an "if" block.

Revered
Posts: 201
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Sat Dec 01, 2012 5:44 pm

I probably wasn't clear when I made that late night post. In my example:
Code: Select all
pool while PoolingConditions() {
    Actions()
}

PoolingConditions() doesn't have to explicitly list the amount of energy that needs to be pooled. Those are the the conditions for wanting to pool energy, e.g., Rip is not about to fall off. If you want to always pool energy for Actions(), you would do:
Code: Select all
pool while true()
    Actions()

I'm still tinkering with the right syntax for expressing it so that it's nice and readable in the script. Sidoine put a lot of work into choosing good verbiage so that an Ovale script was readable.

Revered
Posts: 201
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Sat Dec 01, 2012 5:49 pm

You're being very insistent on some sort of imperative syntax for the Ovale script language which really doesn't fit well into how Ovale works with nodes and time intervals. It's not going to happen because it breaks a major portion of the language related to action priorities.

What I'm offering is a way to express energy pooling without needing explicit energy requirements other than "pool enough for the something in given group of actions". This concept fits with the rest of how Ovale works without breaking other parts of the language.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 01, 2012 6:34 pm

Jeshu wrote:You're being very insistent on some sort of imperative syntax for the Ovale script language which really doesn't fit well into how Ovale works with nodes and time intervals. It's not going to happen because it breaks a major portion of the language related to action priorities.

What I'm offering is a way to express energy pooling without needing explicit energy requirements other than "pool enough for the something in given group of actions". This concept fits with the rest of how Ovale works without breaking other parts of the language.


I am trying to avoid nesting a lot of blocks. What do you think the benefit is for what you are proposing that differentiates it from the current workaround?

Revered
Posts: 201
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Sat Dec 01, 2012 8:43 pm

What I'm proposing fits in with how Ovale treats nodes. A group is a node that returns the best available subnode. Braces are used to define groups, and if you have groups within groups, you'll need to nest braces or else create a function to represent the inner group.

What you're proposing with an imperative statement doesn't fit with how Ovale works. Ovale has no concept of "till the end of the script" or "start at the top of the script" even though you can force that interpretation if you use a subset of the Ovale script language. I'm not comfortable with introducing something like this into the Ovale script language because it involves changing something core about how Ovale works. That's a design decision I would defer to Sidoine.

Posts: 4
Joined: Sat Oct 13, 2012 11:46 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Freakaleak » Sun Dec 02, 2012 12:23 am

IS the DoC spec still the way to go after the patch ?

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sun Dec 02, 2012 1:27 am

Freakaleak wrote:IS the DoC spec still the way to go after the patch ?


It has the highest dps if that is what you are asking.

Exalted
User avatar
Posts: 1654
Joined: Mon May 24, 2010 10:21 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Tinderhoof » Sun Dec 02, 2012 5:21 am

Freakaleak wrote:IS the DoC spec still the way to go after the patch ?

The only changes to Feral for 5.1 was tool tip updates from 5.0 changes, and our new wilty OOC aura. DoC is the same as it was before.

Posts: 4
Joined: Sat Oct 13, 2012 11:46 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Freakaleak » Sun Dec 02, 2012 9:51 am

Thank you. Maybe its my gear but I'm seeing a bigger increase with CoTW ATM or I'm just doing something wrong. I just changed back to kitty after tanking for a while and also havent had any luck with T14 drops in LFR but the chest I was wondering if you guys would take a look at my link and let me know of anything you would change thank you.


http://us.battle.net/wow/en/character/a ... eak/simple

Exalted
User avatar
Posts: 1654
Joined: Mon May 24, 2010 10:21 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Tinderhoof » Sun Dec 02, 2012 2:39 pm

Dancing Steel no loner sucks for us. Our uptime went from around 22-28% to 40-50%. That will give you a boost.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sun Dec 02, 2012 4:09 pm

@Jeshu - I have another potential solution that has zero impact on how Ovale treats nodes and (I think) is simple to implement. How about an enhancement to Texture that allows me to put a number on top of the texture? The one trick is that I need to be able to generate the number dynamically. Something like the following:
Code: Select all
AddFunction FBWaitTime
{
    # there is a TimeToMaxEnergy(). Is there a TimeToEnergy(N), where 1<=N<=100?
    if BuffPresent(Berserk) TimeToEnergy(25)
    unless BuffPresent(Berserk) TimeToEnergy(50)
}

#MainRotation
if ComboPoints()>=5 and TargetDebuffPresent(rip) and BITWRange() and {{BuffRemaining(Berserk)>1 and Energy<25}
        or {BuffExpires(Berserk) and Energy<50}} Texture(ability_druid_ferociousbite number=FBWaitTime())
# BITW 5 combo point FB
if ComboPoints() >=5 and TargetDebuffPresent(rip) and BITWRange() Spell(ferocious_bite)


This works because the Texture node evaluates ahead of the FB node that follows it. I can also use this construct to make the frames where I am showing the damage ratios look better:
Code: Select all
AddFunction RipTickDamageRatio
{
    if TargetDebuffPresent(RIP) {100 * RipTickDamage()/LastRipTickDamage()}
    unless TargetDebuffPresent(RIP) 100.0
}

AddIcon help=Rip size=small mastery=2 checkboxon=cooldownsRatio
{
    # Add a background texture to make it look better
    #RipTickDamageRatio()
    Texture(ability_ghoulfrenzy number=RipTickDamageRatio())
}

Revered
Posts: 201
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Sun Dec 02, 2012 9:33 pm

@Leafkiller: No, right now there's no way to allow parameters of functions to be other functions. That's a problem with the parser, and something I was working on in ticket 181.

I believe you can do "0s before Energy(more 50)" to express the time before you reach 50 energy. I'll check once I get home and update this reply.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sun Dec 02, 2012 10:14 pm

Jeshu wrote:@Leafkiller: No, right now there's no way to allow parameters of functions to be other functions. That's a problem with the parser, and something I was working on in ticket 181

I figured that would be the difficult part here, but that might be an easier path to take than trying to directly support a new "pool" structure.

Is it possible/practical to add support for local variables as a way to work around the parameter issue? I don't know how difficult that would be for the Ovale script parsing.

For example, something like this:
Code: Select all
AddFunction FBWaitTime
{
    # there is a TimeToMaxEnergy(). Is there a TimeToEnergy(N), where 1<=N<=100?
    if BuffPresent(Berserk) TimeToEnergy(25)
    unless BuffPresent(Berserk) TimeToEnergy(50)
}

#MainRotation
if ComboPoints()>=5 and TargetDebuffPresent(rip) and BITWRange() and {{BuffRemaining(Berserk)>1 and Energy<25}
        or {BuffExpires(Berserk) and Energy<50}}
{
    local N
    N = FBWaitTime()
    Texture(ability_druid_ferociousbite number=N)
}
# BITW 5 combo point FB
if ComboPoints() >=5 and TargetDebuffPresent(rip) and BITWRange() Spell(ferocious_bite)

Honored
Posts: 51
Joined: Wed May 25, 2011 3:12 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Kihrawr » Tue Dec 04, 2012 2:08 pm

I have a question about the script. I've recently been doing Brawler's Guild fights, which have a 2 minute enrage. I could be wrong, but my assumption has been that Incarnation and Nature's Vigil will be the highest DPS talents for 2 min fights. My question has to do with Incarnation.

The Ovale script when I am at low energy with Incarnation still active shows a disabled Shred icon. As I gain energy, that Shred icon lights up. If I wait just a moment longer to get even more energy, that Shred icon will change to Ravage. I find this very confusing, since if I'm reacting quickly to what the script tells me to do, I'll just end up Shredding and miss out on Ravages.

Is this a bug in the script, or should I actually be Shredding as soon as I can? The fact that the script changes the icon to Ravage implies to me that there's a bug here, and that I'd get the most DPS by waiting for enough energy to Ravage, but I wanted to make sure.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Thu Dec 06, 2012 4:36 am

Kihrawr wrote:Is this a bug in the script, or should I actually be Shredding as soon as I can? The fact that the script changes the icon to Ravage implies to me that there's a bug here, and that I'd get the most DPS by waiting for enough energy to Ravage, but I wanted to make sure.


It is a script issue. You should use Ravage when Incarnation is up. I will fix it next time I push a new script.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Thu Dec 06, 2012 12:21 pm

Can someone with the 4 piece pvp set tell me the spell ID of the proc you get that allows the unstealthed ravage?

Exalted
User avatar
Posts: 1337
Joined: Fri Nov 25, 2011 7:49 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby aggixx » Thu Dec 06, 2012 1:52 pm

Ravage Ready: http://www.wowhead.com/spell=81022
Ravage Charging: http://www.wowhead.com/spell=131538 (turns into 81022 when aura ends)
Image

Exalted
User avatar
Posts: 1337
Joined: Fri Nov 25, 2011 7:49 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby aggixx » Thu Dec 06, 2012 9:17 pm

Here you go Leaf, here's my modified version in checkbox form:
Spoiler: show
Code: Select all
# Leafkiller's Feral/Guardian druid script.
# Cat Rotation based on Simulationcraft single target default script. Contributions to that have come from many ferals.
# Guardian script from Tinderhoof.
# Lots of input and constructs from jlam aka Nerien
# Revision History
# 5.1.1 11/30/2012 Ravage fix for PVP 4 set and support for faster combo points on crits
# 5.05.14 11/09/2012 New spell ID for clearcasting
# 5.05.14 11/09/2012 Only suggest Feral_spirit if the symbiosis buff is present - otherwise it suggests symbiosis even when the buff is not up
# 5.05.13 10/23/2012 Don't pool during NV
# 5.05.12 10/22/2012 Fix bad spell name in Rake conditional (tigers_fury should be TIGERSFURY)
# 5.05.11 10/22/2012 Fix for energy pooling for non-DoC specs. Small updates based on most recent sim script for TTD. FFF() added. TTD updated.
# 5.05.10 10/21/2012 4 Piece PvP gear support and Nature's Vigil HT code
# 5.05.9 10/16/2012 Feral Spirit support
# 5.05.8 10/14/2012 Fix 3 second SR to interfere less with Rip for HotW (and NV). 60 seconds for Rake.
# 5.05.7 10/14/2012 Update to latest version of sim script - small changes and Rake improvements
# 5.05.6 10/11/2012 Heart of the Wild support, add out of combat support
# 5.05.6 10/10/2012 Update to limit SR using comb points when DoC is up
# 5.05.5a 10/08/2012 Update to include optimizations in simc script
# 5.05.5 09/24/2012 Multiply damage ratios by 100 to avoid rounding issues, put in variable Rip overwriting during BitW, tweak numbers slightly (TF is 14% not 15% for example).
# 5.05.4 09/23/2012 Level 90 script - First complete version
# 5.05.2 09/20/2012 Level 90 script - WiP
# 5.05.1 09/08/2012 First version in Nerien's addon

# Shared defines
Define(barkskin 22812)
    SpellInfo(barkskin cd=60)
Define(cat_form 768)
    SpellAddBuff(cat_form cat_form=1)
Define(cenarion_ward 102351)
    SpellInfo(cenarion_ward cd=30)
Define(dream_of_cenarius_damage 108381)
    SpellInfo(dream_of_cenarius_damage duration=30 )
    SpellAddBuff(dream_of_cenarius_damage dream_of_cenarius_damage=1)
Define(feral_spirit 110807)
Define(force_of_nature 106737)
    SpellInfo(force_of_nature cd=60)
Define(healing_touch 5185)
Define(heart_of_the_wild_spell 108292)
    SpellInfo(heart_of_the_wild_spell cd=360)
    SpellAddBuff(heart_of_the_wild_spell heart_of_the_wild_spell=1)
Define(mark_of_the_wild 1126)
    SpellInfo(mark_of_the_wild duration=3600)
    SpellAddBuff(mark_of_the_wild mark_of_the_wild=1)
Define(natures_swiftness 132158)
    SpellInfo(natures_swiftness cd=60)
    SpellAddBuff(natures_swiftness natures_swiftness=1)
Define(natures_vigil_buff 124974)
    SpellInfo(natures_vigil_buff cd=180)
    SpellAddBuff(natures_vigil_buff natures_vigil_buff=1)
Define(predatory_swiftness 69369)
    SpellAddBuff(predatory_swiftness predatory_swiftness=1)
Define(primal_fury 16961)
Define(renewal 108238)
    SpellInfo(renewal cd=120 )
Define(symbiosis 110309)
    SpellAddBuff(symbiosis symbiosis=1)
Define(treants 106737)
    SpellInfo(treants duration=15 cd=60)
Define(tricks 57933)
    SpellAddBuff(tricks tricks=1)
Define(wrath 5176)
Define(weakened_armor 113746)
    SpellInfo(weakened_armor duration=30)
Define(weakened_blows 115798)
    SpellInfo(weakened_blows duration=30)
 
# Talents
Define(natures_swiftness_talent 4)
Define(renewal_talent 5)
Define(cenarion_ward_talent 6)
Define(faerie_swarm 7)
Define(soul_of_the_forest 10)
Define(incarnation_talent 11)
Define(force_of_nature_talent 12)
Define(heart_of_the_wild 16)
Define(dream_of_cenarius_talent 17)
Define(natures_vigil_talent 18)

#Buff
Define(CLEARCASTING 135700)

#Glyphs
Define(GLYPHOFSHRED 114234)
Define(GLYPHOFSAVAGERY 127540)

# cat abilities. Using the convention that constants are CAPs
Define(BERSERK 106951) #cat cd buff
    SpellInfo(BERSERK duration=15 cd=180 )
    SpellAddBuff(BERSERK BERSERK=1 )
Define(FAERIEFERAL 770) #bear+cat
    SpellInfo(FAERIEFERAL duration=300 cd=6)
    SpellAddTargetDebuff(FAERIEFERAL FAERIEFERAL=1 weakened_armor=1)
Define(FAERIESWARM 102355) #bear+cat
    SpellInfo(FAERIESWARM duration=300 cd=6)
    SpellAddTargetDebuff(FAERIESWARM FAERIESWARM=1 weakened_armor=1)
Define(FEROCIOUSBITE 22568) #cat finish 25-50 energy
    SpellInfo(FEROCIOUSBITE energy=25 combo=0)
Define(INCARNATIONCAT 102543)
    SpellInfo(INCARNATIONCAT duration=30 cd=180 )
Define(MAIM 22570) #cat interrupt
    SpellInfo(MAIM cd=10 energy=35 combo=0)
Define(MANGLECAT 33876) #cat bleed+debuff
    SpellInfo(MANGLECAT inccounter=ripshreds energy=35 combo=1)
    SpellInfo(MANGLECAT critcombo=1 if_spell=primal_fury)
Define(RAKE 1822) #cat bleed
    SpellInfo(RAKE combo=1 duration=15 energy=35 tick=3)
    SpellInfo(RAKE base=98.13 bonusap=0.31453)
    SpellInfo(RAKE critcombo=1 if_spell=primal_fury)
    SpellAddTargetDebuff(RAKE RAKE=1)
    SpellDamageBuff(RAKE dream_of_cenarius_damage=1.25)
Define(RAVAGE 6785)
    SpellInfo(RAVAGE inccounter=ripshreds energy=45 combo=1)
    SpellInfo(RAVAGE critcombo=1 if_spell=primal_fury)
Define(RAVAGEBANG 102545)
    SpellInfo(RAVAGEBANG inccounter=ripshreds energy=0 combo=1)
    SpellInfo(RAVAGEBANG critcombo=1 if_spell=primal_fury)
Define(RIP 1079) #cat bleed
    SpellInfo(RIP resetcounter=ripshreds duration=16 energy=30 tick=2 combo=0)
    SpellInfo(RIP base=112.76 bonuscp=320 bonusapcp=0.0484) # damage coefficients
    SpellAddTargetDebuff(RIP RIP=1)
    SpellDamageBuff(RIP dream_of_cenarius_damage=1.25)
Define(SAVAGEROAROLD 52610)
    SpellInfo(SAVAGEROAROLD duration=18 combo=0 energy=25)
    SpellAddBuff(SAVAGEROAROLD SAVAGEROAROLD=1)
Define(SAVAGEROARGLYPHED 127538)
    SpellInfo(SAVAGEROARGLYPHED duration=12 combo=-5 energy=25)
    SpellAddBuff(SAVAGEROARGLYPHED SAVAGEROARGLYPHED=1)
SpellList(savage_roar_buff 52610 127538)
Define(SHRED 5221) #cat behind
    SpellInfo(SHRED inccounter=ripshreds energy=40 combo=1)
    SpellInfo(SHRED critcombo=1 if_spell=primal_fury)
Define(SHREDBANG 114236)
    SpellInfo(SHREDBANG inccounter=ripshreds energy=40 combo=1)
    SpellInfo(SHREDBANG critcombo=1 if_spell=primal_fury)
Define(STAMPEDEBUFF 81022)
    SpellAddBuff(STAMPEDEBUFF STAMPEDEBUFF=1)
Define(SKULLBASHCAT 80965) #cat interrupt
    SpellInfo(SKULLBASHCAT cd=15 energy=15)
Define(THRASHCAT 106830)
    SpellInfo(THRASHCAT duration=15 energy=50 tick=3)
    SpellAddTargetDebuff(THRASHCAT THRASHCAT=1 weakened_blows=1)
    SpellDamageBuff(THRASHCAT dream_of_cenarius_damage=1.25)
Define(TIGERSFURY 5217) #cat buff
    SpellInfo(TIGERSFURY duration=6 energy=-60 cd=30)
    SpellAddBuff(TIGERSFURY TIGERSFURY=1)
Define(WILDCHARGE 49376)
    SpellInfo(WILDCHARGE cd=15)

# Bear abilities. Using the convention that constants are all CAPs

Define(BERSERKBEAR 106952) #cat+bear cd buff
    SpellInfo(BERSERKBEAR duration=10 cd=180 )
    SpellAddBuff(BERSERKBEAR BERSERKBEAR=1)
Define(ENRAGE 5229)
Define(FRENZIEDREGEN 22842)
Define(INCARNATIONBEAR 102558)
    SpellInfo(INCARNATIONBEAR duration=30 cd=180 )
Define(LACERATE 33745)
Define(MANGLEBEAR 33878)
Define(MAUL 6807)
Define(MIGHTOFURSOC 106922)
Define(RENEWAL 108238)
Define(SAVAGEDEFENSE 62606)
Define(SURVIVALINSTINCTS 61336)
Define(SWIPEBEAR 779)
Define(THRASHBEAR 77758)
Define(WILDCHARGEBEAR 102401)
    SpellInfo(WILDCHARGEBEAR cd=15)

AddCheckBox(cooldownsL "Show Left Rotation Boxes" default)
AddCheckBox(cooldownsR "Show Right Cooldown Boxes" default)

AddCheckBox(bearaoe "Bear AOE Rotation")
AddCheckBox(alternate "Alternate layout")

AddCheckBox(cooldownsRatio "Show Rake and Rip Ratio Boxes" mastery=2)
AddCheckBox(lucioles SpellName(FAERIEFERAL) default mastery=2)
AddCheckBox(berserk "Cat Berserk" default mastery=2)
AddCheckBox(infront "Frontal attack" mastery=2)
AddCheckBox(predictive "Hide predictive box" mastery=2)

#
# Mastery=2 Feral cooldown boxes and rotation
#
AddFunction FFF
{
    if TalentPoints(faerie_swarm) Spell(FAERIESWARM)
    if not TalentPoints(faerie_swarm) Spell(FAERIEFERAL)
}
AddFunction SavageRoar
{
    if Glyph(GLYPHOFSAVAGERY) Spell(SAVAGEROARGLYPHED)
    if Glyph(GLYPHOFSAVAGERY no) and ComboPoints(more 0) Spell(SAVAGEROAROLD)
}

AddFunction TimeUntilTargetIsDead
{
    target.TimeToDie()
}


AddFunction MinRatioForRipOverwrite
{
    if {TimeUntilTargetIsDead() >120} 112
    if {TimeUntilTargetIsDead() <=120} {{0.002*{180.00-TimeUntilTargetIsDead()}} + 1.00} * 100
}

#
# Rake functions
AddFunction RakeTickDamage
{
    # rake_tick_damage = (tick_damage + coeff * AP) * damage_multiplier * bleed_multiplier
    Damage(RAKE) * {1 + Mastery()/100}
}

AddFunction LastRakeTickDamage
{
    # rake_tick_damage = (tick_damage + coeff * AP) * damage_multiplier * bleed_multiplier
    LastSpellEstimatedDamage(RAKE) * {1 + LastSpellMastery(RAKE)/100}
}

AddFunction RakeTickDamageRatio
{
    if TargetDebuffPresent(RAKE) {100 * RakeTickDamage()/LastRakeTickDamage()}
    unless TargetDebuffPresent(RAKE) 100.0
}

#
# Rip functions
AddFunction RipTickDamage
{
    # Damage(rip) == { 113 + (320 * CP) + (0.3872 * AP * CP) } * DamageMultiplier(rip)
    Damage(RIP) * {1 + Mastery()/100}
}

AddFunction LastRipTickDamage
{
    # Damage(rip) == { 113 + (320 * CP) + (0.3872 * AP * CP) } * DamageMultiplier(rip)
    LastSpellEstimatedDamage(RIP) * {1 + LastSpellMastery(RIP)/100}
}

AddFunction RipTickDamageRatio
{
    if TargetDebuffPresent(RIP) {100 * RipTickDamage()/LastRipTickDamage()}
    unless TargetDebuffPresent(RIP) 100.0
}


AddIcon help=Rake size=small mastery=2 checkboxon=cooldownsRatio
{
    RakeTickDamageRatio()
}

AddIcon help=Rip size=small mastery=2 checkboxon=cooldownsRatio
{
    RipTickDamageRatio()
}

AddFunction ExtendRip
{
    Spell(RAVAGE usable=1)
    if CheckBoxOn(infront) {
        if Glyph(GLYPHOFSHRED) and {BuffPresent(TIGERSFURY) or BuffPresent(BERSERK)} Spell(SHRED)
        Spell(MANGLECAT)
    }
    Spell(SHRED)
}

AddFunction AddCombo
{   
    ExtendRip()
}


AddFunction AddComboWithThrash
{   
    if ComboPoints() >= 5 and target.DebuffRemains(THRASHCAT) < 6  and TimeUntilTargetIsDead() >=6 Spell(THRASHCAT)
    AddCombo()
}

AddFunction BITWRange
{
    {ArmorSetParts(T13 more 1) and TargetLifePercent(less 60)} or TargetLifePercent(less 25)
}

AddFunction ExtendedRipDuration
{
    if {target.DebuffPresent(RIP) and Counter(ripshreds) < 3} {{{3-Counter(ripshreds)}*2} + target.DebuffRemains(RIP)}
    if {target.DebuffPresent(RIP) and Counter(ripshreds) >= 3} {target.DebuffRemains(RIP)}
}

AddFunction EnergyForPredatorySwiftness
{
    Energy()+{10*{BuffRemains(predatory_swiftness) -1}}
}

AddFunction EnergyForSoul
{
    Energy()+{10*{4 - ComboPoints()}}
}
 
AddIcon help=cd size=small mastery=2 checkboxon=cooldownsL {
    if TargetIsInterruptible(yes) {
        Spell(SKULLBASHCAT)
        if ComboPoints(more 1)
            Spell(MAIM)
    }
    Spell(WILDCHARGE)
}

AddIcon help=cd size=small mastery=2 checkboxon=cooldownsL { # Berserk Icon
    if BuffPresent(TIGERSFURY) Spell(BERSERK)
    if 0s before Spell(BERSERK) Texture(Ability_mount_polarbear_white)
}

AddFunction NotInCombat
{
    if not InCombat() {
        if not BuffPresent(str_agi_int any=1) Spell(mark_of_the_wild)
        if not BuffPresent(dream_of_cenarius_damage) and TalentPoints(dream_of_cenarius_talent) Spell(healing_touch)
        unless Stance(3) Spell(cat_form)
        if BuffRemains(savage_roar_buff) <=1 SavageRoar()
        if TalentPoints(force_of_nature_talent) Spell(treants)
    }
}
AddFunction StartRotation
{
    if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness) and BuffRemains(predatory_swiftness) <=1.5 and BuffExpires(dream_of_cenarius_damage)
        Spell(healing_touch)
    if BuffRemains(savage_roar_buff) <=1 SavageRoar()
    if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness) and ComboPoints() >= 4 and BuffStacks(dream_of_cenarius_damage) <2
        Spell(healing_touch)
    if TalentPoints(dream_of_cenarius_talent) and PreviousSpell(natures_swiftness) Spell(healing_touch)
}

AddFunction TFBerserk
{   
    # TF + Berserk logic - only show Berserk if both are off of cooldown - everyone should macro TF to their Berserk key
    if not {BuffPresent(BERSERK) or BuffPresent(CLEARCASTING)} {
        if Energy(less 36) and {0s before Spell(TIGERSFURY)} {
            if CheckBoxOn(berserk) Spell(BERSERK)
            Spell(TIGERSFURY)
        }
    }
   
    #In case Berserk was not cast with TF
    if {BuffPresent(TIGERSFURY) or {TimeUntilTargetIsDead() <15 and SpellCooldown(TIGERSFURY) >6 }} and CheckBoxOn(berserk) Spell(BERSERK)
}

AddFunction MainRotation
{
    # Two conditions for FB during Blood of the Water phase
    # Add in FB code for end of fight - only do this is Rip buff is present
    if BITWRange() and ComboPoints(more 0) and TargetDebuffPresent(RIP) and TargetDebuffExpires(RIP 2.9) Spell(FEROCIOUSBITE)
    if CheckBoxOn(lucioles) and target.DebuffStacks(weakened_armor any=1) <3  FFF()
   
    if TimeUntilTargetIsDead() >=6 and BuffPresent(CLEARCASTING) and TargetDebuffExpires(THRASHCAT 3) and BuffExpires(dream_of_cenarius_damage) Spell(THRASHCAT)
   
    # Blood in the water code - mostly for DoC - combined the BITW check to make Ovale more efficient
    if BITWRange() {
        if BuffRemains(savage_roar_buff) <=3 and ComboPoints(more 0) and BuffExpires(dream_of_cenarius_damage) SavageRoar()   
        if TalentPoints(dream_of_cenarius_talent) and BuffExpires(dream_of_cenarius_damage) and BuffExpires(predatory_swiftness) and ComboPoints() >=5
            Spell(natures_swiftness)   
        if ComboPoints() >=5 and TimeUntilTargetIsDead() >30 and RipTickDamageRatio() >=114 Spell(RIP)
        if TargetDebuffPresent(RIP) and ComboPoints() >=5 Spell(FEROCIOUSBITE)
    }
   
    if BuffPresent(dream_of_cenarius_damage) and ComboPoints() >=5 and TimeUntilTargetIsDead() >6 and {TargetDebuffExpires(RIP 2) or
        {TargetDebuffExpires(RIP 6) and RipTickDamageRatio() >=100 and not BITWRange()}} Spell(RIP)
   
    if BuffRemains(savage_roar_buff) <=3 and ComboPoints(more 0) and BuffExpires(dream_of_cenarius_damage) and TalentPoints(dream_of_cenarius_talent) SavageRoar()
    if BuffRemains(savage_roar_buff) <=3 and ComboPoints(more 0) and not TalentPoints(dream_of_cenarius_talent) {
        if not {TargetDebuffExpires(RIP) <2 and {BuffPresent(BERSERK) or target.DebuffRemains(RIP)+1.9 <=SpellCooldown(TIGERSFURY)}} SavageRoar()
    }
   
    if TalentPoints(dream_of_cenarius_talent) and BuffExpires(dream_of_cenarius_damage) and BuffExpires(predatory_swiftness) and ComboPoints() >=5
             and TargetDebuffExpires(RIP) <3 and {BuffPresent(BERSERK) or target.DebuffRemains(RIP)+1.9 <=SpellCooldown(TIGERSFURY)} and not BITWRange()
        Spell(natures_swiftness)
   
    # Time to recast Rip - clip if possible - try to hold off for TF       
    if ComboPoints() >=5 and TimeUntilTargetIsDead() >=6 and TargetDebuffExpires(RIP) <2 and {BuffPresent(BERSERK) or target.DebuffRemains(RIP)+1.9 <=SpellCooldown(TIGERSFURY)}
        Spell(RIP)
       
    if TimeUntilTargetIsDead() >=6 and BuffPresent(CLEARCASTING) and TargetDebuffExpires(THRASHCAT 3) Spell(THRASHCAT)
   
    #Extends Rip with shred/mangle/ravage
    if TargetDebuffPresent(RIP) and TargetDebuffExpires(RIP 4) and Counter(ripshreds less 3) ExtendRip()
   
    if {TimeUntilTargetIsDead() <=4 and ComboPoints() >=5} or {TimeUntilTargetIsDead() <=1 and {{ComboPoints() >=2 and Energy() >=38} or ComboPoints() >=3}}
        Spell(FEROCIOUSBITE)
   
    if ComboPoints() >=5 and BuffRemains(savage_roar_buff) <=6 and target.DebuffPresent(RIP) and
        {{TalentPoints(soul_of_the_forest) and ExtendedRipDuration() > 6} or ExtendedRipDuration() >10} SavageRoar()
       
    if ComboPoints() >=5 and target.DebuffPresent(RIP) and {{{TalentPoints(soul_of_the_forest) or BuffPresent(BERSERK)} and ExtendedRipDuration() > 6}
        or ExtendedRipDuration() >10} Spell(FEROCIOUSBITE)

    # clip Rake early if TF is up and rake ramining is less than 9 seconds
    if TimeUntilTargetIsDead() >3 and BuffPresent(dream_of_cenarius_damage) and target.DebuffRemains(RAKE) <6 and RakeTickDamageRatio() >=100 Spell(RAKE)
    if TimeUntilTargetIsDead() >3 and RakeTickDamageRatio() >=112 Spell(RAKE)
    if TimeUntilTargetIsDead() >3 and TargetDebuffExpires(RAKE 2.9) and {BuffPresent(BERSERK) or Energy(more 60)
            or {SpellCooldown(TIGERSFURY) +0.8 } >=target.DebuffRemains(RAKE)}
        Spell(RAKE)
}

AddFunction Fillers
{       
    # take care of OOC when it was not used for Thrash
    if BuffPresent(CLEARCASTING) AddCombo()

    # use Ravage! before other fillers since it is freen
   
    # aggressive shred for Predatory Swiftness and/or Soul of the Forest
    if TalentPoints(dream_of_cenarius_talent) and BuffRemains(predatory_swiftness) >1 and EnergyForPredatorySwiftness() > {{4 - ComboPoints()}*20} AddCombo()
    if TalentPoints(soul_of_the_forest) and ComboPoints() <5 and EnergyForSoul() > {{5 - ComboPoints()}*20} and not TalentPoints(dream_of_cenarius_talent) AddCombo()
   
    # Shred for combo points for Rip or SR
    if ComboPoints(less 5) and TargetDebuffExpires(RIP 3) AddCombo()
    if ComboPoints(less 1) and BuffExpires(savage_roar_buff 2) AddCombo()
   
    if TimeUntilTargetIsDead() <=8.5 AddCombo()
   
    # Shred aggressively for Berserk and TF
    if BuffPresent(BERSERK) or BuffPresent(TIGERSFURY) or BuffPresent(natures_vigil_buff) AddComboWithThrash()
   
    # Shred to burn off energy so we can TF without capping
    if { 4s before Spell(TIGERSFURY) } AddComboWithThrash()
   
    # Fallback Shred to prevent energy capping
    if 1.4s before Energy(more 99) AddComboWithThrash()
   
    # Nature's Vigil HTs for extra damage
    if not BuffPresent(BERSERK) and BuffPresent(natures_vigil_buff) {
        if BuffExpires(predatory_swiftness) Spell(natures_swiftness)
        if BuffPresent(predatory_swiftness) or BuffPresent(natures_swiftness) Spell(healing_touch)
    }
   
    # Feral Spirit
    if BuffPresent(symbiosis) Spell(feral_spirit)
   
    # opportunistic FF
    if CheckBoxOn(lucioles) and target.DebuffExpires(weakened_armor) <15 and Energy(less 75) FFF()
}

# Predictive rotation (alternative layout)
AddIcon help=predictive mastery=2 checkboxoff=predictive checkboxon=alternative size=small {
    if Stance(3) {
        StartRotation()
        MainRotation()
    }
    if Stance(1) {
        if BuffPresent(heart_of_the_wild_spell) Spell(FRENZIEDREGEN)
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(0) {
        if BuffPresent(heart_of_the_wild_spell) {
            if BuffExpires(heart_of_the_wild_spell) Texture(spell_holy_blessingofagility)
        }
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(4) or Stance(2) Spell(cat_form)
}

AddIcon help=hotw mastery=2 size=small checkboxon=alternative {
    if TalentPoints(heart_of_the_wild_talent) Spell(HEART_OF_THE_WILD)
    if TalentPoints(dream_of_cenarius_talent) Spell(natures_swiftness)
}

# Main rotation
AddIcon help=main mastery=2 {
    NotInCombat()
    if Stance(3) {
        StartRotation()
        TFBerserk()   
        if not TargetInRange(SHRED) Texture(ability_druid_catformattack)
        MainRotation()
        Fillers()
    }
    if Stance(1) {
        if BuffPresent(heart_of_the_wild_spell) {
            if CheckBoxOff(bearaoe) BearMain()
            if CheckBoxOn(bearaoe) BearMainAOE()
        }
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(0) {
        if BuffPresent(heart_of_the_wild_spell) {
            if CastTime(wrath) <BuffRemains(heart_of_the_wild_spell) Spell(wrath)
            Spell(cat_form)
        }
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(4) or Stance(2) Spell(cat_form)
}

# Predictive rotation
AddIcon help=predictive mastery=2 checkboxoff=predictive checkboxoff=alternative {
    if Stance(3) {
        StartRotation()
        MainRotation()
    }
    if Stance(1) {
        if BuffPresent(heart_of_the_wild_spell) Spell(FRENZIEDREGEN)
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(0) {
        if BuffPresent(heart_of_the_wild_spell) {
            if BuffExpires(heart_of_the_wild_spell) Texture(spell_holy_blessingofagility)
        }
        if not BuffPresent(heart_of_the_wild_spell) Spell(cat_form)
    }
    if Stance(4) or Stance(2) Spell(cat_form)
}

AddIcon help=cd size=small mastery=2 checkboxon=cooldownsR { # Rake
    if BuffExpires(savage_roar_buff) Texture(ability_druid_skinteeth)
}
AddIcon help=cd size=small mastery=2 checkboxon=cooldownsR { # Rip
    if TargetDebuffExpires(RIP) Texture(ability_ghoulfrenzy)
}
AddIcon help=cd size=small mastery=2 checkboxon=cooldownsR { # Rake
    if TargetDebuffExpires(RAKE ) Texture(ability_druid_disembowel)
}
AddIcon help=cd size=small mastery=2 checkboxon=cooldownsR {
    Spell(TIGERSFURY)
}

#
# Mastery=3 Guardian cooldown boxes and rotation
#
AddIcon help=cd size=small mastery=3 checkboxon=cooldownsL {
    Spell(barkskin)
}

AddIcon help=cd size=small mastery=3 checkboxon=cooldownsL {
    if TalentPoints(natures_swiftness_talent) Spell(natures_swiftness)
    if TalentPoints(renewal_talent) Spell(RENEWAL)
    if TalentPoints(cenarion_ward_talent) Spell(cenarion_ward)
}

AddFunction BearMain
{
    if 1s before Spell(MANGLEBEAR) Spell(MANGLEBEAR)

    if not TargetDebuffPresent(weakened_blows any=1) Spell(THRASHBEAR)
    if target.DebuffStacks(weakened_armor any=1) <1 FFF()
    if TargetDebuffPresent(THRASHBEAR) <4 Spell(THRASHBEAR)

    Spell(LACERATE)
    FFF()
}

AddFunction BearMainAOE
{
    if 1s before Spell(MANGLEBEAR) Spell(MANGLEBEAR)
    Spell(THRASHBEAR)
    Spell(SWIPEBEAR)
}

AddIcon mastery=3 size=small checkboxon=alternate checkboxoff=cooldownsL {
}

# Main rotation
AddIcon help=main mastery=3 {
    if CheckBoxOff(bearaoe) BearMain()
    if CheckBoxOn(bearaoe) BearMainAOE()
}

AddIcon help=defense mastery=3 checkboxoff=alternate {
    if Rage(less 11) Spell(ENRAGE useable=1)
    Spell(SAVAGEDEFENSE usable=1)
    Spell(FRENZIEDREGEN)
}

AddIcon help=cd size=small mastery=3 checkboxon=cooldownsR {
    Spell(SURVIVALINSTINCTS)
}

AddIcon help=cd size=small mastery=3 checkboxon=cooldownsR {
    Spell(MIGHTOFURSOC)
}

AddIcon help=cd size=small mastery=3 checkboxon=cooldownsR {
    if TalentPoints(incarnation_talent) Spell(INCARNATIONBEAR)
    if TalentPoints(force_of_nature_talent) Spell(force_of_nature)
}

AddIcon help=cd size=small mastery=3 checkboxon=cooldownsR {
    Spell(BERSERKBEAR)
}


I use some "cheats" to get it be placed how I want it to be (like I have an empty box to the left of the main box in bear spec so it positions it correctly). Perhaps an ovale setting that allows you to change the alignment of the frame would be a cleaner solution.
Image

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Thu Dec 06, 2012 9:26 pm

The extra boxes might be a good place to track Maul/tooth and claw stuff - I need to figure out what makes the most sense to track there.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 08, 2012 3:16 am

I just pushed Nerien's 2.1.5 with an updated feral script. It should work properly for Ravage! now (I cannot test the pvp 4 piece set bonus though). It has support for an alternate way to display the prediction icon (the aggixx way), and I reconciled the code with the most recent simc script with the exception of the energy pooling code as I am still holding off on that waiting to see what Jeshu decides to do in Ovale.

The code for aggressive FBs has been toned down per the simc script as it no longer has a conditional for SotF. This is a change aggixx made to the script and I am not sure if he tested this across all the specs or if it was something he changed as part of his DoC energy pooling code. I will check with him and push a new script as needed.

The code does have some improvements for when SR and Rip are coming off of cooldown close to one another so Rip uptimes should be higher (also the less aggressive FB code helps with Rip uptime).

Posts: 15
Joined: Wed Oct 24, 2012 9:43 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Ampzilla » Sat Dec 08, 2012 3:24 am

Leafkiller wrote:The code does have some improvements for when SR and Rip are coming off of cooldown close to one another so Rip uptimes should be higher (also the less aggressive FB code helps with Rip uptime).

This syncing issue was happening a lot recently for me. Disturbingly too much where both SR and Rip would be ticking down 14..13..12..11 way way way too often.

If only out of curiosity what besides the less aggressive FB modification has been improved? Feel free to tell me "stop asking too many questions and just try it out and see" =D

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 08, 2012 3:57 am

Ok...just pushed 2.1.6. I did not properly implement the alternate setup (alternate predictive box) for the Guardian spec. That is fixed now.

Ampzilla wrote:
Leafkiller wrote:If only out of curiosity what besides the less aggressive FB modification has been improved? Feel free to tell me "stop asking too many questions and just try it out and see" =D


Well, the emergency SR timer is now the buff is off rather than <= 1 second - so the really close countdowns will go with Rip if possible. The logic on when to do an early SR is a little different now to help avoid bad situations and the SR refresh is before the Fb code. Actually there were several places where some conditionals have been moved around that was not in the script yet.

Exalted
User avatar
Posts: 1145
Joined: Fri Jun 04, 2010 4:28 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Leafkiller » Sat Dec 08, 2012 4:18 am

And just when I thought I was finished, I added tooth and claw support to the lower left hand box of the bear alternate predictive display. It shows the tooth and claw icon instead of maul when the buff is present - this is similar to the shred icon, although it is not the same texture (you can check on wowhead). I have been looking for an easy way to tell when this buff is up, other than trying to watch my action bars, and this does take care of that.

Revered
Posts: 201
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Thu Dec 13, 2012 12:05 am

@Leafkiller: I have added made a new 5.1.5 release of Ovale that adds a "wait" statement to the language. From the commit message:
Add a "wait" statement to interrupt evaluation of a group.

The syntax is "wait <node>" that returns the given node. If part of a
group node, then it causes the group to evaluate to the best node of the
group up to and including the wait statement.

A "wait" node has the same priority as its child node.

Please let me know if the following examples aren't clear enough.

Code: Select all
# This example only ever suggests FB if energy>80. Once energy drops below 80,
# then it'll only suggest Mangle-spam since we'll always have enough energy to Mangle.
{
    if Energy(more 80) Spell(FEROCIOUS_BITE)
    Spell(MANGLECAT)
}

Code: Select all
# This example uses "wait": it pools energy to 80 then suggests FB as long as FB
# is castable (at least one combo point). Otherwise, it suggests Mangle.
{
    wait if Energy(more 80) Spell(FEROCIOUS_BITE)
    Spell(MANGLECAT)
}

Code: Select all
# This example only pools energy for FB if DoC is talented. Otherwise, this just
# suggests Mangle-spam.
{
    if TalentPoints(dream_of_cenarius_talent)
        wait if Energy(more 80) Spell(FEROCIOUS_BITE)
    Spell(MANGLECAT)
}

PreviousNext

Return to Kitty DPS

Who is online

Users browsing this forum: Bing [Bot] and 10 guests