In my last post, I mentioned that I might go more in-depth on some Diablo III theorycraft topics. Here’s the first. I’ll review the math surrounding mitigation in Diablo III and discuss what I think is the most helpful way of keeping track of it for everyday purposes. I also made a simple tool for doing any of the computations discussed here for any stat values; it’s linked below but I’ll also put it here so it’s easy to find: D3-mitigation.

The Mitigation Formula

Armor in D3 reduces all incoming damage by a constant factor M:

M=frac{A}{A+CL}

Where A is your armor stat, L is your attacker’s level, and C is a constant equal to 50 in this game.

Every hit is then further reduced by the appropriate resist (physical or one of the 5 magical schools). The mitigation from resist follows the same formula as mitigation from armor, except that C is equal to 5 instead of 50 (which, as we’ll get into later, roughly makes a point of resist 10 times as effective as a point of armor).

Effective HP and the Armor and Resist Factors

A common way of thinking about the combined effect of HP and damage mitigation is concept of “effective HP”: how much raw damage (damage before mitigation applies, a number you never see onscreen) can I take before dying? The biggest advantage of the EHP concept is that it condenses all of your survivability into one index. The biggest disadvantage is that if you take it completely straight, it tends to undervalue mitigation, because mitigation has the added effect of increasing the utility of all healing done to you, while a bigger HP pool does not.

Even though following EHP fully is not a complete solution, I’m going to borrow heavily from one important concept: thinking of mitigation as scaling up the value of your HP and healing by some constant factor, rather than looking at the mitigation percentage. The reason is that the formula determining the mitigation percentage is hard to grok. A lot of players try to figure out the “diminishing returns” of armor and never really get anywhere. And even for those of us who understand it, it’s an unwieldy enough calculation that we don’t want to go through it mentally every time we look at a new piece of gear.

The way I think of armor is in terms of the “armor factor”: the ratio by which my armor mitigation amplifies the effectiveness of both my HP and any healing. If my mitigation is 50%, then my HP pool and any healing are worth twice what they look on paper–my armor factor is 2. If my mitigation is 66.6%, my armor factor is 3. In general:

F_A = frac{1}{1-M}

We’ll get more into why this is a useful way of thinking about things throughout the post. First is an important mathematical result.

Scaling

Above I’ve given the mitigation formula and the definition of the armor factor. The first thing we want to do is find the armor factor as a function of A. Combining the equations and eliminating M (see Appendix A) leads to a result that has long been familiar to anyone who has done any WoW theorycraft:

F_A = 1+frac{A}{CL}

The key here is that it increases linearly with A (each time A increases by an amount equal to CL, your armor factor increases by 1). Viewed this way, the marginal value of armor doesn’t “diminish” as it gets higher.

The mitigation from armor and resist on a given hit multiply together. So we can say that effective HP grows with both the armor factor and the resist factor:

H_E = H F_A F_R

where

F_A = 1+frac{A}{C_A L}
F_R = 1+frac{R}{C_R L}

Against level 60 enemies,

F_A = 1+frac{A}{3000}
F_R = 1+frac{R}{300}

This should help you visualize how your armor factor and resist factor expand your HP pool for survival purposes.  Each factor increases linearly with the corresponding stat (armor or resist). For armor, the magic number to keep in mind is 3000–every 3000 additional armor increases your armor factor by 1. 3000 armor doubles your HP pool, 6000 triples it, 9000 quadruples it, etc. For resists, use the same intuition, but with 300, 600, 900, etc. (Against level 63 mobs in Act3-4 Inferno, the magic numbers will be 3150 and 315).

Overall I find that thinking in terms of the armor and resist factors is a much more intuitive way of keeping track of my mitigation. An armor factor of 2 means that my HP and healing goes twice as far. And because each factor scales linearly with its corresponding stat, the effect of armor/resist increases is much easier to ballpark in my head than re-applying the mitigation formula constantly. When I see 300 armor (at level 60), I think “increases my armor factor by 0.1” Comparisons between armor, resist, and Vitality on gear become much quicker (more on this below).

Healing

Now it’s time to pause a bit to talk about the practical effect of mitigation. It has one major benefit aside from increasing your ability to absorb a large amount damage at once: it amplifies all healing. This matters increasingly as you obtain more regen and life leech and have to rely on other similar things to last through longer encounters. The important point here is that the outcome changes based on whether the healing effects are constant value or %-based. If you’re a Demon Hunter using Preparation to heal 60% of your HP each encounter, that will benefit equally from a larger HP pool or from more mitigation. But if you’re a Monk healing yourself, that heal is for a constant value, and will be markedly more valuable with higher mitigation (an interesting point here is the Monk heal and many other heals don’t scale with weapon damage like most D3 skills do–their effectiveness only scales with mitigation).

