Back to Blog
enemy designcombatbalancingencounter design

One Verb Per Enemy: Building a Roster That Teaches Your Combat System

Most enemy rosters are reskins with two ideas between them. Design each enemy around a verb, give it a readable tell, and anchor its stats to time-to-kill — plus an encounter beat map and a playtest checklist.

GameDesignerX TeamSeptember 12, 20267 min read

Picture a combat prototype with nine enemy types in it, and playtest feedback that is unanimous and useless: "combat feels fine, a bit samey." List what each enemy actually does and the problem usually surfaces in four minutes. Seven of the nine walk toward the player and hit them. One shoots from range. One explodes. Nine art assets, two ideas.

A roster is not a bestiary. It is a curriculum. Every enemy you add should teach the player something about your mechanics that no other enemy teaches, then keep quizzing them on it. If you can delete an enemy and no player skill goes untested, that enemy was decoration.

Start with the verb, not the creature

Before you name anything or brief an artist, write the roster as a list of verbs — what the enemy does to the player's options. Not "goblin archer" but "punishes standing still." Not "big armored knight" but "forces you to create space." A six-enemy roster for a melee-focused action game, written verb-first:

Enemy Verb (what it does to the player) Tell Intended counter
Rusher Punishes passivity; closes distance fast Audible screech at spawn, 0.6s crouch before lunge Sidestep, then punish the recovery
Shieldbearer Denies the front; forces repositioning Slow advance, shield raised, no other animation Flank, or break guard with heavy attack
Lobber Punishes camping in cover Arc indicator on ground, 1.2s fuse Move before it lands; ignore the enemy itself
Pinner Removes mobility; stops dodge-spam Beam charge with rising tone, 0.8s Break line of sight
Swarm (x5) Punishes single-target weapons Spawns as a visible cluster Area attack, or funnel into a corridor
Healer Adds a priority target; punishes tunnel vision Visible green tether to whoever it's healing Kill it first, or cut the tether's line

Six enemies, six distinct player behaviours being trained — and none need to be different creatures in fiction. Halo's Covenant is largely chaff (Grunts), front-denial (shielded Jackals) and skill check (Elites) in one faction. Doom Eternal hard-binds verbs to answers: the Arachnotron's turret asks for precision, the Cacodemon's open mouth asks for a grenade. The fiction is a wrapper. The verb is the design.

The delete test

For each enemy, write one sentence: "Without this enemy, the player would never have to ______." If you can't finish it, or two enemies finish it the same way, merge or cut. A four-enemy roster where every entry passes the delete test reads as richer than a twelve-enemy roster where eight are reskins — at a third of the animation budget.

Tells are the actual content

Players do not experience your enemy's stat block. They experience the half-second before the hit lands. A tell is a contract: this is coming, here is your window, here is the price for missing it. Three rules that hold up across genres:

  1. One tell per attack, unique in the whole roster. If two enemies both wind up with a raised arm, you haven't taught the player anything — you've taught them to guess.
  2. The tell must be perceivable from where the player fights. A subtle eye-glow is worthless at top-down camera distance. Test tells at your real gameplay camera, minimum supported resolution, HUD on.
  3. Audio carries the tell off-screen. Anything that can attack from outside the frustum needs a distinct sound cue — the most common cause of "cheap deaths" in early builds.

Pick concrete windup numbers, hold them consistently across the roster, then tune as a set. A workable starting convention:

  • Light attacks: 0.3–0.4s windup, ~0.5s recovery
  • Heavy attacks: 0.7–1.0s windup, ~1.0s recovery — long enough to be a real decision
  • Ranged charge: 0.8–1.2s, with an escalating tell (rising pitch, not a static loop)
  • Unblockable: a colour or audio flag used for nothing else in your game

Those are starting values, not truths. The point is that you write them down once and every enemy inherits from the same table, so a player who learns "heavy attacks are dodgeable" learns it for the whole game. Your Mechanics module is a reasonable home for this table — it's the thing your combat designer, animator and audio person all need to agree on before anyone builds the second enemy.

