How it's built, patched and set up for its played test; it runs on the ioquake3 engine. The numbers are under Test runs.
Quake III Arena runs on Walnut’s build of ioquake3, the engine OpenArena plays on at about 70 frames a second with its OpenGL 1 renderer. The engine is free; the game’s data is not, so Walnut doesn’t offer it: Walnut Games makes a package of it from your own copy (the Overview’s Installation, and the Guides). The game code is ioquake3’s native build of id’s GPL source, not the bytecode in the paks: ioquake3 has no PowerPC compiler for that bytecode any more, and the interpreter is slow on the PS3’s processor. Quake III loads its first arena, q3dm1, with the right picture; nobody has played it on Walnut yet.
Status
Untested as a played game: published so that Walnut Games can set up its data. On 2026-10-27 the data came from the CD’s ISO on the PS3 and ioquake3 loaded q3dm1 with the right picture (lightmaps, models, HUD; xwd fullscreen, looked at); on 2026-10-28 from GOG’s installer, with Team Arena, whose mpteam1 loaded with its own HUD. Nobody has played a session or measured it yet.
Packages, data and settings
- Engine: our
ioquake3(ioquake3, OpenArena’s engine),/usr/lib/ioquake3/ioquake3. Its package already has Debian’s native game code links:/usr/lib/quake3/base/baseq3/{cgame,qagame,ui}.sofor Quake III and/usr/lib/quake3/ta/{baseq3,missionpack}/for Team Arena. The launchers setvm_cgame 0,vm_game 0,vm_ui 0andsv_pure 0, so ioquake3 loads those native libraries (ioquake3’s build of id’s GPL game code, the same game as 1.32’s bytecode): ioquake3 has no PowerPC compiler for the QVM bytecode any more (only x86, x86-64 and ARM), and the interpreter is slow on the PPE. Withsv_pure 1the client would insist on the paks’ bytecode. - Data: game-data-packager’s
quake3-data(/usr/share/games/quake3-data/baseq3/pak0-8.pk3) andquake3-team-arena-data(.../quake3-team-arena-data/missionpack/pak0-3.pk3), each with gdp’s links into/usr/lib/quake3/{base,ta}. Those links are why the data manifest and walnut-games-helper take symlinks now (docs/PACKAGING.md “Links”). Team Arena’s Conflicts/Replacesquake3-data (<< 77~)is about old gdp builds and is left out of the manifest: unversioned it would remove quake3-data. - Launchers (desktop/launchers), both
NoDisplay=truewithX-Walnut-Requires=the pak0 of their data: “Quake III Arena” (fs_basepath /usr/lib/quake3/base) and “Quake III: Team Arena” (fs_basepath /usr/lib/quake3/ta,fs_game missionpack). - Defaults:
autoexec.cfgin/usr/lib/quake3/base/baseq3/and/usr/lib/quake3/ta/baseq3/(desktop/files), OpenArena’s:opengl1,r_mode -2fullscreen at the desktop’s resolution, vsync,com_maxfps 60, DXT1 textures, the pad bindings; andcl_cdkeyCheck 0(ioquake3 0030): without it both menus open on a CD KEY screen at every start.ui_cdkeycheckedcan’t skip it: the UIs register itCVAR_ROM, which forces a value set on the command line or in a config back to 0. No key is shipped or needed (it mattered only to id’s authorize servers). - Settings live in ioquake3’s XDG folders:
~/.config/Quake3,~/.local/state/Quake3(~/.q3awhen it exists).
Data sources tried
- CD ISO (
QUAKE3.iso, 1.11-era:Quake3/baseq3/pak0.pk3and pak1): loop-mounted by walnut-data; gdp needs 1.32’s pak1-8 too, from id’s point releaselinuxq3apoint-1.32b-3.x86.run. gdp downloaded it fromftp.fu-berlin.de(idstuff) in the games builder on the PC. On the PS3 the import ran with--no-downloadand GOG’s pak1-8 beside the ISO, for lack of room for the download’s 128 MB. - GOG’s Quake III Gold (
setup_quake3_2.0.0.2.exe, 921 MB, known to gdp): gdp unpacksbaseq3/pak0.pk3as well when only Team Arena is asked for (the installer unpacks to 981 MB, whichever package is asked for); walnut-data’s space check counts that. On the PS3 (2026-10-28) a plain import made quake3-data in 349 s and named Team Arena as an add-on,-p quake3-team-arena-datatook 315 s; about 2.4 GB free for the base and 2 GB for Team Arena, besides the installer itself. - MDF/MDS: the CD’s ISO written as a 2448-byte-sector MDF (2352 + 96 bytes of subchannel) with its
.mdsand extracted again by walnut-data’s code gave the ISO 9660 volume byte for byte (on the PC).
Known problems
- Sound drops out for 80-170 ms about once a minute in a game with bots (OpenAL’s
mmap commit error: Broken pipein the log, one per dropout): OpenAL’s mixer thread starves at normal priority. With a real-time limit for the session there were none in 3 runs; that change is system-wide and not made yet (the investigation).
Engine options
- ioquake3 (the pick: OpenArena runs on our ioquake3 engine, gamedb/engines/ioquake3)
- Quake3e (a performance fork: x86/ARM JIT, Vulkan; no PPC JIT)
- spearmint (not fetchable)
- id’s Quake-III-Arena (frozen dump, reference)
Research
What the surveys and plans said about it, newest first; each line names its source, the section and the date.
- 2026-10-20, pc-classics.md, “Action and shooters”: “RTCW, Wolfenstein: ET, Quake 3, Elite Force” (mostly with console versions): iortcw, ET: Legacy, ioquake3; playable; GL 1.x/2.x; Q3’s QVM had a big-endian PPC JIT; own data; effort M.
- 2026-10-20, pc-classics.md, “Alternatives and popularity”: ioquake3 (2850 stars, 2026-10-12): the baseline, PPC JIT history.
Build
| Packages | ioquake3 |
|---|---|
| Suite | not in the game suite yet |
| Game data | the player supplies it (see the game's page) |
Our source packages
- ioquake3 source
30 patches
- renderergl2: delete GLSL shader objects once their program is linked
- renderergl2: r_glslMaxBones, no GPU bone animation by default
- renderergl2: no shadow and post-processing programs without framebuffer objects
- renderergl2: keep compiled GLSL programs across renderer restarts
- renderergl2: r_glslLazy, build each GLSL program at its first use
- renderergl2: allocate the VAO cache only with r_vaoCache 1
- renderergl2: no permanent CPU copy of MD3 vertices that went to a VBO
- renderergl2: no tangents in MD3 VBOs without normal mapping
- renderergl2: r_md3Lods, and no MD3 LODs that r_lodbias rules out
- renderergl2: r_gpuVertexAnimation, to animate MD3 models on the CPU
- renderergl1: no scan of the whole shader text after a miss in the script hash table
- unzip: no crc32 of the pk3 entries read, fs_zipCrc 1 brings it back
- renderergl1: build the AltiVec code (com_altivec), fixed for vec4 normals
- renderergl1: R_ChopPolyBehindPlane doesn't clear its two work arrays
- OpenAL: s_alLazy, the sounds of a player are loaded when first played
- unzip: inflate whole pk3 entries with libdeflate (USE_LIBDEFLATE, fs_zipFast)
- msg: the message Huffman trees from tables (msg_huffSlow 1 builds them as before)
- renderergl1: r_mergeLightmaps, the map's lightmaps in a few atlas textures
- renderergl1: r_glStateCache, texture unit and client array state sent only when a draw needs it
- renderergl1: r_lockArrays 0, no glLockArraysEXT around every batch
- renderergl1: r_skyArrays, a sky box side in one glDrawElements
- renderergl1: r_mergeLightmaps 2 and r_mergeLightmapsSize, to tell the atlas textures' cost from the batching's
- renderergl1: r_mergeLightmaps defaults to 0, any atlas page adds about 10 s of hitches per run on the PS3
- renderergl1: r_keepImages, the textures of image files kept across a map change
- client: cl_preloadLate, what the cgame registered during play loaded with the next same map
- renderergl2: r_vaoSnormColor, vertex colours as signed normalized shorts
- renderergl2: no powf per texel channel in the gamma-correct mipmaps
- renderergl2: r_md3PackedFrames, animated MD3 frames in 12 bytes a vertex
- client: cl_cdkeyCheck 0, the UI takes any CD key as valid
- sys: sys_signalQuit, a quit signal is handled by the main loop
Played test
What a played session sets up (rating/test.toml); the medal comes from these sessions only.
| Process | ioquake3 |
|---|---|
| Set aside | ~/.local/share/Quake3, ~/.config/Quake3, ~/.local/state/Quake3, ~/.q3a (the game starts on fresh defaults) |
| Play starts at | CL_InitCGame |