emulator: ioquake3 type: standalone core_classification: game_engine source: "https://github.com/ioquake/ioq3" upstream: "https://github.com/ioquake/ioq3" profiled_date: "2026-10-04" source_commit: "83a776283bdb958f82db25554b5ed0966aaf6e49" core_version: "1.36+git" display_name: "ioquake3" cores: [ioquake3] systems: [quake3, teamarena] notes: | Quake III Arena / Team Arena source port maintained by the ioquake team. BASEGAME = "baseq3", BASETA = "missionpack" (code/qcommon/q_shared.h :44,65). FS_Startup (code/qcommon/files.c:3360) scans each search path for pak0.pk3 through pak(NUM_ID_PAKS-1).pk3 under baseq3, and up to NUM_TA_PAKS paks under missionpack (code/qcommon/qcommon.h:591-593, NUM_ID_PAKS=9, NUM_TA_PAKS=4). Loaded paks are matched against hardcoded unsigned 32-bit checksums (code/qcommon/files.c:178-198: pak_checksums[], missionpak_checksums[]). These are NOT MD5 / SHA1 / CRC32 of the file; they are id's own custom pak checksum (sum of each lump CRC, see FS_LoadZipFile). A mismatch prints "WARNING: baseq3/pak0.pk3 is present but its checksum (%u) is not correct" (code/qcommon/files.c:3574) and keeps running: the loader does not refuse the file, so no md5/sha1 is written below. A missing baseq3 pak is fatal unless the engine runs standalone, which it does when no id pak is found and com_basegame is not baseq3 (code/qcommon/files.c:3652-3657, 3697). Team Arena paks are checked the same way once fs_game or fs_basegame is missionpack (code/qcommon/files.c:3738-3739). A pak0.pk3 loaded from demoq3/ with checksum DEMO_PAK0_CHECKSUM stands in for baseq3/pak0.pk3 with a warning (code/qcommon/files.c:3557-3562, 3661-3674). files: # ================================================================ # Quake III Arena (baseq3/, 9 numbered paks) # pak0.pk3 comes from the retail disc, pak1.pk3 through pak8.pk3 from # the 1.32 point release (code/qcommon/files.c:3715-3717). # pak_checksums[0..8] = { 1566731103, 298122907, 412165236, # 2991495316, 1197932710, 4087071573, # 3709064859, 908855077, 977125798 } # ================================================================ - name: "pak0.pk3" category: game_data system: quake3 path: "baseq3/pak0.pk3" required: true source_ref: "code/qcommon/files.c:180 (pak_checksums[0]=1566731103u), 3568 (per-index checksum compare), 3697 (fatal when a baseq3 pak is absent)" note: "Retail Quake III Arena base pak. Engine prints a warning on checksum mismatch, does not refuse the file." unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in" - name: "pak1.pk3" category: game_data system: quake3 path: "baseq3/pak1.pk3" required: true source_ref: "code/qcommon/files.c:181 (pak_checksums[1]=298122907u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak2.pk3" category: game_data system: quake3 path: "baseq3/pak2.pk3" required: true source_ref: "code/qcommon/files.c:182 (pak_checksums[2]=412165236u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak3.pk3" category: game_data system: quake3 path: "baseq3/pak3.pk3" required: true source_ref: "code/qcommon/files.c:183 (pak_checksums[3]=2991495316u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak4.pk3" category: game_data system: quake3 path: "baseq3/pak4.pk3" required: true source_ref: "code/qcommon/files.c:184 (pak_checksums[4]=1197932710u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak5.pk3" category: game_data system: quake3 path: "baseq3/pak5.pk3" required: true source_ref: "code/qcommon/files.c:185 (pak_checksums[5]=4087071573u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak6.pk3" category: game_data system: quake3 path: "baseq3/pak6.pk3" required: true source_ref: "code/qcommon/files.c:186 (pak_checksums[6]=3709064859u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak7.pk3" category: game_data system: quake3 path: "baseq3/pak7.pk3" required: true source_ref: "code/qcommon/files.c:187 (pak_checksums[7]=908855077u), 3697 (fatal when a baseq3 pak is absent)" - name: "pak8.pk3" category: game_data system: quake3 path: "baseq3/pak8.pk3" required: true source_ref: "code/qcommon/files.c:188 (pak_checksums[8]=977125798u), 3697 (fatal when a baseq3 pak is absent)" # ================================================================ # Quake III Arena demo (demoq3/) # DEMO_PAK0_CHECKSUM = 2985612116 # ================================================================ - name: "pak0.pk3" category: game_data system: quake3 path: "demoq3/pak0.pk3" required: false source_ref: "code/qcommon/files.c:178 (DEMO_PAK0_CHECKSUM=2985612116u), 3557-3562 (demoq3 pak0 checksum compare), 3661-3674 (accepted in place of baseq3/pak0.pk3)" note: "Demo pak. Recognised only under demoq3/ and only with this checksum; the engine then prints a warning and counts baseq3/pak0.pk3 as found." # ================================================================ # Team Arena (missionpack/, 4 numbered paks) # missionpak_checksums[0..3] = { 2430342401, 511014160, # 2662638993, 1438664554 } # ================================================================ - name: "pak0.pk3" category: game_data system: teamarena path: "missionpack/pak0.pk3" required: false source_ref: "code/qcommon/files.c:193 (missionpak_checksums[0]=2430342401u)" note: "Team Arena base pak. Required only when launching +set fs_game missionpack." unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in" - name: "pak1.pk3" category: game_data system: teamarena path: "missionpack/pak1.pk3" required: false source_ref: "code/qcommon/files.c:194 (missionpak_checksums[1]=511014160u)" - name: "pak2.pk3" category: game_data system: teamarena path: "missionpack/pak2.pk3" required: false source_ref: "code/qcommon/files.c:195 (missionpak_checksums[2]=2662638993u)" - name: "pak3.pk3" category: game_data system: teamarena path: "missionpack/pak3.pk3" required: false source_ref: "code/qcommon/files.c:196 (missionpak_checksums[3]=1438664554u)"