Warrior Block Calculations – Part 1

In response to my earlier work on paladin MoP Block mechanics, several of my warrior friends asked if I could perform a similar calculation for their class. I thought that it would be a relatively straightforward calculation – after all, their active mitigation only involves one buff, so it should be simpler than the paladin version, right?

Boy was I wrong.

The warrior calculation is far, far worse than the paladin one, for subtle reasons. It’s somewhat ironic, because the calculations for how warriors spend resources are much easier, just as I thought they would be. The problem is that their resource generation is a tangled, unimaginably awkward mess. Primarily because of two specific complications: the Enrage mechanic and parry-haste. At several points within the calculation, I thought about deftly avoiding both of those problems through approximation techniques. But in the end, my curiosity got the better of me, and I treated both of them in full, with as little approximation as necessary. Unfortunately, that’s 8 hours of my life I’ll never get back.

But in any event, the warrior calculation is complete, and I’m going to publish it in 4 parts. In this first part, I’ll go through the basic framework, which is very similar to the paladin calculation. In the second part, we’ll dig into the warrior rotation and tackle the problem of parry-hasting. The third part will deconstruct the Enrage mechanic and develop the expression for rage generation. And then in part 4, we’ll tie everything together, plug in numbers, and see how things work out numerically. I’ll probably skip the Monte-Carlo sim this time, so there likely won’t be a part 5.

A Word On Notation

In the paladin calculation, I was a bit haphazard with variable names. This came back to bite me a few times, and in retrospect I would have done a few things differently to make it clearer where certain factors came from. Luckily, I’ve since developed a slightly better set of variable-naming conventions, which turned out to be essential to making the warrior calculation manageable. I’m going to use the new notation here, so be aware that certain variables (ex: $\gamma$) won’t share a meaning between the paladin and warrior calculations. If Blizzard ends up changing our active mitigation mechanics, I’ll have to re-do the paladin calculation, and at that point I’ll update our version to the new notation.

1. The Incoming Damage Formula

As for paladins, the incoming damage formula can be written:

$D = D_0 S F_{\rm ar} F_{\rm av} F_b$

Where $D$ is net damage taken, $D_0$ is damage intake before mitigation/avoidance effects, $S$ is the spec-based mitigation factor (Sanctuary for paladins, Defensive Stance for warriors, $S=0.9$), and $F_{\rm ar}$, $F_{\rm av}$, and $F_b$ are the armor, avoidance, and block mitigation factors, respectively. We’ll define each of those shortly. To see how damage varies with different stats, we’ll want to perform implicit differentiation on (1):

$\frac{dD}{D_0 S} = dF_{\rm ar} F_{\rm av} F_b + dF_{\rm av} F_{\rm ar}F_b+ dF_b F_{\rm ar} F_{\rm av}\large$

$D_0$ and $S$ don’t vary with rating, so we divide through by those to normalize. Thus, to determine how damage varies with stats, we need to define all three of the mitigation factors and differentiate them. The armor and avoidance factors are easy, and identical to the paladin version, so we’ll start with them.

1.1 Armor Mitigation Factor

The armor factor works exactly the same way it does in Cataclysm. An amount of armor $Ar$ grants mitigation $M_{\rm ar}$ equal to

$M_{\rm ar} = Ar / (Ar + K)$,

where $K$ is the armor constant (32573 for an 88 boss). The armor factor is then

$F_{\rm ar} = 1-M_{\rm ar} = K/(Ar+K)$,

and differentiating we get

$dF_{\rm ar} = -dAr K / (Ar+K)^2 = \frac{-dAr}{f_{ar}}F_{\rm ar}\large$

where we’ve defined $f_{ar}=(Ar+K)$ to put this in a form reminiscent of the other factors we’ll encounter during the derivation. $f_{ar}$ can be thought of as a “rating-to-percent” conversion factor for armor, since that’s what $f_i$ will represent for rating $r_i$.

1.2 Avoidance Mitigation Factor

Avoidance is only slightly trickier due to diminishing returns (DR). In addition, we can no longer treat dodge and parry as identical, as we could in the paladin calculation. So we’ll just keep track of them both. Let our warrior’s total avoidance $A$ have the form:

$A = A_{m0}+A_{p0}+A_{d0}+A_p+A_d$

where $A_{m0}$, $A_{p0}$, and $A_{d0}$ are miss, parry, and dodge from sources that aren’t subject to DR, while $A_p$ and $A_d$ are parry and dodge gained from sources which are subject to DR. The avoidance mitigation factor is,

