While battle simulations are more accurate for specific situations, TDO, which stands for "total damage output", can be a very useful way to rank pokemon and their attacks. TDO is equal to the amount of damage a pokemon can dish out before dying. The advantages of TDO include:

- It incorporates a Pokemon's offensive and defensive ability in one useful number
- It is just a formula, so it can be plugged into excel
- You don't need to specify the defender's moves or stats
- If two pokemon battle, the one with higher TDO will do better every time

*Actual* TDO requires battle simulations to calculate. But TDO is easy to approximate with just a formula. This approximation is what is seen on pokemon spreadsheets*. Not everyone uses the same approximations, and some formulas are better than others. We have spent some time to come up with a formula that incorporates energy gains from taking damage and other edge-effects.

The approximate formulas for TDO and tankiness itself are simple.

$$TDO_{prop} = DPS1 * HP * DEF$$ $$Tankiness_{prop} = HP * DEF$$DPS1 is your DPS against a target with 1 defense, and HP, DEF are the hit points, defense of your pokemon. But even though these formulas are short, the formula for DPS itself is a bit more complex. This is to take into account corrections for energy gains from damage and wasted energy gains from dying early. It is given in its full form at the very bottom of this page!

*Actually what is used is not TDO, but a formula which is *proportional to* TDO, meaning the TDO of each pokemon is off by some constant factor. This is good enough, because all that we need is each Pokemon's *relative* ranking to make moveset or counter decisions.

The spreadsheet has every pokemon so it is too big for this page. It lists all combinations of moves, including legacy moves.

Survival time was based on t5 raid bosses.- It only considers the attacker, not the matchup. Some pokemon are useful because of their typing, and while it accounts for STAB (same type attack bonus) it doesn't account for type advantages. It can be made to account for a matchup by adding type multipliers to the damage formula.
- Discontinuities: TDO calculates as if there were a steady stream of damage & energy going between attacker and defender. This is accurate for long battles & still pretty good for shorter battles but not as accurate as simulation results. Some edge effects (leftover energy)

are accounted for but everything is at least somewhat approximate. - nTotalCMovesSimple is approximate and may vary a lot from battle to battle. Choosing a specific number for it introduces a bias.
- It doesn't account for lag. This could be done pretty easily by adding a little time to move durations. But since fmoves are buffered anyway, it should be a decent approximation.

Tankiness has some flaws too. Doing lots of damage actually should decrease your survival time because the enemy gains more energy. This is not accounted for in just DEF * HP, but for gym defenders it won't make a big difference.

In a world of simulations, what is the use of TDO anymore? A few things. Simulations are good at looking at very specific matchups, but it is very hard to average simulations in an accurate way that gets an overall metric of a pokemon as each battle introduces different biases. This makes approximate TDO and DPS an attractive, yet approximate, overall metric.

To add, there are some details of battle mechanics which still need to be worked out, like:

- Does the defender choose their next move at the beginning of the 2 second pause between attacks? If so, it can't use the 2s of energy it gained. This significantly reduces the number of charge moves that go off.
- Does the defender only use up cmove energy after the move finishes? If so,

it probably has a lot of overkill energy loss during the move itself, especially for full-bar cmoves.

Another advantage of TDO is ease of use. You just plug and chug... no programming. Use it on excel sheets etc to get quick results without investing a lot of time and effort on tons of simulations.

Then multiply by HP_A * HP_B on both sides of the equation to get the equivalent condition:

$$DPS_A * HP_A > DPS_B * HP_B$$Therefore DPS * HP is what determines which pokemon wins. But DPS_A depends on DEF_B and vice-versa... It would be nice to have only properties of pokemon A on the left side, and only pokemon B on the right side. So let's define a new variable, DPS1, which is DPS but with the DEF factored out. It is the DPS you would do against a target with 1 defense:

$$DPS_A = \frac{DPS1_A}{DEF_B}$$Plug it into the inequality:

$$\frac{DPS1_A}{DEF_B} * HP_A > \frac{DPS1_B}{DEF_A} * HP_B$$And multiply by DEF_A * DEF_B on both sides:

