This is a webxdc (in-chat mini-apps) port of the 1999 first-person shooter Quake III Arena, with multiplayer support.
- Install Delta Chat (or another messenger that supports webxdc).
- Download the bundled
.xdcfile. Alternatively, download from the webxdc store. (The file is just a.ziparchive renamed to.xdc). - Open the Delta Chat messenger.
- Create a Delta Chat account (it will not ask you for your email or phone!).
- Send the
.xdcfile to your friend. - Launch the resulting app.
- Following the in-app instructions, download the game data archive.
- Select the archive in the app's file picker.
- Wait for your friend to do the same, starting from step 6 (launch the app).
- Frag!
To be precise, this port is based on the "The Longest Yard" project
(a browser version of Quake III with multiplayer),
which is hosted here https://thelongestyard.link/
(source code).
That project is, in turn, based on https://ioquake3.org/
(https://github.com/ioquake/ioq3/)
and HumbleNet (https://github.com/jdarpinian/HumbleNet).
The project is not made in a maintainable way. Initially it was intended as just a prototype but it seems to work well enough.
So, how it was made:
-
Go to https://thelongestyard.link.
-
Click "Play Multiplayer".
-
Save the page (Ctrl + S).
-
Download remaining assets manually.
-
Launch a local HTTP server (e.g.
python3 -m http.server) and make sure that multiplayer and single-player works. Your browser will still connect to the signaling server of the original website and perform WebRTC P2P connection. We'll get rid of this later.This corresponds to the first commit in this repository.
-
Polyfill (mock) browser WebRTC API to use webxdc.joinRealtimeChannel as the transport. See the second commit in this repository.
-
Mock the WebSocket connection to the HumbleNet signaling server. See the third commit. The messages can be hard-coded, they only depend on whether the current app instance is gonna be the server or a client.
-
Get rid of other minor dependencies on direct internet connection. See commit history.
Update 2025-11: now we use a forked version of thelongestyard.link. From now on the development steps are as follows:
- Download a "web" (Emscripten) build from
https://github.com/WofWca/ioq3/tree/revert-more-stuff.
It's a forked version with some stuff reverted,
namely
cl_autoAttackand the "ztm-flexible-hud" mod. Those extra changes appear to have made the engine (.wasm) incompatible with other mods. Additionally we enabled Opus codec support (USE_CODEC_OPUS) so that we can bundle a smaller version of Open Arena with compressed sound (instead of the uncompressed.wav). - Upack the
.wasm32.jsand.wasm32.wasmfiles here. - Download the
QVM.zipartifact from https://github.com/WofWca/baseq3a/tree/baseq3a-free-version-and-my-stuff. This is a version of the "baseq3a" mod with non-free assets removed and with some of our patches. You may also use the free version, with no extra patches: https://github.com/ec-/baseq3a/pull/59. - Extract
pak8a.pk3fromQVM.ziphere.
- We also are using a file explorer ui for the Emscripten Filesystem API, so users can edit some files and mod the game.
- Copy the .iife.js file from the dist folder of the emscripten-fs-file-explorer-ui npm package and use it in one of the html files following the npm package instructions.
- Copy the .js file from the webxdc-download-polyfill repo and link it to the html, this fixes download links issues in webxdc context (download links are used in the file explorer to export files)
And here is some extra stuff:
-
Add "Change Map" in-game menu item for the demo version
- Download the Linux build artifact from this branch https://github.com/WofWca/flexible-hud-for-ioq3/tree/add-menu-item-start-new-arena-ztm-flexible-hud. The branch is based on this MR: clover-moe/mint-arena#7.
- Find the
vmdirectory in the build files. - Make another .zip file and add the
vmdirectory to it. - Replace
ztm-flexible-hud.pk3with the new.zipfile.
If you don't want the "Change Map" button, you can use the original (non-forked) version of the mod: https://clover.moe/flexible-hud-for-ioq3.
- HumbleNet is not really needed. Because it works on top of WebRTC, and then we mock WebRTC API to make it work on top of webxdc instead.
- We should have properly forked https://github.com/jdarpinian/ioq3 and implemented a build CI, instead of just saving the bundled website assets.
Not really.
If you are already using a native version of ioquake3 or https://thelongestyard.link and are happy with it, then there is no need to migrate to this webxdc version. In fact, you should expect higher ping in the webxdc version, due to the reliability layer overhead of the transport that it uses. Unreliable + unordered transport is not yet available in Delta Chat, but it is being considered, as of 2025-05.
This project is simply a version of https://thelongestyard.link that is a little more convenient to run if you're already using Delta Chat or another messenger that supports webxdc.
