I play on several alts of various classes, and while I do have my favorites, I want to at least do passable DPS on each of my toons when I choose to play any one of them. It's difficult to remember the proper rotations across all the specs and classes that I play. My solution to this is the addon Ovale Spell Priority.

Ovale puts an icon box on your screen that displays the proper spell or ability to use in order to maximize damage. Unlike other "move-suggestion" addons, Ovale works across all classes and specs and the suggestions aren't hard-coded into the addon itself. Rather, Ovale uses a script language that allows for describing which abilities to use based on the presence or absence of buffs or debuffs, spell or item cooldowns, etc. Ovale comes with default scripts for each class and spec, but anyone is free to write a custom script for their toon and use it instead of the default script.

I maintain my own custom Ovale scripts that I update to stay current with SimulationCraft, as well as using my own conventions for icon usage that differ from the default scripts.

Installing a custom script

Ovale code window
To install a custom script into the current Ovale profile, you'll need to:
  1. Copy the custom script into the clipboard.
  2. Open the Ovale code window by typing the following into the chat window:
    • /ovale code
  3. Click in the code textbox to place the cursor there.
  4. Press <Ctrl>A to select the existing script.
  5. Press <Ctrl>V to paste the custom script from the clipboard into the code window.
  6. Click the Accept button to save the script. The game may freeze for a few seconds while the script is being compiled by Ovale.
  7. Click the Close button to close the code window.
  8. You're done!

Writing a custom script

Writing a custom script for Ovale is not difficult for anyone with an understanding of how to write code. Using the default scripts is an excellent guide to writing your own, and there is plenty of documentation on the various conditions that may be checked before suggesting a spell to use.

There are a few common idioms that I've discovered while translating SimulationCraft action lists into Ovale scripts.

buff.name.remains<=2 using BuffExpires(...)

if BuffExpires(INQUISITION 2) and HolyPower(equal 3) Spell(INQUISITION)

buff.name.remains>6 using BuffPresent(...)

if TargetDebuffExpires(RUPTURE 2 mine=1) and BuffPresent(SLICEANDDICE 6) and ComboPoints(more 0) Spell(RUPTURE)

cooldown.spell.remains<10 using if 10s before Spell(...)


cooldown.spell.remains>30 using unless 30s before Spell(...)

unless 15s before Spell(DEEPFREEZE) or 30s before Spell(FLAMEORB) or 30s before Spell(ICYVEINS) Spell(COLDSNAP)

Internal cooldowns

If there is a buff that is gained from an item or a set bonus that also has an internal cooldown, you can use the BuffGain() interval function to check whether the internal cooldown has elapsed since the last time the buff procced. For example, the hunter 4pT13 bonus has an internal cooldown of 105s and causes Arcane Shot to proc a buff, Chronohunter, which increases ranged haste by 30%. A reasonable priority list for hunters with the 4pT13 bonus might be to choose between using Arcane Shot and Aimed Shot as a focus dump: use Arcane Shot to proc the haste buff, and use Aimed Shot while under the effects of the haste buff.

if Mana(more 79)
  unless BuffGain(CHRONOHUNTER 105) Spell(AIMEDSHOT)
Johnny Lam,
May 14, 2012, 12:55 PM