# Avoidance Diminishing Returns in MoP – Part 3

In parts 1 and 2, I presented the data and calculations that led us to the analytic forms of the new diminishing returns (DR) formulas. However, while having the formulas is a great thing, most tanks are probably more curious about what it means for them. In other words, “how does this change how I approach gearing?” That’s what I’ll try to address in this blog post.

Recap – The Formulas

Before we get there though, let me quickly re-post the formulas once again. Between taking and analyzing the data and writing these blog posts, a new build went live that added 2% dodge to Sanctuary. While I haven’t tested it yet, it’s almost certain that this 2% dodge will not be affected by diminishing returns. As such, it’s just an addition to base dodge (check for yourself – your level 90 paladin should have 5.01% dodge while naked if I’m right). So to summarize the last two posts, the new dodge and parry DR equations are:

$\Large {\rm totalDodge} = {\rm baseDodge} + \left (\frac{1}{C_d}+\frac{k}{\rm preDodge} \right )^{-1}$

$\large {\rm totalParry} = {\rm baseParry} + \frac{\rm baseStr}{Q} + \left (\frac{1}{C_p}+\frac{k}{\frac{{\rm totalStr}-{\rm baseStr}}{Q} + {\rm preParry}} \right )^{-1}$

with ${\rm preParry}$ and ${\rm preDodge}$ being the pre-DR avoidance values as read off of the respective tooltips, and the following constant values:

${\rm baseParry}=3.00$
${\rm baseDodge}=5.01$
${\rm baseStr}=176$ (for a BE, varies per race)
$Q=952$
$C_p=235.5$
$C_d = 65.631440$
$k=0.885$

I chose Q to represent the Strength-to-Parry conversion factor because it takes us from “S” to “P” in “PQRS”, and Q is more fun than R.

What Does It All Mean?

Now that we have the formulas, let’s look at what they mean. First of all, here are the DR curves plotted for you:

It’s clear that by 10% worth of dodge rating, we’re already seeing the effects of diminishing returns (which is why the L90 dodge data was easy to fit, the curvature starts to happen much earlier). But it takes 2-3 times as much parry to start seeing distinct curvature. This means our gearing is going to be very lopsided – we’re going to want a lot more parry than we have dodge.

To illustrate that more clearly, let’s look at the differential gain in avoidance. The following plot shows how much avoidance you gain by adding 1% pre-DR avoidance, plotted as a function of your post-DR avoidance level. To put that in less technical terms: if you already have X% post-DR dodge (i.e., as read off of your character sheet), then adding another 1% pre-DR dodge will give you Y% post-DR dodge, where X and Y are the values on the plot.

The dotted lines are guides to help us see how to “balance” dodge and parry. You’re probably familiar with the Cataclysm rule of thumb, which is “keep dodge and parry rating approximately equal.” But with different diminishing returns curves, keeping them equal isn’t optimal anymore, because dodge will be much more severely diminished. As a result, adding 10 parry rating would give us more net avoidance than 10 dodge rating.

That’s what the dotted lines tell us: “how much parry do we want to have at 10%, 15%, and 20% dodge to keep dodge and parry balanced?” Again, “balanced” means that adding 10 parry rating gives us the same amount of post-DR avoidance as adding 10 dodge rating. Note that I’ve already included base dodge and parry in this plot, so that’s accounted for.

This plot tells us exactly how bad the discrepancy between dodge and parry is. If we have 10% total dodge on our character sheet, we’d want to stack up to 21% parry to make sure that we’re not being inefficient with our diminishing returns. And it gets worse as we go higher – at 15% total dodge, we’d want 39% parry, and at 20% dodge we’d want 57% parry. The ideal ratio of parry:dodge gets larger as we stack more dodge (though to be fair, this is only because of base dodge and parry – the ideal ratio of pre-DR parry and dodge is a constant).

We can express this mathematically as follows. The differential gain in post-DR dodge and parry $dA_d$ and $dA_p$ due to a small amount of pre-DR dodge and parry $da_d$ and $da_p$ are:

$dA_d = \frac{1}{k} \left (1-\frac{\rm postDodge}{C_d} \right)^2 da_d\large$
$dA_p = \frac{1}{k} \left (1-\frac{\rm postParry}{C_p} \right)^2 da_p\large$

