Back to Blog
balancingcombatsystems designrpg

Damage Formulas That Keep Every Stat Worth Taking

Why most balance problems are formula problems, not number problems. Pick a mitigation shape, price every stat in % DPS or % effective HP, and validate three reference builds before anyone plays it.

GameDesignerX TeamOctober 28, 20267 min read

A tester finishes your demo and says the thing every systems designer dreads: "I just ignored armor." They were right to. Your mitigation formula was damage = attack - defense, your basic enemy hit for 12, and 10 points of armor turned that into 2 — until the boss hit for 100, where the same 10 points removed a rounding error. One stat was simultaneously overpowered and useless, and no amount of tuning the numbers in the item table could fix it, because the problem was the shape of the equation, not the values plugged into it.

Most "balance problems" in small-team games are really formula problems. Pick the wrong curve and you spend months nudging numbers while builds collapse into one optimal path. Pick a formula with a known shape and you can price every stat in a single currency, hand the sheet to a designer who is not a mathematician, and still have breakpoints that reward clever builds.

Here is a working method, with the arithmetic written out.

Start from time-to-kill, not from stats

Before you choose a formula, decide how long a fight should take. Target durations are the only anchor that makes damage numbers meaningful.

Say a basic enemy should die in about 4 seconds of sustained attention, and the player's default weapon swings 1.5 times per second at 12 damage:

  • 4 s × 1.5 attacks/s = 6 hits
  • 6 hits × 12 damage = 72 HP

That single number now constrains everything else. Your trash mob has 72 HP, a mini-boss that should take 20 seconds sits near 360 HP, and any ability that deals more than 72 damage is a one-shot by definition, which is a design statement you should make on purpose.

Write the targets down as a band, not a point: trash 3–5 s, elite 12–18 s, boss 90–150 s across phases. Bands survive tuning; single values invite endless argument. If you keep these in a balance and economy sheet in GameDesignerX alongside the enemy stat blocks, the TTK column recalculates as soon as someone edits a weapon, which turns "did that nerf break the pacing?" into a glance rather than a meeting.

Three damage shapes, three failure modes

Almost every mitigation system is a variation on one of these.

Flat subtraction: damage = attack − defense. Intuitive, and the reason your tester ignored armor. Its mitigation percentage depends entirely on the incoming hit:

Incoming hit Defense 10 Damage taken Effective reduction
12 10 2 83%
30 10 20 33%
100 10 90 10%

The same 10 points are build-defining against swarms and worthless against bosses. It also forces a minimum-damage clamp, or chip attacks round to zero and enemies become immortal. Flat subtraction works when your damage values live in a narrow range — a game where everything hits for 8 to 20 — and breaks the moment you add a big-hit enemy.

Asymptotic percentage: reduction = armor / (armor + K). The standard choice, and worth understanding properly. With K = 100:

  • 50 armor → 33% reduction
  • 100 armor → 50% reduction
  • 300 armor → 75% reduction

The reduction curve flattens, which looks like diminishing returns and scares designers off. It isn't. Work out effective HP: eHP = HP × (1 + armor / K). With 100 base HP, 100 armor gives 200 eHP and 300 armor gives 400 eHP. Every single point of armor adds exactly 1% of your base HP, forever. The stat never dies, it never spikes, and it is trivial to price.

The trap is elsewhere: HP and armor multiply. A character who doubles HP and takes 300 armor has 800 eHP against a baseline of 100 — eight times tankier from two stats that each looked tame in isolation. Either accept that as the tank build's payoff and tune enemy damage for it, or gate one of the two stats.

Multiplicative multipliers: damage = base × m1 × m2 × m3. This is where most combo explosions come from. Three separate +50% sources stack to 1.5 × 1.5 × 1.5 = 3.375×, not the 2.5× an additive system would give. The more sources you ship, the more the top build runs away from everything else. Default to additive buckets (base × (1 + 0.5 + 0.5 + 0.5)) and reserve true multipliers for a handful of deliberate, loud effects — a crit, a signature ultimate, one legendary item — where a player discovering the stack is the point.

For resistances, multiplicative stacking is your friend rather than your enemy: three sources of 30% resist leave 0.7³ = 0.343 damage through, a 66% reduction that can never reach immunity no matter how many sources you add.

Price every stat in one currency

Once the shapes are fixed, convert each stat into either % DPS or % eHP. Then an item is just a budget.

Average damage with crits is easy to price:

DPS = base × (1 + critChance × (critMulti − 1))

At 25% crit chance and a 2.5× multiplier: 12 × (1 + 0.25 × 1.5) = 16.5 average damage. With a 2× multiplier, 1% crit chance is worth exactly 1% DPS, which makes it a clean conversion unit for item budgets.

A workable table for the example game above, where one budget point equals 2% of a baseline:

Stat Amount per budget point Priced as
Attack +2% weapon damage 2% DPS
Attack speed +2% 2% DPS
Crit chance (2× multi) +2 percentage points 2% DPS
Max HP +2% 2% eHP
Armor (K = 100) +2 armor 2% eHP

A common uncommon item gets 2 points, a rare gets 3, a legendary gets 4 plus one unique effect that is deliberately off-budget. Now "is this item too strong?" is arithmetic, and a new team member can author twenty items in an afternoon without breaking the curve.

Attack speed and attack are both priced at 2% DPS, but they are not identical in play: attack speed also improves damage-over-time application and reduces overkill waste, so expect to discount it slightly after testing.

Mind the integer breakpoints

With 72 HP trash mobs, a player hitting for 24 kills in 3 hits. At 23, it takes 4. That one point of damage is worth 25% of the player's kill speed, while the next six points of damage are worth nothing at all until the next threshold.

Breakpoints are not a bug — hunting them is one of the best feelings in a stat-driven game. But they must be intentional:

  • Keep common enemy HP values clustered around a small set of numbers so breakpoints are discoverable and shared.
  • Avoid making a breakpoint reachable only with one specific item, or that item becomes mandatory.
  • If you want the curve smooth instead, add small damage variance (±10%) so thresholds blur.

Say which one you chose in your decision log. Six months later, someone will "fix" your deliberate breakpoint unless the reasoning is written down.

Validate with three builds, not with vibes

Build a sheet with one row per build and the formulas live. At minimum, test:

  1. Glass cannon — all budget in DPS stats
  2. Tank — all budget in eHP stats
  3. Hybrid — split evenly

For each, compute TTK against trash/elite/boss and survival time against each enemy's DPS output. Then set a tolerance: no build should kill a boss more than ~40% faster than another, and no build should survive less than ~60% as long as the tank. Numbers outside your band mean the formula or the prices are wrong, and you know which before anyone plays it.

Pre-ship checklist

  • TTK bands written down for every enemy class
  • One named mitigation formula, with K documented
  • Multiplicative sources counted — and the list is short
  • Every stat converted to % DPS or % eHP
  • Item budget tiers defined and applied
  • HP × armor interaction checked at endgame values
  • Three reference builds inside tolerance
  • Minimum-damage clamp (or proof you don't need one)

None of this replaces playtesting. The tell you are listening for is whether players can name the stat they want next. If they can, the math is legible. If they shrug and take whatever dropped, the formula is doing the shrugging for them.