diff --git a/.gitignore b/.gitignore
index 0052d532..e8f9b3e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -97,6 +97,7 @@ bios/Gemei/A330/.variants/A330.HXF.58c11dad
# Free game data over 50 MB (fetched from large-files release)
bios/Id Software/Wolfenstein Enemy Territory/etmain/pak0.pk3
+bios/Id Software/Quake/quoth/pak1.pak
bios/Blizzard/Diablo/fonts.mpq
bios/Toys for Bob/The Ur-Quan Masters/uqm-0.8.0-voice.uqm
bios/Toys for Bob/The Ur-Quan Masters/uqm-remix-disc2.uqm
diff --git a/bios/Id Software/Quake/quoth/pak0.pak b/bios/Id Software/Quake/quoth/pak0.pak
new file mode 100644
index 00000000..535637d2
Binary files /dev/null and b/bios/Id Software/Quake/quoth/pak0.pak differ
diff --git a/bios/Id Software/Quake/quoth/pak2.pak b/bios/Id Software/Quake/quoth/pak2.pak
new file mode 100644
index 00000000..df722bf1
Binary files /dev/null and b/bios/Id Software/Quake/quoth/pak2.pak differ
diff --git a/emulators/tyrquake.yml b/emulators/tyrquake.yml
index f5e9c656..66c5add0 100644
--- a/emulators/tyrquake.yml
+++ b/emulators/tyrquake.yml
@@ -11,16 +11,90 @@ cores: [tyrquake]
systems: [quake]
notes: >
Quake engine source port by Kevin Shanahan (Tyrann). Plays Quake (id1), mission
- packs Scourge of Armagon (hipnotic) and Dissolution of Eternity (rogue), Quoth
- mod, and custom mods via -game parameter. Content is loaded directly from the
- PAK file path: the directory containing the PAK becomes basedir
- (libretro.c:988,1050). The engine auto-detects game variant by checking the
- content path for id1, hipnotic, rogue, or quoth substrings
- (common/libretro.c:1313-1377). All engine assets (gfx/palette.lmp, gfx/colormap.lmp,
- gfx.wad, textures, models, sounds) are loaded from within PAK files via
- COM_AddGameDirectory (common.c:1709), which tries pak0.pak through pak9.pak in
- both lowercase and uppercase. The core never calls
- RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. BGM as OGG tracks in music/ subfolder
- of each game directory.
+ packs Scourge of Armagon (hipnotic) and Dissolution of Eternity (rogue), the Quoth
+ mod, and custom mods. Content is a PAK file. When its path contains id1,
+ hipnotic, rogue or quoth, the parent of the PAK's directory becomes basedir and
+ the matching -rogue, -hipnotic or -quoth switch is set. Any other directory is
+ passed as -game
with its parent as basedir (common/libretro.c:1313-1325,
+ common/libretro.c:1331, common/libretro.c:1363-1390). COM_InitFilesystem always
+ adds basedir/id1 first, then rogue, hipnotic or quoth, then the -game directory
+ (common/common.c:1717-1734), so every game reads id1/pak0.pak beside its own
+ folder. COM_AddGameDirectory opens pak0.pak, pak1.pak and so on, lowercase then
+ uppercase, and stops at the first index that opens neither
+ (common/common.c:1668-1686). gfx.wad, gfx/palette.lmp and gfx/colormap.lmp come
+ from those PAKs and a missing one stops the engine with Sys_Error
+ (common/host.c:711-712, common/host.c:728-760, common/wad.c:78-81).
+ gfx/pop.lmp, present only in the registered id1/pak1.pak, sets the registered
+ cvar (common/common.c:938-953). The PAK directory is compared to the id1/pak0.pak
+ file count and CRC, but com_modified is never read, so any PAK is accepted
+ (common/common.c:1580-1593). The core never calls
+ RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. Background music is streamed from
+ music/trackNN. in each game directory, ogg, opus, mp3, flac, wav, it, s3m,
+ xm or mod, when present (common/bgmusic.c:35, common/bgmusic.c:63-71,
+ common/bgmusic.c:314-338).
-files: []
+files:
+ - name: "pak0.pak"
+ category: game_data
+ system: quake
+ path: "id1/pak0.pak"
+ required: true
+ source_ref: "common/common.c:1668-1686, common/common.c:1718, common/host.c:711-712, common/libretro.c:1313-1331"
+ note: "Shareware and registered Quake data, one file in both releases. Read for every game, mission packs and mods included."
+
+ - name: "pak1.pak"
+ category: game_data
+ system: quake
+ path: "id1/pak1.pak"
+ required: false
+ source_ref: "common/common.c:1668-1686, common/common.c:938-953"
+ note: "Registered episodes 2 to 4. Read only after pak0.pak opens."
+ unsourceable: "retail data the collection does not hold, and 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: "common/common.c:1722-1723, common/libretro.c:1368-1371"
+ note: "Scourge of Armagon data. Loaded when the content path contains hipnotic."
+ unsourceable: "retail data the collection does not hold, and 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: "common/common.c:1720-1721, common/libretro.c:1363-1366"
+ note: "Dissolution of Eternity data. Loaded when the content path contains rogue."
+ unsourceable: "retail data the collection does not hold, and a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: quake
+ path: "quoth/pak0.pak"
+ required: false
+ size: 48226771
+ sha1: be18095be10b1c45afb0f51cfaa7341fae639d0f
+ source_ref: "common/common.c:1017-1020, common/common.c:1724-1725, common/libretro.c:1373-1376"
+ note: "Quoth 2.2 data. Loaded when the content path contains quoth, with the Scourge of Armagon HUD."
+
+ - name: "pak1.pak"
+ category: game_data
+ system: quake
+ path: "quoth/pak1.pak"
+ required: false
+ size: 84961704
+ sha1: a14f1351e38c9df3eb03ef7e47f7aae9c29b8df2
+ source_ref: "common/common.c:1668-1686, common/common.c:1724-1725"
+ note: "Quoth 2.2 data, read after quoth/pak0.pak."
+
+ - name: "pak2.pak"
+ category: game_data
+ system: quake
+ path: "quoth/pak2.pak"
+ required: false
+ size: 8021749
+ sha1: c022a1062e9f8f99d8071c2fde297458499d302e
+ source_ref: "common/common.c:1668-1686, common/common.c:1724-1725"
+ note: "Quoth 2.2 data, read after quoth/pak1.pak opens."