where ${\rm postDodge}$ and ${\rm postParry}$ are the post-DR dodge and parry values gained purely from sources subject to diminishing returns (i.e., subtracting out base dodge and base parry). I have also called these “${\rm netParry}$” in the previous posts, and I’m being sloppy here for the moment and rolling the parry granted by ${\rm baseStr}$ into ${\rm baseParry}$. If we set $dA_d = dA_p$ and $da_d = da_p$, we can solve for ${\rm postParry}$ in terms of ${\rm postDodge}$:

${\rm postParry} = \left ( \frac{C_p}{C_d}\right ) {\rm postDodge}\large$

If we want to compare total parry $( {\rm totalParry = baseParry+postParry})$ to total dodge $( {\rm totalDodge = baseDodge + postDodge})$, we get:

${\rm totalParry} = {\rm baseParry} + \frac{C_p}{C_d} \left ( {\rm totalDodge}-{\rm baseDodge} \right )\large$

which we could plot if we wanted to know exactly how much parry we should aim for at a given dodge level. If you’re interested, here is that plot.

We can also consider the ideal parry-to-dodge ratio, $R_{\rm pd} = {\rm totalParry}/{\rm totalDodge}$. That’s simply:

$R_{\rm pd} = \frac{\rm totalParry}{\rm totalDodge} = \frac{C_p}{C_d} – \frac{(C_p/C_d){\rm baseDodge}-{\rm baseParry}}{\rm totalDodge}\large$

which looks like this when plotted:

As you can see, the ideal parry-to-dodge ratio quickly jumps up to 2:1 and then slowly increases to 3:1 and higher as you stack more dodge. It saturates at $C_p/C_d = 3.588.$ This is going to make balancing slightly annoying, since we’ll have to keep referring to the above equation (or using a spreadsheet or a tool like askMrRobot) when our gear changes.

It’s worth noting that there’s an easy solution to this, if Blizzard wanted to implement it. If strength granted parry rating rather than invisibly giving pre-DR parry percentage we’d have it pretty easy. In that situation, all we’d have to do is make sure that the ratio of our parry rating to dodge rating was 3.588, regardless of what our post-DR values are. That’s all the equation is doing, in fact; it’s complexity is purely due to accounting for the invisible parry granted by strength that isn’t showing up in the tooltip.

In summary, we’re going to value parry a lot more than dodge at level 90. Expect to have 2x-3x as much parry as dodge under normal conditions.

I said this in the last post, but it bears repeating: while I have only tested this with a paladin, it’s a reasonable assumption that these formulas will work for warriors and DKs. Since druids can’t parry, their DR formula is likely to have a different (i.e. much higher) value of $C_d$, otherwise they’ll be severely disadvantaged compared to tanks that can parry. I wouldn’t be surprised if their value of $C_d$ was the same as our value of $C_p$, in fact, but that’s just wild conjecture at this point. If there are any druids in the audience that want to submit some data to me (naked agi/dodge as well as agi/dodge rating/pre-DR dodge/post-DR dodge in various gear sets), I’ll be happy to perform the fitting and figure out what your $k$ and $C_d$ value are.

It’s less clear whether Monks will use the same constants as the plate tanks. My guess is no, simply because while they can parry, they won’t be getting much parry rating if they share gear with druids. A small amount from rings, amulets, cloaks, and trinkets, perhaps, but probably not enough to make a huge impact. Most of their avoidance will probably come from dodge, and as a result I’d expect their value of $C_d$ to be a little higher. In fact, it wouldn’t surprise me at all if they were just swapped for monks, such that their dodge cap was around 235% and their parry cap was around 65%. But again, that’s wild speculation. And again, if any monks want to submit the appropriate data sets, I’ll be happy to do the rest of the work.

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

### 58 Responses to Avoidance Diminishing Returns in MoP – Part 3

1. Kitmajere says:

Hey Theck,
First of all, thank you very much for the workup. I’m interested in the info for monks — what data do you need to figure these things out? I’m sorry if you stated this elsewhere.
Thanks!

• Theck says:

Well, I assume that monks do not get parry from strength, but do get dodge from agi. So what I’d need is the following:
Level 85 monk – naked stats (base agi, dodge, parry), then agi/dodge/parry (both pre-DR from the tooltip and post-DR from the character sheet) values as you add gear one piece at a time, ideally maxing out your dodge/parry rating through gems and reforging at the end. This can all be done with a premade (provided you can make an 85 monk premade, I guess)
Leve 90 monk – repeat the process (naked stats, then adding gear one at a time).

