Built in public
Notes from building the game — what I tried, what broke, and what I learned. Newest first.
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.
I profiled my tower-defense expecting the towers and enemies to be the expensive part. They weren't. The frame budget was going to the HUD redrawing itself sixty times a second — and one Phaser method that re-renders even when nothing changed.
Every tower-defense enemy threatens the same thing: your life total. So I built four that don't — a saboteur for each resource you actually juggle (towers, cash, compute, tempo). Then I tried to make them 3D, and image-to-3D taught me two rules the hard way.
In a tower-defense the enemies are the passive ones — they walk, you act. So I built one that reaches over to your side of the board while it strolls: an AI-compliance inspector who fines your cash and takes your towers offline, one citation at a time.
A tower-defense player mostly watches. So I bolted a hotbar onto the tense moment — instant powers and placeable compliance gates you drop on the path. Then I shipped it, felt nothing, and learned the real lesson: a mechanic you can't see isn't a mechanic.
My landing page was a tidy column marooned in two oceans of empty navy. So I filled the gutters with the game's cast — a depth-layered parallax field — and learned that 'depth' is four things moving at once, and that two transforms on one element will always fight.
In a tower-defense, your towers shoot the enemies — that's the whole deal. So I built the one thing the genre never lets you fight back against: an enemy structure that buffs the wave, sitting just off the path, daring you to stop serving and shoot it instead.
My AI-CEO bosses got one great intro line, then crossed the whole board mute. The fix was ~100 lines, almost all of it writing — because the feature was already built, twice, and I nearly missed it.
I'd tuned every level to a perfect win rate. Then it hit me: win rate measures whether you survive, not whether you had to think. So I taught my AI playtester to measure the difference.
A playtester said my maps looked empty. I rebuilt the floor four ways before realizing per-tile tiling can't not draw a grid — the fixes are all shaders my 2D engine doesn't have. So I shipped a git revert.
Three buff towers that boost their neighbours' fire-rate, damage, and range — dropped into a 100-level campaign tuned to 'just barely finish.' Free power should've wrecked the curve. It didn't, and the reason is a piece of economics worth stealing for your own game.
Six of my game's seven worlds had buildings that looked subtly wrong on the board. The fix wasn't better AI — it was four words my best world had already been using, sitting in a log I'd never read back.
I regenerated 96 building sprites and every one floated above the ground. Not the code, not the shadows — transparent padding the engine faithfully scaled into a cushion of dead air. Here's the mechanism, and the one-line fix for any AI-cut sprite.
A flat colour filter reads as fake because it has no material story — one hue across every object, no decay, no contrast. Here's why that fails, and what art-directing an AI reskin for real actually takes.
Late-game waves had run out of scary. Instead of designing new villains, I cloned the ones I had into crowds — three new tanks for the price of one render pass. The catch: a crowd that looks like a crowd but acts like one guy is just a fat sprite.
Most tower-defense bosses just hit harder. Mine watches what you build and counters it — disabling whatever tower type you lean on, again and again, until you diversify. The whole 'smart enemy' is ~50 lines and zero new AI.
Four of my seven worlds were impossible to lose. I threw every balance knob I had at them and nothing moved — because the variable that mattered wasn't damage, it was damage-per-cost. Here's the mechanism, and the one cut that fixed six worlds.
My game needs every character drawn from four angles. A text-to-image model can't draw the same face twice. So I stopped asking it to draw the same face twice — I made one mesh and pointed a camera at it.
A shiny AI cutter fixed my ugliest sprites in one shot, so I pointed it at the whole game. Here's why a color-flood cutter shatters some subjects and AI segmentation saves them — and why only 11 of 150 actually needed the swap.
A color-distance background remover shattered a teal bench, haloed a temple, and painted a tree magenta. The bug was deeper than my prompts: keying by color is the wrong question. Here's the right one — and why I tore the whole method out a day later.
Pinning UI 'in place' fixes its position, not its scale. On a zoomed game camera that's the gap between a working toolbar and one that renders at half size and misses every click. Here's the mechanism, and the pattern that actually fixes it.
A 'strictly richer' upgrade system that was strictly worse to play. The bug wasn't the depth — it was asking the player to think during the one moment they can't. Here's why, and where the depth went instead.