TUF
Is there anything tougher than an acronym that sounds exactly like the word “tough”? There is: a made-up word written in all caps that actually isn’t an acronym at all and also sounds exactly like “tough”. TUF.
TUF is a new take on the “NPS” tanking metric that we used in Legion.
In a sentence: “TUF” measures how good you are at staying alive and negating incoming damage.
In a shorter sentence: “TUF” measures how tough you are.
Motivation
The goal of TUF is to create a metric that is easy to understand and meaningfully quantifies the value of disparate sources of toughness. A secondary goal is to create a metric that can be used to generate reports that clearly show how much all of your different actions are contributing to your toughness relative to each other — data that has been sorely missing for tanks since… forever.
How to Interpret TUF
TUF is a number from 0 to 100%. If you are 100% TUF, that means you never die, and you negate all incoming damage with only the help of background HoTs or splash healing — your healers don’t need to give you any direct attention or spend any significant amount of time casting on you.
0% TUF is almost impossible to reach… even with really bad gear and sub-optimal ability use, your Armor and active mitigation abilities will still negate a significant amount of damage.
You don’t need to reach 100% TUF to be a good tank — that’s overkill. You want it to be high though: 80% or higher means that you will feel very safe on a fight. If your TUF is 50% or lower, you are going to have a very hard time on a fight, or your healers will have to work overtime to keep you alive. In between (60-75% or so) is where a fight will feel challenging, but doable — think a progression boss.
How is it calculated?
First, we calculate your chance to live through any given fight without dying. This is pretty easy with our simulator — just keep track of whether you die or not! The AMR simulator is the only tanking tool created thus far that can actually calculate a meaningful chance to die — more on this in the simulator section below.
Second, we calculate the percent of raw incoming damage that you negate. There are many ways to negate damage: reduce it via armor or versatility, avoid it, absorb it, or heal it back up. A few sources of negation need some extra explanation.
Self Healing
We only consider effective healing — all overhealing is ignored. In addition, we subtract any overhealing that you cause your tank healers to do. This only applies to direct heals that the tank healers have decided to cast on you because your health dropped down for a long enough period of time for them to see it.
To be clear — any overhealing from HoTs on you or splashes from other kinds of “background” healing like AoE heals, smart heals, etc. is never subtracted.
The healer overheal adjustment turns out to be extremely minor, but it is useful to ensure that poorly timed heals don’t seem to give more value than they actually are. If you consistently heal yourself just as or after your tank healer decides to start casting on you and thus cause your healer to waste heals, your self-heals have very little value. The opposite is true as well: if you consistently decide to heal just as or after your tank healers heal you, you will tend to overheal. We don’t want total negation to see these situations as fundamentally different — both represent situations where you are healing in a sub-optimal way.
Stagger
Brewmaster’s Stagger deserves some special mention. We handle this in a very straightforward manner: self-damage is treated as negative negation. Thus if you never purified any of your stagger, you would gain exactly zero negation. The fact that spread-out damage is far less threatening than spike damage is handled by tracking your actual chance to live.
Max Health
Increasing your maximum health does nothing to negate damage. Max health’s main benefit is increasing your chance to live, which we account for directly. There are some indirect benefits such as making some abilities or heals larger, but those will all be accounted for by the impacted abilities. Though we don’t have a direct adjustment for max health, don’t be fooled — it is the single most important stat for all tank specs (along with armor). Chance to live is highly dependent on it.
Background Heals
Mentioned in the self-healing section, “background” heals are what we consider heals you will always get, regardless of how tough you are. For example, smart heals or AoE heals in your vicinity can’t be “turned off” — you will always get them. In any realistic tanking situation, you will always have some kind of HoT on you, a beacon, etc., even in the least demanding situations.
We include all background healing in your negation. We do this for a simple reason: so that “snarfing” background heals doesn’t translate to a score increase. While it is true that if you don’t even need a HoT or any smart heals you are certainly tougher than if you do… that is a distinction that doesn’t matter. Healers want to play the game too! You would have to actively yell at them to stop using a “background” level of healing on you.
Anything you do to snag all of that background healing for yourself is counterproductive. You would be much better served by learning how to take advantage of it.
Final Calculation
Now we have two numbers between 0 and 1 (or 0 and 100%, but we use the decimal form internally): chance to live, and percent of raw damage negated. We give those equal weight and combine them, with a small adjustment for edge cases: it is extremely rare to have below 50% negation. You more or less have to take off all your gear to get that low. So negation below 50% is only given 5% of the total score (so that if you are testing edge cases we can distinguish between them, and so that changes in negation within reasonable ranges have a bigger impact on score), and the remaining 95% of total score is split equally between negation from 50-100% and chance to live from 0-100%.
As an example, say you have 85% negation and 95% chance to live (pretty realistic numbers if you are appropriately geared for a fight).
Your “low” negation (below 50%) would be 1.
Your “high” negation (above 50%) would be (0.85 – 0.5) / 0.5 = 0.7.
Your chance to live would be 0.95.
Total = (1 * 0.05) + (0.7 * 0.475) + (0.95 * 0.475) = 0.83375
TUF = 0.83375 * 100 = 83.375%
Chance to Live is King
It is worth reiterating this because the calculation above might not make it obvious for everyone: your chance to live dominates your final TUF score. It is the single most important thing for a tank, and thus it was important to us that TUF track very closely to your chance to live. The negation component’s main purpose is to distinguish between setups with similar chance to live: when given a choice, go with the setup where you negate more of the damage yourself rather than having to rely on a healer’s direct attention.
It is very rare that you would have a setup with very low chance to live and very high negation. Though they don’t track perfectly with each other (which is why we don’t just use negation directly, it doesn’t work out very well), they are definitely correlated to a large degree. Because of this general correlation, you shouldn’t see any wacky high TUF scores with low chance to live.
Simulator Details
It is worth noting a few details about how the AMR tank simulator works because it will have a huge impact on TUF.
Incoming Damage
Incoming damage is scripted using a boss script mechanism based on real abilities used by real bosses. Most tank damage is very regular in boss fights, and it can be scripted with a pretty high degree of accuracy. We both replicate specific boss fights for testing, and create theoretical fights based on common damage patterns you might experience in e.g. Mythic+.
An important simulator setting is NPC Damage Multiplier, which allows you to scale damage up and down. This is particularly useful for Mythic+ which has this idea built right into the game, but also for any boss script — you can scale it up or down to relevant damage levels for your character.
Incoming Heals
We simulate heals coming in on the tank from external healers using a set of rules that realistically approximate healer behavior. We consider a 20-man raiding scenario with 4 healers for some scripts, and a 5-man scenario with one healer for others.
These rules are 100% customizable, and use the same engine as our healer simulations. They can do all sorts of things like only heal the tank if below X% health, only use certain heals during certain phases of the fight, assign different responsibilities to different healers, and so on.
The healers’ general power can be scaled as well via the Ally Item Level option.
We are always adjusting and improving these rules, but the overall goal remains the same: they should be realistic without being overly aggressive. We intentionally prefer to let the tanks try and work to save themselves rather than having the healers go into full panic mode to save you. This is why your death chance on a particular script might seem higher than you would expect: in a real raid setting, your healers will compensate to save you. But if you set up your healers to do that in the simulation, it will tend to hide the tank’s deficiencies and make it harder to discover what matters and what does not.
Rotations
Tank rotations have all the flexibility available to DPS rotations, and a set of tank-specific functions that allow rotations to respond to predictable “big damage” events. For example a good tank will time up active mitigation and cooldowns with specific boss abilities. Our simulator allows you to make these kinds of decisions with relative ease, resulting in very realistic and efficient ability usage.
The AMR simulator also has very advanced off-GCD rotation checking, allowing smart and efficient cooldown usage in parallel with the main GCD-locked rotation.
Death
When you die in the simulation, you stay dead for 3 seconds and then get resurrected to 60% of your maximum health, like most battle resurrection spells. Ending the simulation on death and starting again results in far too much volatility — it would take forever to get meaningful results from the simulator. This approach works well in most realistic cases where chance to die is very low. By staying dead for a few seconds and getting resurrected to a reasonable level of health, we prevent most of the bad things that death can do to a simulator: triggering “below X% health” effects too much or not at all, dying repeatedly and using instant resurrection as a great way to get infinite heals, really bizarre results due to health going negative, etc.
Reporting
A major goal of the TUF metric is to produce a report that shows a meaningful breakdown of how much each source of negation is contributing to keeping you alive. The by-spell breakdown that you see on the simulation result report is total negation contributed by each ability. A few decisions had to be made about how to divide up the value between simultaneously active sources of negation — this has no impact on the final total value (and thus no impact on any gearing strategies or conclusions drawn from the metric value itself). It simply changes the by-spell breakdown, and thus might impact how you think about the relative worth of certain abilities when viewing the report.
How the Combat Log Works
The in-game combat log or what you might see on a combat logging website may not report the breakdown by ability the same as AMR. There are a lot of reasons for this: whether the game is categorizing something as an absorb or a damage reduction, the order it decides to apply them, and so on.
Ultimately, all we care about is the final damage that an attack will do to you. As long as we are calculating that the exact same way that the game is calculating it, we are free to report it in whatever way is most useful for analysis.
We chose a reporting technique that gives a truly unbiased breakdown of how much negation each action you take is contributing relative to each other.
Say a boss melee attack hits you for 100k raw damage. You have 50% damage reduction from armor, you block 40% of the damage, and your Versatility adds another 15% damage reduction. Your final damage taken is calculated by multiplying all these reductions together:
100k * 0.5 * 0.6 * 0.85 = 25.5k
We first figure out the total damage prevented: in this case 100k – 25.5k = 74.5k. Then, we split that proportionally between all active damage reductions. In this case we have 0.5, 0.4, and 0.15. Just total those up to 1.05, and split it:
74.5k * (0.5 / 1.05) = 35.48k to armor
74.5k * (0.4 / 1.05) = 28.38k to block
74.5k * (0.15 / 1.05) = 10.64k to versatility
That gives a “fair” breakdown of the true power of each ability. But there’s one more piece…
Avoidance
Parry, Dodge, and Block require some further special handling to give each a fair share. Let’s create a new example and say that we have Armor that reduces damage by 50%, and 50% chance to dodge. And let’s say that we take 10 hits for 100k damage each. It’s pretty straightforward to figure out the final damage that we will take: every hit will land for only 50k, and only half (5) of those will connect at all, for 5 * 50k = 250k total damage, or 750k total damage prevented.
So how should that 750k damage be split? For Dodge (and Parry): a 50% chance to Dodge essentially acts like a 50% damage reduction, so both the Armor and Dodge in this scenario are of equal value. 375k goes to each. The way this is calculated on a per-attack basis is similar to our first example, we add your dodge chance to the list of sources of damage reduction on each attack that can be dodged, whether you dodge it or not:
Total reductions: 0.5 (armor) + 0.5 (dodge) = 1
Dodged Attack:
100k hit, does 0 damage because dodged it: 100k total damage prevented
100k * (0.5 / 1) = 50k to armor
100k * (0.5 / 1) = 50k to dodge
Not-Dodged Attack:
100k hit, does 50k damage after armor, didn’t dodge it: 50k total damage prevented
50k * (0.5 / 1) = 25k to armor
50k * (0.5 / 1) = 25k to dodge
This gives us the 50/50 split between Armor and Dodge that makes sense for this scenario.
Going back to our first example with Block, we need to apply this same principle to blocking, which essentially acts like a “partial dodge”. Every hit that can be blocked, we add the current block chance * block amount (* 1 + crit block chance for warriors) to the list of things that the final prevented damage is split between, whether we block it or not. This might seem a little “weird”, but doing it any other way will short-change block. Here is another simplified example to demonstrate:
Say you take 10 hits for 100k raw damage each.
Scenario 1:
Armor: 50% DR
Total damage prevented: 10 * 50k = 500k (prevent half the damage on all hits)
Scenario 2:
Block: 50% chance to block 50% damage
Total damage prevented: 5 * 50k = 250k (block half the damage on half the hits)
Scenario 3:
Armor: 50% DR
Block: 50% chance to block 50% damage
- 5 hits land for 100k * 0.5 = 50k, 50k prevented per hit
- 5 hits land for 100k * 0.5 * 0.5 = 25k, 75k prevented per hit
- Total damage prevented: 5 * 50k + 5 * 75k = 625k
We can use these 3 simplified scenarios to eyeball the relationship between these two sources of damage, then verify that our math will give the expected result. The Armor is twice as good as the Block, which makes sense: the Block only happens half as often for the same amount. The block is essentially acting like a 0.25 damage reduction, since it only happens half the time, or 0.5 * 0.5.
When the two are combined, the final damage taken acts like you multiplied a 0.5 and 0.25 damage reduction together: 0.5 * 0.75 = 0.375 multiplier on damage taken.
So on our final report for this case, we want to see Armor as worth 2x Block. To get this result, we need to use the method described for Avoidance: on every single hit that can be blocked, whether it is blocked or not, add in block chance * block amount when portioning out the total damage prevented.
Total reductions: 0.5 (armor) + 0.5 * 0.5 (bock) = 0.75
Blocked Attack:
100k hit, does 25k damage after 0.5 * 0.5 reduction, 75k total damage prevented
75k * (0.5 / 0.75) = 50k to armor
75k * ((0.5 * 0.5) / 0.75) = 25k to block
Not-Blocked Attack:
100k hit, does 50k damage after armor, didn’t block it: 50k total damage prevented
50k * (0.5 / 0.75) = 33.3k to armor
50k * ((0.5 * 0.5) / 0.75) = 16.65k to block
This gives us the 2 to 1 split between Armor and Block that we desire.
Summary
The tanking community has had plenty of good theorycrafters over the years, but has lacked a comprehensive tool akin to a DPS simulator. Mainly this is because it’s a lot harder to simulate a tanking situation than a DPS situation. With TUF and the AMR simulator, we finally have a “complete” tool for evaluating tanks. The TUF metric works very well for generating gearing strategies and useful reports about various sources of negation. The AMR simulator allows scripting realistic incoming damage and has realistic incoming healing. Rotations can be written that respond intelligently to predictable boss attacks. And most importantly, the AMR simulator can calculate a realistic chance to live on any given fight, thus doing away with a lot of guesswork about tank gearing. We encourage you to try it out, customize it, and give us your feedback.
Appendix: Other Metrics
There are several other metrics that have been used for tanking. Here we compare them to TUF.
DTPS
Damage taken per second is the simplest measure for a tank, and often seen in logs. It is of limited use though. Some tank specs just take more damage and rely on self-healing. Its main use is as a relative measure when comparing two players of the same spec. If one player is able to take less damage, it might be interesting to figure out why. But it’s still only sort of interesting… maybe one guy takes more total damage but dies less because his timing is better, or he heals himself back up between hits better.
HRPS
Healing required per second is a metric that we showed on our logs in WoD, and has been used in various forms elsewhere. It measures how much external healing people had to do to keep you alive. This is better than DTPS in many cases because it doesn’t ignore self-healing. It can be interesting to know how much work it takes your healing team to keep you alive. It has one major limitation though (which is also a limitation of DTPS): it can’t value max health increases. If you have a huge health pool but require more healing, you might actually be a lot tougher (die less), but that won’t be reflected at all.
TMI
The “Theck-Meloree Index” was created by a couple good theorycrafters a few years ago, full details here: http://www.sacredduty.net/theck-meloree-index-standard-reference-document
The short version is this: it keeps a 6-second moving average of the damage that you take minus the healing and absorption that you do to yourself. This is normalized to your max health at any given moment. Then some fancy math is done to the results that spit out a lower number if that total in any 6-second window is less than your max health and happens infrequently. It spits out a higher number if you take more than your max health in any 6-second window and it happens frequently. In other words: smaller and less frequent spikes in damage is the best scenario, lower is better.
TMI is a great concept and caught on in the community, to a degree. We calculate it in the AMR simulator and show it on batch report output. Though it is interesting, it is largely unnecessary if you can calculate a realistic chance to die — that is ultimately what TMI is trying to measure. The more complete model in the AMR simulator can measure your death chance directly, so there isn’t a need for this layer of indirection anymore. Also, as your chance to die approaches zero, TMI becomes less interesting. The spikes you are taking are no longer threatening, so trying to reduce healer burden through total negation is a more valuable toughness goal.
TUF
TUF attempts to address all of the weaknesses of these three older metrics. It factors in healing required (negation is essentially the “inverse” of healing required), thus handling the biggest limitation of DTPS. It factors in max health via measuring death chance, thus handling the biggest weakness of HREQ/S. It simulates real tanking situations with incoming heals, realistic damage patterns, and actual tank death. This removes the necessity for a layer of indirection on top of the simulation results which is TMI’s biggest weakness: complexity and extra assumptions.
So is TUF perfect? Nope! But it is a big step forward. Directly measuring death chance is a huge win for evaluating truly threatening tank scenarios and valuing things like max health. For non-threatening fights where your death chance is zero, total negation is the only thing that moves your score — a better goal if you want to pile on the toughness and bring one less healer to your raids.
The Blender
Halfway through Legion we added The Blender to our gear optimizer. For me as a tank, this was the last big missing piece that really rounds out TUF. It is a tool that allows you to intelligently transition from defensive-oriented gear to offensive-oriented gear as you get tougher. This is exactly what most tanks desire. For example, our default “Mostly Defense” blend will focus on things that increase TUF until you are surviving the fight reliably, then transition you to DPS-oriented gear as you start to out-gear your content, which generally happens as you farm a raid tier. It is able to handle the transition in a smooth and sensible way, comparing large DPS increases to small TUF gains. We also offer several options for people who prefer more a more DPS-oriented gearing approach.
Tank Simulations
Zoopercat explains the full details of the tank simulator in this series of blog posts. If you want to discuss TUF or anything about the tank simulator, please post on this thread.
- Part 1: Intro: Simulating tanks & the factors that need to be taken into account
- Part 2: Modeling boss fight mechanics, taking damage, and ‘rotations’
- Part 3: Modeling heals, metrics, and balancing survival with DPS