• disargeria says:

I’ve got a monk data set for you! Where can I send it?

• Theck says:

theckhd at gmail dot com

2. Timothy says:

Might I correct something, Paladins have a 3% base Dodge, 3% base Parry, and 3% base block

3. Hinalover says:

Hina from Rawr. First of all, thanks for the calcs. I’ve been doing tests for both Rawr as well and The Inconspicuous Bear forums. A few notes
a) Last patch lowered the amount of dodge and parry required for 1% dodge/Parry from 1035 to 885 rating to reach 1%
b) Using Whitetooth’s old LibStatLogic-1.2 (slightly modified) mod, Druids need ~1171.401122093733 Agility for 1% dodge at level 90. It’s the closest number I can get for them.

4. Taser says:

From your formula it seems that you think that parry from base strength is not being affected by the DR. I am not 100% sure of that. But the deviations are really small, just wanted to know.

It seems that the data you calculated with was taken after the change to the ratings, but you were calculating with the old ratings (1035 instead of 885). Don’t know if this might cause problems with the results of you calculations.

• Theck says:

Traditionally, parry from base strength hasn’t been affected by DR (nor was agility from base Dodge back when we received it). The fitting also seemed to confirm this – while I only posted the final results, I spent several hours playing with different forms of the equation. None of the ones that included base STR in the DR component fit perfectly (i.e. R^2=1 was not achievable).

The data was taken before the change to ratings (I’ve been sitting on this data for a week or two now) – dividing rating by pre-DR values gave exactly 1035. I didn’t provide them because it doesn’t make any difference in the calculation. All that matters is the pre-DR dodge and parry percentages, which can be read directly from the tooltip.

5. Sinnaabun says:

Theck….you still play?

<3 sinnaa from old school WOLK BR Alliance (now sinnaabun of Accession on Stormreaver horde)

• Theck says:

Of course I do! I wouldn’t have much to blog about otherwise!

6. Demo says:

@the base dodge being 5.01

It seems agility still gives a minute chance to dodge for plate tanks. (at level 86, throwing on a random helmet with a 40 agi gem it in pushes it to 5.02)

I highly doubt this will effect DRs at all and I know for a fact we aren’t about to go back to using agility weapons, but I figure it should be noted somewhere

• Theck says:

Indeed, you are correct. A little bit of testing reveals that we’re getting an agi->dodge conversion at the rate of 1% dodge every ~10k agility. Not enough to make an impact on our gearing, but interesting nonetheless.

7. Sinnaabun says:

Gay….i turned on notify me when reply but didn’t get an email….your blog sucks because it doesnt notify me!

• Theck says:

I think it’s the blog’s way of telling you you’re a noob.

(Seriously though, did you put the e-mail address in right? I’ve never used the notify feature, so I’m not sure if it works. I’ll turn on notify for this post to try it out).

• Theck says:

Testing

8. Pingback: Patch 5.0.4 Round-Up | Sacred Duty

9. Jamison says:

For warriors best I can tell

k = 0.959
Q = 243

• Theck says:

Yes, in one of the more recent beta builds, the warrior equations were changed. Your $k$ is the cataclysm value $(k=0.956)$ for both dodge and parry. The dodge cap and parry cap have changed for you as well, $C_p = 238$ and $C_d = 91.5$. Also, $Q=243.6$ for both paladins and warriors.

• Jamison says:

PERFECT! That explains the deviation I was getting with higher values!

• Theck says:
10. Kaluun says:

Ok, haven’t looked through these yet, but I’m both a protection warrior and a mathematician so this looks perfect for me.

11. Rodchester says:

Theck,
I have a question regarding dodge/parry values. According to these charts parry is going to be more valuable than dodge because of the harsh diminishing returns. However in the 5.0.4 Round Up, you said that parry and dodge should be equal. As of right now I have about a 2:1 ratio of parry to dodge and I would like to know if this is incorrect or not.

Also this question is for current level 85.

Thank you -Rodchester

• Theck says:

I didn’t say they were equal. I gave an equation to use to balance them – the exact same equation that shows up in this post. That equation will tell you to expect to have about 2-3x as much parry as dodge. Your dodge and parry *rating* will probably be similar, but the extra parry we get from Strength disrupts the balance.

Agility increases dodge. Following the same diminishing returns formula for parry, but now using agility rather than strength, i get:

