Back to Devlog
    v1.0.0-alpha.4
    1.0 Alpha 4October 25, 2026Release notes

    Road to 1.0: Less Waiting, Better Reflections

    Background downloads, a browser cache that survives code updates, and reflections captured automatically from map shaders. Inside Washoi alpha 4.

    Keep the Arena Ready

    Alpha 3 spent a lot of time finding work the renderer could stop repeating. Alpha 4 brings that same attention to downloading and loading the game.

    The next match needs maps, models, textures and sounds. Some can arrive while you are choosing what to play. Some are already in your browser. An update to the game code should let unchanged media stay where it is.

    That is the main job of this release: make better use of the waiting time, keep the packages you have already downloaded, and give joining a match priority over optional preparation.

    There is a glimpse of the rendering work ahead, too. Map shaders can now ask for a reflection of their surroundings, and the engine generates the cubemap automatically. The same loading screen that prepares your weapons can prepare a room's reflections before you walk into it.

    Download While You Choose a Fight

    The Play page now prepares common assets and the selected room's map in the background. You can look through the modes or wait for friends while some of the next match's downloads get done.

    Preparation follows the selected map, rather than automatically downloading every arena. A compact indicator beside the version and footer links shows what is happening. Open it to see which packages are queued, downloading or ready, including packages reused from cache.

    The panel uses the lobby's yellow, cut-corner cards and raised keys. It has controls to pause background downloads and retry preparation, and clicking outside closes it. The useful information is there when you want it, without making the download queue the centre of the Play page.

    Joining a match uses the same download work. If a required package is already arriving, the join attaches to that request. Required assets get priority over optional queued work, and pausing background preparation leaves the downloads needed to join available.

    Keep What You Already Downloaded

    Reloading the page should be able to reuse yesterday's map.

    Packages with published content hashes now persist in browser storage across reloads. The hash identifies the package's contents, so a code update can leave unchanged maps, models and sounds in the cache. When a package changes, the new contents get their own identity and are fetched again. Stored bytes are checked on reuse; corrupt entries are replaced.

    The cache has a size budget. As older content makes room for new downloads, smaller packages that still fit are retained. Browser storage can also be unavailable or full, in which case loading falls back to HTTP. EU and US game origins have separate browser caches.

    This saves repeat transfers when the content is available locally. The scene still has to decode models and prepare materials and shaders, so cached packages are one part of getting ready for a match.

    There is a repair for an awkward handover, too: cancelling optional work and immediately joining no longer risks leaving a replacement request for the same package stranded in the queue.

    Give the First Load Time to Finish

    A player loading into a match can temporarily look like someone who is only watching. Previously, a slow initial load could run into the server's two-minute spectator-only shutdown while the player was still getting ready.

    Admitted players now receive a finite loading allowance. A first visit has room to finish its downloads and preparation, while abandoned clients and spectator-only matches still have a path to cleanup.

    If the connection fails terminally during loading, the game offers a return to the lobby. The failure has somewhere useful to go, instead of uncovering a frozen match that looks as if it ought to be playable.

    Let a Shader Ask for Its Surroundings

    A reflective surface needs something to reflect. A cubemap supplies a view in six directions, giving the material an image of the space around it.

    SHAG now understands map $cubemap in a shader stage, following the Qfusion convention. The shader declares that it wants a reflection; the engine works out the capture for the surface and renders the map into it. The reflecting object is left out of its own capture.

    Smooth normals turn a curved model into a curved mirror. A flat surface can reflect its room with projection that keeps the reflected surroundings in place as you move. The reflection can also be blended over another stage: an additive reflection puts a shine over a lightmapped base.

    That gives map materials a way to reflect the actual arena around them, with the capture generated from the shader's request. It opens more room for reflective details as the renderer develops toward 1.0.

    The captures contain the static map. Players, weapons, effects, water and other cubemap objects are excluded. They are taken once per map load, normally behind the loading screen, with up to eight captures per map; further objects reuse the nearest capture. An object whose world was not ready during loading is captured later in play.

    Prepare the Reflection Before the Turn

    Water already used reflection cubemaps, but their timing could interrupt the match. A pool's capture draws the map six times, and it used to happen when the pool first came into view. Turning toward water could suddenly ask the renderer to do all that work during play.

    Water reflection captures now happen behind the loading screen. Preparing them there moves that work out of the moment you turn a corner and find the pool.

    Together with shader-generated cubemaps, it is another reason to make the loading phase do a complete job: download what is needed, reuse what is already there, and prepare the picture before the fight asks for it.

    Another Step Toward 1.0

    Alpha 4 puts the biggest changes around the edges of a match: the packages arriving while you choose, the cache surviving a reload, the loading player getting time to finish, and reflections prepared before they come into view.

    The aim is simple. Spend less time fetching the same arena, and arrive with more of it ready to play.