So far, we’ve developed the general expressions for warrior block mechanics, and we’ve worked out the warrior rotation and the effects of parry haste. In this installment, we’ll work out the last two pieces to the warrior block mechanics puzzle: the Enrage mechanic, and the rage generation equation.

**1. Enrage Mechanics**

The Enrage buff increases rage generation from auto-attacks by 25%, so we need an accurate model of it if we intend to get accurate estimates of rage generation. Normally, buff uptimes are fairly simple – a buff with a single potential trigger has an uptime of

${\rm uptime} = 1 – q^N$

where $q = 1 – p$ is the probability that the effect doesn’t proc ($p$ is the probability that a proc does occur), and $N$ is the number of proc chances that occur during the buff’s duration. The logic behind this is pretty straightforward – the probability of having N failed proc chances during the buff’s duration is $q^N$, and if that happens, the buff will fall off. You can rigorously show that this is the correct formula using a Markov chain, if you’re so inclined. Since this is a well-established result, we’re not going to repeat that here.

However, Enrage is more complicated than this, because Enrage has *three* proc mechanics. It can proc from critical strikes (so auto-attacks, Shield Slam, Devastate, Revenge, and Thunder Clap in our model), critical blocks, and from automatic crits through the interaction of Ultimatum and Glyph of Incite. And on top of all of that, Berserker Rage grants the enrage effect on-demand.

**1.1. Multi-Sourced Uptime Equation**

Let’s ignore Berserker Rage for a moment, and handle the three proc mechanics. Using the same logic as the simple example, the buff will drop off if we get no successful procs from *any* of the three mechanics during the buff duration, so our uptime should look like:

${\rm uptime} = 1-q_1^{N_1} q_2^{N_2} q_3^{N_3}$,

where $q_1$, $q_2$, and $q_3$ are the “failure” chances for critical strikes, critical blocks, and Ultimatum procs, respectively, and $N_1$, $N_2$, and $N_3$ are the number of times each of those events can happen in the 6-second buff duration. We can write explicit expressions for $q_i$:

$q_1 = 1-x$

$q_2 = 1-C$

$q_3 = 1-u$

Where $x$ is our crit chance, $C$ is our crit block chance, and $u=0.3$ is the Ultimatum proc chance. The expressions for $N_i$ are:

$N_1=6 [ (R_{\rm SS}+R_{\rm D}+R_{\rm R})\Theta+R_{\rm TC}\Theta_s+R_{\rm AA}(\Theta-g) ]$

$N_2 = 6 R_{\rm att}(1-A)\left [ G+ (1-G)B_c\right ]$

$N_3 = 6 R_{\rm D}\Theta$

Where we’ve used our definitions of $\Theta$ and $\Theta_s$ from last time, and included the glancing blows chance $g$. Here, we’re assuming that the warrior will only ever use Heroic Strike if it’s free (i.e. 0 rage coast), and Glyph of Incite guarantees each of those will be a crit. If the glyph isn’t used, $q_3$ is no longer necessary, and regular Ultimatum-induced crits can be folded into $N_1$ by adding a 1.3 to the coefficient of $R_{\rm D}$.

Note also that $N_1$ is complicated by the fact that we have different miss rates for each attack source. Shield Slam, Devastate, and Revenge are all melee attacks, while Thunder Clap is a spell, and auto-attacks have an extra chance for glancing blows (which cannot be crits).

Berserker rage can be trivially included in this, as it gives 20% uptime automatically. If we treat this as a stochastic event (i.e. random), then our expression for enrage uptime is

$E =1 -0.8 q_1^{N_1}q_2^{N_2}q_3^{N_3}$

In theory, you might be able to do a little better than this by saving Berserker Rage and using it only when your stochastic (i.e. random) Enrage effects aren’t active, but it’s not likely to be a big improvement.

**1.2. Derivatives of q and N**

We’re going to need to differentiate $E$, so it will be to our benefit to calculate the contributing differentials $dq_i$ and $dN_i$. The $dq_i$ are very simple:

$dq_1 = -dx$

$dq_2 = -dC = -dm \beta_{vm}$

$dq_3 = 0$

where $\beta_{vm}$ is as defined in part 1.

The derivatives of $N_i$ are much more annoying, so we’ll do them one at a time:

$dN_1 = 6d\Theta(R_{\rm SS}+R_{\rm D}+R_{\rm R}+R_{\rm TC}+R_{\rm AA}) \\+ 6\Theta(dR_{\rm SS}+dR_{\rm D}+dR_{\rm R}) \\+6\Theta_s dR_{\rm TC}+6 dR_{\rm AA}(\Theta-g)$

