Awards, a Spectator Camera, and a Demo Player
Server-authoritative awards, directional damage indicators, framerate-independent physics, a chase camera, and gzip-aware demo playback at up to 4x speed.
Awards Are Decided On The Server
AwardTracker inside GametypeController:
frag first_blood
on_fire at 5 kills
raging at 10
unstoppable at 15Presented as an AwardBanner in Orbitron with --w-gold, centred at 35% from the top, in a sequential queue. BinaryProtocol event code 12 ('award'). The EventFeed replaced the kill feed entirely.
Damage Arrows
A Canvas2D directional overlay: red vignette plus scattered triangles weighted by damage direction — 12-70px, 28-60 triangles, 0.35-1.4s flash, intensity scaling with damage, and an oversized splash at 50+ damage.
Pain camera shake now fires for all damage types — hitscan, beam, projectile, melee — at 5-60% of max.
The Physics Fix
Use full dt per command (not dt/queue.length)
Removed queue=0 stale-input simulationThis is v0.9.10's double-simulate() bug from the other end. In v0.9.10 the queue was simulated too many times; here it was simulated for too little time. Bots now send input at 125Hz from a timer loop with AI decisions cached and re-sent.
Also fixed: retreat setting BACK without clearing FORWARD, dodge not setting LEFT/RIGHT flags, and combat targeting state.players[0] instead of visionResult.visibleEnemies[0] — shooting at somebody who was behind a wall.
Spectating And Demos
SpectatorController with exponential smoothing and a snap past 500u, yaw wrap, SpectatorCycling with an alive list and auto-select, watchOnly mode, and a challengers queue past maxClients (maxSpectators default 8).
DemoReader.fromFile() is async with gzip auto-detection (0x1f 0x8b) via the browser DecompressionStream or Node zlib.gunzipSync. DemoViewer plays at the recorded snapshot rate with play/pause, seek, and 0.25x to 4x speed.
And The Type Cleanup
677 total tests (was 462)
~204 any casts eliminated across 29 rendering files
Biome errors 74 -> 36, warnings 644 -> 296Known Issues: none stated.