A flash blinds 70% of the map, so somebody is always blind #19
shipped production is serving it deploy b42aa0d
A flash now blinds you only if you were looking at it, reaches a room rather than the map, and bots throw it to take a site instead of the moment they buy it.
The rule, built as the gate benjivers described. facingFlash in src/abilities.ts decides whether: anywhere inside the screen's 37.5° half-angle is the full duration, a quick grace falls to nothing by 55°, and beyond that is zero. flashReach decides only how long: full near the pop, a flicker at the edge of the radius, nothing past it, and never zero while the light carries, so staring at one is never survivable by distance. A wall or smoke between you and the pop still saves you. Every flash radius is 320 to 360 (was 800 to 900, which was 70% of the map by area).
Bots. flashCall in src/bots.ts throws only where the pop lands in front of the enemy as they stand, never within a fuse's run of the thrower or a team mate, never while a team mate looks at the spot, six seconds after the team's last and twelve after its own, and only to take a site: on the way in, or back onto the planted spike. A bot plants its feet on the tick it throws; the aim code used to swing the barrel the same tick and put the flash into the wall beside its head.
Measured headless, eight seeds, before and after:
| before | after | |
|---|---|---|
| flashes a round | 6.48 | 1.16 |
| live player-seconds blind | 4.36% | 0.74% |
| live seconds somebody is blind | 15.97% | 6.14% |
| blinded per flash: self / own team / enemy | 0.20 / 0.43 / 0.23 | 0.00 / 0.00 / 0.92 |
Most of the old blindness was the thrower and their own team. src/bots.test.ts plays the match and keeps those numbers; src/abilities.test.ts holds the radius, the gate against the renderer's FOV, and the facing-then-distance rule. One old test was rewritten because it encoded the 900 radius and a 45° full cone.
To feel it in the preview: stand on a site facing the entrance and wait for an attacking bot's entry flash. Look at it and you eat the whole 1.7 seconds. Turn 60° away before it pops and nothing happens. A bot's flash never lands on you from across the map or from behind your shoulder.
🤖 Generated with Claude Code
A flash is now the size of a room, blinds only what was on your screen, and bots throw it to take a site rather than in every duel.
The number. A bot match run headless over the same eight seeds, before and after:
The old flash blinded the thrower's own side three times as often as the enemy. The new one blinds one enemy, on purpose.
What changed. In
src/abilities.tsevery flash radius is 320 to 360 (11% of the map by area, was 70%).flashDurationtakes the radius: full strength inside 40% of it, fading to a 20% flicker at the edge, nothing past it. The cone is half the renderer's 75° field of view, full inside 20°, so a pop that was not on screen does nothing. Insrc/bots.ts,flashCalldecides a throw: only where the pop would land in front of the enemy as they stand (a throw that flies past somebody facing you pops behind their head), never within a fuse's run of the thrower or a team mate, never while a team mate is looking at the spot, six seconds after the team's last and twelve after the thrower's own, and only on the way into a site or back onto the planted spike. A bot also plants its feet on the tick it throws: the aim code used to swing the barrel up to 13° the same tick and the flash went into the wall beside its head.Tests.
src/abilities.test.tsholds the radius, the falloff and the cone againstFOVinstatic/raycast.js. Newsrc/bots.test.tsplays the corridor scenarios above and runs the headless match, printing and asserting the numbers in the table. The one existing test I changed was written for the 900 radius and now states its radius.What to look at in the preview. Take a seat and stand on a site with the defenders. In the first ten seconds of a live round you should see at most one flash come in, and only if you are looking at it; turn away as the yellow dot flies and you keep your sight. What I chose not to do: shorten the blind durations or touch the client overlay, since the numbers above came from the simulation alone.
🤖 Generated with Claude Code
Closes #18