969 and FCFS - Rotation Building 101
Disclaimer: This article assumes a high level of familiarity with the 969 rotation. If you can't name the 5 core abilities by heart, or don't know what "969" even stands for, this article is not for you. Go read up on the basics of the rotation before attempting to slog through this text. Knaughty's Advanced FAQ has a pretty good explanation of the basics of 969 that will get you started.
This article is intended as a tutorial on the subtleties of rotation theorycraft. It's very long, very in-depth, and not particularly well-suited to a "TLDR"-style summary (though I've bolded sections of the text to help, and included a summary/conclusions section anyway). It's intended for people who find the details of theorycrafting interesting, which is probably a short enough list to fit on one hand. Nonetheless, it's done in fairly exacting detail, and it's written to be accessible even to those without a deep knowledge of theorycrafting, provided they have the requisite time (hours? days?) to read it.
------------------------------
Introduction
Lately, there seems to have been a large number of people questioning the validity of the 969 rotation. Some have suggested that we should move to a FCFS priority queue much like Retribution has. The most common reason given for this change is that "FCFS is better threat than 969." We'll see in a moment why, even if true, this argument falls short of being a convincing reason to abandon good old 969.
969 Rotation - Misconceptions and Goals
First let's discuss the goal of 969, and wait to worry about numbers until later. It's a common misconception (often repeated by some of us who should know better, even myself) that 969 is the highest-threat rotation we have available. This is not, in fact, the case. It would be true if we only had the 5 core abilities at our disposal, simply because we'd have nothing else to fill GCD's with. But unless they take away (or substantially change) Avenger's Shield and Hammer of Wrath, there will always be a way to out-threat 969.
The reason for this is that 969 prioritizes survivability as well as threat. The goal of the 969 rotation is to maximize threat under the following constraints:
- We must keep 100% Holy Shield uptime
- We want to cast Judgement as often as possible to minimize the chance that JotJ will expire
Those two constraints make all the difference, and explain why it's possible to find a rotation that out-threats 969. However, it's important to remember that any rotation that out-threats 969 will not satisfy these two constraints. This will become clearer as we look closely at the numbers.
Ability Breakdown
For starters, we need to know the damage and DPS of each of our abilities. I'm going to pull the numbers from this post; if you want more detail on how the numbers were generated, take a look at the link. I'm using values calculated for 3.2, since the 3.2.2 changes aren't finalized yet, and as they are right now would not affect the mechanics of the simulation.
Theck wrote:
- Code: Select all
Ability Damage Glyphed Threat Glyphed
ShoR 3984 0 11041 0
HotR 2950 0 8175 0
Cons 3437 0 9525 0
JoV 2264 2490 6274 6901
AS 2562 5124 7100 14200
HoW 2525 0 6998 0
SoV 435 0 1206 0
VDoT 4810 0 13330 0
HS 933 0 2586 0
Melee 697 0 1017 0
- Code: Select all
Ability DPS Glyphed TPS Glyphed
ShoR 664 0 1840 0
HotR 492 0 1363 0
Cons 382 0 1058 0
JoV 252 277 697 767
AS 71 142 197 394
HoW 281 0 778 0
SoV 459 0 1273 0
VDoT 321 0 889 0
HS 149 0 414 0
Melee 736 0 1073 0
For the moment, we'll only concern ourselves with the 7 abilities we can choose to use: Shield of Righteousness (ShoR), Hammer of the Righteous (HotR), Consecration (Cons), Judgement of Vengeance (JoV), Avenger's Shield (AS), Hammer of Wrath (HoW), and Holy Shield (HS). It's clear from the first plot that ShoR, Consecration, and HotR are our highest-damage abilities. However, since HotR is on a 6-second cooldown (as opposed to Consecration's effective cooldown of 9 seconds), it's higher DPS than Consecration. All three of these abilities out-damage and out-DPS Judgement.
In the DPS plot, AS is calcluated on a 36-second effective cooldown and HoW is calculated on a 9-second effective cooldown. Their DPS will fluctuate considerably if we adjust the cooldowns, so we'll have to be a little more careful with them. In particular, the plot misrepresents AS for our purposes because while it's an ability we'd only cast every 30+ seconds, we'd only sacrifice a small portion (like 1/4) of the DPS of one of the other abilities if we substituted it in. As a result, we'll get more mileage out of the damage plot for these two abilities.
Holy Shield's Damage is for a single charge, while its DPS is calculated based on the player's block percentage (42% for this simulation, which should be reasonable assuming 100% HS uptime) and boss's attack speed (2.4 after JotJ). Despite the block % being a little off for some of the calculations we're about to see where HS doesn't have 100% uptime, the point of the plot is pretty clear - Holy Shield is our weakest ability for both damage and DPS.
So to summarize, here's how each ability pans out, from highest dps to lowest dps
- Code: Select all
Ability DPS Defense
ShoR High ---
HotR High ---
Cons High ---
HoW Med ---
AS Med ---
JoV Med Med (JotJ uptime)
HS Low High (unhittable)
It's also worth noting at this point that I'm not going to use the AS or Judgement glyphs in this analysis. If I did, it would definitely change the outcome, at least insofar as AS would become our highest-damage ability and would move up to the top of the queue, making it a "High" DPS ability. However, it won't change the overall conclusions at the end, outside of which priority queue is the best for maximum damage output.
FCFS Simulation Details
Now, let's try and build a rotation out of these abilities. We'll try building an FCFS by writing a priority queue, and then calculate it's DPS and TPS. I've written some code that will simulate this by checking each spell in the priority queue and choosing the first one that's available (i.e. not still on cooldown). It then repeats this 1008 times to get enough data to smooth out short-term fluctuations. It also tracks the number of times each spell is cast, the number of empty GCDs (when nothing was available to cast), Holy Shield uptime (after 5 GCDs have passed, to avoid edge effects), and the exact order in which the spells were cast, so that we can do some diagnostics on the results.
The code is available here in MATLAB format: calc_fcfs.m
See my MATLAB thread for more details if you're interested in running the code yourself.
FCFS - Building the Queue
Let's try and craft our FCFS using the same rules as 969: We want 100% Holy Shield uptime, and we want to cast Judgement as often as we can to minimize JotJ drop-off. Thus we'll start our priority queue with:
#1: HS > JoV
To fill out the rest, we'll use the abilties in order of highest DPS. For now we'll skip the two situational abilities (AS and HoW) for simplicity; we'll add them to the mix in a little bit. So our final priority queue is:
#1: HS > JoV > ShoR > HotR > Cons
Running the simulation, we get the following results:
- Code: Select all
Q# DPS TPS HS Up% Queue
1 2437 6042 100 HS > JoV > ShoR > HotR > Cons
Q# ShoR HotR Cons JoV HS HoW AS Empty
1 168 168 168 168 168 0 0 168
That TPS seems awfully low, and looking at the breakdown we see exactly why: 168 empty GCD's! Let's look at the line-by-line output to see what's causing this (read down each pair of columns):
- Code: Select all
'0' 'HS' '15' 'Cons'
'1.5' 'JoV' '16.5' '---'
'3' 'ShoR' '18' 'HS'
'4.5' 'HotR' '19.5' 'JoV'
'6' 'Cons' '21' 'ShoR'
'7.5' '---' '22.5' 'HotR'
'9' 'HS' '24' 'Cons'
'10.5' 'JoV' '25.5' '---'
'12' 'ShoR' '27' 'HS'
'13.5' 'HotR' '28.5' 'JoV'
So in our zeal to be defensive, we lead off with HS and JoV, followed by our 6-second cooldowns. However, in doing so we reach a point where all 5 abilities are on cooldown, and we can't cast anything, forcing us to push back our next cast. Another problem is that we're pushing ShoR and HotR back to keep HS and JoV up - note that the first cast of ShoR is at 3.0, but the next isn't until 12. We're losing out on nearly half the ShoR's and HotR's we could be getting.
To remedy this, let's try shifting ShoR and HotR up in the queue and placing JoV behind them, but ahead of Cons. Thus our next queue is
#2: HS > ShoR > HotR > JoV > Cons
Running the numbers on this, we get
- Code: Select all
Q# DPS TPS HS Up% Queue
1 2437 6042 100 HS > JoV > ShoR > HotR > Cons
2 2820 7103 100 HS > ShoR > HotR > JoV > Cons
Q# ShoR HotR Cons JoV HS HoW AS Empty
1 168 168 168 168 168 0 0 168
2 252 252 167 168 168 0 0 1
We've gained over 1000 TPS by doing this, because we've gotten rid of nearly all of those empty GCD's and replaced them with ShoR or HotR casts. We still have one empty GCD though, and looking at the breakdown we see why:
- Code: Select all
'0' 'HS' '15' 'JoV'
'1.5' 'ShoR' '16.5' 'HotR'
'3' 'HotR' '18' 'HS'
'4.5' 'JoV' '19.5' 'ShoR'
'6' 'Cons' '21' 'Cons'
'7.5' 'ShoR' '22.5' 'HotR'
'9' 'HS' '24' 'JoV'
'10.5' 'HotR' '25.5' 'ShoR'
'12' '---' '27' 'HS'
'13.5' 'ShoR' '28.5' 'HotR'
We're still leading off with ShoR and HotR one after another, but this time our queue naturally shifts them so they're separated by one GCD. Unfortunately, we're still stuck with that one empty GCD early on due to clashing.
Let's try and fix this from the get-go by separating ShoR and HotR in our queue. We'll make one more shift, swapping HS and ShoR:
#3: ShoR > HS > HotR > JoV > Cons
- Code: Select all
Q# DPS TPS HS Up% Queue
1 2437 6042 100 HS > JoV > ShoR > HotR > Cons
2 2820 7103 100 HS > ShoR > HotR > JoV > Cons
3 2822 7109 100 ShoR > HS > HotR > JoV > Cons
Q# ShoR HotR Cons JoV HS HoW AS Empty
1 168 168 168 168 168 0 0 168
2 252 252 167 168 168 0 0 1
3 252 252 168 168 168 0 0 0
Aha! We've finally nailed it - no empty GCDs, and 100% Holy Shield uptime. If we look at the breakdown:
- Code: Select all
'0' 'ShoR' '15' 'HotR'
'1.5' 'HS' '16.5' 'Cons'
'3' 'HotR' '18' 'ShoR'
'4.5' 'JoV' '19.5' 'HS'
'6' 'ShoR' '21' 'HotR'
'7.5' 'Cons' '22.5' 'JoV'
'9' 'HotR' '24' 'ShoR'
'10.5' 'HS' '25.5' 'Cons'
'12' 'ShoR' '27' 'HotR'
'13.5' 'JoV' '28.5' 'HS'
That rotation should look awfully familiar, because it's 969. Note that it doesn't actually matter what order we use for the 9-second cooldowns in the queue, because we just rotate between them. We get the same results from the situation if we use this queue:
#4: ShoR > Cons > HotR > JoV > HS
In addition, it doesn't even matter whether we lead with a 9-second or a 6-second ability, as long as the two 6-second abilities aren't adjacent in the queue:
#5: HS > ShoR > JoV > HotR > Cons
- Code: Select all
Q# DPS TPS HS Up% Queue
3 2822 7109 100 ShoR > HS > HotR > JoV > Cons
4 2822 7109 100 ShoR > Cons > HotR > JoV > HS
5 2822 7109 100 HS > ShoR > JoV > HotR > Cons
Q# ShoR HotR Cons JoV HS HoW AS Empty
3 252 252 168 168 168 0 0 0
4 252 252 168 168 168 0 0 0
5 252 252 168 168 168 0 0 0
All three give exactly the same 969 rotation, despite having different queues. We would get identical results if we swapped ShoR and HotR as well. It's pretty clear that the particular order you use to fill in the queue doesn't matter, as long as the two 6-second abilities aren't adjacent. I'll elaborate more on this idea later in the article.
As one final test, let's see what happens if we build the queue in order of highest dps, as we would if we were trying to maximize threat, again grouping the two 6-second abilities, but this time placing them at the top of the queue:
#6: ShoR > HotR > Cons > JoV > HS
- Code: Select all
Q# DPS TPS HS Up% Queue
6 2642 6611 90 ShoR > HotR > Cons > JoV > HS
Q# ShoR HotR Cons JoV HS HoW AS Empty
6 252 252 126 126 126 0 0 126
Again, lumping the two 6-second cooldowns together leaves some empty GCDs which drop our sustained output. Also note that with the two 6's next to one another, and HS in last place in the queue, we've lost Holy Shield uptime.
So, now that we've considered all the possibilities available if we limit ourselves to the 5 fundamental abilities, we can draw some conclusions:
- 969 is an FCFS constructed with only the 5 fundamental abilities with a priority queue of the form:
- (6s) > (9s) > (6s) > (9s) > (9s), or
- (9s) > (6s) > (9s) > (6s) > (9s).
- The 6's and 9's can be placed in any order without changing the result, as long as the two 6's are never in adjacent spots.
- 969 is the maximum threat rotation one can get with the 5 fundamental abilities
- Any other FCFS one can come up with using only those 5 abilities will be inferior to 969 due to empty GCD's.
FCFS - Optional Abilities
The question remains, "How do our optional abilities (AS and HoW) fit into this?" For starters, we should note that since the 969 queue fills all GCDs, anything we tack on to the end of the queue will never get cast. So the following queues would give exactly the same result:
HS > ShoR > JoV > HotR > Cons
HS > ShoR > JoV > HotR > Cons > AS
HS > ShoR > JoV > HotR > Cons > Divine Shield > Hearthstone
You'll never have to fear bubble-hearthing with such a queue, because outside of school lockouts or gimmick bosses that increase your spell cooldowns, you'll never reach Divine Shield or Hearthstone. For us, this means that we'd have to slip AS and HoW into the queue somewhere before the last position.
However, we have a further constraint, this time a practical one. If we put either of those abilities between ShoR or HotR in the queue, we'll end up pushing back one of our 6-second casts, and lose DPS. For example, consider this queue:
#7: HS > ShoR > JoV > HoW > HotR > Cons
Here, we'll end up pushing back HotR and Cons every so often to fit HoW in. Unfortunately, both HotR and Cons are higher-dps abilities than HoW, so we should see a net loss of threat compared to 969:
- Code: Select all
Q# DPS TPS HS Up% Queue
5 2822 7109 100 HS > ShoR > JoV > HotR > Cons
7 2697 6763 100 HS > ShoR > JoV > HoW > HotR > Cons
Q# ShoR HotR Cons JoV HS HoW AS Empty
5 252 252 168 168 168 0 0 0
7 252 168 0 168 168 252 0 0
It should be clear by now that to gain any TPS from optional abilities, we have to lose one of our two original constraints (HS uptime or JotJ dropoff minimization). Anything else we do ends up lowering our output, either by disrupting the rotation or substituting a weaker ability for a stronger one (e.g. ShoR > HS > HotR > JoV > AS > Cons keeps HS and JotJ uptime, but swaps AS for Cons, which is a net threat loss). So we can confidently say we've shown that 969 is the highest-threat rotation that maintains 100% Holy Shield Uptime and minimizes JotJ dropoff chance.
FCFS - Max Threat Queues
As one last exercise, let's see what happens if we throw caution to the wind and ignore defenses entirely. Let's ask the question, "What's the highest-threat rotation we can come up with?" There are two ways we could approach this, now that we have a basic idea of what to expect from a FCFS queue:
- We could put ShoR > HotR > Cons at the top, and then list the other abilities according to DPS. This would be a priority ordered mostly by DPS considerations.
- We could put ShoR > Cons > HotR at the top, since we know that bunching ShoR and HotR ends up pushing things back. This would be a pseudo-969, but with JoV and HS last on the list.
Rather than dissect each of these in detail, I'm just going to post all of the simulation results, and make a few brief comments about them.
- Code: Select all
Q# DPS TPS HS Up% Queue
1 2437 6042 100 HS > JoV > ShoR > HotR > Cons
2 2820 7103 100 HS > ShoR > HotR > JoV > Cons
3 2822 7109 100 ShoR > HS > HotR > JoV > Cons
4 2822 7109 100 ShoR > Cons > HotR > JoV > HS
5 2822 7109 100 HS > ShoR > JoV > HotR > Cons
6 2642 6611 90 ShoR > HotR > Cons > JoV > HS
7 2697 6763 100 HS > ShoR > JoV > HoW > HotR > Cons
8 2699 6768 70 ShoR > HotR > Cons > AS > JoV > HS
9 2916 7369 0 ShoR > HotR > Cons > AS > HoW > JoV > HS
10 2923 7388 0 ShoR > HotR > Cons > HoW > AS > JoV > HS
11 2923 7388 0 ShoR > HotR > HoW > Cons > AS > JoV > HS
12 2941 7438 0 ShoR > Cons > HotR > HoW > AS > JoV > HS
13 2942 7442 0 ShoR > Cons > HotR > AS > HoW > JoV > HS
- Code: Select all
Q# ShoR HotR Cons JoV HS HoW AS Empty
1 168 168 168 168 168 0 0 168
2 252 252 167 168 168 0 0 1
3 252 252 168 168 168 0 0 0
4 252 252 168 168 168 0 0 0
5 252 252 168 168 168 0 0 0
6 252 252 126 126 126 0 0 126
7 252 168 0 168 168 252 0 0
8 252 252 126 126 101 0 51 100
9 252 252 126 126 0 201 51 0
10 252 252 126 84 0 252 42 0
11 252 252 126 84 0 252 42 0
12 252 252 168 126 0 168 42 0
13 252 252 168 120 0 168 48 0
We see that we do get an increase over 969 with the ShoR > HotR > Cons queues, and that in thos cases it's best to have HoW higher in the queue than AS. There's a subtle reason for this - it's due to cooldown clashes that lead to JoV casts. Going from Q#9 to Q#10, we trade 42 JoV casts and 9 AS casts for 51 HoW casts. We lose a little bit of DPS by swapping HoW for AS, but offset that loss and gain slightly more by replacing those 42 JoV's with HoW.
However, the ShoR>Cons>HotR queues come out solidly ahead. This is for exactly the same reason 969 works well - by separating the two 6-second casts, you spread out the empty GCDs and make it easier to fill them with the high-DPS, long-cooldown spells like Consecration (168 casts compared to only 126 for the best-performing Shor>HotR>Cons queues, #10 and #11). Also note that in this case, we do better prioritizing AS over HoW, as it lets us drop 6 more Judgements from our rotation and replace them with AS. Note that at 7442 TPS, this is as good as it gets, meaning the gain over a standard 969 is about 330 TPS for losing all of your Holy Shield uptime and about 25% of your Judgement casts.
FCFS - Decoupled Queues
This leads us to one final, very subtle point. Spreading the 6-second casts out in this fashion does something that we could call "decoupling" the priority queue. In other words, because of the way the cooldowns work out, for this queue:
ShoR > Cons > HotR
Cons will always be on cooldown for every other 6-second cast, because Cons will be on cooldown for 6 GCDs. So no matter what we put after HotR, we'll always be in the pattern of:
6-second cast
something else
6-second cast
something else
6-second cast
something else.
This is actually true for any queue that puts an 8+ second cooldown ability in between ShoR and HotR. So in essence, we could split this into two separate queues, one for 6-second abilities and one for "everything else." We could then build the rotation by alternating between the two queues, casting a spell from the 6-second queue, followed by a spell from the "everything else" queue, followed by another 6-second spell, and so forth. This is also very easy to simulate, so here's one last set of tables to chew on:
- Code: Select all
Q# DPS TPS HS Uptime Queue1 Queue2
1-1 2822 7109 100 ShoR > HotR HS > JoV > Cons
1-2 2822 7109 100 ShoR > HotR Cons > JoV > HS
1-3 2858 7207 80 ShoR > HotR Cons > JoV > AS > HS
1-4 2933 7416 0 ShoR > HotR Cons > JoV > HoW > HS
1-5 2942 7442 0 ShoR > HotR Cons > AS > HoW > JoV > HS
1-6 2941 7438 0 ShoR > HotR Cons > HoW > AS > JoV > HS
1-7 2905 7340 0 ShoR > HotR HoW > AS > Cons > JoV > HS
1-8 2923 7388 0 ShoR > HotR HoW > Cons > AS > JoV > HS
1-9 2905 7340 0 ShoR > HotR AS > HoW > Cons > JoV > HS
1-10 2927 7399 0 ShoR > HotR AS > Cons > HoW > JoV > HS
- Code: Select all
Q# ShoR HotR Cons JoV HS HoW AS Empty
1-1 252 252 168 168 168 0 0 0
1-2 252 252 168 168 168 0 0 0
1-3 252 252 168 168 126 0 42 0
1-4 252 252 168 168 0 168 0 0
1-5 252 252 168 120 0 168 48 0
1-6 252 252 168 126 0 168 42 0
1-7 252 252 101 100 0 252 51 0
1-8 252 252 126 84 0 252 42 0
1-9 252 252 101 100 0 252 51 0
1-10 252 252 151 151 0 151 51 0
The first two entries (1-1 and 1-2) are just 969. The third and fourth slip in our optional abilities, shifting HS to the back of the line. The rest are the 6 possible incarnations that place Cons, AS, and HoW ahead of JoV and HS. Some of the entries should look familiar, since they equate to several of the entries in the earlier simulation. The advantage here is that by treating things this way, we're far less sensitive to initial conditions, so we'll never end up with pushback due to bunching of the 6-second abilities. Again, the best we can do is #1-5, which is the 7442 TPS queue that we came up with in the first simulation.
FCFS - Conclusions
As a final thought, we're already beginning to see why we don't usually refer to 969 as a priority queue system. For one thing, the best way to go about generating it is by treating it as two different priority queues. In addition, we've seen in the past that in some cases it's better to alternate abilities into the rotation in a fashion that doesn't adhere to queue-like rules (i.e. substitute Avenger's Shield or Exorcism in for every other Judgement). If you want to describe those scenarios, you'd need to make it three queues (one for 6's, and two for the "other" abilities, alternating back and forth between the 6-second and both of the 9-second queues). And with all of this complexity, we still have a rotation that's easily described in one 5- or 12-step cycle (96969, or 969696969696 if you want the whole rotation) with an easy rule for how to "weave in" other abilities (e.g. sub AS for every 4th Judgement).
So while it's really a FCFS at heart, the trusty old 969 is simple enough that it's easier to describe to beginners as a "rotation" than a complicated series of FCFS queues.
To summarize the major points of this article, here's a quick TLDR summary:
- 969 is an FCFS constructed with only the 5 fundamental abilities with a priority queue of the form:
- (6s) > (9s) > (6s) > (9s) > (9s), or
- (9s) > (6s) > (9s) > (6s) > (9s).
- The 6's and 9's can be placed in any order without changing the result, as long as the two 6's are never in adjacent spots.
- 969 is the maximum threat rotation one can get with the 5 fundamental abilities
- Any other FCFS one can come up with using only those 5 abilities will be inferior to 969 due to empty GCD's.
- 969 is the highest-threat rotation that maintains 100% Holy Shield Uptime and minimizes JotJ dropoff chance.
- To gain any TPS from optional abilities, we have to lose one of our two original constraints (HS uptime or JotJ dropoff minimization).
- The maximum gain by using a "max-threat" FCFS over a standard 969 is about 330 TPS for losing all of your Holy Shield uptime and about 25% of your Judgement casts.
- 969 is effective because it decouples the 6-second abilities from "everything else." It thus ensures that we get maximum use out of our two high-DPS 6-second abilities while spacing the 9-second abilities out to avoid cooldown clashes.
News
As the final battle for Icecrown approaches, what will you find awaiting in the icy halls of the Lich King?
After years of lurking in her lair battling the many brave adventurers who travelled from afar to challenge her, Onyxia returns to commemorate World of Warcraft’s five-year anniversary.
As you have no doubt surmised from the title of this thread, I would really like to see the new horde paladin race be Forsaken rather than tauren. There are multiple reasons behind this, which I'll touch...
Read More...




