Our bots got worse when we let them learn
We gave the sniper bots a way to correct their aim after every miss. The hardest difficulty got worse, not better. The reason is the same reason a real shooter with a shaking hand can't fix a bad zero by trying harder.
Every bot in the game aims with the same solver a player's reticle uses: real drop, real wind drift, the same ballistic table. That part was never in question. The question was whether a bot could get better over the course of a fight — not scripted-better, but actually adjusting its own aim based on what just happened, the way a person does after a miss.
The idea
Bots don't see the true wind. Each one carries its own persistent misreading of it for the length of an engagement, plus a Gaussian hand-shake that gets tighter as difficulty goes up. On top of that, after every miss, a bot nudges its aim by a fraction of wherever the round actually went — a learning rate. The obvious move for the hardest bots was to turn that fraction up. More learning, more correction, a bot that visibly zeroes in the longer a fight goes. That was the plan.
What actually happened
We ran the encounter through a headless simulation harness — about 400 trials per difficulty, per range — before trusting the feeling of watching it. At the ranges that matter, the bot's random hand-shake dominates the error far more than any persistent bias does. Turning the learning rate up to its maximum didn't sharpen the aim; it made the bot chase its own tremor. At 900 metres, an Elite bot's first-shot hit rate was 28%. After it had been "learning" for a while, that dropped to 15%.
It makes sense once you see the shape of the error. Learning from a miss only helps when the miss tells you something true about a bias you can correct. When the miss is mostly noise, "correcting" it just adds more noise on top. A bot that overreacts to its own shaky hand ends up shakier, not steadier.
The fix was to turn the dial back down, not up: the learning rate now sits between 0.25 and 0.35 for every difficulty. Low enough that a bot can't talk itself into a worse aim, high enough that its tracers still visibly creep toward you over a longer engagement — which turned out to be the part that actually reads as "smart" to a player. Not a perfect correction. A believable one.
The numbers that shipped
- PVP, per shot at ~600 m: Rookie 14%, Veteran 24%, Elite 46%.
- Tower Duel, per shot at ~2.5 km: Rookie 9%, Veteran 18%, Elite 41%.
A test now locks this shape in place: the duel bot has to be able to hit at all, the difficulties have to stay ordered, a zero-error bot (gusts off, for testing) has to clear 97%, and Elite is not allowed to quietly turn into an aimbot. If a future change moves any of those numbers, the test fails and says exactly which one.