Back to Devlog
    v1.0.0-alpha.3
    1.0 Alpha 3October 24, 2026Release notes

    Road to 1.0: Straight Into the Fight

    Quick Play with bots, fewer map draw calls, smoother combat and a clearer split between Washoi and SHAG Engine. Another big step toward 1.0.

    The Next Stretch of the Road

    An arena shooter has a simple promise: get into a match, find your rhythm, and let the next fight hold your attention.

    There is quite a lot of work hiding inside that promise.

    Alpha 2 was the bot-logic hotfix. It made opponents more responsive to what they heard, more purposeful about where they went, and better at getting themselves out of trouble. Alpha 3 reaches much further: the path into a match, the work happening during a firefight, and the structure underneath the whole game.

    This is another big step on the road to 1.0.0. More of the game is ready before you need it, more rendering work is shared instead of repeated, and getting a busy arena to yourself takes a lot less arranging.

    One Key, Four Opponents

    A quiet lobby should still have a way into a fight.

    The new Quick Play key opens a private Free-for-All room, brings in four bots, votes for a random map and readies you once the last opponent arrives. You pick Quick Play; the game handles the room setup.

    It is a direct route into trying the movement, learning a map or finding out which weapon feels right today. If the bot service cannot supply an opponent, the flow stops in the room without readying you into an empty match.

    Bots are easier to find elsewhere too. The Private lobby key now explains that it is also for bot matches. Add bot works in public rooms: using it makes the room private, tells everyone about the change and turns the room link into an invite link friends can still follow. Bots do not take places reserved for queued players or enter public ranked matches.

    Free-for-All also waits for at least four ready players, with room for eight. Opponents wear individual colours from the team palette, so the bot that just escaped your rocket is easier to recognise when it comes back around.

    Load the Fight Before the Fight

    A loading screen should be doing useful work while it has your patience.

    Previously the game prepared pickup models during loading, then started loading your held weapon after the screen had closed. Projectiles had a similar problem: early snapshots could ask for models before the scene or their definitions were ready. Their first proper appearance could arrive with texture loading and shader compilation in the middle of a match.

    Held weapons and projectile models are now prepared during map loading. Their materials are warmed up there too, and the prepared first-person weapon view is reused when you join.

    Loading also keeps combat sounds, voices, announcers and ambient loops quiet until the screen finishes fading. Music continues, your saved sound settings are kept, and delayed shots do not all announce themselves in a burst afterward.

    The handover into the arena should feel like arriving ready to play.

    Stop Spending a Frame on the Same Work

    The performance pass follows the firefight all the way down to individual textures, materials and collision checks.

    Hitscan effects used to find an impact by testing against the rendered map's triangles. That is a costly way to answer the same question for every riotgun pellet. They now use the map's collision brushes, as the server does. In the recorded washoi_dm5 comparison, a ray went from about 2 ms to 0.015 ms. Shots also stop at weapon clip consistently with the server; surfaces marked to reject impact marks and shots into the sky are respected.

    Explosions used to build their own meshes, update fireball vertices on the CPU and run a fresh spark system. They now draw as instances of four shared meshes, with animation handled on the GPU. Spark systems are reused instead of repeatedly releasing and rebuilding their shader. The distracting splash radius disc is gone, and plasma trails are short streaks again.

    Models share their original textures when copied. Held weapons, dropped weapons and spinning barrels reuse read-only materials on WebGL. Switching to the blade no longer makes the frozen map materials reconsider lights that cannot illuminate a wall. Models arriving during play also stop triggering another round of map shader compilation just to change a light cap.

    Each of those changes removes work from the moment a player is trying to aim.

    Draw the Map Once

    Soft lamp halos and water need depth information. They had each been drawing the scene again to get it, on top of the normal frame.

    On WebGL2 with post-processing enabled, both now read depth already drawn by the main pass. In the recorded plasma timedemo on washoi_dm5, draw calls fell from 389 to 195, median frame time went from roughly 10.8–12.0 ms to 8.9–9.4 ms, and GPU time fell by about a third.

    Those measurements belong to that map, workload and rendering path. They give us a useful before-and-after comparison; a different browser, GPU or match will have its own result. WebGPU keeps the separate depth passes for now.

    The graphics presets get a practical adjustment too. Balanced starts with bloom off and 4× texture sharpness, while keeping full-resolution textures. Smooth disables soft halos, trading their soft intersection with walls for less rendering work. Existing saved choices are preserved.

    Same Arena, Fewer Pieces

    Drawing the map once still leaves a question: how many separate pieces does the renderer have to send to the GPU?

    A wall texture can appear across several pages of a map's baked lighting. Each page used to split those surfaces into another mesh and another draw, even though they shared the same wall texture.

    FBSP maps now keep their static world's lightmap pages in texture arrays. Think of the pages as layers in the same book: each surface still reads its own lighting, but surfaces using the same wall texture can share a mesh across pages. The baked lighting stays intact while the renderer submits fewer pieces of the arena.

    On washoi_dm5, the solid map went from 178 meshes to 133. In a separate plasma timedemo comparison, median draw calls fell from 191 to 172, about ten percent. Frame times on the profiling machine stayed within measurement noise; the clear result is less draw-submission work for the CPU. The older IBSP map path and moving brush models keep their existing lightmaps.

    Other players' and dropped weapons get a similar economy at a distance. Sights, sight displays, glass and halos stop drawing beyond 400 units; glow strips stay until 700 units. The gun body and barrels remain, so the parts that identify a weapon stay visible while tiny details stop costing separate draws. The recorded plasma timedemo went from roughly 33 weapon draws per frame to 24.

    The aim is to spend the frame on the fight you can see, with less CPU work spent submitting lighting splits and distant details.

    Small Repairs You Can See

    A muzzle flash should leave the barrel, even when you are strafing. The Voltaic beam should do the same. Both now use the camera position just before the frame is drawn, so they stay attached to the weapon while moving.

    Plasma bolts have their textures and additive glow again. Mounting another package no longer leaves the shader registry temporarily empty, and materials discard cached fallback properties once their real scripts become available.

    Chat is larger in matches, on the end-of-match board, in the lobby and in rooms. Free-for-All players also have their own team identity internally, so their messages stop appearing as spectator chat while opponents remain opponents.

    These changes sit beside the big performance work, but they are part of the same job: make the game easier to read while it is moving.

    Give the Game and the Engine Their Own Jobs

    There is a substantial piece of development underneath this alpha that does not announce itself with a new button.

    Washoi is taking ownership of the things that make it Washoi. Its browser startup, bot application, game rules, account-aware naming, server launchers, editor entity catalog, tests and development tools belong with the game. SHAG provides the reusable systems and accepts the game's policies through explicit adapters.

    Game commands now run through the game package, while SHAG's checks can run without the game source. The familiar tooling still works from the assembled checkout, with the game selecting its own startup and build recipes.

    That boundary matters for maintaining the game and developing the engine alongside it. It makes it clearer where a gameplay change belongs and which parts another application can reuse. Separation work and assembly checks continue as we head toward 1.0.

    A Bigger Step Toward 1.0

    Quick Play gets you into an arena. Better loading gets the weapons ready. The rendering changes draw the same arena in fewer pieces and leave more of the frame for the fight. The engine work gives the next round of development a clearer place to happen.

    Alpha 2 helped the opponents find their feet. Alpha 3 is about helping the whole game find its stride.