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. - 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.
- 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.