There are a few simplifications we can make to this expression. We know that $dR_{\rm D} = dR_{\rm D0} – dR_{\rm TC}$ from part 2. We also know that $R_{\rm SS}+R_{\rm D}+R_{\rm R}+R_{\rm TC}$ is all of our GCD-based casts *except* for Battle Shout, thus

$R_{\rm SS}+R_{\rm D}+R_{\rm R}+R_{\rm TC} = R_{\rm GCD} – R_{\rm shout}$

Using all of these, along with our definitions of $dR_{\rm SS}$, $dR_{\rm R}$, $dR_{\rm D0}$, $dR_{\rm TC}$, and $dR_{\rm AA}$ from part 2, we have:

$dN_1 = 6 d\Theta [(R_{\rm GCD}-R_{\rm shout}+R_{\rm AA}) +\Theta(\chi_{\rm SS} + \chi_{\rm D0} + \chi_{\rm R}) + (\Theta-\Theta_s)\chi_{\rm TC} ]\\+ ds 6\pi_s(\Theta-g) \\+ da_p 6\pi_p(\Theta-g)$

We can define a few abstraction factors to help clean this up:

$dN_1 = \eta_{1h}(dh+de)+\eta_{1s}ds+\eta_{1p}da_p$

$\eta_{1h} = 6\left [ R_{\rm GCD}-R_{\rm shout}+R_{\rm AA}+\Theta(\chi_{\rm SS}+\chi_{\rm D0}+\chi_{\rm R})+\chi_{\rm TC}(\mu-d-p) \right ]$

$\eta_{1s} = 6\pi_s (\Theta-g)$

$\eta_{1p}= 6\pi_p(\Theta-g)$

$N_2$ is even worse, because it’s got $G$ in it. Let’s crank through that:

$dN_2 = -6R_{\rm att}(dA_d + dA_p)[G + (1-G)B_c] \\+ 6R_{\rm att}(1-A)[dG(1-B_c)+(1-G)dB_c]$

And, again, saving you some algebra:

$dN_2 = (da_d+da_p)\eta_{2d}+dm\eta_{2m}+(dh+de)\eta_{2h}+ds\eta_{2s}$,

where

$\eta_{2d} = 6R_{\rm att}\left [\gamma_d(1-A)(1-B_c) – \Phi_{\rm av}(G+(1-G)B_c)\right ]$

$\eta_{2m} = 6R_{\rm att}(1-A)\left [\beta_{cm}(1-G)+\gamma_m(1-B_c)\right ]$

$\eta_{2h}=6R_{\rm att}(1-A)(1-B_c)\gamma_h$

$\eta_{2s}=6R_{\rm att}(1-A)(1-B_c)\gamma_s$,

and I’ve used the $\gamma_i$ definitions from part 1.

$dN_3$ is quite simple:

$dN_3 = 6dR_{\rm D}\Theta + 6R_{\rm D}d\Theta$

which simplifies to

$dN_3 = (dh+de)eta_{3h}$

$\eta_{3h} = 6[R_{\rm D}+\chi_{\rm D0}-\chi_{\rm TC}]$.

Now, we have all the derivatives of $q_i$ and $N_i$ that we need to complete our Enrage model. All that remains is to differentiate our expression for $E$ and plug in the results from this section.

**1.3. Differentiating E**

Unfortunately, differentiating $E$ is a bit of a pain. The problem is that both $q_i$ and $N_i$ differentials come into play, which makes the results a bit cumbersome. To differentiate, we’ll make use of the identity:

$d(x^y) = yx^{y-1}dx + ln(x)x^y dy$

Doing so gives us:

$dE = -0.8 [ (N_1 q_1^{N_1-1} dq_1 + \ln(q_1) q_1^{N_1} dN_1) q_2^{N_2} q_3^{N_3} \\+ q_1^{N_1} (N_2 q_2^{N_2-1} dq_2 + \ln(q_2) q_2^{N_2} dN_2) q_3^{N_3} \\+ q_1^{N_1} q_2^{N_2} (N_3 q_3^{N_3-1} dq_3 + \ln(q_3)q_3^{N_3} dN_3)]$

We can simplify this some by pulling out a factor of $q_1^{N_1}q_2^{N_2}q_3^{N_3}$:

