A line of crossbowmen firing into light-armoured archers while their bolts glance off a dwarf shield wall behind

Designing a counter system players can read

Game Design7 min readUpdated
ClaudeBuilt the thing
Adam SturrockDecided what mattered

Written up later from the commit history. Dated to when the work landed.

Players should be able to look at an army and know what beats it.

That is the brief, written as the third of the game's design pillars long before any of this shipped: no filler units, every unit has a situation where it is the right choice, and the counters have to be legible. A counter, in a strategy game, is simply a unit that beats another unit badly enough that a player will change what they are building in order to have one.

The version a player actually feels is much simpler than the sentence. Send crossbowmen at archers and the archers evaporate. Send those same crossbowmen at a dwarf shield wall and the bolts do about a quarter of what you expected.

That is two numbers out of ninety six. Pierce damage against light armour is double. Pierce against heavy or fortified armour is half. It is the oldest counter in the genre and a player learns it without being told, because a doubling is visible in the health bars.

Dwarves in mail with axes and round shields meeting a goblin charge across a muddy field at sunset, fires burning on the ridgeline behind

What the table feels like before it is a table

Bring a Steam Cannon to a wall and the wall comes down, because siege damage does half again to fortified armour and every building in the game is fortified. Bring that same Steam Cannon to a fight against enemy casters and it is close to useless, at half damage against magic armour.

A brass steam cannon firing point-blank into a charge of goblin warg riders, lava streaming down the cliffs behind

Hammers exist because blunt damage is the answer to medium armour and the wrong answer against a warded caster. Lightning and holy damage both punch through arcane wards at half again, which is a flavour rule and a mechanical rule at the same time: a shield made of magic does not stop a storm.

None of those need a table. They need one sentence each. The table is only where the sentences are kept.

Fifty of the ninety six do nothing

The legibility answer is arithmetic. Count the combinations and fifty of the ninety six change nothing at all. Just over half of the system is a deliberate no-op.

That is the design rather than laziness. The four physical damage types carry almost every sharp number, because physical counters are the ones a player is expected to plan around. The eight magical types sit flat on purpose: magic is generalist, and the interesting variation comes from whether a target has researched warding against that specific element, not from its armour. A fireball does roughly what a fireball does to everybody.

Two columns are shaped rather than tuned. Hero armour is flat between 0.75 and 1.0 against all twelve damage types, so no hero can be hard countered by picking one weapon. Ethereal is true immunity to all four physical types, handled as immunity rather than as a very small number, because a player who sees an arrow land for 1 damage will keep firing arrows.

Damage typeunarmouredlightheavyfortifiedmagichero
pierce1.52.00.50.51.00.75
siege1.51.01.01.50.50.5
arcane1.01.01.00.750.50.85
holy1.01.01.00.751.50.85

Not one unit was labelled by hand

The part that made a system this size affordable is that almost nothing was labelled by hand. A unit's armour follows from the job it already does. Melee troops are medium. Archers, casters and healers are light. Heavies are heavy. Siege engines and every building are fortified. Workers are unarmoured.

Of 229 units in the game today, not one carries a hand-written armour class. Every single one inherits it. Around thirty override their damage type, and those are exactly the ones you would guess: the hammer-wielders, the plague casters, and the handful of siege beasts that fire energy rather than shot.

The other half of the trick is that the default pairing multiplies to exactly one. A unit that had not been labelled yet deals precisely the damage it dealt before any of this existed, which is what let the whole system ship without a rebalance pass over every unit in the game first. Labelling was something you could do a faction at a time.

One place where a hit becomes a number

Every source of damage in the game funnels through the same four steps: melee swings, arrows, bombs, splash and spells alike. Flat armour reduction first, then damage type against armour type, then the target's resistance to that specific element, then a clamp so nothing ever multiplies to absurdity and no hit ever lands for zero when it was meant to hurt.

The reason that matters is not tidiness, it is that a counter system with two implementations has two behaviours, and the second one is always the one a player finds. If a fire arrow resolves differently from a fireball, no amount of table design will make either of them legible.

The same rule applies upwards into what the player is told. The strong-against and weak-against lines on a unit's tooltip are not written by hand. They are read back out of the same table that resolves the hit, with anything above 1.25 counted as strong and anything below 0.75 as weak. A tooltip read out of the table it describes cannot drift away from the game.

Concentration is the legibility lever, not size

The honest measure of whether a counter system is legible is not how big it is. Count the combinations that do nothing, because those cost a player nothing to know. Then look at where the rest of them sit.

Fifty of these ninety six are no-ops, and almost every sharp value falls in four of the twelve damage types. So what a player actually carries is not forty six pairings. It is four rules, each of which can be said in one sentence.

The same forty six sharp numbers spread evenly across all twelve types would be identical arithmetic and completely unlearnable, because no group of them would summarise. That is the rule worth stealing: concentrate the sharp values in the axis the player is already watching, and let the rest of the system stay quiet.

The second rule is that a counter system must never contradict the smaller rule the player already has. What a player plays with mid-fight is a much older triangle: melee beats siege, siege beats ranged, ranged beats melee. Ninety six numbers sit underneath that triangle, and they work because they agree with it. A combination that disagreed would not correct the player. It would read as a bug, because the triangle is the thing they are acting on.

Dwarf crossbowmen firing flaming bolts from the roof of a stone watchtower while the ground around it burns

The table is deliberately kept out of the combat interface rather than surfaced in it, which is a decision to teach the system before the fight and stay quiet during it. Every spell that deals one of the eight magical types is listed with its damage, cooldown and cost on the ability inspector, and the four physical rules that decide most fights are the ones you meet in the first minute of a skirmish.

Hero armour being flat is the same instinct that shapes three separate hero resource models, and the elemental riders that stack burning and chill are researched from each faction's own magic building, which is part of what makes the nine factions play differently. The whole thing was argued out in prose before it was numbers, which is the working pattern described in designing a game in writing before code.

Which leaves the system doing exactly what the pillar asked of it. Ninety six combinations sit underneath the game, fifty of them deliberately silent, and what reaches a player is four sentences they can act on in the first minute of a match: arrows shred light armour, hammers answer medium, siege breaks buildings, and nothing hard counters a hero. The table is where those sentences are kept, not something anyone has to read.

Questions

How many damage and armour types does the game have?

Twelve damage types against eight armour types, so ninety six combinations. Four of the damage types are physical (slash, pierce, blunt, siege) and eight are magical (fire, frost, lightning, arcane, shadow, nature, holy, water). The armours are unarmoured, light, medium, heavy, fortified, magic, hero and ethereal.

Do I have to memorise ninety six numbers to play?

No. Fifty of the ninety six do nothing at all, and the sharp numbers sit almost entirely in the four physical damage types. In practice a player learns three rules: arrows shred light armour, siege weapons break buildings, and no single damage type hard counters a hero.

Can a unit deal more than one kind of damage?

Yes. A unit carries one main damage type plus optional elemental riders from research or gear, so a crossbow can fire pierce damage plus five points of fire. Each part is resolved separately against the target's armour and its resistances. Splash damage stays main-type only.

An AI-controlled goblin base mid-game with a walled arc, towers behind it, and a scouting warg rider heading off toward the fog line

How an RTS AI opponent thinks

Seven personalities, difficulty expressed as behaviour rather than as free resources, and an opponent that reacts to what its scouts have actually seen.

10 min read
← All posts