u/walm00

Made a browser-only Desert Strike-style lane battler in Three.js. No download, no GPU needed. 1v1 works over a shared link

I've wanted to build a standalone version of the old StarCraft "Desert Strike" custom map for years. If you played BW/SC2 arcade you know the one - you don't micro units, you build production and the units auto-spawn and march down a single lane, and the whole game is about out-teching and out-countering the other side. I loved that mode. Nobody ever made a clean standalone version I actually wanted to play.

So a couple weeks ago I finally just... started. And ended up completely vibe coding the whole thing.

The goal I set myself: can I make something that looks decent, feels fun, and runs entirely in a browser - no download, no launcher.

Turns out: yeah, kind of?

What it is right now:

  • 1-lane tug-of-war. You build production structures, they auto-spawn units every wave, units walk down the shared lane and fight.
  • No hand-authored rock-paper-scissors table. Counters are emergent — every unit has an armor class and a damage type, and the matchups fall out of the stats (armor-class × damage-type × flat armor × shields × splash × anti-air). So "which unit beats which" is something you discover, not something I hardcoded.
  • You push through two guard towers, then kill the enemy Nexus. Overtime kicks in if nobody breaks through.
  • 1 vs Computer (fully local, no server) and 1 vs 1 with a friend over a shareable URL - one player hosts, the other just clicks a link in their browser. No accounts, no install.

Tech: Three.js + TypeScript, Vite. Browser only. The simulation is a pure, deterministic core (seeded RNG, fixed timestep) with the renderer/AI/network layered on top - which saved me a hundred times when debugging, because I could replay the exact same match.

Sound: made all of it with ElevenLabs - per-unit attack SFX (text-to-sound), the looping music + victory/defeat stingers (their Music API), and the intro narration (text-to-speech). It's positional too, so a fight off to the side actually pans and fades with the camera. Still slightly wild that you can score a whole game from text prompts now.

Art - not an ad, zero affiliation, just genuinely worth sharing: I built the map and every 3D unit with meshy.ai. I can't model to save my life, and text/image → usable glb is the only reason a solo dev like me shipped something that isn't grey boxes.

Multiplayer, technically: it's host-authoritative - only the host's browser runs the real simulation; the guest just sends inputs and renders what the host broadcasts, so the two can never disagree about game state. The server in the middle runs zero game logic - it's a dumb message broker. I wrote that broker once as plain JS and run it two ways from the same file: a Node WebSocket server for local/LAN, and the exact same code inside a Cloudflare Worker Durable Object (one instance per room) for a stable public URL. End result: a remote friend just clicks a link - no port-forwarding, no install.

The hard parts:

Movement. Sounds trivial for a "1-lane" game - until units have real x/z positions instead of sitting on a single line. Then everything gets messy: units bunch up and pin the front into a permanent stalemate, and naive center-to-center attack range under-reaches big units and over-reaches small ones. Fixes: units target and chase by true 2D distance, attack reach measures to the enemy's edge, and a blocked unit flows sideways around whatever's anchored in front of it instead of shoving into it. All of it has to stay deterministic so a mirror match is a perfect draw and multiplayer never desyncs.

Balancing. Because counters are emergent, one stat tweak ripples through the whole unit web - buff one armor type and three matchups you never touched suddenly break. So every number lives in config (nothing hardcoded), and I wrote automated "gates" - tests that fail if a mirror match never ends, if a counter unit doesn't win, or if the front line stalemates. Only way to tune without silently breaking five other things.

What still needs doing:

  • More units / factions and real tech-tree depth
  • More balancing passes — it's playable but not tight yet
  • Netcode hardening (multiplayer is host-authoritative and works, but I want it more resilient)
  • Visual/perf polish, mobile

I built this mostly for fun and to prove to myself it was possible. It genuinely surprised me how far one person can get now by combining ideas + AI tools.

Would really love feedback from people who actually build games/engines:

  • What should I improve next?
  • For the balancing problem specifically — how do you approach tuning an emergent counter system without playing whack-a-mole?
  • What techniques/practices should I learn instead of just "making it work"?
  • How would you approach optimization / making this feel closer to a real game?

Open to criticism. Roast it.

u/walm00 — 13 hours ago