{"slug": "battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer", "title": "Battle Drones - a vibe coded RTS with audio-based multiplayer", "summary": "Simon Willison released Battle Drones, a browser-based Command & Conquer-style real-time strategy game built almost entirely by coding agents — mainly Claude Code — across 12 major iterations and 321 commits, with multiplayer between two nearby devices synchronized over audio. Willison said he reviewed almost none of the TypeScript code and credited the game's playability to telling Claude to \"Make it a LOT more fun,\" after early versions built on the Phaser framework with OpenAI image-generation sprites were not fun to play. The game runs on mobile and desktop, includes multiple maps and a random map generator, and is playable at simonw.github.io/battledrones.", "body_md": "My latest vibe coded game experiment is a Command & Conquer style RTS (Real Time Strategy) game called [Battle Drones](https://github.com/simonw/battledrones#readme) ([play it here](https://simonw.github.io/battledrones/)). Unlike [my previous experiments](https://simonwillison.net/2026/Aug/5/raccoon-heist/), this one is *actually fun to play*. I'm somewhat embarrassed to admit that I got there by telling Claude to \"Make it a LOT more fun\". It also supports multiplayer between nearby devices using audio to synchronize game state! Here's what I've built so far, and some of the things I learned along the way.\n\nMy initial goal was to build an RTS game I could play on my phone, in the style of [Command & Conquer](<https://en.wikipedia.org/wiki/Command_&_Conquer_(1995_video_game)>). I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.\n\nAfter 12 major iterations (and [321 commits](https://github.com/simonw/battledrones/commits/main/) by coding agents, mainly Claude Code) I now have a browser-based game that works on mobile and desktop, has multiple play modes, several maps (including a random map generator) and even supports multiplayer for two devices within microphone range of each other.\n\nHere's a video demo of Battle Drones running in a desktop browser:\n\nFeatures so far include:\n\nBattle Drones is heavily vibe coded - I've reviewed almost none of the code, and it's built in a language (TypeScript) that I've hardly used myself. I've playtested it quite a bit though, and it's been through a large number of iterations since I started the project.\n\nHere's a rough history of the project so far, including key prompts and links to transcripts.\n\nI started out with Claude Fable 5 back in July:\n\n`We are going to build a mobile friendly RTS game - command and conquer style - called Battle Drones, in which two armies of drones (both flying and ground-based) battle for territory and resources`\n\n`Let's start with a MVP design, ask me some questions`\n\nHere's a [shared transcript](https://claude.ai/code/session_015RYeKm4ji4N16oqthyX1b1). I'd given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI [Image Generation API](https://developers.openai.com/api/docs/guides/image-generation) for assets, which got me some basic sprites.\n\nYou can [try v1 here](https://simonw.github.io/battledrones/v1/) - it looked like this:\n\nIt's recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.\n\nThis first version was barely a proof of concept, and it wasn't any fun to play.\n\nClaude used the [Phaser](https://github.com/phaserjs/phaser) 2D game framework for these early versions. I didn't even realize this until several iterations later!\n\nThe second version ([try v2 here](https://simonw.github.io/battledrones/v2/)) added sprites for all of the vehicles and the \"AI vs. AI\" mode, so I could watch the game playing without having to directly control it myself.\n\nClaude proved reasonably competent at prompting OpenAI's image models to generate sprites. You can browse the v2 sprites in the [public/assets/sprites](https://github.com/simonw/battledrones/tree/v2/public/assets/sprites) folder.\n\nIt still wasn't much fun, and the graphics were boring. It was now October, and I had upgraded to Claude Opus 5.5. I told it:\n\n`Massively improve this game. Make the graphics and gameplay better (keep it mobile friendly). Render new graphics using the latest OpenAI GPT image API (lookup details) with the API key in the environment variable. Add new unit types and balance the gameplay better. Also add new buildings and better, more varied terrain.`\n\nThis resulted in five new maps with generated background tiles in a variety of styles, [visible here](https://github.com/simonw/battledrones/commit/aa22f08a34347d7d9f94b33f44a73b4deb046aa1). Opus also regenerated the sprites, making them much more visually appealing. You can [try v3 here](https://simonw.github.io/battledrones/v3/) - it looks like this:\n\nThis is starting to feel like a real game! It still wasn't very fun to play though - I found myself getting bored pretty quickly.\n\nSo far my Battle Drones experiment was confirming my [previous belief](https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp) that coding agents can build a thing that looks like a game but can't actually make something that's genuinely compelling to play.\n\nI shared this theory with someone over dinner, and then thought to myself that I should give the models a proper chance to prove me wrong. I prompted Opus 5.5 on my phone:\n\n`This game isn't fun enough yet. Make it a LOT more fun.`\n\nThis time I was running in [Ultracode mode](https://code.claude.com/docs/en/workflows), where Claude Code (in this case Claude Code for Web) runs \"dynamic workflows\", described in their docs as:\n\nA dynamic workflow is a JavaScript script that orchestrates many [subagents](https://code.claude.com/docs/en/sub-agents) at once.\n\nThis kicked off *many hours* of work. I started it in the evening and didn't get a playable result back until late into the next morning. But the results were spectacular.\n\nYou can [try v4 here](https://simonw.github.io/battledrones/v4/) - it looks like this:\n\nI had Claude [write its own release notes](https://github.com/simonw/battledrones/blob/main/Battle%20Drones%20The%20Fun%20Update%20%E2%80%94%20Release%20Notes.md) - here are the highlights:\n\nEvery skirmish and Daily Op now opens with a choice, gives the side that's losing a way back, and pulls the armies into the middle of the map. There are also two new ways to play.\n\n**Openers**: pick Blitz, Industry or Air Wing before the clock starts.\n**Call-down powers**: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.\n**Objectives and salvage**: Uplink relays, supply drops and wrecks worth scrap.\n**Feel**: combat juice, adaptive music, unit voices and an announcer.\n**Command**: battle alerts, game speed, saved squads and touch placement.\n**New modes**: Last Stand survival waves and an 8-mission Ops campaign.\n**Progression**: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.\nFights run longer and swing more. In 1,200 AI-vs-AI test matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%. The share of wins by a side that had been 800+ scrap behind rose from 24% to 46%.\n\nPart of the reason Claude took so long was that it ran over a thousand simulated playtest sessions, and used the results to rebalance the existing units, add new ones, and introduce new features.\n\nAfter the success of Ultracode at \"Make it a LOT more fun\", I decided to be more ambitious:\n\n`Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes`\n\nThat was another overnight run. I woke up to [this v5 version](https://simonw.github.io/battledrones/v5/):\n\nThe new 3D models were entirely constructed by Claude in TypeScript code.\n\nv6 ([play v6 here](https://simonw.github.io/battledrones/v6/)) added some more visual polish. v7 ([play v7](https://simonw.github.io/battledrones/v7/)) added robot infantry (troopers, rocket squads, snipers) and a \"Condor\" troop carrying aircraft.\n\nI was beginning to feel guilty at how little actual design input I had into the game - it really had been a case of me saying \"make it more fun\" and \"add visual polish\" for the past few releases.\n\nI'd noticed that the AI didn't use the new infantry and troop carrying aircraft from v7 very often - there wasn't a great strategic reason to use them.\n\nIt would be neat if we had a new map with a new game mechanic that actively encouraged players to load up Condors with infantry robots and send them out into the map.\n\nThis resulted in my longest prompt yet:\n\n`Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.`\n\n`To do this the map will have limited harvester resources but several more uplinks - but uplinks will be on islands that are inaccessible by land vehicles or infantry. These uplinks can also not be claimed using air vehicles. The ONLY way to get them is to fly infantry there in a Condor.`\n\n`Armies always start with a Condor and a single squad. If an army has no Condor a new one will be provided for free, flying in from the edge closest to their HQ and landing there. That free condor will come with a single free squad on board.`\n\n`The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places`\n\n`I want to encourage a battle over uplinks.`\n\n`The map should be the times the size of other maps - still square`\n\n`First research and then critique this design. Only build after we have agreed on any modifications`\n\n`You get to design a new biome for this`\n\nThe result was the tropical **Archipelago** map, with seven island uplinks that players can only capture by flying out infantry in a Condor. It's definitely the most fun map to play, once you've got the hang of the basic game mechanics from the simpler maps. The [v9 edition](https://simonw.github.io/battledrones/v9/) made that map a little more interesting - it now looks like this:\n\nI decided to add giant robot mechs to the game - think Jaegers from [Pacific Rim](<https://en.wikipedia.org/wiki/Pacific_Rim_(film)#Plot>), or Titans from Warhammer 40,000.\n\nHere are some of the prompts I used to brainstorm with Claude:\n\n`Help me brainstorm ideas for adding giant robots to this game - think dreadnoughts or titans from W20K - how could we do this in a way that enhanced gameplay, kept things balanced, added unique twist? Don't overthink this yet`\n\n`Let's keep brainstorming. I like the idea that it's a mobile base - that can accept harvested scrap and can have buildings built near it (even if it later moves on) and can produce infantry units too. An interaction with condor would be neat but I don't know what that could be.`\n\n`Idea: as it gets damage it loses the ability to fire some weapons - by default it has eye laser (like lancers) and arm canons (like titan) and two shoulder mounted mortars, plus machine guns similar to a squad of troops`\n\n`Damage knocks out mortars and then laser - it always has guns. You can't build next to a building that was only put there because of the mech, you need the mech there for off-base building and only within three squares of it`\n\n`[...] Lets do two condors can carry the mech`\n\nThe end result is *really cool*.\n\nGoliaths can be constructed using a Gantry - a building that can only be created after first building a Fab, Bay, Airpad, and Tech Lab. You can see the Goliath under construction, and it then walks out from the Gantry and can march around the map.\n\nGoliaths can \"anchor\", which digs them into the ground. In their anchored state they can act as a new HQ, constructing infantry units and additional buildings in a new area.\n\nTwo Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!\n\nThe game now ends when you destroy the enemy's HQ building *and* any Goliaths they might have built.\n\nThere are also a couple of mutators relating to Goliaths:\n\nThe other v10 feature is **agent battles**. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?\n\n`Fun extra challenge: think about how we might make multiplayer available to coding agents. It would be neat if we could set up a battle between eg GPT-6 Sol and Claude Opus 5.5 where each model has access to a tool which gives them information about the game (presumably non-visual, but only the information they could see through fog of war etc) and lets them control their units etc [...]`\n\n`Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin`\n\nOpus 5.5 went to work on this, producing [this AGENT-BATTLES.md proposal](https://github.com/simonw/battledrones/blob/7001ed186c8b8aef4acb27f680ecf4c09b607e54/AGENT-BATTLES.md) and then implementing and testing it. The feature also includes the ability to record and replay these battles - here's [a replay of Claude Haiku 5.5 vs. GPT-6 Luna](https://simonw.github.io/battledrones/v11/?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json), and here's that same battle [in a separate debug tool](https://simonw.github.io/battledrones/record-viewer.html?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json#r1) that shows the underlying prompt responses.\n\nThe prompt that drives agent battles [can be seen here](https://github.com/simonw/battledrones/blob/d584e351d9d28c4ba058b78ddcca9b93cd9bcd33/llm-tools-battledrones/llm_tools_battledrones.py#L106-L117).\n\nThere are a few more replays like this [linked in the README](https://github.com/simonw/battledrones/blob/main/README.md#watch-ai-models-play-it). I hope to turn this into a full league table at some point in the future.\n\nThis version exists purely because I glanced at my [Claude Usage](https://claude.ai/new#settings/usage) page one day and saw that I'd only used 75% of my weekly allowance and it was resetting in 45 minutes. I decided to see if I could get an extra Battle Drones feature from my remaining tokens, and picked \"random map\" as the target:\n\n`Design and implement a mechanism for generating a random map using any of the available biomes - it should be the size of the largest map and rivers and bridges and rocks and forest and scrap and crystals are all in play. Make them rotationally symmetric and use a seed to allow them to be selected or reused later. You have 45 minutes to build this! Be creative.`\n\nHere's [the transcript](https://claude.ai/code/session_01CfwMwDaK1kLKnRV6di8VMT), and an image Claude generated to show me its work:\n\nI only *just* got this working, so I've not had much time to actively test it yet. The latest Battle Drones now supports multiplayer via two devices sat within microphone distance of each other!\n\nThis feature started out as my [Chirp Pong](https://simonwillison.net/2026/Oct/15/chirp-pong/) experiment from last week. I pointed Claude Code at that working proof of concept:\n\n`Clone Simonw/tools from GitHub and look at recent branches for the example pong game that uses web microphone to implement multiplayer between two phones via audio signals`\n\n`Build a version of that for battledrones`\n\nOpus built [this Radio Probe tool](https://simonw.github.io/battledrones/radio-probe.html) to measure how much bandwidth we could get between two devices and, based on positive results from that, implemented a full audio modem system. I've tried it between laptops, iPhones and iPads so far and it seems to work really well!\n\nWhy use sound for this? Because I [love static HTML](https://simonwillison.net/2025/Dec/10/html-tools/#the-anatomy-of-an-html-tool) that costs nothing to run, and I don't want to spin up a server somewhere and then stay responsible for keeping it operating for as long as anyone might want to play the game.\n\nI know almost *nothing* about game development. This makes it a great opportunity to try out coding agents in a field where my existing software engineering experience has less impact on the results.\n\nGames are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.\n\nThis morning ([via Hacker News](https://news.ycombinator.com/item?id=50168190)) I found [Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop](https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop). I wouldn't personally dream of submitting Battle Drones to an event like this - it's still way too low effort to warrant consideration as a legitimate indie gaming project.\n\n... but I can now see a path to vibe coded games like this being taken seriously. Battle Drones is fun, it looks good, it has innovative features (the multiplayer-over-audio thing is a first for an RTS as far as I can tell).\n\nI'd love to see what someone with better taste than me and a driving passion to produce something truly exceptional could produce!\n\nA few other observations from this project:\n\n`Math.sin()` and `Math.cos()` and friends with `llama.cpp` fame).\nTags: [game-design](https://simonwillison.net/tags/game-design), [projects](https://simonwillison.net/tags/projects), [ai](https://simonwillison.net/tags/ai), [generative-ai](https://simonwillison.net/tags/generative-ai), [llms](https://simonwillison.net/tags/llms), [claude](https://simonwillison.net/tags/claude), [vibe-coding](https://simonwillison.net/tags/vibe-coding), [coding-agents](https://simonwillison.net/tags/coding-agents), [claude-code](https://simonwillison.net/tags/claude-code)", "url": "https://wpnews.pro/news/battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer", "canonical_source": "https://simonwillison.net/2026/Oct/20/battledrones/", "published_at": "2026-10-20 19:34:19+00:00", "updated_at": "2026-10-20 19:48:00.824226+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "generative-ai"], "entities": ["Simon Willison", "Battle Drones", "Claude Code", "Anthropic", "OpenAI", "Phaser", "TypeScript", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer", "markdown": "https://wpnews.pro/news/battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer.md", "text": "https://wpnews.pro/news/battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer.txt", "jsonld": "https://wpnews.pro/news/battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer.jsonld"}}