What it is

PRISM WARD is a portrait, touch-first 3D tower defense roguelite built for five-to-seven minute runs. Spend Lumen to build and upgrade towers, defend the crystalline Core through ten waves and a two-phase boss, and pick one mutation between waves. Every run is a complete session: win by surviving the boss, lose when the Core falls, restart instantly.

Genre: Tower Defense & Strategy.

The signature twist: Attunement

Exactly one tower at a time can be supercharged. The right choice changes as each wave's composition changes, so the moment-to-moment decision is which tower to channel power into right now. From wave four, agile enemies dodge unslowed shots from the basic tower, which forces tower variety and gives switching Attunement a real reason to exist.

What's in the prototype

  • Ten waves including a two-phase boss
  • Three tower types (single-target, chain, slow), three levels each
  • Attunement with per-type bonuses; twenty behavioral mutations
  • Six enemy behaviors: basic, swarm, runner, armored, shielded, boss
  • Skippable opening cinematic, first-run hints, score, instant restart
  • Everything is a single tap: no dragging, no camera control

How it was built

The game was prompt-built with Claude (Claude Code) over roughly three weeks; the build log records every session and decision. Three.js handles rendering with an Unreal-style bloom pass. All geometry is procedural, all audio is WebAudio-synthesised, and all textures are generated on a canvas at runtime, so the whole game is one index.html plus a vendored Three.js, runs fully offline, and makes zero network requests.

Source is authored as TypeScript script files that share one global scope, then type-stripped and concatenated into a single readable, unminified <script type="module">. No bundler, no code generation. Every tunable number lives in one CONFIG object; a single applyDamage hook drives status effects, mutations and shields; every enemy, projectile and effect is pooled so update paths never allocate.

Challenges

  • Balance with AI, not by hand. Scripted player profiles (spend discipline, Attunement use) with a separate RNG for player decisions let us run multi-seed sweeps and compare fingerprints instead of eyeballing.
  • Bloom blowouts. Multiplying emissive intensity per frame overflowed the half-float bloom target to NaN and blacked out the screen. Rule now: assign from a per-frame base, never multiply into persistent state.
  • Mobile audio. Counting voices with onended silently broke after iOS backgrounding; we count scheduled end times instead.
  • Readability under bloom. Enemy energy became an additive halo outside the silhouette rather than a mesh inside it.

What's next

Keep the five-minute run as the heartbeat and grow around it: multiple arenas, build archetypes with a deeper mutation pool, between-run progression and score chases, rebuilt natively in the Horizon creation tools.

Built With

Share this project:

Updates

Submission history