Split The code is public; the app answers only to the crew.

The flashbang: the grenade that opens a site, and the blindness rule behind it #159

Closed opened this
Closed without merging

Pushed. `bun run check` is green (708 tests, types clean), the app boots and `/` answers.

stopped closed without shipping deploy 7428468

opened this

Pushed. bun run check is green (708 tests, types clean), the app boots and / answers.

A flashbang, $200 in the buy menu, in the same pocket as the HE and on the same key.

src/client/flash.ts is the whole rule and knows nothing about the game: it takes the flash's position, an eye, a view direction and the answer of one trace, and returns seconds — 3.4 at most, square in the face inside 300 units, falling with distance to nothing at 1400 and with how far off your view it went off (a fraction behind you, zero through a wall), with anything under 0.3 s rounded away so a flicker is never a white screen. A player carries one number for it, blindUntil; hud.ts turns it into white (0.9 alpha at the very worst, decaying linearly, drawn under the scoreboard and the damage report so information you asked for is not taken away) and bots.ts turns it into hands. flash.test.ts covers the three cases and the boundary at the edge of the view, where one degree costs a hundredth of a second rather than everything.

grenades.ts grew a second kind and one constant — the arc, the gravity, the bounce and the fuse mechanism are untouched; only FUSE[kind] (1.4 s for a flash) and what world.ts does at detonation differ. world.ts gained five small things: the field, its reset in startRound, the "flash" sound name, kindOf on the throw, and a flashbang() beside detonate(). Friendly fire applies — your own flash blinds your own side and you with them. The bot handicap went in where a bot already reads its skill: every reader of aimError and reaction now goes through hands(), which adds up to 30° of aim error and 0.8 s of reaction in proportion to how blind the bot is, so there is no new branch in the shooting code and observe.ts's 32 numbers are untouched.

Worth looking at in the preview: buy a flashbang in the freeze time, press <kbd>4</kbd> twice to cycle to it, and throw one at your own feet to see the white and hear the crack panned where it went off; then throw one into a site and walk in. A CT's buy list is ten rows long now, so the tenth row answers to <kbd>0</kbd> — without that the defuse kit would have lost its digit.

I did not touch the HE's numbers, did not give the bots a reason to buy or throw either grenade (#58's shape), and did not go near smoke (#37). Measured: a detonation is one trace per living player in range — ten at the worst — which costs 3 µs on top of a 68 µs tick, once, on the tick the fuse ends.

🤖 Generated with Claude Code

Closes #110

commented

Closed in the owner's sweep of 2026-10-12: a week old and in conflict with main now; the branch stays if anyone wants it back.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs