Mar 302010
 

In Part 1 of the series, I covered buff/debuff trackers, an essential addon for any player serious about improving their kitty DPS. (Commenters: I’ve added a few more to the original post…thanks for all your great suggestions.) In this post, I’ll be examining mods that go beyond passively tracking your buffs/debuffs by helping you actually execute your DPS rotation. (Note that when I say “rotation,” that’s shorthand for “priority list.” Fixed rotations went out a while ago.)

So what does a rotation mod do, exactly?

It tells you (typically via an icon display) which skill you should use next to maximize your DPS. It comes to a decision based on several factors, including the addon’s programming, your energy/combopoints, time left on buffs/debuffs/cooldowns, enemy health, etc.

Isn’t that cheating?

Nope, though many players frown on their use. To Blizzard, as long as the mod doesn’t press the button for you (or just create one button that you can spam-click), it’s acceptable. There was an excellent wow.com discussion post on this when Facemauler was first popularized a year ago, so go there if you’d like to see some of the arguments for and against. IMHO, since the mod is not 100% infallible, I consider it a tool and not a cheat. However, I can certainly see how people could consider it as such.

Why use a DPS rotation mod?

Well, frankly, because it makes life much easier, especially on complex boss fights. On a single-target fight with no movement/switching, it’s not overly difficult to follow an ideal rotation. Once you add in movement, target switching, effect dodging, etc., the amount of mindspace left for ability choice decreases significantly. (Let’s not even mention raid leading. Gah.) A mod can help you maintain good DPS even when distracted, or teach you a good rotation if you’re still learning the class.

Cool! Any downside?

First, the helpers are only as good as the logic that powers them. Addons like these tend to come and go, as patches make significant changes to ability priorities. If you’re using an older mod (or logic), then the suggestions may not be very good. Second, the logic is structured towards a simple tank-and-spank situation (modeling anything else would be VERY complicated and probably out of the scope of an in-game addon). Most of the fights in ICC require frequent movement and target switching; you’ll frequently need to use your own judgment to maximize your DPS. (All of the wing bosses, for example, have specific times at which they are untargetable or have an add that needs killing. You’ll want to clip your DoTs to get max-duration ones up pre-switch.)

So where did these addons come from?

The first feral rotation addon was Facemauler, which was very good for its time. It wasn’t overly configurable, but it worked, and worked out-of-the-box. I used it for most of Ulduar. Sadly, it hasn’t been updated since last April, making its suggestion logic not so hot now.

Facemauler was followed by Feral By Night (FBN), a VERY complex and powerful addon, created by nightcrowler. It featured a dynamic rotation creator based on your characters stats and procs, and included a proc watcher, CD watcher, health/energy frames, all kinds of stuff. Unfortunately, it was never easy to use. It came with EVERYTHING toggled on by default, including all the stuff that never worked (so it took a lot of futzing around to get it usable) and had virtually no documentation. It was improving significantly, but nightcrowler disappeared and hasn’t updated the addon since July. FBN is still a viable option, but since it still uses 3.2 values, it’s not optimal (plus you still have to strip out the crap).

Ovale, my recommendation of choice, is slightly different. Instead of re-inventing the wheel, Ovale is designed purely as a rotation mod mechanism. It provides a scripting language for rotation authors to write scripts in; this way, when there’s a patch, instead of having to change hardcoded settings, the only things necessary are script tweaks. These scripts are simple text files that can be edited directly in-game, either by hand or just copy-pasted in. Ovale has a default script for every class that does a pretty decent job; however, you can freely replace these scripts with more complex logic for better performance.

Sounds good. How do I try it?

