
I built an enemy for every resource you manage
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.
Every enemy in a tower-defense threatens the same single number: your life total. They walk toward the exit, you stop them or you lose a life. After a hundred levels that’s the only verb the enemy line knows — and “same threat, bigger health bar” is a shallow way to add variety.
But a life total isn’t the only thing I’m managing. Across a wave I’m juggling my towers, my cash, my compute, and the tempo of the board. So instead of another fat health bar, I built an enemy that reaches over and attacks each one.
Four saboteurs, four pillars
- The Regulator goes after your towers — walks the funnel stamping them offline for “audit” and fining you as he passes. (He got his own post.)
- The Undercutter goes after your money — a price-war hawker; while he’s on the board every conversion pays less, and if he reaches the exit he crashes the market for a lump of cash.
- The Load Shedder goes after your compute — a rolling blackout that drains the shared power pool and browns out the tower it walks past, one flickering block at a time.
- The Zeitgeist goes after the whole wave — eight billion users wanting the same thing at once; while it lives, every unit moves faster and resists conversion.
The point isn’t the flavour, it’s that each one demands a different answer. You focus-fire the Regulator, over-provision compute against the Load Shedder, decide whether to eat the Undercutter’s squeeze or spend the shots to kill it, and drop everything for the Zeitgeist. Same “priority target” role, four reasons. And they were nearly free to build — each is the player’s own systems (boss abilities, the aura engine, a shared tower-disable map) pointed at a new target. The cheapest way to make an enemy interesting isn’t a bigger health bar; it’s giving it something of yours to take.
Then I made them 3D, and image-to-3D bit back
Here’s the honest part. Every character in this game is a real 3D mesh — one image → a mesh (via an image-to-3D model) → baked to four isometric facings so it turns to face where it walks. The four saboteurs had shipped flat: one front sprite, mirrored. Baking them into meshes taught me image-to-3D’s two unwritten rules.
Rule 1: it can’t read. The Undercutter held a big SALE sign. The mesh turned the letters into melted runes — image-to-3D reconstructs shapes, and text is just shape-noise to it. The fix was to say the same thing without words: a chunky gold price-drop arrow reads as “cheap” instantly and reconstructs razor-crisp.

Rule 2: it needs contrast. The Zeitgeist started as a glowing white blob — pure luminance, no shadow. Image-to-3D infers form from light-and-dark cues, and a shape with neither comes back a lumpy marshmallow. The fix was to give it something to grab onto: I redesigned it as a dark-navy bot with bright cyan seams, and it snapped straight into a clean mesh. (An all-white robot taught me this exact lesson months ago. Apparently I had to learn it twice.)

What it changed
The wave used to ask one question — is my life total safe? Now it asks which of my systems is under attack right now, and is it worth leaving the wave to deal with it? Four enemies, four answers. And after the bake they finally turn to face their direction of travel instead of moon-walking a mirrored sprite.
Two lessons I’m keeping: design enemies around the resources the player already manages, not around a stat block — and if you’re turning art into 3D, give the model shapes and contrast to reconstruct, never text.