Pong Studio Pong Studio
ENKOVI
Get updates
← All posts Devlog

Tuning wave difficulty: making 'almost losing' feel fair

June 29, 2026

Town Guardians key art

A run doesn’t feel unfair because it ended. It feels unfair when you didn’t see it coming.

That’s the distinction we keep returning to while tuning wave difficulty in Town Guardians. Sometimes the Wall of Divine Beasts falls — that’s fine, even intended. But when it does, a player should be able to trace a clean line back to the wave where they made the wrong call. Not the wave that cheated them. The one they misjudged.

That’s the third pillar of what we’re building, and we treat it as load-bearing: a loss should feel out-planned, never cheated.

Pressure Is a Shape, Not a Number

Early in development, wave difficulty felt like a dial — turn it up and things get harder. But “harder” on its own just means the player loses faster, which isn’t interesting. What we actually want is meaningful pressure: difficulty that asks a question the player can answer, or fail to answer, on their own terms.

That’s why our three current enemy archetypes each represent a different kind of difficulty question, not just a different threat level.

The Rotten Spore Mushroom is a patience problem. It’s slow, persistent, and punishes players who spend too aggressively in the early waves. Nothing about it feels unfair — it broadcasts itself. The difficulty is deciding how much to invest in handling it versus holding resources back for what comes later. Players who lose to it usually know exactly why.

The Corrupted Tree Spirit is a priority problem. It forces you to ask: which Successor handles this, and what am I trading to make that happen? Somteori and Hwaran, our Support pair, become deliberate choices here rather than defaults. The difficulty isn’t the enemy itself — it’s the opportunity cost it creates elsewhere on the wall.

The Unraveler Narak is something else entirely. It’s a “rethink your whole board” problem. When Narak arrives, the question isn’t which hero to route at it — it’s whether your current setup was even built for this. That’s a harder kind of loss to make feel fair, because it can read as the ground shifting under you without warning.

Telegraphing Without Telegraphing Too Much

Narak is where we spent the most design time on fairness. The moment it shows up and the player feels blindsided, we’ve broken pillar three. But if we signal it so clearly that players trivially prepare for it every run, we’ve gutted the roguelike element — every build converges on the same hedged answer.

The balance we landed on is telegraphing category, not specifics. Players can read, wave by wave, that the composition of the Legion of Ruin is shifting — the pattern changes before the heaviest pressure arrives. That gives them one more decision before things peak. Not a solution handed to them. A moment to reconsider.

The best almost-loss isn’t a near miss — it’s a run where the player made four sharp calls and one slow one, and they know exactly which one it was.

This is what “clean retreat” means to us in design terms. When a Successor gets overwhelmed and a section of the wall starts absorbing pressure, it should read as a consequence of positioning, not a random spike. Players can adapt to consequences. They can’t adapt to noise.

Holding the Line on Fairness

The roguelike structure of Town Guardians means every wave set is different, and we can’t hand-tune every possible combination. What we can do is ensure each enemy type asks a legible question, that danger has visible shape before it lands, and that the player always has at least one meaningful decision left — even when the run is already slipping away.

If we get that right, losing a run doesn’t feel bad. It feels like a reason to go again.

We’re still deep in this work, and every playtesting session teaches us something new about where “almost” tips into “unfair.” If you want to see where Town Guardians is headed, the game section has more on what we’re building.


Want to know the moment our next game is playable? Get launch updates →