STELLAR SIEGE

A sci-fi tower defense where the map never changes but the problem does — every wave asks a new question of the same ground.

The signal lied. What sent it is harvesting the colonies it lured in, and you command the defences of the outposts still holding the line.


What it does

Place towers on fixed plots, upgrade them, and drop walls directly onto the road to decide where enemies stall and die. Survive every wave to win; let them reach your base and you lose lives. One level is one session — six to ten minutes.

The strategy sits in a counter triangle you have to read before each wave:

  • Armored enemies shrug off kinetic fire → answer with Energy
  • Shielded enemies resist energy → answer with Kinetic
  • Fliers ignore walls and ground towers entirely → answer with ranged cover

No single build answers everything. The plots never move; the thing standing on them is new every wave.

In the prototype

  • 3 levels — 8, 10 and 12 waves; one, two and three lanes, with enemies entering from different edges of the board
  • 3 tower types × 3 tiers, plus a Tier-4 specialisation fork — two opposed choices per tower, locked in for the rest of the level
  • 9 enemy types — infantry, rushers, armored, shielded, fliers, a splitter that bursts into three on death, and two bosses
  • 2 wall types, 2 cooldown powers, and per-tower targeting priorities
  • Reactive tutorial — coach marks that point at the live board and wait for you to actually do the thing before advancing
  • Enemy dossiers — first sighting of any hostile raises a chip carrying its portrait; tap it to see what it resists, what beats it, and what it costs you

How it was built

Prompt-built with Claude Code (Claude Opus) over ~13 sessions, on Three.js.

Everything is procedural. Meshes are built in code, textures painted into canvases at runtime, and all audio — including a sequenced music track that gains drums and a melody only while a wave is live — is synthesised with the Web Audio API. The whole build is 0.71 MB and makes zero network requests.

Balance is verified by an automated playtest bot that plays every level with two opposing spending strategies. No balance change was accepted without it passing all six runs.

What was hard

  • Halving tower ranges broke the entire game. In a tower defense the quantity that decides whether a lane holds is dps × time_in_range, so halving range halves every tower's damage per pass — measured 7.0s of fire on a passing brute down to 3.5s. All six bot runs went from winning to losing.
  • Roads that folded through themselves. A ribbon of half-width h cannot survive a bend tighter than h. Every lane had bends of radius 0.21–0.41 against a 0.50 half-width. Fixed with a curvature-relaxation pass that opens only the offending corners.
  • A camera that had to fill the frame. A board of width W and depth D projects at aspect W / (D·sin(pitch)), so the pitch is solved rather than fixed — there is exactly one angle at which a 16:9 board covers a 16:9 screen.

Controls

Everything is a tap, in landscape.

Tap a plot → pick a tower → preview its range and damage → Build. Nothing is spent until you confirm. Tap a built tower to upgrade, retarget or sell it. Tap a wall, then the road. Tap Call Wave — calling early pays a bonus.

Built With

Share this project:

Updates

Submission history