$F_{\rm av} = 1-A$,

and differentiating this gives us

$dF_{\rm av} =-dA_d -dA_p$

To express the post-DR differentials in terms of rating, we need to differentiate the diminishing returns equation:

$\frac{1}{A_d} = \frac{1}{C_d} + \frac{k_d}{a_d}\large$

which gives us

$dA_d = \frac{da_d}{k_d}\left ( 1-A_d/C_d \right )^2\large$.

Here, $C_d$ and $k_d$ are the diminishing returns coefficients for dodge, and $a_d$ is the pre-DR amount of dodge corresponding to $A_d$ post-DR dodge. Parry follows an identical equation. If we assume that the player has balanced dodge and parry (such that $A_d \approx A_p$), then we can simplify this slightly by introducing an avoidance dependency factor $\Phi_{\rm av}$:

$\Phi_{\rm av} = \frac{1}{k_d}\left ( 1-\frac{A_d}{C_d} \right )^2\large$

such that $dF_{\rm av}$ is

$dF_{\rm av} = -\left ( \frac{dr_d}{f_d} + \frac{dr_p}{f_p} \right ) \Phi_{\rm av}$.

Again, $f_d$ and $f_p$ are our rating-to-percent conversion factors for dodge and parry.

1.3 Block Mitigation Factor

The block mitigation factor is more complicated, just as in the paladin case. We start from the expression:

$F_b = G[1-(1+C)B_v] + (1-G)B_c[1-(1+C)B_v]+(1-G)(1-B_c)$,

which can be re-arranged to the simpler form

$F_b = 1-G(1+C)B_v – (1-G)B_c(1+C)B_v$.

In this expression, $G$ is the probability that an un-avoided attack becomes a guaranteed block. $C$ is the critical block chance, as determined from mastery. $B_c$ is the player’s total block chance, and $B_v$ is the player’s block value. Note that $B_v=0.3$ by definition, since we’re representing critical blocks explicitly with $C$. If we differentiate $F_b$, we have

$dF_b = -dG \phi_{\rm G} – dC \phi_{\rm BV} – dB_c \phi_{\rm BC}$,

where we’ve defined the factors

$\phi_{\rm G} = (1-B_c)(1+C)B_v$
$\phi_{\rm BV} = [G+(1-G)B_c]B_v$
$\phi_{\rm BC} = (1-G)(1+C)B_v$.

We still need to develop explicit expressions for $dG$, $dC$, and $dB_c$ to complete the derivation. The last two are easy, so we’ll tackle them first; $dG$ is where the complications turn up, so we’ll save that for later.

1.3.1 – Block Chance derivative

Block chance can be written

$B_c = B_c^{(0)} + B_{cm}$,

where $B_c^{(0)}$ is block chance from sources unaffected by DR (so, base block and Bastion of Defense) and $B_{cm}$ is the post-DR block chance from any other sources (which, as far as I know, is only mastery). The diminishing returns equation for block is identical to that of avoidance, but with different coefficients $C_B$ and $k_B$:

$\frac{1}{B_{cm}} = \frac{1}{C_B} + \frac{k_B}{b_{cm}}$.

Just as we did for avoidance, we can relate $dB_{cm}$ to $db_{cm}$:

$dB_{cm} = \frac{db_{cm}}{k_B} \left (1-B_{cm}/C_B \right )^2$.

$db_{cm}$ is related to a change in mastery ($dm$) by $db_{cm}=dm f_b $, where $f_b$ is the mastery-to-block-chance conversion factor (1.5%). To put this in terms of rating, we use $dm = dr_m / f_m$, where $f_m$ is the rating-to-mastery conversion factor.

Bringing this all together, and noting that $dB_c = dB_{cm}$, we have

$dB_c = \left ( \frac{dr_m}{f_m} \right ) \beta_{cm}$,

where we’ve defined $\beta_{cm}$ as

$\beta_{cm} = \frac{f_b}{k_B}\left ( 1-\frac{B_{cm}}{C_B} \right )^2\large$

These last two equations complete the factor $dB_c$.

1.3.2 – Crit Block derivative

Critical block chance can be expressed in the form,

$C = C^{(0)} + C_m$,

where $C^{(0)}$ is crit block from other sources and $C_m$ is crit block from mastery. I’m assuming there’s no diminishing returns on crit block; luckily if this is in error it’s a simple fix. Differentiating, we have

