Road to 1.0: Washoi Goes Native
The native Washoi client is here: a Rust build for Windows, macOS and Linux, free to download and test. Plus bots that stop spinning and start hunting. Inside Washoi beta 10.
The Biggest News Yet: Washoi Goes Native
Washoi is no longer only a browser game. With beta 10, the native Washoi client gets its own Download page on washoi.net: a desktop build for Windows, macOS and Linux, written in Rust.
It plays on the same servers as the browser game, reads the same published game data and meets everyone in the same lobby. Browser or native, it's one arena and one player base. The browser version stays exactly where it is, still the quickest way in with nothing to install. The native client is for everyone who wants Washoi as a proper desktop game.
Two new open-source projects make it:
- wash-fps-rust, the game itself, ported from the browser client.
- SHAGGER, the engine underneath it: the Rust counterpart of SHAG, the engine the browser game runs on.
Between them that's about 4 MB of Rust source, 130 KB of WGSL shaders and more than 330 commits, all public under the MIT License.
Download It, Play It, Break It
The native client is in public beta, and we want it on as many machines as possible. Grab it from the new Download page, under Downloads in the washoi.net menu or straight at washoi.net/download.
- Windows: an installer, or a portable zip if you'd rather not install.
- macOS: builds for Apple silicon and for Intel Macs.
- Linux: an AppImage, or a tarball.
The page suggests the build for your system, and it always shows the newest release: it reads the same release list the client checks at start, with every file's size and SHA-256 checksum. Installed on Windows, the game updates itself when a new version is out, and it checks the download against that checksum before it does.
Every machine you try it on is a test we couldn't run ourselves. Different GPUs, drivers, monitors, Linux desktops and Macs all count. Tell us how it runs, and what breaks, on Discord.
While you're on the Download page: the soundtrack is there as a zip, and so is the source of both clients and both engines.
Same Game, Bit for Bit
A second client is only worth having if it plays the same game. So the Rust is tested against the TypeScript, not just eyeballed.
- Simulation and the wire format match bit for bit. Results computed by SHAG are checked in as golden vectors, and SHAGGER has to reproduce them exactly. A jump is the same jump in either client.
- The map renderer is held to the same rule. SHAG's face builders, lightmap encoding and lighting run over all 16,169 faces of the seven shipped maps, and the Rust matches every one bit for bit.
- Beta 9 was reviewed feature by feature. Its protocol, timeouts and rejoins, player bodies and items were held against the browser game, and the first round of public beta testing ported every client feature that was still missing.
The beta 10 servers accept every native client released so far. If a future server needs a newer one, the lobby shows an Update required screen with the download, rather than letting an old client in to fail. And because bots run on the server, native players meet the beta 10 bots too.
Built for Speed
A browser is a remarkable place to run a game. A native client skips a whole layer of it. There's no browser tab sharing the machine, no JavaScript engine and no garbage collector deciding when to pause. Rust compiles the game to machine code ahead of time, and SHAGGER talks to the graphics card through wgpu.
The performance work is measured, not assumed:
- Models outside your view aren't drawn. In the three golden test demos, 60 to 85% of model draws are now culled, and the frames come out pixel for pixel the same.
- GPU state is set only when it changes between draws.
- Posing a player natively takes a few microseconds. The browser animates medium-distance players at 30 Hz to save JavaScript time; the native client doesn't need to.
Those measurements ran on a software rasterizer, a build machine with no GPU at all, where the mean frame on washoi_dm14 at 1280×720 went from 99.9 to 88.5 ms. That's a measure of the CPU's share of the work, not the frame rate you'll see on a real graphics card. We haven't benchmarked native against the browser on real hardware yet; when we do, the numbers will come with the map, the mode and the machine.
Built Not to Fall Over
- Its file loaders are fuzzed. The fuzzer fed them malformed maps, textures, models and sounds until it found files that looped forever or asked for 17 GB of memory. Those are now rejected, and the last full pass, 588,000 inputs, found nothing.
- It was soak-tested. A 25-minute run of a highlight reel held its memory steady, within 1 MB, from the first minute to the last.
New in 0.3: Controllers and Hints
The native client moves fast. Version 0.3.1 is the current release, and since 0.2.1 it has gained:
- Controller support. The move stick moves at its own angle, the look stick turns, Menu opens the Esc menu and the D-pad and A and B drive it. Hints, the spectator card and the ready bar name the pad's buttons. Aim assist isn't ported yet.
- Hints for new players: the gold HINT card above the weapons, with your own keys.
cl_hints 0turns it off. - A weapon swap prompt when your inventory is full and you stand by a weapon.
- Demos: the watched player's gun is in their hand, and a ✕ plate in the top left leaves playback.
- Spectating: a free-flying spectator gets a card with the keys.
- Ragdolls no longer shake: bodies are drawn between physics steps.
- A log file: console output goes to
washoi.login the config folder, so a match that fails to load leaves a trace to send us.
Where It Stands
- Lobby: the same lobby page the browser shows, in a webview, so it looks the way you know it. Its menu music now stops when a match or a demo starts.
- Antialiasing: FXAA on the
r_msaasetting. - Launch options: kept in
washoi.args. - Linux: the AppImage needs WebKitGTK 4.1, and tells you if it's missing. 0.2.1 fixed a crash on Wayland desktops.
It's a beta, and there will be rough edges. That's what the downloads are for.
On the SHAG Side: Smarter Bots
On the SHAG side, beta 10 is the bots' release. Almost every change in it is about how bots look, move, chase and choose, and the difference shows the moment one comes round a corner. They spin less, chase with purpose, take smarter routes and shoot when they're actually looking at you.
And for the first time, bot movement is measured instead of judged by eye. A new tool, bot:motion, plays a headless match and reports how bots move: how often their view swings away and back, how fast it turns, time spent standing still, sliding and in the air, items picked up and how close they run to walls. Watching demos used to be the only way to tell.
Bots Stop Spinning
Bots turn back and forth far less. In 4-bot FFA on washoi_dm1 and dm2 their view swings away and straight back about 60% less often than before. The fixes, and a few more like them:
- A bot chasing an enemy sticks with them until another is clearly the better lead, instead of turning between enemies whose trails cross.
- A fragged enemy is forgotten, rather than chased to where they would have run on to.
- A lost enemy is watched like a corner: the bot keeps looking where they went.
- Distant sounds don't derail an errand. On the way to an item it needs, a bot keeps going when it hears an enemy further than a corner away, and readies a weapon instead.
- Trick jumps start cleanly. Lining one up, a bot creeps onto its mark crouched, coasts to a stop and stands before starting, instead of shuffling across the mark and often giving up.
- Unreachable items get a rest, such as a weapon dropped down a ledge, instead of being walked at into a wall.
- Bots come out of a teleporter facing its exit, as players do.
Bots Start Hunting
- Bots shoot when their view is on you, not from the moment they decide to. A bot that noticed someone behind it used to fire all the way round its turn.
- Slow gun, then a fast one. After an electrobolt shot, a bot may switch to its machinegun or riotgun while the bolt reloads, when that suits the distance.
- Small detours for good items. On the way to the Mega, a bot grabs a health pack just off its route. In 4-bot FFA on washoi_dm2 that meant about 40% more health and armour picked up a minute; on dm1, where items lie further apart, about the same.
- A missed jump no longer means giving up on the item. The bot avoids that jump and takes another route, and a jump missed again and again is avoided for longer, up to 40 seconds.
- More crouchslides, down any straight, open stretch of route.
- Bots running out of a fight look toward open space instead of the wall a corner points them at.
Bots Stop Hugging Walls
Bots now run each walking stretch of a route along one planned line: down the middle of rooms and round corners on the outside, instead of from node to node. About 40% of the walk links in a map's bot graph bent round a doorway or dropped off a ledge, and bots used to run straight at them, into the wall.
In 4-bot FFA, the share of running time spent within 24 units of a wall fell from 19–22% to 11% on washoi_dm1, and from 17–20% to 9–12% on dm2. Wall avoidance now steers the bots for 2–4% of their running time instead of a quarter of it. A second new tool, bot:routes, checks every route from a spawn point to an item offline, in seconds.
Smaller Things
- The game and engine manuals are corrected where they had drifted: setup and packaging commands, the Node 24 requirement, Amphi and S&D map pools, five-second Duel and FFA countdowns, and how S&D handles map weapons, Quad and pickups.
- The credits dialog's Close and the video export page's buttons are the menu's raised keys again, and the credits card is back to its own size.
- The free-for-all result screen lists players by score again. A player who left after the match ended had dropped to the bottom, so the winner could appear below the player they beat.
- With
developer 1,r_wireframeandr_showtrisdraw wireframes again.
The full notes are in the engine's v1.0.0-beta.10.md changelog.