$dE = -0.8q_1^{N_1}q_2^{N_2}q_3^{N_3}[(N_1 dq_1/q_1 + \ln(q_1) dN_1) \\+ (N_2 dq_2/q_2 + \ln(q_2) dN_2) \\+ (N_3 dq_3/q_3 + \ln(q_3) dN_3)]$

We can simplify this further by noting that $(1-E) = 0.8 q_1^{N_1} q_2^{N_2} q_3^{N_3}$ and plugging in our results for $dq_i$:

$dE = (1-E)\left [ N_1 dx/(1-x) – \ln(1-x)dN_1 + N_2 dm\beta_{vm}/(1-C) -\ln(1-C) dN_2 – \ln (1-u) dN_3\right ]$

Unfortunately, the expression balloons a bit when we plug in the $dN_i$:

$dE = (1-E) [ dx \frac{N_1}{1-x} – (dh+de)\eta_{1h}\ln (1-x) – ds\eta_{1s}\ln (1-x) – da_p \eta_{1p}\ln (1-x) \\+ dm\frac{N_2\beta_{vm}}{1-C} – (da_d+da_p)\eta_{2d}\ln (1-C) – dm \eta_{2m}\ln (1-C) – (dh+de) \eta_{2h}\ln (1-C) \\- ds \eta_{2s}\ln (1-C) – (dh+de)\eta_{3h}\ln (1-u)]$

But by combining terms and abstracting, we can get a reasonably manageable form:

$dE = (1-E)[dx\epsilon_x + (dh+de)\epsilon_h+dm\epsilon_m+ds\epsilon_s + da_d\epsilon_d+da_p\epsilon_p]$

$\epsilon_x = N_1/(1-x)$

$\epsilon_h = -\eta_{1h}\ln (1-x) – \eta_{2h}\ln (1-C) – \eta_{3h} \ln (1-u)$

$\epsilon_m = N_2\beta_{vm}/(1-C) – \eta_{2m}\ln (1-C)$

$\epsilon_s = -\eta_{1s}\ln (1-x) – \eta_{2s}\ln (1-C)$

$\epsilon_d = -\eta_{2d}\ln (1-C)$

$\epsilon_p = -\eta_{1p}\ln (1-x) – \eta_{2d}\ln (1-C) = -\eta_{1p}\ln (1-x) + \epsilon_d$

Which is our final form for $dE$, and completes our model of Enrage effects. Note that while there seem to be a lot of negative signs in these expressions, it’s because all of the natural log factors are negative.

**2. Rage Per Second Calculation**

At long last, we’re ready to construct our rage generation equation. The basic form will be:

$RPS = RPS_{\rm AA} + RPS_{\rm SS} + RPS_{\rm shout} – RPS_{\rm TC}$

The easiest is $RPS_{\rm shout}$, which is just

$RPS_{\rm shout} = 20 R_{\rm shout} = 20/60 = 1/3$,

and since it’s a constant, its derivative is zero.

**2.1. Shield Slam Rage Generation**

Shield Slam is also fairly straightforward,

$RPS_{\rm SS} =\Theta[10 R_{\rm rSS} + 15 R_{\rm SnB}]$

The term in brackets is the base SS rage generation rate (maximum 2.8 rage per second at hit- and exp-caps). The derivative is then,

$dRPS_{\rm SS} = d\Theta[10 R_{\rm rSS} + 15 R_{\rm SnB}] + \Theta[10 dR_{\rm rSS} + 15 dR_{\rm SnB}]$

Using our expressions for $dR_{\rm rSS}$ and $dR_{\rm SnB}$ from part 2, we have:

$dRPS_{\rm SS} = (dh+de)[10R_{\rm rSS}+15R_{\rm SnB} + \Theta(10\chi_{\rm rSS}+15\chi_{\rm SnB})]$

**2.2. Thunder Clap Rage Cost**

Thunder Clap is also not particularly difficult, since we’ve already developed an expression for $R_{\rm TC}$:

$RPS_{\rm TC} = 20 R_{\rm TC} = 10/3 – (8/3)\Theta_s$

Differentiating gives us

$dRPS_{\rm TC} = -(8/3)(dh+de)$.

**2.3. Auto-Attack Rage Generation**

Finally, the expression for auto-attacks is:

$RPS_{\rm AA} = \Theta(1+0.5 E)(5/R_{\rm AA}^{(0)}) R_{\rm AA}$

Note that each melee attack generates a normalized amount of rage $5/R_{\rm AA}^{(0)}$.

Differentiating gives us,