Encounter grammar: how you spend the roster

Individual enemies are vocabulary. Encounters are sentences. The pacing pattern that works — and it predates games — is introduce, isolate, combine, twist.

  • Introduce the enemy alone, in a safe arena, nothing competing for attention. The player should only be able to die here through carelessness.
  • Isolate it: two or three of the same type, stress-testing the verb. Two Shieldbearers in a corridor is a different puzzle from one.
  • Combine it with an enemy the player knows, chosen so the verbs conflict. Pinner + Rusher is nasty because one removes mobility and the other demands it.
  • Twist: change the arena, not the enemy. The same pair on a narrow bridge, in the dark, or on a timer is a new encounter for zero new content.

A beat map for the first hour, using the roster above:

Beat Room Content What it's testing
1 Entry hall 1 Rusher Dodge timing
2 Courtyard 3 Rushers, staggered spawns Target prioritisation
3 Gallery 1 Shieldbearer Flanking
4 Gallery (return) Shieldbearer + 2 Rushers Doing both under pressure
5 Rooftops 2 Lobbers, cover-heavy Cover is a trap, keep moving
6 Cistern Swarm + 1 Healer Area damage + priority targets
7 Bridge Pinner + Rusher The conflict pair

Notice how little new content beats 4 and 7 require. That's the trick: most encounter variety should come from combination and arena, because those are cheap. If your level list grows faster than your enemy list, you're probably doing it right.

Numbers: anchor everything to time-to-kill

Balance relative to a single anchor, not in absolute values. Pick a target TTK for your baseline enemy — a Rusher dies in 1.5 seconds of focused attention from a competent player — and express everything else as a multiple.

If the player's light attack does 10 damage at 3 hits/second (30 DPS):

  • Rusher: 45 HP (1.5s)
  • Shieldbearer: 90 HP (3.0s), or 45 HP once guard is broken
  • Lobber: 30 HP (1.0s) — fragile, because the threat is the projectile, not the body
  • Swarm member: 10 HP — they must die in one hit or the fantasy collapses
  • Healer: 30 HP, positioned 15m back, so the real cost is travel time

Buff the player's weapon by 20% and you change one cell; the whole table recomputes. That's the case for keeping the roster in a balance sheet with live formulas, linked to your character entries, rather than a wiki page — derived stats stay consistent when the formula changes, while literals rot within two sprints.

For damage in the other direction, decide how many hits the player survives, not how much damage enemies do. "Three Rusher hits kills a full-health player" is a design statement anyone can evaluate. "Rusher does 34 damage" is trivia.

Playtest questions that find roster problems

Generic playtest questions get generic answers. These four surface enemy-design failures specifically:

  • "Which enemy did you kill first, and why?" — no answer means your roster has no priority structure.
  • "What did the [enemy] do right before it hit you?" — the highest-value question here. If they can't describe the tell, the tell isn't readable.
  • "Which enemy is the most annoying?" — annoying usually means unreadable or unanswerable, which are different fixes. Ask a follow-up.
  • "If you could delete one enemy, which?" — often the one failing the delete test. Players spot it before designers do.

Log answers against the specific enemy, not the session. "Playtest 12 went okay" is worth nothing in three months; "four of six testers couldn't describe the Pinner's charge tell" is a work item.

The checklist

Before an enemy leaves the prototype stage:

  • A one-sentence verb no other enemy shares
  • Passes the delete test
  • Tell is visually unique in the roster and audible off-screen
  • Windup and recovery come from the shared timing table
  • One intended counter, plus a situational alternative
  • HP and damage derived from the TTK anchor, not typed raw
  • A planned introduce → isolate → combine sequence
  • Fought at the real camera distance, HUD on, minimum resolution

Nine enemies with two ideas will always lose to five enemies with five. Write the verbs first and the roster mostly designs itself.