$dC = dC_m = dm \beta_{vm} = \left ( \frac{dr_m}{f_m}\right )\beta_{vm}$,

where $\beta_{vm} = f_{cb}$ is the mastery-to-crit-block conversion factor (1.5%).

1.3.3 – Shield Block derivative

$dG$ is complicated because it depends on many different things. The expression for $G$ itself is not particularly onerous:

$G = R_{\rm SB} T_{\rm buff}\large$

with $R_{\rm SB}$ representing the Shield Block cast rate, and $T_{\rm buff}$ the duration of the Shield Block buff. Note that $G$ is also the uptime of the Shield Block buff. Differentiating $G$, we get,

$dG = dR_{\rm SB}T_{\rm buff}\large$

The next step would be to start calculating $R_{\rm SB}$ and $dR_{\rm SB}$, and plug those results into $G$ and $dG$. Unfortunately, that’s the hard part of the calculation, and requires some complicated modeling of parry-haste and Enrage mechanics. We’ll tackle that in parts 2 and 3 of the series. For now, we cheat: we’ll use the answers in abstracted form. This works because we know the form of the answer, so by defining variables to represent the stuff we haven’t worked out yet, we can continue the calculation and get to the end.

Let’s assume that $dR_{\rm SB}$ has the form:

$dR_{\rm SB} = (dh+de)\rho_h + ds\rho_s + dm\rho_m + da_d \rho_d + da_p\rho_p + dx\rho_x$,

where I’ve used $dh$ to represent a small change in hit, $de$ a small change in exp, $ds$ a small change in haste, $dm $ a small change in mastery, $da_d$ a small change in dodge, $da_p$ a small change in parry, and $dx$ a small change in critical strike (yes, crit is a mitigation stat for warriors). Note that these are changes in percentages; thus $dh$ is equivalent to a rating change of $dr_h/f_h$, and so on for the other factors. The variables $\rho_i$ are just like our earlier factors of $\Phi_{\rm av}$ or $\beta_{im}$, in that they represent the effect that a small change in a particular stat causes in $dR_{\rm SB}$. The $\rho_i$ can (and will) depend on any of the input variables. Finding suitable expressions for $\rho_i$ will be the objective of the next two blog posts.

In the meantime, we can use these results to put $dG$ in a more convenient form:

$dG = (dh+de)\gamma_h + ds\gamma_s + dm\gamma_m + dx\gamma_x + da_d\gamma_d + da_p\gamma_p$,

where we’ve defined the $\gamma_i$ as:

$\gamma_h = \rho_h T_{\rm buff}\large$
$\gamma_s = \rho_s T_{\rm buff}\large$
$\gamma_m = \rho_m T_{\rm buff}\large$
$\gamma_x = \rho_x T_{\rm buff}\large$
$\gamma_p = \rho_p T_{\rm buff}\large$
$\gamma_d = \rho_d T_{\rm buff}\large$

With these definitions, we can go back and finish defining $dF_b$, and subsequently finish the derivation (symbolically, at least – we’ll need the $\rho_i$ before we can start plugging in numbers).

1.3.4 – Constructing the Block Factor derivative

Substituting our expressions for $dG$, $dC$, and $dB_c$ into $dF_b$, we have:

$dF_b = -(dh+de)\gamma_h\phi_{\rm G} – ds\gamma_s\phi_{\rm G} – dx\gamma_x\phi_{\rm G} -da_p\gamma_p\phi_{\rm G} – da_d\gamma_d\phi_{\rm G} – dm\left [ \gamma_m\phi_{\rm G} +\beta_{vm}\phi_{\rm BV} + \beta_{cm}\phi_{\rm BC} \right]$

We’re going to do another round of encapsulation here to keep the expressions manageable. Thus, we’ll write $dF_b$ as

$dF_b = -(dh+de)\Phi_{\rm bh} – ds\Phi_{\rm bs} – dx\Phi_{\rm bx}-da_p\Phi_{\rm bp}-da_d\Phi_{\rm bd} – dm\Phi_{\rm bm}$,

with the following definitions for the $\Phi_{\rm bi}$:

$\Phi_{\rm bh} = \Phi_{\rm be} = \gamma_h\phi_{\rm G}\large$
$\Phi_{\rm bs} = \gamma_s\phi_{\rm G}\large$
$\Phi_{\rm bx} = \gamma_x\phi_{\rm G}\large$
$\Phi_{\rm bp} = \gamma_p\phi_{\rm G}\large$
$\Phi_{\rm bd} = \gamma_d\phi_{\rm G}\large$
$\Phi_{\rm bm} = \gamma_m\phi_{\rm G} + \beta_{vm}\phi_{\rm BV} + \beta_{cm}\phi_{\rm BC}\large$

