emulator: vkQuake type: standalone core_classification: game_engine source: "https://github.com/Novum/vkQuake" upstream: "https://sourceforge.net/projects/quakespasm/" profiled_date: "2026-10-17" source_commit: "6f9c012a9176ee36663fd7a6d30b6291a0dbbcc1" core_version: "1.33.0" display_name: "Quake (vkQuake)" cores: ["vkquake"] systems: [quake] notes: | Vulkan Quake engine derived from QuakeSpasm. VKQUAKE_VERSION 1.33, VKQUAKE_VER_PATCH 0 (Quake/quakever.h:37-41). GAMENAME = "id1" (Quake/quakedef.h:37). COM_InitFilesystem takes the base directory from -basedir, otherwise host_parms->basedir (Quake/common.c:2463-2467). COM_AddGameDirectory opens //pak0.pak, pak1.pak, ... and stops at the first index that does not open (Quake/common.c:2241-2245). Right after id1/pak0.pak it mounts vkquake.pak, built from Misc/vq_pak and embedded in the binary (Quake/common.c:2257-2282); it carries default.cfg, three menu pictures and entity fixes, no gfx.wad and no palette. gfx.wad and gfx/colormap.lmp come from id1/pak0.pak; without either the engine stops with Sys_Error (Quake/wad.c:80-87, Quake/host.c:1093-1095). gfx/pop.lmp, present only in the registered id1/pak1.pak, sets the registered cvar (Quake/common.c:1458-1484). COM_LoadPackFile compares the file count (339) and the CRC of the pak directory against id1/pak0.pak v1.00, v1.01 and v1.06 (Quake/common.c:56-59, 2105-2118). A mismatch only sets com_modified; the file is still mounted. With com_modified set and no gfx/pop.lmp the engine stops (Quake/common.c:1464-1470), so -game, -hipnotic and -rogue, whose paks differ from id1/pak0.pak, need the registered id1/pak1.pak. -rogue and -hipnotic add rogue/ and hipnotic/ after id1/ (Quake/common.c:2507-2510). Batocera 43.1 runs `vkquake -basedir /userdata/roms/quake` and adds -hipnotic or -rogue from the ROM name (configgen generators/vkquake/vkquakeGenerator.py). Background music is streamed from /music/trackNN., ogg, opus, flac, mp3 and wav, when present (Quake/bgmusic.c:29, 321). files: - name: "pak0.pak" category: game_data system: quake path: "id1/pak0.pak" required: true source_ref: "Quake/common.c:2241-2245 (pak%i.pak loop), 2496 (id1 by default); Quake/wad.c:80-87 (gfx.wad fatal)" note: "Shareware and registered Quake data, one file in both releases. Directory CRC compared to v1.00, v1.01, v1.06; a mismatch does not refuse the file." - name: "pak1.pak" category: game_data system: quake path: "id1/pak1.pak" required: false source_ref: "Quake/common.c:2241-2245 (pak%i.pak loop), 1458-1470 (gfx/pop.lmp, registered check)" note: "Registered episodes 2 to 4. Read only after pak0.pak opens. Needed by -hipnotic, -rogue and -game." 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: quake path: "hipnotic/pak0.pak" required: false source_ref: "Quake/common.c:2509-2510 (-hipnotic), 2241-2245 (pak%i.pak loop)" note: "Scourge of Armagon data. Loaded with -hipnotic." 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: quake path: "rogue/pak0.pak" required: false source_ref: "Quake/common.c:2507-2508 (-rogue), 2241-2245 (pak%i.pak loop)" note: "Dissolution of Eternity data. Loaded with -rogue." unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"