$$DPS1_A * HP_A * DEF_A > DPS1_B * HP_B * DEF_B$$So equivalently, the pokemon who wins is the one with the highest DPS1 * HP * DEF. Often TDO is seen written as ATK * DEF * HP... you can see that these are similar because DPS is proportional to ATK. But DPS1 * HP * DEF is more accurate so it is the one we will use.

At this point, the problem is just to find DPS (we can get DPS1 just by multiplying that by defense). Define a cycle by a series of Fmoves, and then one Cmove. Then the formula we will use is

$$weaveDPS_{simple} = $$ $$\frac{CDamage + nFmovesPerCycle * FDamage}{CycleTime}$$...but first we need to find expressions for nFMovesPerCycle and CycleTime. Note that any variable starting with F or C stands for fast move or charge move, respectively. So for example CDuration is the duration of a charge move (how long after you start it until you can move again). Any variable beginning with "n" stands for number.

*CycleTime* depends on how many of each move is in a cycle:

How many Fmoves can you do in one cycle? In one cycle, you gain energy equal to ~CmoveEnergyCost. The percent of that energy which comes from Fmoves depends on the energy/second gained by taking damage vs the energy/second from spamming your Fmoves:

$$PercentEnergyFromFmoves = \frac{EPS_{Fmoves}}{EPS_{Fmoves} + EPS_{dmg}}$$ $$EPS_{Fmoves}=\frac{FmoveEnergyGain}{FmoveDuration}$$ $$EPS_{dmg}=EnemyDPS/2$$The last thing we need is EnemyDPS. It would be complicated to deal with exactly, but simulation results provide a good experimental relationship between EnemyDPS and Defense for a t4 or t5 raid boss. This already includes STAB but should be scaled if there are type advantages involved.

$$EnemyDPS = 1930/DEF$$ Now we are ready to calculate*weaveDPS*, which is the average damage per second you get throughout a cycle. $$weaveDPS_{simple} = $$ $$\frac{CDamage + nFmovesPerCycle * FDamage}{CycleTime}$$ Why did I add the "simple" subscript to

*weaveDPS*? Often, the battle ends and you still have wasted energy left. So for the last half-cycle or so, your DPS will just be FMove DPS. We can account for this by taking a weighted average of

*weaveDPS*with

*FmoveDPS*: $$weaveDPS_{actual} = $$ $$\frac{nCMoves * weaveDPS_{simple} + 0.5 * FmoveDPS}{nCMoves + 0.5}$$ where $$FmoveDPS = FmoveDamage/FmoveDuration$$

For this you will need nCmoves:

$$nCmoves = floor(SurvivalTime/CycleTime)$$ $$=floor(0.0005*STA*DEF/CycleTime)$$The equation for SurvivalTime is an approximation based on real-world tests.

At this point, there is a chain of variables to plug in, everything is expressed in terms of numbers which can be found in the game_master file or on pokemon go websites, like base stats of a pokemon. Below is a summary.

For *FDamage, CDamage*, use the damage formula:
$$damage = ceil(0.5*ATK*Power/EnemyDefense)$$
As for TDO (total damage output), the formula is
$$TDO = DPS1 * HP * DEF$$

...but be careful, DPS1 is different from DPS. In particular, DPS1 is the same as the DPS formula but at the end when you use the damage formula, you have to plug in EnemyDefense=1.

Normally when plugging in for Attack, Defense and HP, you'd use

$$ATK = (BaseATK+ATK IV)*CPM$$...where CPM is the CP Multiplier. But for this, CPM makes no difference, so you can leave it out (set it equal to 1). IVs can make a minor difference, so I recommend using something like 14/14/14.

Lastly, as mentioned before, the formula for survival time (tankiness) is

$$SurvivalTime = DEF * HP * 0.0005$$How did the 0.0005 slip in there? It is just a constant multiplier that makes the survival times approximately in seconds. It is based off of an in-game battle test.

In the spreadsheets on this post, values were all scaled by the same constant so that dragonite's dragonbreath/dragonpulse TDO and DPS match results from gamepress' in-house battle simulator. The proportion of all results stayed the same.

~doublefelix921