Two Problems, One Release
The console became 45 class files, Quake 3 clip-brush collision landed, and tree-shaking took the bundle from 8.0MB to 3.36MB.
The Console Became A Directory
45+ commands migrated to individual class files under src/engine/console/commands/, with a Command base class and CommandRegistry providing auto-discovery of command files.
Commands can require developer 1 for access. New: cvarlist, toggle, set, reset, resetall, exec, bind and developer.
The cvar system arrived here, formally — Cvar.register('r_shadows', true, {type, description, onChange}), Cvar.get, Cvar.set — with r_*, s_*, g_*, m_* and cam_* categories, after having been written in v0.8.15.
Quake 3 Collision
Q3CollisionBackend: SlideMove with multi-plane clipping, StepSlideMove with 18-unit maximum stair stepping, and clip brush meshes for fullclip, playerclip and caulk. Content and surface flags: SOLID, PLAYERCLIP, DETAIL, NONSOLID.
freefly_collision on|off|mode freefly_speed 500This is the release where the engine stopped gliding through Quake geometry and started respecting it.
The Numbers
Bundle: 8.0MB -> 3.36MB (58% reduction)
Total JS: 4.24MB with code splittingAlso: memory leak prevention — every map object tagged mapOwned: true, with EventBus subscriptions, observers and handlers cleaned up, plus leaktest maprenderer and leaktest mapcycle. Headless CI entry: npm run cli:game -- --command "map wdm7; bsp info; quit".
The Honest Bugfix
freefly_speed - Fixed cvar registration (moved after class definition)A cvar that had to be registered after the class it belongs to existed. It is the v0.8.10 wrap-mode bug and the v0.9.11 dt / queue.length bug in embryo: a registration order that nobody tested because the console it printed to was not the console anyone was looking at.