A QuakeWorld game module in native Rust — faithful QuakeWorld gameplay with Unreal Tournament-style movement on top, and navmesh bots that play it anywhere: on the server, or connected to any server as real network clients, both QuakeWorld and NetQuake servers.
It reimplements the original QuakeWorld qwprogs.dat logic as a cdylib the server loads as a
pr2 native game module (GAME_API_VERSION 16) — the same host ABI
KTX uses. Drop it in place of qwprogs.dat and the gameplay
mirrors stock QuakeWorld; everything on top is a cvar you can switch off.
- UT-style movement — double jump, wall dodge, elevator jump, and the shock combo (shootable grenades), layered onto QuakeWorld without breaking bunnyhopping. → movement & combat
- The grappling hook — the classic Wedge hook, ported from purectf. Bots swing it too. → movement & combat
- Game modes — deathmatch, Rocket Arena, midair, CTF, and timed race routes, each
composable with an orthogonal match format (FFA,
1on1,2on2,2on2on2, …). → modes & match composition - Bots without waypoint files — the navmesh is generated from the map's BSP at load time. Bots bunnyhop, speed-jump, double-jump, rocket-jump, and grapple across it. → the bots
- Bots that play like players — they see, hear, and feel before they fight; value items the way KTX duellers do; model their opponents from observation; and bank grenades around corners. In team modes they spread fire, reserve pickups, and run CTF roles. → the bots
- The same bots as network clients —
rtx-clientjoins any QuakeWorld (or NetQuake) server over UDP with the identical brain, fetching maps it doesn't have. → the bots as network clients - Everything is a cvar — every mechanic, mode, and bot behaviour has a switch. → cvar reference
Run a server with it:
cargo build --release
cp target/release/librtx.so /path/to/server/qw/qwprogs.so # or .dylib / .dllThe server needs pr2 / API 16 support. Prebuilt qwprogs artifacts for Linux, macOS, and
Windows come out of the GitHub Actions build workflow.
Add bots in server.cfg:
set rtx_bot_count 4
set rtx_bot_skill 3
Or point the bots at somebody else's server:
cargo build --release -p rtx-client
./target/release/rtx-client --server quake.example.org --basedir ~/Games/Quake --bots 2| page | contents |
|---|---|
| Movement & combat | Double jump, wall jump, elevator jump, the shock combo, the grappling hook, choosing the arsenal. |
| Game modes | dm, ra, midair, ctf, race; match composition and the team-match lifecycle; map rotation. |
| The bots | Perception, navigation and the navmesh's jump/hook links, item valuation, combat, teamwork. |
| Bot architecture | How the brain is built: the navmesh core, the per-frame decision loop, movement drivers, the opponent model, the two embodiments. |
| The bots as network clients | rtx-client: joining any QW/NQ server, mode detection, map downloads, squads. |
| Cvar reference | Every rtx_* tunable with its default, on one page. |
| Development & tooling | Building, CI artifacts, tests, the control channel and tuning harness. |
| crate | |
|---|---|
rtx-game |
the game module (qwprogs replacement) — all game logic |
rtx-nav |
navmesh building and query over the BSP collision hull |
rtx-proto |
the QuakeWorld and NetQuake wire protocols as pure codecs |
rtx-client |
the bots as standalone network clients |
rtx-nav-view |
a 3D viewer for the generated navmesh (live overlay via --live) |
rtx-ctlproto |
typed msgpack schema for the game↔tools control channel |
rtx-auditlog |
per-bot ring buffer of compact sensor frames |
rtx-mcp |
an MCP bridge for driving live bot-tuning sessions |
Copyright © 2026 Daniel Svensson.
Licensed under the GNU Affero General Public License, version 3 or later (AGPL-3.0-or-later).
Inspiration and compliance with a bit of everything thanks to: Quake Bot Archive, KTX, FrogBot Rocket Arena, ezQuake, FTE, QSS-M, Original Quake