25 drones, one brain: why the swarm comes in wings
Published
The enemy is a machine swarm, and it comes in wings. Here is why each number is what it is. How it plays: Swarm wings.
25 drones a wing
Why: the first wing was built to “see how a wing works first”: 25 drones. Individual enemy fighters top out at about 100 at 60 fps, so the swarm needed a cheaper unit.
Built 2026-10-24 · scripts/swarm_wing.gd DRONES := 25
One brain per wing
Why: “The wing is the unit: one pilot brain, one target choice, one touch / avoidance check, one marker. The drones are bodies swirling round its centre (a flock), no AI of their own.” So “a swarm costs per wing, not per drone”: about 0.2 ms a wing, about 1 µs a drone more.
Built 2026-10-24 · scripts/swarm_wing.gd SPREAD := 70.0 m, SWIRL := 0.6 rad/s, RETHINK := 0.5 s
Fire spread over up to 5 targets
Why: “a swarm smothers everything near it while a lone Mk3 focuses one”. Each drone takes the nearest of the wing’s targets its gun reaches.
Built 2026-10-24 · scripts/swarm_wing.gd TARGETS := 5
One round in four drawn, with four rounds’ damage
Why: “the same damage a second, fewer tracers”. Every fired round is still rolled for a hit.
Built 2026-10-24 · scripts/swarm_wing.gd TRACER_SHARE := 4
A drone dies per drone’s worth of damage
Why: each drone is as tough as a fighter of its Mark, and the wing’s hull is all of theirs added up. As drones die, “the cloud thins, its fire weakens”. A Mk1 wing has 25 × 90 = 2,250 hull; a Mk1 drone takes about 9 hits from Mk3 point defence, or about 36 from an equal Mk1 fighter’s gun (derived). One hit is not one drone.
Built 2026-10-24 · scripts/swarm_wing.gd set_mark(), hit(); marks.gd HULLS["fighter"] = 90
Never out of ammunition
Why: “a drone is packed full of ammunition”. A wing reloads, with the same pause as a fighter, but never runs dry.
Built 2026-10-25 · scripts/swarm_wing.gd _can_reload()
About 45 to 50 wings at 60 fps
Why: measured, not chosen. The cost is per wing, so the limit is the number of wings, whatever their size: 8,000 drones in 8 wings of 1,000 ran at about 72 fps. Measured during the approach and the chase, not a brawl.
Measured 2026-10-24 · tests/bench_wings.gd