Repository navigation
Releases: simonw/battledrones
Release list
v13: Online multiplayer
Play this version: v13
Download the build: v13.zip
Online duels: send a friend a link (or let them scan a QR code) and play a 1v1 skirmish against each other over the internet, phone to phone or in any two browsers. Plus a Copy replay JSON button on every end screen, and a new page showing every 3D model in the game.
- Online duels 🌐: tap Duel a friend online on the Skirmish tab. The lobby shows an invite link and a QR code of it, with Share and Copy buttons. Your friend scans the code with their camera or opens the link, taps Join the battle, and you're both picking openers on your map and mutators, blue against red. It's built on the same lockstep engine as sound duels: both browsers run the whole simulation, and only the players' orders cross the network. They travel through a tiny relay server, about 200 lines of Python on Fly, which pairs the two browsers by room code and forwards messages between them without storing anything. A dropped connection (a network switch, a phone that slept) reconnects by itself and the match carries on. Rematch swaps sides and meets in the same room. Online duels work in every browser, need no microphone, and count toward the same win/loss record as sound duels. PR #38
- Copy replay JSON 📋: every end screen now has a Copy replay JSON button, whether you won, lost or drew: skirmish, the Daily Op, Last Stand, Ops, AI vs AI, duels, and even a replay you're watching. It copies the whole battle as a record: the setup, every order both sides gave, and a checksum every 10 seconds. Paste it into 🎬 Watch a replay on the menu to watch the match again exactly as it was played. Replays now also support Last Stand and Ops battles. PR #38
- 3D models page: models.html shows every unit's 3D model beside its info card, to turn and zoom, with its animations to play (walk, aim, fire, fall). A Buildings tab covers every building, plus the Uplink relay and the supply crate. PR #34
- Sound duel noise warning: the sound duel's lobby now warns that the link plays a constant high-pitched noise for the whole match, which many people find unpleasant and which may cause headaches. PR #36
- Smaller changes: a sound duel now goes full screen only after the audio link is set up, so the microphone prompt isn't hidden behind it. The project is now under the Apache License 2.0.
Commit: 63e652e
v12: Sound duels and new models
Play this version: v12
Download the build: v12.zip
Sound duels: two phones on a table play a 1v1 skirmish against each other with no network at all, sending their orders to each other as sound. Plus a cinematic camera for AI vs AI matches, and new Flak Crawler and Mortar models.
- Sound duels 🔊: tap Duel a friend (sound) on the Skirmish tab. One phone taps Host (its map and mutators), the other Join. Both phones run the whole game in lockstep, and only the players' orders cross the air, carried by an acoustic modem. Each phone sends in its own band (around 9.5–12.5 kHz and 16–19 kHz), with a lower band to fall back on. Lay the phones flat 10–30 cm apart: the lobby shows how well each phone hears the other, then both pick an opener. Pausing on one phone shows "Friend paused" on the other, and you can resign from the pause menu. The report has a Sound duel section with link quality and a check that both phones saw the same battle, plus Rematch (which swaps sides) and Save battle. Duels keep their own win/loss record and don't earn XP, medals or stars. The button only shows in browsers that can run the modem (an AudioWorklet and a microphone, over HTTPS). It's been tested end to end in simulation and in the browser, but only a little on real phones so far. The full design is in SOUND-DUEL.md, and the research behind it is in reports/. PR #31
- Cinematic camera 🎥: AI vs AI matches now direct their own camera, on by default. It follows the busiest fight, cuts between the two armies when things are quiet, and jumps straight to surprises: a calldown, a Goliath rolling out or falling, the first shot at an HQ, an Uplink changing hands, a veteran dying. It zooms in for tight fights and out for spread-out ones. Pan or zoom yourself and it hands you the camera, taking it back 8 seconds after you stop. Toggle it with the 🎥 button above ⚡ or the C key. PR #32
- New Flak Crawler and Mortar models: both were too easy to mistake for tanks at play zoom. The Flak Crawler is now a spider tank on six walking legs with four guns pitched at the sky, and the Mortar is a siege mortar on four big wheels with one huge banded barrel. Their HUD portraits are reshot to match. Stats and sizes are unchanged. PR #29
- Stuck touches on iOS fixed: iOS Safari can end a touch without telling the page, for example after an abandoned edge swipe. The game then counted that finger as down for the rest of the match, so tapping to select, box selection and orders all stopped working. It now notices a finger that is no longer on the screen and forgets it. PR #30
- Smaller changes: radio-probe.html measures a phone-to-phone sound link,
?side=redplays a skirmish as red, andtools/vite-https.config.tsserves the dev build over HTTPS for testing duels on phones.
v11
Play this version: v11
Download the build: v11.zip
Random maps: a seed grows a new symmetric battlefield on any of the five biomes, and you can preview it in full or play it blind. Plus five more battles between AI models, and replay links that keep working as the game changes.
- Random maps 🎲: a new card on the menu grows a 108×108 map from a seed, on any of the five biomes. The seed picks one of six layouts: a great river, twin moats, a central lake, a canyon with passes, a forked river or badlands mesas. Every map has rivers, bridges, fords, scrap, crystals, roads and Uplinks, and is symmetric between the two sides like the hand-made maps. Its ground is painted in the browser. Seeds are short codes: reroll, type one in (any text works) or share a
?map=link. Last Stand can be played on random maps, but they don't earn career stars. PR #27 - Preview it, or play it Uncharted: 👁 Preview shows the whole map before you play, with both HQs, the Uplinks and the supply-drop sites marked. 🌫 Uncharted plays it blind: the menu shows only the map's biome and code, unexplored ground is fully shrouded, Uplinks stay hidden until you scout them, and the end screen reveals the map. PR #27
- Straight diagonal bridges: a diagonal bridge is now one straight deck instead of a staircase, including the ones on Riverlands and the Archipelago. PR #27
- More agent battles: the agent tools now support the Goliath Armada mutator, with anchor, pack-up and lift orders, and anchored Goliaths that train infantry and harvesters. There are five new showcase battles between Claude Opus 5.5, Claude Haiku 5.5, GPT-6 Astra, GPT-6 Luna and Gemini 4 Argon: watch them from the README.
- Replays pinned to versions: the showcase replay links now open v11, where each battle is known to replay exactly. Other versions of the game no longer warn about every replay recorded on different game code. They check it in the background and warn only if it really plays out differently, with a link to the version where it doesn't. PR #28
- Smaller changes: the prompts used to build the game so far are collected in web-session-prompts.md, and
npm run mapgenwrites PNG previews of generated maps.
Commit: COMMIT
Goliaths and agent battles
Play this version: v10
Download the build: v10.zip
A new mobile-base mech, the Goliath, and agent battles, where AI models play Battle Drones against each other.
- The Goliath and the Gantry: the Goliath is a mobile base. It strides on planted feet, digs in on hydraulics and stabiliser spikes, can be lifted by Condors, and topples when it dies. The Gantry builds it in stages you can watch. A side that loses its HQ and every Goliath loses the game. The enemy AI builds and fights with Goliaths too, and they come with their own HUD panel, radio lines, base alarms, after-action report entries and medals. PR #23
- Three new mutators: Nomads 🦿, where each side starts with an anchored Goliath instead of a base. Robot Love 💘, where two enemy Goliaths that meet fall in love and the battle ends in a draw. Goliath Armada 🚁, where each side starts with nothing but four Goliaths in the air, each carried by two Condors. PR #26
- Agent battles: an arena where AI models play each other through tools that only show what their side can see, in 5-second rounds. It includes an
llm-tools-battledronesplugin for LLM, battle records, replays from the game menu,?replay=links and showcase battles. The simulation maths is now deterministic, so a replay plays out the same in every browser. See AGENT-BATTLES.md. - New models and portraits: new Raptor, Lancer and Hornet models. HUD portraits are now rendered from the 3D models in blue and red.
- Smaller changes: the Titan is renamed the Mastodon, there's an iOS Home Screen icon (PR #17), and map terrain URLs are versioned so the service worker no longer serves stale terrain paint.
Commit: 360595c
A more natural Archipelago
Play this version: v9
Download the build: v9.zip
The Archipelago expands from 96×96 to 108×108, giving its gulf islands more breathing room and a more natural landscape.
- Redesigned gulfs and islands: distinct island shapes, wider stretches of open sea, headlands, coves, reef shoals and limestone sea stacks, with freshly repainted terrain. The central lagoon, two bridges and HQ-to-bridge distances are preserved, and the map remains symmetric between the two sides. PR #15
- Correct fight directions: off-screen fight arrows now point south, southwest or southeast correctly when a battle is behind the tilted camera. PR #14
- Playable release archive: GitHub Actions now publishes the current game and every tagged version at its own URL, with downloadable ZIPs reused to speed up future deployments. Automated tests run separately. PR #12, PR #13
Commit: 3ca11d8
Archipelago
Play this version: v8
A large tropical island map built around transporting infantry to seven Uplinks, maintaining garrisons and controlling the air. Includes island-aware AI and substantial pathfinding improvements.
Historical milestone: October 10, 2026 (Pacific Time).
Pull request: #11
Commit: 1f4f25d