– baseDodgeChance = 5%
– dodgeCap = 66.5522133402405
– k=0.885970968828508
– Qd=10025.4295440002

dodgeChance =
baseDodgeChance +
baseAgility/Qdodge +
( 1/dodgeCap + k / (bonusAgility/Qd + preDodge) )^-1

Level 85 human paladin. All regressions done with full 15 significant figures returned by GetDodgeChange(), GetCombatRatingBonus(CR_DODGE), giving R2=0.9999588727384.

i’ll be adding the formulas to LibStatLogic tonight. Thank you so much for the parry formulas. i never considered the possiblity that “base strength” and “bonus strength” could be treated differently. Once i found your insight there, everything fell into place.

Oops. i meant R^2 = 0.9999999852786

• Theck says:

Yup, I’ve known about the Agi->dodge conversion for a few months now. Though I think that it’s more likely that dodgeCap=65.631440 (the cataclysm value). See what your regression gives you for k if you fix the dodge cap at that value – I suspect that k will come out closer to 0.885 (as in, it’ll round to that at 3 significant digits).

• Theck says:

Also, is there any way you can share your data set? I’d like to play with the fitting in MATLAB a bit.

i wrote added an addition to an addon that i maintain that records every combination of level, class, race, attributes, ratings, combat bonuses, effects that i see. i dig it out of the saved variables as a CSV. Google Docs spreadsheet version: https://docs.google.com/spreadsheet/ccc?key=0ApdRKcW8Z5eTdEZCYU03Z1hRWkRRSVJUdHdzTWx5YVE

god i wish i could edit my posts. The typo’s make me look bad.

• Theck says:

Now that’s what I call a data set! Thanks, I’ll take a look at that and see if I can narrow the range of viable values for our constants.

• Theck says:

Pauladin, I need to commend you on that data set. With your data, I’ve been able to nail down our DR coefficients much more precisely than before. I’ll probably put together a blog post with the updated data in the next few days (giving you credit for the amazing data that let me do it, of course!).
preview here:

• Theck says:

Also, one note: your addon seems to have two errant data points for mastery/block. They’re both exactly 10% lower than they should be, suggesting that the paladin it was scanning wasn’t in prot spec. It was easy enough to exclude those data points from the fit, but I figured you may want to know in case you decide to adjust the addon to check spec.

13. Haziel says:

Hi, great work as usual, I’m helping an author on addon, because I love the addon, but he didn’t played lately, so we are trying to give more “accurate” data, since CTC is dead.

Is the math bellow “correct” to find the “most accurate” Chance to BE HIT ?
I look there and I get a feeling something is missing or incorrect?

local level = UnitLevel(“player”)
local blockVal = GetBlockChance()
local parryVal = GetParryChance()
local dodgeVal = GetDodgeChance()
local missVal = 3

for i = 0, 3 do
local block = max(blockVal – 1.5 * i, 0)
local parry = max(parryVal – 1.5 * i, 0)
local dodge = max(dodgeVal – 1.5 * i, 0)

— Will be 0 for levels +2/3
local miss = max(missVal – 1.5 * i, 0)
— Non-avoided attacks (overall hit + block)
local hitChance = max(100.0-parry-dodge-miss, 0)
— Chance to block over all attacks
— (displayed block % is chance to block over attacks that are not avoided)
local calcBlock = min(hitChance*block/100, hitChance)
— Chance to be hit over all attacks (100%-avoidance-converted block)
local calcHit = hitChance-calcBlock
— Mob Level
local level = level+i;
end

14. Theck says:

I think so. You lose 1.5% miss, dodge, parry, and block for each level the attacker has on you, so your equations for block, parry, dodge, and miss are correct.

hitChance should be (100-parry-dodge-miss), so that’s correct.

calcBlock will be block*(hitChance/100). The min bounds it at hitChance, which is correct too.

calcHit should just be (100-avoid)*(100-block)/100. In your notation, 100-avoid is hitChance, so it would be hitChance*(100-block)/100, which when multiplied out gives hitChance-calcBlock.

15. Haziel says:

So, more accurated would be:

local blockVal = GetBlockChance()
local parryVal = GetParryChance()
local dodgeVal = GetDodgeChance()
local missVal = 3

for i = 0, 3 do
local block = max(blockVal – 1.5 * i, 0)
local parry = max(parryVal – 1.5 * i, 0)
local dodge = max(dodgeVal – 1.5 * i, 0)

