
Battle Drones - a vibe coded RTS with audio-based multiplayer
Battle Drones is a browser-based Command & Conquer style RTS that Simon Willison built over 12 iterations and 321 commits, mostly with Claude Code and Claude Opus 5.5. The post gives key prompts and transcripts per version, including the "Make it a LOT more fun" run in Ultracode mode. It also covers an Agent vs. Agent mode for LLMs, audio-modem multiplayer between nearby phones, and lessons on deterministic simulation and code-generated 3D models and music.
What it claims
Simon Willison's Battle Drones is a static HTML and TypeScript RTS, published October 2026. Coding agents wrote it with almost no human code review. Willison argues that coding agents can produce a game that is fun to play, not just one that looks like a game. That reverses his earlier view. His evidence is v4: from the single prompt "This game isn't fun enough yet. Make it a LOT more fun.", Claude Opus 5.5 in Ultracode mode ran over a thousand simulated playtests and used them to rebalance the game.
How it works
- Stack changes. v1 to v4 used the Phaser 2D framework, which Willison only noticed several versions later. v5 moved to three.js from one overnight prompt. All 3D models are built in TypeScript code, with no imported assets.
- Art and audio. The agent got an OpenAI API key through an environment variable. It generated sprites and terrain tiles with OpenAI's image API, looked at the results and revised its own prompts. There are no audio files: the adaptive soundtrack is generated in code.
- Ultracode. Ultracode runs "dynamic workflows", JavaScript scripts that orchestrate many subagents at once. The v4 run started in the evening and returned a playable build late the next morning.
- Design prompts. Later versions used longer prompts. One example is the Archipelago map spec, which ends "First research and then critique this design. Only build after we have agreed on any modifications."
- Agent battles. Two LLMs play each other through a tool that returns non-visual game state limited by fog of war, plus unit controls. The design is in AGENT-BATTLES.md, built as a plugin for Willison's
llmtool. Battles can be recorded and replayed. A debug viewer shows the raw model responses, for example Claude Haiku 5.5 vs. GPT-6 Luna. - Audio multiplayer. This grew out of the Chirp Pong prototype. Opus first built a Radio Probe tool to measure bandwidth between two devices, then built a full audio modem. Willison chose sound so that the game needs no server to run or maintain.
Evidence
The figures come from Claude's own release notes for v4, based on 1,200 AI-vs-AI matches on Normal difficulty:
| Measure | Before v4 | After v4 |
|---|---|---|
| Games still undecided after 25 minutes | 14% | 0.9% |
| Wins by a side that had been 800+ scrap behind | 24% | 46% |
Other observations from the build:
- Cross-browser determinism. Replays desynced because
Math.sin(),Math.cos()and similar functions return slightly different values in Chrome and Safari. Claude replaced them with custom implementations. - Offline play. The game runs as a Progressive Web App and works offline without being asked for. Willison played it on a plane from his phone's cache.
- 3D modeling. Willison says Opus 5.5 and GPT-6 Astra are both capable of building 3D models for games.
- Time-boxed feature. v11 (random maps) used the last 25% of a weekly Claude allowance, with a 45-minute limit stated in the prompt.
How to use it
Each version, v1 to v12, can be played in the browser from links in the post. The repository has the sprites (public/assets/sprites), the agent-battle prompt, and replays linked from the README. Willison names two prior examples of audio data transfer: Siner by Alon Horesh and ggwave by Georgi Gerganov.
Limits
- The code is mostly unreviewed, written in a language Willison rarely uses.
- Audio multiplayer is new and lightly tested: only on laptops, iPhones and iPads, and only for two devices within microphone range.
- The balance numbers are self-reported by the agent from simulated matches, not human playtests.
- Ultracode "burns tokens like there's no tomorrow", and the post gives no cost figures.
- The agent league table is a plan, not built yet.
- Willison calls the game too low effort to submit as a serious indie project.
Organisations named here
- Anthropic
- OpenAI
- Hacker News
- Steam
- Claude Code
- Simon Willison
Technologies named here
- Claude Code
- Claude Fable 5
- Claude Opus 5.5
- Ultracode
- Claude Haiku 5.5
- Phaser
- GPT-6 Luna
- three.js
- GPT-6 Sol
- TypeScript
- GPT-6 Astra
- Blender
- OpenAI GPT image API
- Radio Probe
- Chirp Pong
- ggwave
- Siner
- Progressive Web App
- Scrimshaw Jukebox
- OpenAI API
- Progressive Web Apps
- WebGL
Techniques named here
- Vibe coding
- Open-ended prompt 'Make it a LOT more fun'
- Design critique before build
- Agent vs. Agent battles
- Audio-based multiplayer
- Deterministic simulation engine
- Procedural audio generation
Related in coding-agents
