WARBIRDS.IO Dev Log

← All posts

The kill that took twenty minutes

The report came in the usual shape: “air-to-air kills are too hard.” No numbers, no repro — and, as usual, right. By the time we were done measuring, the complaint had a precise address: your bursts were landing, your damage was real, and your kills were dying at the last gate anyway. An average pilot was scoring about one kill every twenty minutes in a sky where the war itself logged one every seventy seconds.

Numbers before constants

House rule: nobody touches a balance constant until the feeling is a number. So the headless probe — the same rig that settled the “bots hammer me” report — grew an offense funnel: for a simulated human in a full 36-plane match, how often is there a shot to take (an enemy inside 700 m, within ~12° of the nose)? How often is the trigger down? How many rounds connect? How many kills convert?

Shipping config, four skill tiers, four seeds, ten sim-minutes each: opportunity was healthy — a takeable shot existed 21–33% of alive time. Hits landed — 0.8–4 per minute. Kills: 0.0–0.2 per minute. The funnel starves exactly once, at the end.

The arithmetic is brutal and simple. A quad-.50 round does 4 damage; a Sparrowhawk carries 100 hp; a kill therefore wants ~25 connecting rounds on one airplane. And connecting is the hard part: the hit sphere is 5 meters, which at 300–700 m of gun range subtends less than one degree of aim. Pilots were landing four rounds a minute, spread across every plane that crossed their nose. Twenty-five on the same one? Twenty minutes.

The bake-off

Candidates went through the probe like everything else, each judged on three numbers at once: human kills up, bot pressure on the human flat, and the bot-vs-bot kill rate flat — the skies have to stay lively, that's the whole show. The symmetric fixes failed exactly the way you'd fear. Widening the hit sphere for everyone (5 m → 8 m) doubled bot-on-bot kills — we'd have traded “kills are rare” for a sky that churns like a blender. Hotter rounds for everyone (+50%) barely moved the human's kill rate at all, because damage was never the starving gate — connecting was.

What passed was the asymmetric pair, applied only where a human's round meets a bot: humanVsBotHitRadiusMult 1.3 — forgiveness on the exact gate that starves — and humanVsBotDamageMult 1.5 — a shorter bill. Measured: human hits +70%, human kills +77%, bot pressure flat, bot-vs-bot flat. Human-vs-human never sees either multiplier; PvP stays exactly fair. No one will ever read a patch note and feel handled — your bursts just bite the way they always felt like they should.

The anatomy, and the hole in the ledger

Then a sharper question came back from the bench: in a tuned combat sim, most kills should be a committed burst — a few seconds of saddle time that either downs the plane or breaks it off streaming smoke. Were ours? We taught the probe to autopsy every kill in the world: whose damage was on the victim, and when.

They were not. Only 0–10% of kills were decisive (the killer dealing ≥70% of the victim's damage in the final ten seconds). The average kill carried the fingerprints of five different attackers. Warbirds' air war was death by committee: everyone chips, somebody collects, and the somebody is a lottery.

The autopsy also found an accounting hole. A plane you shoot into the ground pays out only if it augers in within six seconds of your last hit. A plane you've truly broken — engine dead, gliding, done — that takes ten seconds to meet the dirt pays nobody. Those uncredited cripple-crashes run at 0.15–0.37 per sim-minute against ~1.0 credited kills: somewhere between a fifth and a third of earned kills were evaporating at the ledger. So the rule changed: a crash now pays the attacker who dealt the most damage in the last 30 seconds — provided they dealt at least a fifth of the plane's health, so the pilot who broke it collects, a stray graze doesn't, and a clean pilot-error crash stays nobody's kill. Measured after: credited crashes tripled, nobody died any faster, and the remaining unpaid crashes are the committee-broken planes where no single attacker earned the name — which feels right.

The confession

We also built a two-browser duel rig — a real client chasing a real straight-line target through the actual mouse-aim pipeline — and its first honest result was about us: our synthetic hand, even chasing the game's own lead pip, landed zero hits in five runs while bots shot it down four times in 2.5 minutes. The instrument measured the complaint from the receiving end and its own motor limits at the same time. It stays in the toolbox anyway: its numbers can't flatter us, and the day a gunnery change makes hitting genuinely attainable, its zeros will flip — the cleanest before/after signal there is.