local miss = max(missVal – 1.5 * i, 0)
local hitChance = max(100.0-parry-dodge-miss, 0)
— local calcBlock = min(hitChance*block/100, hitChance)
local calcBlock = min(hitChance*(100-block)/100, hitChance)
local calcHit = hitChance-calcBlock
end

Did I interpreted correctly your correction? I think I’m lost somewhere, sorry about that, I’m pretty sure I misinterpreted something cos, let’s take this real stats from an Alt Pala I have:

D: 11,22 P: 25,52 B: 39,65 and with these on mob level 88 I have 25,40% likely to be hit
D: 11,22 P: 25,52 B: 35,73 (removed BoM) and with these on mob level 88 I have 22,56% likely to be hit? This can’t be right I’m sure I took wrong turn somewhere, with more block I have more chances to be hit ? And those values seems way too low.

Now with old formula hitChance and same stats:
D: 11,22 P: 25,52 B: 35,73 (removed BoM) and with these on mob level 88 I have 49,59% likely to be hit?
D: 11,22 P: 25,52 B: 39,65 and with these on mob level 88 I have 46,56% likely to be hit ?
Beside those values seems more real, I get an increased chance on NOT to be hit/full hit.

Re-Read it again your post, I think now I’ve interpreted correctly (well 4am here :), but I left previous so you might understand the mess inside my follow-up:

local blockVal = GetBlockChance()
local parryVal = GetParryChance()
local dodgeVal = GetDodgeChance()
local missVal = 3

for i = 0, 3 do
local block = max(blockVal – 1.5 * i, 0)
local parry = max(parryVal – 1.5 * i, 0)
local dodge = max(dodgeVal – 1.5 * i, 0)

local miss = max(missVal – 1.5 * i, 0)
local hitChance = max(100.0-parry-dodge-miss, 0)
— local calcBlock = min(hitChance*block/100, hitChance)
— local calcBlock = min(hitChance*(100-block)/100, hitChance)
local calcBlock = min(block*(hitChance/100), hitChance)
local calcHit = hitChance-calcBlock
end

Now with this 2nd fix, seems more consistent along with old formula and still more real when I made 1st fix, maybe a lil more steeper (when comparing to old formula) not much:

D: 11,22 P: 25,52 B: 35,73 (removed BoM) and with these on mob level 88 I have 49,69% likely to be hit?
D: 11,22 P: 25,52 B: 39,65 and with these on mob level 88 I have 46,85% likely to be hit ?

Regarding the other formulas, this macro I joined several formulas to keep all-in-one, seems sweet to use in-game and on-the-fly:

/run local d,b,c=GetDodgeChance(),235.5/65.631440,(235.5/65.631440)*5.01-3.76 local p=GetParryChance() print(format(“nIdeal parry for %.2f%% dodge: %.2f%%nIdeal parry/dodge ratio: %.2fnTotal Avoidance: %.2f%%nn”,d,b*d-c,b-c/d,5+c+p))

Thanks for all your help and your awesome work on Tank community, even Blizzard recognized that on FL raid 😉

• Theck says:

Sorry for the confusion, I wasn’t making any corrections in my response. All of the equations I posted match exactly what you had the first time around. Your 2nd fix just reverted you back to the original (correct) equations. Note that hitChance*block/100 is the same thing as block*(hitChance/100).

• Haziel says:

Ok Thanks for all your help, much appreciated Theck
Yes, you’re right, never read posts at 4 am, specially after a long very hard day at work 😀

PS – BTW the addon is Ardent Defender, that I’m helping his author, since he only have beta access 😉

16. Tuux says:

Hello,
Really nice blog.
Could you tell me if Cd Cp Q and k are influenced by the class ?
I’m writing a French Blood DK guide, and I’d really like to enter in contact with you.
Add me on Skype if you have 5 minutes, I’ve 1/2 questions about Parry DR :/
tuux.unnamed

• Theck says:

Cd, Cp, k, and Q can all be class-specific. Unfortunately, I don’t know what the values are for DKs. If I had to guess, Cp and Q are probably the same as for warriors and paladins. But k and Cd are different for warriors and paladins, so I can’t make an educated guess at those w/o looking at some data.

17. Kyle says:

Your mathematics make me hot. Who knew all those semesters of calculus and physics would come in use. Truly a great lab report here! Nice work 😀

• Vincent says:

Someone is having a raging brainer ; )