Last time, we painfully ground through the necessary calculus to develop relationships between different stats – armor, avoidance rating, block rating, hit, expertise, and haste. In this installment, we’re going to bring all of that together and start comparing those stats to see how they affect our damage intake.
First, we need to recap the equations we’ll need to proceed. There are a lot of them, but I don’t want to make readers sift through the last few blog posts just to find the definition of a term, so we’ll summarize them here. If you’ve been following along the whole time, feel free to skip to the next section.
The damage taken formula is:

where
is the pre-DR incoming damage, and the armor, avoidance, and block factors are defined as:
,
,
.
is the armor constant,
is the player’s armor,
is the player’s total avoidance,
is the player’s block value for the guaranteed block from SotR (75%),
is the block value during the SotR buff (50%),
is the default block value (30%), and
is the player’s block chance as read off of the character sheet.
and
are variables that describe SotR mechanics as defined in the first installment:


is the duration of the SotR increased block value buff. The SotR cast rate
and incoming blockable attack rate
are:


where
is the divine purpose proc chance (0.15) and
is the boss’s swing timer.
is our Holy Power generation rate from all sources:
(1+s)R_{\rm CS} \\ + [1 - (2m-h-e)](1+s)R_{\rm J}+ R_{\rm BL}. R_{\rm HPG} = [1 - (m-h) - (d+p-e)](1+\alpha_{\rm GC})(1+s)R_{\rm CS} \\ + [1 - (2m-h-e)](1+s)R_{\rm J}+ R_{\rm BL}.](http://s0.wp.com/latex.php?latex=R_%7B%5Crm+HPG%7D+%3D+%5B1+-+%28m-h%29+-+%28d%2Bp-e%29%5D%281%2B%5Calpha_%7B%5Crm+GC%7D%29%281%2Bs%29R_%7B%5Crm+CS%7D+%5C%5C+%2B+%5B1+-+%282m-h-e%29%5D%281%2Bs%29R_%7B%5Crm+J%7D%2B+R_%7B%5Crm+BL%7D.&bg=ffffff&fg=333333&s=0)
Here,
,
, and
are miss, dodge, and parry caps, respectively, and
,
, and
are our hit, expertise, and haste percentages.
and
are our CS and J cast rates, and
is the Grand Crusader proc rate.
is the HPG rate from Blessed Life, or from any other non-rotational sources.
Last week, we defined the differential of
, which represents the change in damage intake:

And calculated the differentials of each factor implicitly to find their dependence on ratings:



where
is our character’s post-DR dodge chance (ignoring base dodge),
and
are the avoidance diminishing returns formula coefficients, and
is the rating-to-percentage conversion factor for stat $i$ (i.e.
for haste,
for dodge, etc.). The block factor was particularly ugly, so we defined the following additional quantities to make things a little easier to work with:
![\beta_h = \frac{(1+s)[(1+\alpha_{\rm GC})R_{\rm CS}+R_{\rm J}]}{3(1-\alpha_{\rm DP})} \left [ \frac{F_{bG}}{R_{\rm att}}+ \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ] \beta_h = \frac{(1+s)[(1+\alpha_{\rm GC})R_{\rm CS}+R_{\rm J}]}{3(1-\alpha_{\rm DP})} \left [ \frac{F_{bG}}{R_{\rm att}}+ \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_h+%3D+%5Cfrac%7B%281%2Bs%29%5B%281%2B%5Calpha_%7B%5Crm+GC%7D%29R_%7B%5Crm+CS%7D%2BR_%7B%5Crm+J%7D%5D%7D%7B3%281-%5Calpha_%7B%5Crm+DP%7D%29%7D+%5Cleft+%5B+%5Cfrac%7BF_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%7D%2B+%5Cfrac%7BS+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29R_%7B%5Crm+SotR%7D%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)
![\beta_s = \frac{(R_{\rm HPG}-R_{\rm BL})}{3(1-\alpha_{\rm DP})(1+s)} \left [ \frac{F_{bG}}{R_{\rm att}} + \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ] \beta_s = \frac{(R_{\rm HPG}-R_{\rm BL})}{3(1-\alpha_{\rm DP})(1+s)} \left [ \frac{F_{bG}}{R_{\rm att}} + \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_s+%3D+%5Cfrac%7B%28R_%7B%5Crm+HPG%7D-R_%7B%5Crm+BL%7D%29%7D%7B3%281-%5Calpha_%7B%5Crm+DP%7D%29%281%2Bs%29%7D+%5Cleft+%5B+%5Cfrac%7BF_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%7D+%2B+%5Cfrac%7BS+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29R_%7B%5Crm+SotR%7D%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)
![\beta_d = \frac{(1-A_d/C_d)^2}{k_d T^{(0)}_{\rm att}} \left [ \frac{R_{\rm SotR} F_{bG}}{R_{\rm att}^2} + \frac{(1-R_{\rm SotR}^2T_{\rm buff}) F_{bS}}{(R_{\rm att}-R_{\rm SotR})^2} \right ] \beta_d = \frac{(1-A_d/C_d)^2}{k_d T^{(0)}_{\rm att}} \left [ \frac{R_{\rm SotR} F_{bG}}{R_{\rm att}^2} + \frac{(1-R_{\rm SotR}^2T_{\rm buff}) F_{bS}}{(R_{\rm att}-R_{\rm SotR})^2} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_d+%3D+%5Cfrac%7B%281-A_d%2FC_d%29%5E2%7D%7Bk_d+T%5E%7B%280%29%7D_%7B%5Crm+att%7D%7D+%5Cleft+%5B+%5Cfrac%7BR_%7B%5Crm+SotR%7D+F_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%5E2%7D+%2B+%5Cfrac%7B%281-R_%7B%5Crm+SotR%7D%5E2T_%7B%5Crm+buff%7D%29+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29%5E2%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)


![F_{bB} = (1-G)[S B_v' - (1-S)B_v] F_{bB} = (1-G)[S B_v' - (1-S)B_v]](http://s0.wp.com/latex.php?latex=F_%7BbB%7D+%3D+%281-G%29%5BS+B_v%27+-+%281-S%29B_v%5D&bg=ffffff&fg=333333&s=1)

where the only new variable we’ve introduced is
, which is the portion of our post-DR block chance that was subject to DR (in other words,
, where
is our base block chance at 0 mastery.
Developing Relationships Analytically
The next step is to start generating relationships between the different stats. If we substitute in our new expressions for
,
, and
into the expression for
and group terms according to rating type, we get the following expression:
![\frac{dD}{D_0} = dAr\frac{F_a F_{\rm av} F_b}{(Ar+K)} - \frac{dr_d}{f_d} F_a \left [\frac{(1-A_d/C_d)^2}{k_d} F_b + \beta_dF_{\rm av} \right ] \\ - \left (\frac{dr_h}{f_h}+\frac{dr_e}{f_e}\right )\beta_h F_a F_{\rm av} - \frac{dr_s}{f_s}\beta_s F_a F_{\rm av} - \frac{dr_m}{f_m}\beta_m F_a F_{\rm av} \frac{dD}{D_0} = dAr\frac{F_a F_{\rm av} F_b}{(Ar+K)} - \frac{dr_d}{f_d} F_a \left [\frac{(1-A_d/C_d)^2}{k_d} F_b + \beta_dF_{\rm av} \right ] \\ - \left (\frac{dr_h}{f_h}+\frac{dr_e}{f_e}\right )\beta_h F_a F_{\rm av} - \frac{dr_s}{f_s}\beta_s F_a F_{\rm av} - \frac{dr_m}{f_m}\beta_m F_a F_{\rm av}](http://s0.wp.com/latex.php?latex=%5Cfrac%7BdD%7D%7BD_0%7D+%3D+dAr%5Cfrac%7BF_a+F_%7B%5Crm+av%7D+F_b%7D%7B%28Ar%2BK%29%7D+-+%5Cfrac%7Bdr_d%7D%7Bf_d%7D+F_a+%5Cleft+%5B%5Cfrac%7B%281-A_d%2FC_d%29%5E2%7D%7Bk_d%7D+F_b+%2B+%5Cbeta_dF_%7B%5Crm+av%7D+%5Cright+%5D+%5C%5C+-+%5Cleft+%28%5Cfrac%7Bdr_h%7D%7Bf_h%7D%2B%5Cfrac%7Bdr_e%7D%7Bf_e%7D%5Cright+%29%5Cbeta_h+F_a+F_%7B%5Crm+av%7D+-+%5Cfrac%7Bdr_s%7D%7Bf_s%7D%5Cbeta_s+F_a+F_%7B%5Crm+av%7D+-+%5Cfrac%7Bdr_m%7D%7Bf_m%7D%5Cbeta_m+F_a+F_%7B%5Crm+av%7D&bg=ffffff&fg=333333&s=2)
In the past, we’ve then set
equal to zero and explicitly worked out formulas that equate one stat to another. For example, if we wanted to see how much haste rating gives as much damage reduction as a given amount of mastery rating, we’d set all of the other
to zero and solve:

which gives the simple solution

I chose that particular combination because a lot of factors cancel and make it easy on us, but you could do the same for any of the different combinations and get a similar (albeit uglier) expression.
That was fine in Cataclysm, because we were only looking at three major stats: avoidance, mastery, and armor. With N stats, there’s
different combinations, which for N=3 and k=2 is just three: avoidance vs. mastery, avoidance vs. armor, and mastery vs. armor. However, now we’re looking at six stats: armor, avoidance, hit, expertise, haste, and mastery. For N=6, there are 15 different combinations. At that point it becomes less efficient to derive explicit relationships between each pair of stats, and more efficient to find some way to normalize the contribution of each stat so we can look at their relative weights numerically.
In other words, it will make a lot more sense to choose realistic character stats and calculate the factors
and
, and see which one is bigger. Not only will those tell us how haste and mastery compare, but if we want to compare either to a different stat (say, avoidance) we only need to calculate the equivalent factor for that stat, and we instantly know how it stacks up to both.
So we define the normalized damage reduction factors
as follows:

![\gamma_d = F_a\left [ \frac{(1-A_d/C_d)^2}{k_d}F_b + F_{\rm av} \beta_d \right ]/f_d \gamma_d = F_a\left [ \frac{(1-A_d/C_d)^2}{k_d}F_b + F_{\rm av} \beta_d \right ]/f_d](http://s0.wp.com/latex.php?latex=%5Cgamma_d+%3D+F_a%5Cleft+%5B+%5Cfrac%7B%281-A_d%2FC_d%29%5E2%7D%7Bk_d%7DF_b+%2B+F_%7B%5Crm+av%7D+%5Cbeta_d+%5Cright+%5D%2Ff_d&bg=ffffff&fg=333333&s=2)




What do these factors
represent? Well, each one is the net damage reduction
that you gain from one point of rating
. So
tells you the damage reduction of one point of mastery rating,
one point of haste rating, and so on. The nice part about this is we can simply write a program that does the annoying work of evaluating the messy expressions in the first section of this post. We feed the program a few easily-understood input parameters like armor, avoidance, and so on, and it spits out the six
values we’re interested in. So let’s do that.
Developing Relationships Numerically – Inputs
First, we need to define our inputs. Since we don’t have stats at level 90 yet, let’s make some estimates based on stats at level 85 fighting a level 88 boss. We’ll assume that the player has 30% avoidance 15% of which is from dodge. We’ll also assume they have 55% block chance, 40k armor, 2% hit, 2% expertise, and 10% haste. That gives us the following variables:








Based on the level difference, we have the following values for the hit/expertise caps and armor coefficient:




We also have the block value tiers we defined earlier:



And we know the rating->percentage conversion factors for each stat (noting that the percentages are in decimal form):





The diminishing returns coefficients for avoidance and blocking are also necessary:

(~65%)
(~135%, courtesy of Pagezero at Tankspot)
And we have some assorted constants to define:



Finally, we need to assume a boss swing timer. Let’s choose 2 seconds:

Developing Relationships Numerically – Outputs
I’ve written a MATLAB script file that defines all of these values and then calculates the expressions we’ve worked out. First, we need to pick a rotation, because that determines
and
. For this example, we’ll choose “SotR>CS>J>AS>Cons>HW,” which tends to maximize holy power returns (thus giving the best results possible for hit/exp/haste). In this model, you cast CS on cooldown, so

Judgment gets pushed back every so often, however, which gives it an effective cooldown of 6.75 seconds (which you can work out by hand as well). Thus,
.
To see how accurate our HPG modeling is, let’s compare it to the matlabadin FSM code, which gives very accurate rotation information. Plugging those values into our formula with 10% haste gives us a HPG rate of
,
in perfect agreement with the FSM code. Thus, we can feel certain that our formula for
is correct. So far so good. Based on the HPG rate, our model says we should have a SotR cast rate of
,
or one SotR every 6.64 seconds, again in agreement with the FSM code.
Our formulas for
and
give us the following uptimes:


That’s pretty incredible – 43% of the incoming attacks that we don’t avoid are guaranteed to be blocked by SotR at 75%, and we’ll have the +20% block buff up for 83% of the ones that aren’t avoided or guaranteed.
But I know what you’re really interested in is the normalized damage reduction factors
. So let’s jump right to them. Since the values come out to be pretty small, let’s define

which is the net benefit of 100000 rating instead of 1 rating. Note that we’re not really trying to model stacking
of any of these ratings – we’re just multiplying the results by
so they’re easier to compare (otherwise we’d need to use scientific notation). The results are:






Wait, hold on, is that right? These results are saying that mastery is in dead last place, behind hit, expertise, haste, and even armor (remember that we get 4 armor per itemization point, so it’s actually got a per-itemization value of
.
Yes, sadly, it’s correct. I’ve double-checked it a few times now, and I think I’ve caught and fixed all of the errors in the derivation. Unless something about our mastery changes significantly between now and release, mastery is going to be our dump stat in MoP.
O Mastery, Why Hast Thou Forsaken Us?
To understand why mastery performs as badly as it does, we need to drill down a little farther. Let’s look at the values that go into
:






So there’s part of the problem:
is smaller than the others by a factor of 4 to 7, depending on what we’re comparing it to. Note that all of the
have an armor factor (i.e.
), an avoidance factor (i.e.
), and a block factor (either
or one of the
). So the fact that
is at least four times lower explains why block performs so poorly.
But why is
so low? And not just in the mathematical sense – what mechanically is going on that causes
to lag the others so much? To see that, we need to drill down further. Let’s look at the “block prefactors,” or the factors that go into the expression for
:



What do these tell us?
is the multiplier that relates a small change in
to a small change in
.
serves the same purpose for
, and
for
(and thus mastery). From this vantage point, it looks like block isn’t faring so badly. We can see that SotR’s guaranteed blocks have a fairly large effect, but good old block seems to be OK. Of course, the devil is in the details – it’s not the
that are the problem; the problem is that a fixed amount of rating gets you a much bigger change in
than it does in
.
To see why, let’s look back at our equations for
, which I’ll repeat here:
![\beta_h = \frac{(1+s)[(1+\alpha_{\rm GC})R_{\rm CS}+R_{\rm J}]}{3(1-\alpha_{\rm DP})} \left [ \frac{F_{bG}}{R_{\rm att}}+ \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ] \beta_h = \frac{(1+s)[(1+\alpha_{\rm GC})R_{\rm CS}+R_{\rm J}]}{3(1-\alpha_{\rm DP})} \left [ \frac{F_{bG}}{R_{\rm att}}+ \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_h+%3D+%5Cfrac%7B%281%2Bs%29%5B%281%2B%5Calpha_%7B%5Crm+GC%7D%29R_%7B%5Crm+CS%7D%2BR_%7B%5Crm+J%7D%5D%7D%7B3%281-%5Calpha_%7B%5Crm+DP%7D%29%7D+%5Cleft+%5B+%5Cfrac%7BF_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%7D%2B+%5Cfrac%7BS+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29R_%7B%5Crm+SotR%7D%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)
![\beta_s = \frac{(R_{\rm HPG}-R_{\rm BL})}{3(1-\alpha_{\rm DP})(1+s)} \left [ \frac{F_{bG}}{R_{\rm att}} + \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ] \beta_s = \frac{(R_{\rm HPG}-R_{\rm BL})}{3(1-\alpha_{\rm DP})(1+s)} \left [ \frac{F_{bG}}{R_{\rm att}} + \frac{S F_{bS}}{(R_{\rm att}-R_{\rm SotR})R_{\rm SotR}} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_s+%3D+%5Cfrac%7B%28R_%7B%5Crm+HPG%7D-R_%7B%5Crm+BL%7D%29%7D%7B3%281-%5Calpha_%7B%5Crm+DP%7D%29%281%2Bs%29%7D+%5Cleft+%5B+%5Cfrac%7BF_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%7D+%2B+%5Cfrac%7BS+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29R_%7B%5Crm+SotR%7D%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)
![\beta_d = \frac{(1-A_d/C_d)^2}{k_d T^{(0)}_{\rm att}} \left [ \frac{R_{\rm SotR} F_{bG}}{R_{\rm att}^2} + \frac{(1-R_{\rm SotR}^2T_{\rm buff}) F_{bS}}{(R_{\rm att}-R_{\rm SotR})^2} \right ] \beta_d = \frac{(1-A_d/C_d)^2}{k_d T^{(0)}_{\rm att}} \left [ \frac{R_{\rm SotR} F_{bG}}{R_{\rm att}^2} + \frac{(1-R_{\rm SotR}^2T_{\rm buff}) F_{bS}}{(R_{\rm att}-R_{\rm SotR})^2} \right ]](http://s0.wp.com/latex.php?latex=%5Cbeta_d+%3D+%5Cfrac%7B%281-A_d%2FC_d%29%5E2%7D%7Bk_d+T%5E%7B%280%29%7D_%7B%5Crm+att%7D%7D+%5Cleft+%5B+%5Cfrac%7BR_%7B%5Crm+SotR%7D+F_%7BbG%7D%7D%7BR_%7B%5Crm+att%7D%5E2%7D+%2B+%5Cfrac%7B%281-R_%7B%5Crm+SotR%7D%5E2T_%7B%5Crm+buff%7D%29+F_%7BbS%7D%7D%7B%28R_%7B%5Crm+att%7D-R_%7B%5Crm+SotR%7D%29%5E2%7D+%5Cright+%5D&bg=ffffff&fg=333333&s=2)

Now, just look at the parts in brackets, because it turns out the factors out front are almost identical for dodge and mastery, and about half that size for haste and hit. For hit/exp
, haste
, and dodge
, they contain a term with
(which is large) over
(which is small), which subsequently makes the first term very large. This first term is characteristic of the effects of that stat on the SotR portion of block mitigation – that factor of
comes from
(or
, depending on how you look at it).
These
factors also have a second term that represents the effect on the 6-second block value buff, with
. Even though
is small, it turns out the second term is actually larger than the first due to the other factors. For hit and haste, the first term evaluates to around 1.4, the second is about 1.73. For dodge, the first term is around 0.6 and the second is 1.36.
So hit, expertise, dodge, and even haste are all strong stats because they feed into our active mitigation, both by increasing the amount of guaranteed blocks we get and increasing the uptime of the SotR block value buff. Hit, expertise, and haste all do this in the obvious way – they increase Holy Power generation, which lets us use our active mitigation tool more often. Dodge does it a little more subtly, by reducing
– essentially, the more you dodge, the fewer incoming attacks you have that are eligible for block, increasing the percentage of them that become guaranteed blocks.
But look at
. It’s just got a lonely factor of
, which is 2x-4x smaller than any of the individual factors inside the brackets in the other
. It’s propped up a little by having a better rating->percentage factor
, but not nearly enough to let it catch up to the other stats. And the reason is because it has only a very weak interaction with our active mitigation. In fact, our active mitigation actively undermines mastery by making it less useful. The more guaranteed blocks we get, the less important mastery becomes. If you bump up the hit and expertise values used in the calculation, you increase the importance of
and the value of
goes down by a few percent.
That said, we can’t blame it all on active mitigation. Certainly diminishing returns plays a part, as does the two-roll system itself. The diminishing returns on block are about twice as bad as the diminishing returns on avoidance;
is almost half as large as
, because we’re much higher on the DR curve for block than we are for avoidance (partly because avoidance is split between two DR mechanisms – dodge and parry). And the two-roll system reduces the effectiveness of block chance inherently, like we’ve discussed before.
But the dominant factor in mastery’s demise as a damage mitigation stat is our active mitigation. It introduces an interesting feedback mechanism between avoidance and our active mitigation that allows avoidance to double-dip (hence the second term in
– note that each term of
is larger than
,
, or
). The more we avoid, the stronger SotR’s guarateed blocks get, so adding dodge rating gives us less damage due to avoided attacks and less damage due to a higher percentage of 75% blocks.
Where do we go from here?
I’ve already been advocating a change in our mastery, partly because I was worried it would be too weak (little did I know – even I didn’t expect it to be this bad), and partly because block chance isn’t really all that exciting. It wasn’t exciting in Cataclysm either, but the presence of a block cap made for interesting gearing choices, much like the hit or expertise cap does for a DPS. Mastery in MoP fails to even have that level of “interesting.” It’s just another passive total damage reduction stat, like dodge or parry, but less efficient.
The solutions I’ve been advocating on maintankadin have all included mechanisms that couple mastery with our active mitigation. At the time, I didn’t realize how critical that coupling would be, but the number-crunching we’ve done in this post shows that it’s even more important than I could have guessed. It’s essential, in fact, because our active mitigation accounts for a much larger part of our survivability than our “last resort” block chance does. In a future blog post, I’ll look at some of the possible ways we could introduce this coupling and make mastery an interesting and useful stat.
In the next and final part of this series of blog posts, we’re going to build a numerical Monte-Carlo simulation to validate our analytical model and figure out how reasonable the various approximations we’ve made along the way really are. That may not happen until Friday, though, both because I’ve yet to write the simulation and because I’ve been monopolizing the blog for the better part of a week.
Like this:
Be the first to like this post.