emulator: vkQuake2 type: standalone core_classification: game_engine source: "https://github.com/kondrak/vkQuake2" upstream: "https://github.com/id-Software/Quake-2" profiled_date: "2026-10-17" source_commit: "5bf9c012024884234df0f63c615daec0c740def7" core_version: "1.5.10" display_name: "Quake II (vkQuake2)" cores: ["vkquake2"] systems: [quake2, xatrix, rogue, ctf] notes: | Quake II 3.21 with a Vulkan renderer. VERSION 3.21, VKQUAKE2_VERSION "1.5.10", BASEDIRNAME = "baseq2" (qcommon/qcommon.h:26-30). FS_InitFilesystem reads the basedir cvar, default ".", and mounts /baseq2 (qcommon/files.c:858, 872). A non-empty game cvar adds / on top (qcommon/files.c:878-880, 640). FS_AddGameDirectory tries pak0.pak through pak9.pak in each directory and skips an index that does not open (qcommon/files.c:537-542). FS_LoadPackFile computes a checksum of the pak directory, but the comparison against PAK0_CHECKSUM only runs with NO_ADDONS, which is commented out (qcommon/files.c:24, 28, 484-489). No pak is rejected for its contents. The Vulkan renderer, vid_ref default "vk" (linux/vid_so.c:448), stops with ERR_FATAL when pics/colormap.pcx is missing (ref_vk/vk_image.c:1640-1642); that file is in baseq2/pak0.pak. Batocera 43.1 copies /usr/bin/vkquake2 (binary, ref_*.so and the game libraries of baseq2, ctf, rogue, smd, xatrix, zaero) into /userdata/roms/quake2, changes to that directory and runs ./quake2, with `+set game rogue|xatrix|zaero|smd` chosen from the ROM name (configgen generators/vkquake2/vkquake2Generator.py). The basedir is therefore /userdata/roms/quake2. Music is read from /music/trackNN.ogg, .flac, .mp3 or .wav, then from baseq2/music/ (client/snd_miniaudio.c:215-220, 241-246). files: - name: "pak0.pak" category: game_data system: quake2 path: "baseq2/pak0.pak" required: true source_ref: "qcommon/files.c:872 (baseq2 mounted), 537-542 (pak%i.pak loop); ref_vk/vk_image.c:1640-1642 (pics/colormap.pcx fatal)" note: "Retail Quake II data. Not hash-checked." - name: "pak1.pak" category: game_data system: quake2 path: "baseq2/pak1.pak" required: false source_ref: "qcommon/files.c:537-542" note: "Shipped by the 3.20 point release." - name: "pak2.pak" category: game_data system: quake2 path: "baseq2/pak2.pak" required: false source_ref: "qcommon/files.c:537-542" note: "Shipped by the 3.20 point release." - name: "pak0.pak" category: game_data system: xatrix path: "xatrix/pak0.pak" required: false source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542" note: "The Reckoning data. Loaded with `+set game xatrix`." unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in" - name: "pak0.pak" category: game_data system: rogue path: "rogue/pak0.pak" required: false source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542" note: "Ground Zero data. Loaded with `+set game rogue`." unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in" - name: "pak0.pak" category: game_data system: ctf path: "ctf/pak0.pak" required: false source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542" note: "Three Wave CTF data from the 3.20 point release. Loaded with `+set game ctf`." - name: "pak0.pak" category: game_data system: quake2 path: "zaero/pak0.pak" required: false source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542" note: "Zaero data. Loaded with `+set game zaero`." unsourceable: "data the collection does not hold; a same-named file of another game must not stand in" - name: "pak0.pak" category: game_data system: quake2 path: "smd/pak0.pak" required: false source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542" note: "Slight Mechanical Destruction data. Loaded with `+set game smd`." unsourceable: "data the collection does not hold; a same-named file of another game must not stand in"