We can now take these definitions that describe $dF_b$ and combine them with our earlier expressions for $dF_{\rm ar}$ and $dF_{\rm av}$ to come up with scaling factors for the different ratings that describe their relative value at reducing $D$.

1.4 – Normalized Scale Factors

Starting from $dD/D_0S = dF_{\rm ar}F_{\rm av}F_b + dF_{\rm av}F_{\rm ar}F_b + dF_b F_{\rm ar}F_{\rm av}$, and substituting the differentials we’ve worked out, we have:

$\frac{dD}{D_0 S} = – \left (\frac{dAr}{f_{ar}}\right ) F_{\rm ar}F_{\rm av}F_b – \left ( \frac{dr_p}{f_p}+\frac{dr_d}{f_d}\right ) F_{\rm ar}\Phi_{\rm av} F_b \\- \left ( \frac{dr_h}{f_h}+\frac{dr_e}{f_e} \right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bh}- \left (\frac{dr_s}{f_s}\right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bs} \\- \left (\frac{dr_x}{f_x}\right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bx} – \left (\frac{dr_p}{f_p}\right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bp} \\- \left (\frac{dr_d}{f_d}\right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bd} – \left (\frac{dr_m}{f_m} \right ) F_{\rm ar}F_{\rm av}\Phi_{\rm bm}\large$

Combining terms, we can write this in the form:

$\frac{dD}{D_0 S} = -dAr\Delta_{\rm ar} – dr_p\Delta_p -dr_d\Delta_d -(dr_h+dr_e)\Delta_h-dr_s\Delta_s-dr_x\Delta_x-dr_m\Delta_m$,

where we’ve defined the normalized scale factors $\Delta_i$ as:

$\Delta_{\rm ar} = \frac{1}{f_{ar}}F_{\rm ar}F_{\rm av}F_b\large$

$\Delta_h = \Delta_e = \frac{1}{f_h}F_{\rm ar}F_{\rm av}\Phi_{\rm bh}\large$

$\Delta_s = \frac{1}{f_s}F_{\rm ar}F_{\rm av}\Phi_{\rm bs}\large$

$\Delta_x = \frac{1}{f_x}F_{\rm ar}F_{\rm av}\Phi_{\rm bx}\large$

$\Delta_m = \frac{1}{f_m}F_{\rm ar}F_{\rm av}\Phi_{\rm bm}\large$

$\Delta_p = \frac{1}{f_p}\left [ F_{\rm ar}\Phi_{\rm av} F_b + F_{\rm ar}F_{\rm av}\Phi_{\rm bp} \right ]\large$

$\Delta_d = \frac{1}{f_d}\left [ F_{\rm ar}\Phi_{\rm av} F_b + F_{\rm ar}F_{\rm av}\Phi_{\rm bd} \right ]\large$

These are the normalized scale factors that we need to calculate to compare different stats. At this point, it’s a simple matter of taking our initial conditions (i.e. the player’s avoidance, block, etc.), calculating all of the factors we’ve defined, and plugging them in. Except, of course, that we need to develop expressions for the $\rho_i$ first, which will take some work. Next time, we’ll start figuring out how to express $\rho_i$ by looking at the warrior rotation and the effects of parry haste.

<edit> Since publication, I’ve found that I made an error defining $G$. This considerably simplifies part of the calculations. I’ve updated to accurately reflect this new definition. Apologies for the confusion, if it caused any.

This entry was posted in Tanking, Theck's Pounding Headaches, Theorycrafting and tagged , , , , , , , , , , . Bookmark the permalink.

6 Responses to Warrior Block Calculations – Part 1

  1. Pliers says:

    Warriors? In MY paladin blog? It’s more likely than you think.

  2. Pingback: Warrior Block Calculations – Part 2 | Sacred Duty

  3. Lakhesis says:

    Ah goody, a sneak peak into how the other half lives.

  4. Pingback: Warrior Block Calculations – Part 3 | Sacred Duty

  5. Pingback: MoP Mastery/Block Calculations – Build 15739 | Sacred Duty

  6. Pingback: Workhorse just isn't making the grade... - Page 2

Leave a Reply