$dRPS_{\rm AA} = d\Theta(1+0.5E)(5/R_{\rm AA}^{(0)})R_{\rm AA} \\+dE 2.5\Theta R_{\rm AA}/R_{\rm AA}^{(0)} \\+dR_{\rm AA}\Theta(1+0.5E)(5/R_{\rm AA}^{(0)})$

**2.4. Combined Rage Generation Equations**

Combining all four of these expressions, we have:

$RPS =\Theta(1+0.5E)(5R_{\rm AA}/R_{\rm AA}^{(0)}) + \Theta[10R_{\rm rSS}+15R_{\rm SnB}] – (10/3-(8/3)\Theta_s)+1/3$

which simplifies to

$RPS = \Theta[(1+0.5E)(5R_{\rm AA}/R_{\rm AA}^{(0)})+10R_{\rm rSS}+15R_{\rm SnB}] +(8/3)\Theta_s-3$.

The Shield Block cast rate $R_{\rm SB}$ is simply $RPS/60$. We could differentiate this directly, but it’s a little easier to just combine the individual differentials worked out earlier:

$dRPS = (dh+de)(1+0.5E)(5R_{\rm AA}/R_{\rm AA}^{(0)}) + dE 2.5\Theta R_{\rm AA}/R_{\rm AA}^{(0)} \\+dR_{\rm AA}\Theta (1+0.5E)(5/R_{\rm AA}^{(0)}) +(dh+de)[10 R_{\rm rSS} + 15 R_{\rm SnB} + \Theta (10 \chi_{\rm rSS} + 15\chi_{\rm SnB})] \\+(8/3)(dh+de)$

Which is, of course, annoying to deal with, so we abstract some:

$dRPS = (dh+de)\sigma_h + dE\sigma_E/(1-E) + dR_{\rm AA}\sigma_{AA}$

$\sigma_h = [5(1+0.5 E)R_{\rm AA}/R_{\rm AA}^{(0)} +10 R_{\rm rSS} + 15 R_{\rm SnB} + \Theta (10 \chi_{\rm rSS} + 15\chi_{\rm SnB}) + 8/3]$

$\sigma_E = 2.5 \Theta(1-E)R_{\rm AA}/R_{\rm AA}^{(0)}$

$\sigma_{AA} = 5\Theta(1+0.5 E)/R_{\rm AA}^{(0)}$

We then plug in our expressions for $dE$ and $dR_{\rm AA}$:

$dRPS = (dh+de)\sigma_h + \sigma_E (dx\epsilon_x + (dh+de)\epsilon_h + dm\epsilon_m + ds\epsilon_s + da_d\epsilon_d + da_p\epsilon_p) + \sigma_{AA}(ds\pi_s + da_p\pi_p)$

Combining terms, we have

$dRPS = (dh+de)[\sigma_h + \sigma_E\epsilon_h] + ds[\sigma_E\epsilon_s + \sigma_{AA}\pi_s] + dm\sigma_E\epsilon_m \\+ dx\sigma_E\epsilon_x + da_d\sigma_E\epsilon_d + da_p[\sigma_E\epsilon_p + \sigma_{AA}\pi_p]\large$

The change in the rate of Shield Block casts $dR_{\rm SB}$ due to a change in rage generation is simply $dRPS/60$, and we’ve already defined the expression for $dR_{\rm SB}$ in part 1:

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

By inspection, we can now define the $\rho_i$ as follows:

$\rho_h = (\sigma_h+\sigma_E\epsilon_h)/60\large$

$\rho_s = (\sigma_E\epsilon_s + \sigma_{AA}\pi_s)/60\large$

$\rho_m = (\sigma_E\epsilon_m)/60\large$

$\rho_x = \sigma_E\epsilon_x/60\large$

$\rho_d = \sigma_E\epsilon_d/60\large$

$\rho_p = (\sigma_E\epsilon_p+\sigma_{AA}\pi_p)/60 = \rho_d + (\sigma_E\eta_{1p} \ln x + \sigma_{AA}\pi_p)/60\large$

And finally, we have a complete model of warrior block mechanics. In the next post, I’ll collect all of the expressions we need in one place and plug in numbers to see how the different stats compare.

I have to admit, i need some time to understand and read the posts of the blocking series, thats the most statistic on one topic i had to understand since university But the posts are helpful and interesting. I’m very thankful for them, thanks for your effort and your time spent!

Pingback: L90 Mitigation Stat Weights for Warriors | Sacred Duty

Pingback: Theorycrafting 101: Markov Chains | Sacred Duty