I stopped tuning the levels. I let the bot design them.
My difficulty knobs were noise — a good player just bought past them. So I nearly tripled enemy health, then handed level design to a headless bot that grows each wave to the exact edge where it barely survives. 140 levels, tuned by playing them.
The last time I wrote about balance, a headless bot told me I’d built a game nobody could lose. I fixed the obvious thing — tower damage dwarfed enemy health — and moved on feeling clever.
I wasn’t done. I’d fixed whether you could lose. I hadn’t fixed why one level felt different from the next. That was still a pile of per-level knobs I tweaked by hand: how heavy the enemy mix leaned, little health multipliers, spawn timings. I’d nudge a number, replay, nudge it back. Twenty levels a world, seven worlds. It was going to take forever and it wasn’t even working.
The knob nobody was turning
Here’s what I finally understood: past a certain point, none of my knobs did anything. Because a good player snowballs.
Convert enough enemies and you have money. Money buys a tight cluster of towers on the nastiest corner of the path. And once that cluster exists, it kills everything that walks through it — a light wave, a heavy wave, the wave I spent an hour “balancing.” The kill zone doesn’t care what I set the enemy mix to. The economy already won the level.
So my difficulty setting was a number the player could buy their way out of. I was tuning the first three minutes and the rest played itself. Every careful adjustment past that threshold was noise.
You can’t out-knob a snowball. You have to change the shape of the hill.
Make the stream un-killable by one cluster
The fix was blunt: I nearly tripled every enemy’s health. Not a tweak — a regime change.
Now a single tower cluster can’t clear a stream during the second or two the enemies spend in its range. Some of them make it through, tanky and unbothered, and you need a second position further down the path to catch them. Suddenly the map matters again. Where the corners are, how much of the path your towers actually cover, whether you spent on breadth or on one fortress — all of it comes back to life. Difficulty stopped being how much money did you snowball and became how much of the path can you cover. Geometry, not economy.
Tankier enemies meant fewer of them, and fewer waves — so you also don’t drown in surplus cash and overbuild the whole board. The wave count is just half the level number, plus one now. Level 1 is a single wave. Level 20 is eleven. Short and sharp beats long and rich.
Then I stopped authoring waves at all
With the regime fixed, hand-designing 140 levels still sounded miserable. So I didn’t.
Instead I let the bot build them. For each wave, one at a time, it grows the arrival rate — enemies per second — and replays the level with a near-optimal player. More pressure, replay, more pressure, until the bot barely survives. That’s the edge. Then I back off a safety margin so real players with real dice don’t fall off a cliff, freeze that wave, and move to the next one. Wave two gets built on top of a locked wave one. It’s a staircase, and every step is calibrated against an opponent who doesn’t make mistakes.
The composition still ramps easy-to-hard by design — the gentlest enemies first, the spam and saboteurs forced late — but I’m no longer choosing the numbers. I’m choosing the shape and letting a machine that plays the level four ways find the exact intensity. Design by playing, not by guessing. Seven worlds, twenty levels each, calibrated and then re-verified under unseeded randomness. Every level winnable by a good player, none of them a walkover.
The world that refused
Six worlds fell into line. One didn’t.
Four levels in the USA world resisted every lever I had — money, timing, safety margin, health, all of it. Either the bot cruised at 100% or it bled out, nothing in between, no setting in the middle. That bimodal split is a tell: the problem isn’t the amount, it’s a missing piece.
It was. The USA world has no moderation tower — no clean answer to the spam enemy that jams your other towers. And I’d placed that spam right in the middle of the campaign, where the answer didn’t exist yet. No wave math fixes a missing counter. You either have the tool or you don’t.
So I stopped calibrating and moved the spam. It now shows up only in the late USA levels, where the board is strong enough to absorb it, and I buffed the one partial answer the world does have. Re-ran the bot: all twenty levels clean.
That’s the lesson under the lesson. Calibration finds the edge of a design — it can’t fix the design. When the bot gives you an honest zero at every setting, stop turning knobs and go look at what’s not on the board. The autoplayer is a brutal reviewer, but it only reviews the game you actually built.