Back to Devlog
    v0.9.18
    FeaturesJuly 15, 2026Release notes

    Press T, Keep Your Mouse

    In-game chat that keeps pointer lock, plus 147 health items that never spawned, every Warsow ammo box, an on-gun ammo counter, and a post-game screen.

    Chat That Does Not Take Your Aim

    Press T and the game keeps pointer lock and mouse look. Game binds are suppressed while typing. Enter sends, Esc cancels.

    Server-authoritative, sanitised, rate-limited, broadcast as chat snapshot events and captured into demos at their original ticks. Wire type MessageType.Chat (0x89). The server replaces control characters with spaces, collapses whitespace, caps at 128 characters, rate-limits to a 600ms minimum interval and 5 messages per 5-second burst window. HUD history holds 100 messages; the closed view shows the last 5 with an 8-second fade.

    The Bug That Meant Chat Had Never Worked

    handleDatagram ignored MessageType.Chat. Not "chat was flaky in the browser build" — chat had never worked for WebSocket clients, ever. Found by writing a protocol smoke suite that actually sends a chat message and asserts an echo comes back.

    147 Items That Were Placed And Invisible

    text
    item_health_medium  (+25 HP)   147 instances across shipped maps
                                    previously never spawned
    
    Every Warsow per-weapon ammo box now spawns and grants:
    ammo_riotgun, ammo_lasergun, ...
    Only ammo_plasmagun was mapped before

    Per-type simpleitem icons for ammo boxes.

    The health fix is documented inline and the reasoning is worth keeping:

    Small health was later corrected to cap at 100 — no overheal — so it stays visible
    at full HP.

    An Ammo Counter On The Gun

    Weapons with a tag_ammo bone and an ammoCounter config render live digits, drawn procedurally into a DynamicTexture because the LCDdigits font was not shipped, on the weapon camera layer. Tuned with cg_ammocounter_scale/_yaw/_pitch/_roll/_fwd.

    Also Here

    Smarter bots: they route through teleporters and jumppads, fire their selected weapon including charged blade shots, use crouchslide, ADS only while attacking, and aim from the weapon fire origin.

    A death and corpse camera pass — smoothed follow bound to ragdoll hips or the gib burst centroid, world clamps, sticky death-time viewmodel. HUD polish. Player model tint, fullbright and outline via cl_team_* settings with an HDR-capable palette. Negative scores no longer underflow to 4294967295 (writeInt32/readInt32, wire bytes unchanged, determinism-neutral).

    A post-game screen: input freeze with free-look, an authoritative winner banner, a locked-open gold scoreboard, a 3D winner-model showcase with weapon, duel overtime at +1 minute and no draws, and endgame music with proper restore. Plus single-match servers (--single-match) with a post-game terminal.

    And the demo player was rewritten end to end on the recorded-tick clock, fixing a ~4.17% slow nominal 1x — 125Hz server asking for 60 snap/s actually records 62.5.

    Known Issues

    npm run test:physics could not validate locally, missing BSP data for wdm7, and bsp load wdm2 could not run — public/engine.json and map_wdm2.pk3 were missing from the configured data path. Browser passes owed for two-window chat both ways, typing while strafing, history scrollback, and demo replay with chat visible.

    Deferred to v1 chat: team-only chat (say_team / Y), mute and ignore, chat commands, chat sounds.