Back to Devlog
    v0.9.21
    GameplayAugust 6, 2026Release notes

    A Baseline Eight Times the True Figure

    Search & Destroy, Quad Damage finally implemented after sitting inert on 25 maps, 31 dead teleporters revived, and a lint ratchet that had been measuring the documentation.

    The Line That Sums Up The Release

    text
    a baseline eight times the true figure is a rubber stamp, not a ratchet

    The biome baseline read 902 errors and 575 warnings. It was linting the FPS manual's VitePress output (dist-docs/, written inside the submodule) and VitePress's dependency pre-bundle cache. 98 files carrying ~2,200 of ~2,300 errors; 11 vendor megabundle cache files accounting for 815*.

    Real source: 79 errors / 343 warnings.

    Verified by hand: a file with one any and a missing semicolon passes the gate at
    902 and fails it at 79.

    A gate that cannot fail is worse than no gate, because it is a gate.

    Search & Destroy

    Round-based bomb-and-defuse, Warsow Bomb compatible, replacing TDM on the menu. Test pool wbomb2 ("Reactors"). The TDM code is kept and its tests pass — it just stops being offered.

    Rules were ported from progs/gametypes/bomb/*.as inside data0_21pure.pk3, which corrected four inferred mechanics, including:

    text
    arm/defuse radius: 100 units from the planted bomb, not the site
    arm/defuse progress: shared and decaying, not per-player

    Warsow timers: 30s bomb, 4s arm, 7s defuse, plant below 400 ups on flat-enough ground, 90s rounds, score limit 10 with two-round tennis.

    Wire: entity delta flag 0x40 (a 1-byte powerup mask, sent every snapshot), events powerup_state (18) and powerup_spawn (19), JoinGame's has-team byte widened in place. Expiry is an absolute server tick.

    Quad Damage, After Sitting There For Months

    item_quad was placed on 25 of the 38 shipping maps, exactly once per map — and did nothing. No def, no pickup type, no effect.

    Now 4x damage for 30s, 120s respawn, 15s first-spawn delay, lost on death, and re-taking extends rather than resets. Q3-classic scope: damage to others, damage to yourself, and knockback, applied in CombatSystem.processDamage, stacking with the headshot multiplier. The carrier glows red at 1.5Hz.

    Geometry is procedural — a faceted double-pyramid gem in four counter-rotating blades — because there is no quad model in the pk3. Three sounds. HUD gold countdown slab sampled from Warsow's quad.tga at rgb 224,192,0.

    31 Teleporters That Had Been Dead

    The BSP trigger extractor only accepted target_position, misc_teleporter_dest and info_notnull. Any trigger aimed at target_location (wdm12/17/18/19, wbomb6, wda1, wdm11, wtutorial1) or Q3's info_teleport_destination (wbomb2, wctf1, wda4) was silently dropped.

    All 38 shipping maps were surveyed. 0 existing destinations changed, 31 previously-dropped triggers now resolve.

    Three Collision Fixes With Numbers Attached

    1. 1.Baked misc_model decorations no longer collide — but world triangle soup

    still does: 336 walkable surfaces across 10 maps were held up by nothing else, and the intermediate "drop all soup" build produced 30 bottomless holes.

    1. 1.CONTENTS_DETAIL solid again. wbomb1 462 brushes and wdm12 199 had

    become walk-through.

    1. 1.Face collision uses the asymmetric support point instead of `max(|mins|,

    |maxs|)` per axis, which had floated resting players exactly 16 units above every patch and soup surface — head half-height 40 measured against a foot of 24. Measured: 65 spawn and item points settle 2-16u lower, 0 lost support, 0 raised across 1733 drop probes.

    And Remote Players, 97 Units Off

    Pure render transform, not simulation — a headless yaw sweep showed 0.0000u of drift. Mixamo root motion on mixamorig:Hips at MODEL_SCALE 36 is 82u forward on a run, 39-51u sideways, 246u on a slide, and the yaw-rotated anchor turned it into a circle.

    PlayerModelManager.resetRootMotion() walked getChildTransformNodes(true) — direct descendants only — while vanguard.glb nests __root__ > RootNode > mixamorig:Hips. The Hips branch was dead code.

    text
    Repro: 97.5u before, 0.4u after

    Balance, Then Ragdolls

    Plasmagun 187.5 DPS → 144 (125Hz cannot express 12.5 shots/s, so it lands on 13 ticks). Riotgun blast 100 → 90 by cutting pellets 20 → 18. Machinegun's near-free 40-round 0.13s "reload" replaced with a 30-round clip, 120 reserve, 1.5s. Voltaic's 60-cell clip — which stalled ~31% of the time — became 120 cells plus 60 reserve, 0.5s reload, beam ~2.9s → ~5.8s, effective 100 → 134 DPS. Gunblade removed entirely.

    Ragdolls now fly along the knockback that killed you. The client threw away the server vector, renormalised horizontal to flat 600 u/s, fixed a 300 u/s vertical pop, and on a zero-horizontal kill — "the most common death in the game" — picked a random compass heading at full speed. Now the full 3D direction at 670 u/s, and a degenerate direction pops straight up.

    Known Unverified Items

    Quoted from the changelog without softening:

    Bots hold at their spawn in Search & Destroy — open, and the largest thing this
    release ships without.

    Also: the collision and root-motion evidence is headless only. 31 newly-live jumppads and teleporters have never fired in this engine. Quad has never been seen in the client — gem, red pulse, HUD slab, all three sounds — and quad balance is unplayed. Bots do not know quad exists. Enemy outlines leak about a pixel through thin geometry, "Reported and left as-is deliberately". The lightmap gain is "a per-format bet on one map's evidence" (n=1).

    No S&D round has been played human-vs-human.