There’s two steps involved. First, you’ll have to install Ovale. Second, you’ll have to update the Ovale default feral druid script, which is decent but can use some improvement. I’ve provided Fatalsaints/Leafkiller’s script at the bottom of this post, which comes from the rotation discussion thread on EJ. Just copy the script below and paste into the text box in the addon settings. (If you want to keep the bear/moonkin bits, only replace the cat part, which is everything starting with the lines “if Stance(3) # cat” until “unless Stance(1) or Stance(3),” which starts the moonkin portion.)

If you’ve done this successfully, you’ll see two suggestion boxes, with two smaller boxes to the left. (Depending on how you configure the addon settings, you may need to reposition the window, shift into cat form, or enter combat for the boxes to appear.) Below is how it looks for me during a quick dummy test, with the quickoptions displayed (also shown here is my sUF character frame…yes, the scaling is off a little bit, need to fix that).

From the right, the first large box represents your main rotation (SR/Mangle/Rip/Rake/3xShred/FB), the second large box indicates when to use filler shreds/optional settings, and the small boxes are monitors for Berserk/TF. The quickoptions allow you to set certain abilities to be recommended in the box, or you can handle those manually. It’s a bit complicated to explain, but very easy to grasp once installed. If you’re having any problems getting it working, please post your issue in the forums and I’ll see if I can help.

Can I tweak the script?

Feel free! Before you start, however, I’d recommend installing Simulationcraft and playing with it some, to develop a priority order that best fits your character/situation. (I’ll be talking more about SC in a future post…it’s an awesome tool for fight modeling.) The Ovale documentation is here. If you read the script below, you’ll see lots of commented lines with #…these are the lines from the SC profile calculated to provide the best DPS, and the equivalent action in Ovale language.

Final Thoughts

I encourage everyone to give this a try, even if you hate the idea. You don’t have to use it during a raid; it can serve quite well as a training tool, to show you what an optimal rotation looks like. It’s been my experience that the vast majority of players complaining that this “decreases your situational awareness” or “doesn’t account for fight conditions” still show improvement when using it. Many people have put it quite a lot of effort to tweak the script to its optimum performance…give their hard work a try. I encourage people who’ve used this (or any rotation mod) sucessfully to share their stories in the comments.

Ovale Feral DPS Script

# Fatalsaints Feral Cat DPS Ovale Script v1FixedRakeWhitespacesTabs Leafv1.2
#
# Based on SimulationCraft actions
# http://elitistjerks.com/f73/t81052-best_possible_feral_dps_simulationcraft
#
# Source:
# http://elitistjerks.com/f73/t84378-visualising_optimal_cat_rotation_ingame/p10/#248
# -----------------------------------------------------------------------

Define(FFF 16857)
Define(FF 770)
Define(RIP 1079)
Define(MANGLE 33876)
Define(SHRED 5221)
Define(TIGER 5217)
Define(RAKE 59886)
Define(ROAR 52610)
Define(BITE 22568)
Define(BERSERK 50334)
Define(OMEN 16870)
Define(TRAUMA 46857)
Define(MANGLEB 33878)
SpellInfo(RIP resetcounter=ripshreds)
SpellInfo(SHRED inccounter=ripshreds)

AddCheckBox(CheckBoxTF "Suggest Tiger's Fury")
AddCheckBox(CheckBoxFF "Suggest Faerie Fire")
AddCheckBox(CheckBoxBk "Suggest Berserk")
AddCheckBox(CheckBoxMangle "Suggest Mangle")

AddIcon help=cd size=small
{
if Stance(3) {
Spell(TIGER priority=4)
}
}

AddIcon help=cd size=small
{
if Stance(3) {
Spell(BERSERK)
}
}
AddIcon help=main {
}
AddIcon help=main {
if Stance(3) { # Cat Form
# actions+=/faerie_fire_feral,debuff_only=1
if {CheckBoxOn(CheckBoxFF)} and {TargetDebuffExpires(FFF 0) and TargetDebuffExpires(FF 0)} Spell(FFF)

# actions+=/tigers_fury,energy<=30,berserk=0
if {CheckBoxOn(CheckBoxTF) and BuffExpires(BERSERK 0) and Mana(less 35)} Spell(TIGER)

# actions+=/berserk_cat,energy>=80,energy<=90
if {CheckBoxOn(CheckBoxBk) and Mana(more 79) and Mana(less 91)} Spell(BERSERK)

# actions+=/savage_roar,cp>=1,savage_roar<=1
if {ComboPoints(more 0) and BuffExpires(ROAR 0)} Spell(ROAR)

# actions+=/savage_roar,if=buff.combo_points.stack>=3&dot.rip.remains-buff.savage_roar.remains>=0&buff.savage_roar.remains<=8
if {ComboPoints(more 2) and TargetDebuffPresent(RIP mine=1) and more than 1s between TargetDebuffExpires(RIP mine=1) and BuffExpires(ROAR)} unless BuffPresent(ROAR 9) Spell(ROAR)

# actions+=/savage_roar,if=buff.combo_points.stack>=3&buff.savage_roar.remains-dot.rip.remains<=3&buff.savage_roar.remains<=8
if {ComboPoints(more 2) and TargetDebuffPresent(RIP mine=1) and at most 3s between BuffExpires(ROAR) and TargetDebuffExpires(RIP mine=1)} unless BuffPresent(ROAR 9) Spell(ROAR)

# actions+=/shred,cp<=4,extend_rip=1,rip<=3
if {ComboPoints(less 4) and TargetDebuffPresent(RIP mine=1) and TargetDebuffExpires(RIP 4 mine=1) and Counter(ripshreds less 3)} Spell(SHRED)

# actions+=/rip,cp>=5,time_to_die>=6
# actions+=/ferocious_bite,cp>=5,time_to_die<=6
# actions+=/ferocious_bite,cp>=5,rip>=8,savage_roar>=11
if {ComboPoints(more 4)} {
if {TargetDeadIn(less 7) or {TargetDebuffPresent(RIP 8 mine=1) and BuffPresent(ROAR 11)}} Spell(BITE)
if {TargetDeadIn(more 5) and TargetDebuffExpires(RIP 0 mine=1)} Spell(RIP)
}

# actions+=/mangle_cat,mangle<=1
if CheckBoxOn(CheckBoxMangle) and {TargetDebuffExpires(MANGLE 1) and TargetDebuffExpires(MANGLEB 1) and TargetDebuffExpires(TRAUMA 1)} Spell(MANGLE)

# actions+=/rake,time_to_die>=9
unless {TargetDebuffPresent(RAKE mine=1)} if TargetDeadIn(more 8) Spell(RAKE)

# actions+=/shred,if=(energy>=80|buff.omen_of_clarity.up|buff.berserk.up|cooldown.tigers_fury.remains<=3)
# actions+=/shred,time_to_die<=9
# actions+=/shred,cp<=0,savage_roar<=2
if {Mana(more 79) or BuffPresent(OMEN) or TargetDeadIn(less 10) or BuffPresent(BERSERK) or BuffExpires(TIGER 3) or TargetDeadIn(less 10) or {ComboPoints(less 1) and BuffExpires(ROAR 2)}} Spell(SHRED)
}
}
AddIcon help=main {
if Stance(3) { # Cat Form
# actions+=/savage_roar,cp>=1,savage_roar<=1
if {ComboPoints(more 0) and BuffExpires(ROAR 0)} Spell(ROAR)

# actions+=/savage_roar,if=buff.combo_points.stack>=3&dot.rip.remains-buff.savage_roar.remains>=0&buff.savage_roar.remains<=8
if {ComboPoints(more 2) and TargetDebuffPresent(RIP mine=1) and more than 1s between TargetDebuffExpires(RIP mine=1) and BuffExpires(ROAR)} unless BuffPresent(ROAR 9) Spell(ROAR)

# actions+=/savage_roar,if=buff.combo_points.stack>=3&buff.savage_roar.remains-dot.rip.remains<=3&buff.savage_roar.remains<=8
if {ComboPoints(more 2) and TargetDebuffPresent(RIP mine=1) and at most 3s between BuffExpires(ROAR) and TargetDebuffExpires(RIP mine=1)} unless BuffPresent(ROAR 9) Spell(ROAR)

# actions+=/shred,cp<=4,extend_rip=1,rip<=3
if {ComboPoints(less 4) and TargetDebuffPresent(RIP mine=1) and TargetDebuffExpires(RIP 4 mine=1) and Counter(ripshreds less 3)} Spell(SHRED)

# actions+=/rip,cp>=5,time_to_die>=6
# actions+=/ferocious_bite,cp>=5,time_to_die<=6
# actions+=/ferocious_bite,cp>=5,rip>=8,savage_roar>=11
if {ComboPoints(more 4)} {
if {TargetDeadIn(less 7) or {TargetDebuffPresent(RIP 8 mine=1) and BuffPresent(ROAR 11)}} Spell(BITE)
if {TargetDeadIn(more 5) and TargetDebuffExpires(RIP 0 mine=1)} Spell(RIP)
}

# actions+=/mangle_cat,mangle<=1
if CheckBoxOn(CheckBoxMangle) and {TargetDebuffExpires(MANGLE 1) and TargetDebuffExpires(MANGLEB 1) and TargetDebuffExpires(TRAUMA 1)} Spell(MANGLE)

# actions+=/rake,time_to_die>=9
unless {TargetDebuffPresent(RAKE mine=1)} if TargetDeadIn(more 8) Spell(RAKE)
}
}