Everyone has a flat heal of at least 12,500 every encounter from their potion, and since common forms of self-healing from gear (+HP/sec, % leech, HP on hit, shield blocking) don’t scale with your health pool, increased mitigation improves your survivability by more than it appears from HP alone. If you ever desire to estimate this more exactly, then instead of using your plain HP pool for H in any computations, use your HP pool + an estimate of how much you can heal over the course of an encounter. For now we’ll continue to remind ourselves that healing matters by leaving in a fudge factor Q representing your healing intake for an encounter:

H_E = (H+Q) F_A F_R

Choosing Stats

At level 60, 1 Vitality gives 35 HP, 1 Str gives 1 armor, and 1 Int gives 0.1 to all resists (and in addition, straight +resist all is often found on gear).

Starting again with the basic EHP formula:

H_E = (H+Q) F_A F_R

After some basic calculus (see Appendix B):

1 HP gives F_A F_R  extra EHP

1 Vit gives 35 F_A F_R  extra EHP

1 armor or 1 Str gives frac{(H+Q) F_R}{3000} extra EHP

1 resist all gives frac{(H+Q) F_A}{300} extra EHP

1 Int gives frac{(H+Q) F_A}{3000} extra EHP

To convert armor and resist into Vit equivalents:

1 armor is worth frac{H+Q}{105000 F_A} Vit.

1 resist is worth frac{H+Q}{10500 F_R} Vit.

As always, adjust accordingly for mob levels other than 60.

Example and spreadsheet

Applying a real-world example, let’s say I have 30,000 HP, 3000 armor (as discussed above, 50% mitigation against a level 60), and 300 resist all (same). So the armor and resist factors are both 2, my effective HP is 120,000, and all heals expand my effective HP for 4 times their value.

Plugging into the above, 1 Vit gives 140 EHP, 1 armor/Str gives 20 (ignoring Q), 1 resist all gives 200 (again ignoring Q), and 1 Int gives 20.

Here’s a quick and dirty spreadsheet for doing the same computation for any values. I included dodge from Dexterity, which I didn’t discuss in the post. It doesn’t get into Block, which would necessitate analyzing average hit size against you: D3-mitigation

Conclusions

So comparing 1-for-1, resist all is by far the strongest survivability stat. In reality, you can’t find as much resist all on one item as you can find Vitality. But because large amounts of self-healing amplify the value of 1 resist all to a few times the value of 1 Vit, resist all winds up being very strong. Armor, comparatively, is often left behind.

A few other notes:

  • Single-element resists don’t have markedly higher values than corresponding +resist all items at the same level. So a spread of items covering individual resists is far less efficient than having +resist all in each slot. On a related note though, the ability to stack a single resist with resist all on the same item is why the Monk skill One With Everything is extremely strong–probably the best survivability talent in the game by far.
  • Armor from Str, Dodge from Dex, and resists from Int are all far weaker than HP from Vit and straight +resist all. Basically, secondary stats for your class (whichever of Str/Dex/Int are not your main stat) are not worth actively pursuing for their defensive value. What you generally want as the baseline for solid rares are your main stat (for DPS), Vit, and resist all.
  • Though I didn’t go into dodge in detail today, two things on it. First: 100 Dex gets you 10% dodge, 500 Dex gets you 20%, 1000 Dex gets you 30%, and every 1000 Dex beyond that is another 10%. The throwaway Dex on one item can get a non-Dex class up to 100, which isn’t bad. Second: dodge bonuses from all other sources multiply, rather than adding (i.e. two 10% dodge bonuses leave you with an 90%*90% = 81% chance to be hit, not 80%). So you can’t get increasing marginal effectiveness out of avoidance by stacking it higher.
  • %-based boosts to armor and resists, such as the Barbarian’s Tough as Nails, or the Wizard’s Energy Armor and Prismatic Armor, scale extremely well once your corresponding stat gets high. If my armor factor (as described above) is only 1.5, increasing your armor by 65% makes it 1.825, a 21.7% increase to your EHP and healing effectiveness. But if it’s 2, Energy Armor makes it 2.65, a 32.5% increase. If I have 3000 armor and 300 resist against a level 60, for 25% overall damage taken (armor factor and resist factor are both 2), Prismatic Armor reduces that to 15.7% damage taken, a rather dramatic increase in survivability.

Appendix A

M = frac{A}{A+CL}
1-M = frac{CL}{A+CL}
F_A = frac{1}{1-M}
F_A = frac{A+CL}{CL}
F_A = 1+frac{A}{CL}

Appendix B

H_E = (H+Q) F_A F_R
frac{partial H_E}{partial H} = F_A F_R
frac{partial H_E}{partial V} =frac{partial H_E}{partial H} frac{dH}{dV}= F_A F_Rcdot 35
frac{partial H_E}{partial A} =frac{partial H_E}{partial F_A} frac{d F_A}{d A} = (H+Q) F_R cdot frac{1}{3000}
frac{partial H_E}{partial R} =frac{partial H_E}{partial F_R} frac{d F_R}{d R} = (H+Q) F_A cdot frac{1}{300}
frac{partial H_E}{partial I} =frac{partial H_E}{partial R} frac{dR}{dI} = (H+Q) F_A cdot frac{1}{300}cdot frac{1}{10}