FNAnalytics Docs

Damage Contribution onto Eliminations

Totaling damage which directly led to an elimination

Definition

Damage contribution onto eliminations (DCE) is a total of damage dealt to opponent players that was never fully healed by those opponents before they were eliminated, therefore directly contributing to their death.

A player is eliminated when their health is depleted from damage received. The damage may come from one or multiple sources, including both player and non-player sources.

Example

A player X is at full health and shield.

Shield
100
HP
100

Player A deals 130 damage onto X with their shotgun, leaving X at 70 remaining health.

Shield
100
HP
70
30
Player A130 dmg (100 shield + 30 HP)

Striped regions are missing health/shield

The striped regions in the health/shield bar examples represent missing health and/or shield due to damage received from an opponent player or some other source.

Player B then deals 70 damage onto X, eliminating them.

Shield
100
HP
70
30
Player A130 dmg (100 shield + 30 HP)Player B70 dmg

Player A's DCE statistic increases by 130, and Player B's DCE stat increases by 70.

Approach

Throughout the course of a match, FNAnalytics keeps track of all damage events and health/shield updates for every player.

For each player, a record is kept of all opponent players that have dealt damage to them and how much, called a damage contribution record.

Healing

If a damaged player heals, what happens to the damage contribution of other players who hit them?

On Full Heal

If a player ever heals to full HP and shield, their damage contribution record is cleared.

On Partial Heal

If the damaged player partially heals (i.e. does not heal to full HP and shield), each contributor in the damage record has their contribution rescaled in proportion to the total missing health + shield at the moment of the heal.

Suppose the record holds contributions c1,c2,,cnc_{1}, c_2, \dots, c_n from nn opponents. Let RR be the recipient's remaining combined health + shield just before the heal. With the maximum combined health and shield fixed at a constant 200200, the missing health + shield is

M=HmaxR,Hmax=200.M = H_{\max} - R, \qquad H_{\max} = 200.

A heal of HH points refills part of that missing pool. We spread it evenly across every outstanding point of damage, so dealer ii — who accounts for a fraction ci/Mc_i / M of the missing health — gives back Hci/MH \cdot c_i / M, leaving

ci=ciHciM=ciMHM.c_i' = c_i - H \cdot \frac{c_i}{M} = c_i \cdot \frac{M - H}{M}.

Clamping to guard against a heal that reaches full — which zeroes the record, matching On Full Heal — the rescaled contribution of every dealer ii is

ci=fci,f=max ⁣(0, MHM).c_i' = f \, c_i, \qquad f = \max\!\left(0,\ \frac{M - H}{M}\right).

Why Rescale?

We rescale damage contribution from opponents because the order in which they dealt damage is inconsequential. The alternative implementations of FIFO and LIFO would be far less elegant and intuitive.

Why missing health, not total tracked damage?

The rescale divides by the total missing health MM, not by the sum ici\sum_i c_i of tracked player contributions. Untracked, non-player damage uu (storm, fall damage, etc.) is missing health that no record accounts for:

i=1ncitracked  +  uuntracked  =  M.\underbrace{\textstyle\sum_{i=1}^{n} c_i}_{\text{tracked}} \; + \; \underbrace{u}_{\text{untracked}} \; = \; M.

Dividing by ici\sum_i c_i would assume the heal only ever refills tracked damage, over-reducing player contributions whenever u>0u > 0. Dividing by MM lets the untracked portion absorb its fair share of the heal, so tracked contributions decay correctly.

On Elimination

When a player is eliminated, all the players in their record have their DCE statistic increased by the amount of unhealed damage they dealt.

Additional Examples

Let's walk through a full life — damage, a heal, and an elimination — one step at a time.

Player X starts at full health and shield.

Shield
100
HP
100

Player A hits X for 70, tearing through most of their shield. Say that an NPC then deals another 30, finishing off the shield. X is left with 0 shield and full 100 health.

Shield
30
70
HP
100
Player A70 dmgNPC30 dmg (untracked)

X's damage record now holds a single player — Player A, with 70. The NPC's 30 is real damage, but the NPC is not a player, so it can never earn credit.

Heal event

X pops two Minis, refilling their shield by 50 (each Mini gives 25). Because X did not top back up to full, every contributor in the record is rescaled.

We rescale by the missing health + shield — how far below full X was right before healing. X was at 100 out of 200, so 100 was missing. Refilling 50 of that 100 brings back exactly half of what was missing, so half of it is still gone:

f=10050100=12.f = \frac{100 - 50}{100} = \frac{1}{2}.

Every contribution is multiplied by this factor. Player A's 70 becomes 35:

Shield
50
15
35
HP
100
Player A35 dmgNPC15 dmg (untracked)

Why divide by 100 and not 70?

Of the 100 that was missing, 30 came from the storm, not from Player A. We divide by the full 100 so the heal is shared across all the missing health. If we had divided by Player A's 70 alone, A would have been cut all the way to 20, punished for damage the NPC dealt. Dividing by the total missing health keeps their credit fair at 35.

Player X is eliminated

X is now back up to 150. Player B deals 90 and Player C deals 60, depleting the rest of X's health and eliminating them.

Because B and C dealt their damage after the heal, they are not rescaled — they get full credit. Only damage already in the record at the moment of the heal is affected.

Shield
50
15
35
HP
60
40
Player A35 dmgNPC15 dmg (untracked)Player B90 dmg (50 shield + 40 HP)Player C60 dmg

When X is eliminated, everyone left in the record has their DCE increased by the damage still standing on X:

  • Player A — 35 (their original 70, halved by the heal)
  • Player B — 90
  • Player C — 60

The NPC's damage is dropped, since it never counts toward a player's DCE.

On this page