From 1050fc3cbb44cd3bbce06309b4d319c5b1b54bcf Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sun, 4 Oct 2026 14:54:30 +0200 Subject: [PATCH] feat: profile build and quake family engines --- emulators/eduke32.yml | 155 +++++++++++++++++++++++++++ emulators/etlegacy.yml | 71 +++++++++++++ emulators/fury.yml | 42 ++++++++ emulators/ioquake3.yml | 138 ++++++++++++++++++++++++ emulators/taradino.yml | 116 ++++++++++++++++++++ emulators/xash3d_fwgs.yml | 217 ++++++++++++++++++++++++++++++++++++++ emulators/yquake2.yml | 104 ++++++++++++++++++ 7 files changed, 843 insertions(+) create mode 100644 emulators/eduke32.yml create mode 100644 emulators/etlegacy.yml create mode 100644 emulators/fury.yml create mode 100644 emulators/ioquake3.yml create mode 100644 emulators/taradino.yml create mode 100644 emulators/xash3d_fwgs.yml create mode 100644 emulators/yquake2.yml diff --git a/emulators/eduke32.yml b/emulators/eduke32.yml new file mode 100644 index 00000000..ca48ed4d --- /dev/null +++ b/emulators/eduke32.yml @@ -0,0 +1,155 @@ +emulator: EDuke32 +type: standalone +core_classification: game_engine +source: "https://voidpoint.io/terminx/eduke32" +upstream: "https://voidpoint.io/terminx/eduke32" +profiled_date: "2026-10-04" +source_commit: "ec5824db81817866f70da326d3811bb0f52b3517" +core_version: "r11007" +display_name: "EDuke32" +cores: [eduke32] +systems: [duke3d, nam, napalm, ww2gi] + +notes: | + Build-engine port by TerminX, Hendricks266, Plagman and others. Covers + Duke Nukem 3D (and its official addons), NAM, NAPALM, WWII GI and + Platoon Leader. Startup scans the search path for registered GRPs by + CRC32 (source/duke3d/src/grpscan.cpp:39-76 internalgrpfiles[]). Each GRP + carries a game flag (DUKE / NAM / NAPALM / WW2GI) and optional addon + dependency; EDuke32 picks the user selection, mounts it with + initgroupfile and loads the DEF / CON / RTS the GRP points to. + + G_DefaultGrpFile (source/duke3d/src/common.cpp:60-73) returns the base + GRP for the active game flag: DUKE3D.GRP, NAM.GRP, NAPALM.GRP, WW2GI.GRP. + G_DefaultConFile and G_DefaultRtsFile pick EDUKE.CON / NAM.CON / + NAPALM.CON / WW2GI.CON and DUKE.RTS / NAM.RTS / NAPALM.RTS / WW2GI.RTS. + + CRCs listed in source/duke3d/src/grpscan.h match the retail GRP byte + for byte; the loader only checks CRC32 (not MD5) and only to pick the + entry, never to refuse an unknown GRP. CON / RTS / addon files are + referenced from the chosen entry but their contents are not validated. + +files: + # ================================================================ + # Duke Nukem 3D (base game, GAMEFLAG_DUKE) + # ================================================================ + + - name: "DUKE3D.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/common.cpp:36 (defaultgamegrp GAME_DUKE), source/duke3d/src/grpscan.cpp:41-50 (CRC-indexed variants)" + note: > + Any retail variant plays: Atomic Edition / Plus / World Tour + (DUKE15_CRC 0xFD3DCFF1, 44356548 bytes, grpscan.h:35), v1.3D + registered (DUKE13_CRC 0xBBC9CE44, 26524524 bytes, grpscan.h:33), + Shareware v1.3D (DUKESW_CRC 0x983AD923, 11035779 bytes, + grpscan.h:41), World Tour (DUKEWT_CRC 0x982AFE4A, grpscan.h:37), + Plutonium Pak (DUKEPP_CRC 0xF514A6AC, grpscan.h:36), South Korean + censored (DUKEKR_CRC 0xAA4F6A40, grpscan.h:34). CRC32 identifies + the variant and selects the matching entry in internalgrpfiles[]; + no MD5 or SHA1 is read. + + - name: "EDUKE.CON" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_DUKE)" + note: "EDuke32 CON script. Shipped inside the GRP by default; external copy only when the user overrides it." + + - name: "DUKE.RTS" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:39-76 (rtsname field)" + note: "Remote Ridicule speech. Not loaded if absent." + + # ---- Duke 3D addons ---- + + - name: "DUKEDC.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:56-59 (Duke it out in D.C., GAMEFLAG_ADDON)" + + - name: "VACATION.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:60-64 (Duke Caribbean: Life's a Beach, GAMEFLAG_ADDON)" + + - name: "NWINTER.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:65-66 (Duke: Nuclear Winter, GAMEFLAG_ADDON)" + + - name: "DZ2.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:67-69 (Duke!ZONE II, GAMEFLAG_ADDON)" + + - name: "PENTP.GRP" + category: game_data + system: duke3d + required: false + source_ref: "source/duke3d/src/grpscan.cpp:70-71 (Penthouse Paradise, GAMEFLAG_ADDON)" + + # ================================================================ + # NAM (GAMEFLAG_NAM) + # ================================================================ + + - name: "NAM.GRP" + category: game_data + system: nam + size: 43448927 + required: false + source_ref: "source/duke3d/src/grpscan.h:54 (NAM_CRC 0x75C1F07B), source/duke3d/src/grpscan.cpp:72" + + - name: "NAM.CON" + category: game_data + system: nam + required: false + source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_NAM)" + + # ================================================================ + # NAPALM (GAMEFLAG_NAM | GAMEFLAG_NAPALM) + # ================================================================ + + - name: "NAPALM.GRP" + category: game_data + system: napalm + size: 44365728 + required: false + source_ref: "source/duke3d/src/grpscan.h:55 (NAPALM_CRC 0x3DE1589A), source/duke3d/src/grpscan.cpp:73" + + - name: "NAPALM.CON" + category: game_data + system: napalm + required: false + source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_NAPALM)" + + # ================================================================ + # WWII GI (GAMEFLAG_WW2GI) + # ================================================================ + + - name: "WW2GI.GRP" + category: game_data + system: ww2gi + size: 77939508 + required: false + source_ref: "source/duke3d/src/grpscan.h:56 (WW2GI_CRC 0x907B82BF), source/duke3d/src/grpscan.cpp:74" + + - name: "WW2GI.CON" + category: game_data + system: ww2gi + required: false + source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_WW2GI)" + + - name: "PLATOONL.GRP" + category: game_data + system: ww2gi + size: 37852572 + required: false + source_ref: "source/duke3d/src/grpscan.h:57 (PLATOONL_CRC 0xD1ED8C0C), source/duke3d/src/grpscan.cpp:75 (Platoon Leader, GAMEFLAG_ADDON)" diff --git a/emulators/etlegacy.yml b/emulators/etlegacy.yml new file mode 100644 index 00000000..893d3a86 --- /dev/null +++ b/emulators/etlegacy.yml @@ -0,0 +1,71 @@ +emulator: ET Legacy +type: standalone +core_classification: game_engine +source: "https://github.com/etlegacy/etlegacy" +upstream: "https://github.com/etlegacy/etlegacy" +profiled_date: "2026-10-04" +source_commit: "f8974d1861e3e95c236d3a7c05362d05f408275f" +core_version: "2.83.0+git" +display_name: "ET: Legacy" +cores: [etlegacy] +systems: [enemyterritory] + +notes: | + Wolfenstein: Enemy Territory source port. BASEGAME = "etmain" + (src/qcommon/qcommon.h:787). FS_InitFilesystem (src/qcommon/files.c: + 5066-5094) refuses to start if pak0.pk3 is not reachable under etmain + and prints "Please copy pak0.pk3 from the 'etmain' path of your + Wolfenstein: Enemy Territory installation to ". pak1.pk3 and + pak2.pk3 are checked against the server's requested pak list in + FS_ComparePaks (src/qcommon/files.c:4011-4018) but neither is a + startup gate; third-party mods pull them in as needed (see README.md + "In addition, third party mods might also require pak1.pk3 and + pak2.pk3"). mp_bin.pk3 ships in the retail release and holds the + stock multiplayer binaries. + + NUM_ID_PAKS = 9 (src/qcommon/qcommon.h:815) counts the names recognised + by FS_idPak; retail Enemy Territory 2.60b publishes only pak0, pak1, + pak2 and mp_bin, so the extra slots are reserved for forward compatible + server lists, never filled by id. + + The ET Legacy project ships its own replacement etmain/ assets (configs, + presets, locale files) directly in the source tree, plus a Legacy mod + pk3 downloaded on first run. The user still has to supply the retail + pak0.pk3 from the free Enemy Territory 2.60b download; pak0.pk3 holds + every id map, model, texture and sound. + +files: + - name: "pak0.pk3" + category: game_data + system: enemyterritory + path: "etmain/pak0.pk3" + required: true + md5: "c8ce5e3eafb9faa74b9af03a9d6f3f5e" + source_ref: "src/qcommon/files.c:5066-5094 (fatal if absent), 5076 (FS_FOpenFileRead \"pak0.pk3\"), src/qcommon/qcommon.h:787 (BASEGAME \"etmain\")" + note: "Retail Wolfenstein: Enemy Territory 2.60b data pak. Startup gate. MD5 informational, not validated by the engine." + + - name: "pak1.pk3" + category: game_data + system: enemyterritory + path: "etmain/pak1.pk3" + required: false + md5: "0d1cb16a147b0f12d79fd3b045e07706" + source_ref: "src/qcommon/files.c:4011-4018 (FS_idPak, NUM_ID_PAKS=9), README.md" + note: "Retail content update pak. Required by servers running 2.60b, pulled in by FS_ComparePaks." + + - name: "pak2.pk3" + category: game_data + system: enemyterritory + path: "etmain/pak2.pk3" + required: false + md5: "61e3bbae9c1cd522cf7fcc27e3a4bbab" + source_ref: "src/qcommon/files.c:4011-4018 (FS_idPak), README.md" + note: "Retail content update pak." + + - name: "mp_bin.pk3" + category: game_data + system: enemyterritory + path: "etmain/mp_bin.pk3" + required: false + source_ref: "src/qcommon/files.c:4011-4018 (FS_idPak)" + note: "Retail multiplayer QVM binaries. ET Legacy ships its own cgame/ui binaries; retail pack is for pure clients joining stock servers." diff --git a/emulators/fury.yml b/emulators/fury.yml new file mode 100644 index 00000000..0b8239b9 --- /dev/null +++ b/emulators/fury.yml @@ -0,0 +1,42 @@ +emulator: Ion Fury +type: standalone +core_classification: game_engine +source: "https://voidpoint.io/terminx/eduke32" +upstream: "https://voidpoint.io/terminx/eduke32" +profiled_date: "2026-10-04" +source_commit: "ec5824db81817866f70da326d3811bb0f52b3517" +core_version: "r11007" +display_name: "Ion Fury" +cores: [fury] +systems: [fury] + +notes: | + Ion Fury runs on EDuke32 built with FURY=1 (GNUmakefile:6-15), which + defines EDUKE32_STANDALONE and sets APPBASENAME=fury, APPNAME="Ion Fury". + In standalone mode the GRP-detection table of EDuke32 + (source/duke3d/src/grpscan.cpp:38-77) is compiled out by #ifndef + EDUKE32_STANDALONE, G_DefaultGrpFile returns "(none)" + (source/duke3d/src/common.cpp:60-77), and the loader autoscans the search + paths for *.grp / *.zip / *.ssi / *.pk3 / *.pk4 + (source/duke3d/src/common.cpp:913). + + Search paths added for the Fury binary include the Steam install (Ion + Fury) and the GOG install (ION Fury), marked with SEARCHPATH_FURY + (source/duke3d/src/common.cpp:585-587, 622-625, 822-833). After scanning, + G_CleanupSearchPaths removes all non-FURY entries when the FURY game + flag is active (source/duke3d/src/common.cpp:850-851), so Fury only + reads from its own install directory. + + No hash or filename is validated by the engine: Ion Fury ships one GRP + (fury.grp) that holds every map, art bank, sound and DEF the game needs, + plus a small number of top-level files the retail installers lay down + alongside it. Only the GRP is listed below; the other files + (fury.cfg, settings.cfg, saves, screenshots) are user state. + +files: + - name: "fury.grp" + category: game_data + system: fury + required: true + source_ref: "source/duke3d/src/common.cpp:913 (autoscan extensions), 585-587 (Steam path), 822-833 (GOG path)" + note: "Main data archive bundled with the retail Ion Fury release. Autoscan picks it up as the only GRP under the Fury search paths." diff --git a/emulators/ioquake3.yml b/emulators/ioquake3.yml new file mode 100644 index 00000000..46d82c04 --- /dev/null +++ b/emulators/ioquake3.yml @@ -0,0 +1,138 @@ +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. + + Missing paks are only fatal when neither com_standalone nor fs_basegame + override the base game (code/qcommon/files.c:3697, 3738). + +files: + # ================================================================ + # Quake III Arena (baseq3/, 9 numbered paks) + # Retail v1.32 ships pak0.pk3 through pak8.pk3 under baseq3. + # 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:179 (pak_checksums[0]=1566731103u), 3568 (per-index checksum compare)" + note: "Retail Quake III Arena base pak. Engine prints a warning on checksum mismatch, does not refuse the file." + + - name: "pak1.pk3" + category: game_data + system: quake3 + path: "baseq3/pak1.pk3" + required: false + source_ref: "code/qcommon/files.c:180 (pak_checksums[1]=298122907u)" + + - name: "pak2.pk3" + category: game_data + system: quake3 + path: "baseq3/pak2.pk3" + required: false + source_ref: "code/qcommon/files.c:181 (pak_checksums[2]=412165236u)" + + - name: "pak3.pk3" + category: game_data + system: quake3 + path: "baseq3/pak3.pk3" + required: false + source_ref: "code/qcommon/files.c:182 (pak_checksums[3]=2991495316u)" + + - name: "pak4.pk3" + category: game_data + system: quake3 + path: "baseq3/pak4.pk3" + required: false + source_ref: "code/qcommon/files.c:183 (pak_checksums[4]=1197932710u)" + + - name: "pak5.pk3" + category: game_data + system: quake3 + path: "baseq3/pak5.pk3" + required: false + source_ref: "code/qcommon/files.c:184 (pak_checksums[5]=4087071573u)" + + - name: "pak6.pk3" + category: game_data + system: quake3 + path: "baseq3/pak6.pk3" + required: false + source_ref: "code/qcommon/files.c:185 (pak_checksums[6]=3709064859u)" + + - name: "pak7.pk3" + category: game_data + system: quake3 + path: "baseq3/pak7.pk3" + required: false + source_ref: "code/qcommon/files.c:186 (pak_checksums[7]=908855077u)" + + - name: "pak8.pk3" + category: game_data + system: quake3 + path: "baseq3/pak8.pk3" + required: false + source_ref: "code/qcommon/files.c:187 (pak_checksums[8]=977125798u)" + + # ================================================================ + # 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:192 (missionpak_checksums[0]=2430342401u)" + note: "Team Arena base pak. Required only when launching +set fs_game missionpack." + + - name: "pak1.pk3" + category: game_data + system: teamarena + path: "missionpack/pak1.pk3" + required: false + source_ref: "code/qcommon/files.c:193 (missionpak_checksums[1]=511014160u)" + + - name: "pak2.pk3" + category: game_data + system: teamarena + path: "missionpack/pak2.pk3" + required: false + source_ref: "code/qcommon/files.c:194 (missionpak_checksums[2]=2662638993u)" + + - name: "pak3.pk3" + category: game_data + system: teamarena + path: "missionpack/pak3.pk3" + required: false + source_ref: "code/qcommon/files.c:195 (missionpak_checksums[3]=1438664554u)" diff --git a/emulators/taradino.yml b/emulators/taradino.yml new file mode 100644 index 00000000..8b62c78f --- /dev/null +++ b/emulators/taradino.yml @@ -0,0 +1,116 @@ +emulator: Taradino +type: standalone +core_classification: game_engine +source: "https://github.com/fabiangreffrath/taradino" +upstream: "https://github.com/fabiangreffrath/taradino" +profiled_date: "2026-10-04" +source_commit: "2b4ea3c6c18caf60959efee1f2534c2122607716" +core_version: "0.1" +display_name: "Taradino" +cores: [taradino] +systems: [rott] + +notes: | + SDL2 port of Rise of the Triad by Fabian Greffrath, forked from the + original 1995 Apogee/3D Realms source release. + + Build-time switch: SHAREWARE=0 (default, "registered") expects + DARKWAR.WAD / DARKWAR.RTL / DARKWAR.RTC; SHAREWARE=1 (dropped by the + CMakeLists SHAREWARE option) expects HUNTBGIN.WAD / HUNTBGIN.RTL / + HUNTBGIN.RTC (rott/rt_main.h:33-45). The repo distributes the + non-shareware binary; shareware builds are compiled by users from the + same tree. + + Startup assembles argv in SetupWadFile (rott/rt_main.c:808-842), joining + `datadir` and STANDARDGAMEWAD, then feeds it to W_InitMultipleFiles + (rott/rt_main.c:842, rott/w_wad.c). The WAD search tries each path + registered through add_datadir() (rott/rt_datadir.c:198-209); a missing + main WAD aborts with FileNotFoundError(STANDARDGAMEWAD) + (rott/rt_main.c:812). + + Game-product detection runs after the main WAD opens: FindFileByName + (rott/rt_main.c:165-177) looks for ROTTSITE.RTC (site license), + ROTTCD.RTC (SuperROTT, i.e. ROTT CD extra battle levels), and + DARKWAR.RTC (registered battle levels), setting gamestate.Product to + ROTT_SITELICENSE, ROTT_SUPERCD or ROTT_REGISTERED. Shareware builds + stay on ROTT_SHAREWARE. + + REMOTE1.RTS carries the "Remote Ridicule" speech bank; its absence is + silently tolerated (rott/rt_main.c:830-834). + + No hash is validated — the loader relies on WAD lump names and the + SHAREWARE_TAG magic number inside the RTL (rott/rt_ted.c:1432). + +files: + # ================================================================ + # Rise of the Triad: Dark War (registered release, Apogee 1995) + # Default build (SHAREWARE=0, rott/rt_main.h:33-39) + # ================================================================ + + - name: "DARKWAR.WAD" + category: game_data + system: rott + required: true + source_ref: "rott/rt_main.h:34 (STANDARDGAMEWAD), rott/rt_main.c:808-812 (FileNotFoundError on miss)" + note: "Main data WAD. Fatal if absent in non-shareware build." + + - name: "DARKWAR.RTL" + category: game_data + system: rott + required: true + source_ref: "rott/rt_main.h:35 (STANDARDGAMELEVELS), rott/rt_main.c:192" + note: "Single-player level data. Opened alongside the main WAD." + + - name: "DARKWAR.RTC" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:36 (STANDARDBATTLELEVELS), rott/rt_main.c:174-177 (ROTT_REGISTERED when present)" + note: "Comm-bat (deathmatch) level data. Marks gamestate as ROTT_REGISTERED." + + - name: "ROTTCD.RTC" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:38 (SUPERROTTBATTLELEVELS), rott/rt_main.c:170-172" + note: "SuperROTT (ROTT CD) extra battle levels. Promotes product to ROTT_SUPERCD." + + - name: "ROTTSITE.RTC" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:39 (SITELICENSEBATTLELEVELS), rott/rt_main.c:164-166" + note: "Site License battle levels. Promotes product to ROTT_SITELICENSE." + + - name: "REMOTE1.RTS" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.c:832 (datadir/REMOTE1.RTS fallback)" + note: "Remote Ridicule speech bank. Loaded if present, silently skipped otherwise." + + # ================================================================ + # Shareware build (SHAREWARE=1, rott/rt_main.h:41-43) + # Produced only when users set -DSHAREWARE=1; file names differ. + # ================================================================ + + - name: "HUNTBGIN.WAD" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:41 (STANDARDGAMEWAD under SHAREWARE)" + note: "Shareware main WAD (Hunt Begins). Required only in shareware builds." + + - name: "HUNTBGIN.RTL" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:42 (STANDARDGAMELEVELS under SHAREWARE)" + note: "Shareware level data." + + - name: "HUNTBGIN.RTC" + category: game_data + system: rott + required: false + source_ref: "rott/rt_main.h:43 (STANDARDBATTLELEVELS under SHAREWARE)" + note: "Shareware comm-bat level data." diff --git a/emulators/xash3d_fwgs.yml b/emulators/xash3d_fwgs.yml new file mode 100644 index 00000000..19ab65b4 --- /dev/null +++ b/emulators/xash3d_fwgs.yml @@ -0,0 +1,217 @@ +emulator: Xash3D FWGS +type: standalone +core_classification: game_engine +source: "https://github.com/FWGS/xash3d-fwgs" +upstream: "https://github.com/FWGS/xash3d-fwgs" +profiled_date: "2026-10-04" +source_commit: "1414fc281b6dc986378ea7ae35086c62d782a865" +core_version: "0.21+git" +display_name: "Xash3D FWGS" +cores: [xash3d_fwgs] +systems: [halflife, cstrike, czero, czeror, dmc, gearbox, bshift, ricochet, tfc] + +notes: | + GoldSrc / Half-Life 1 engine reimplementation by Flying With Gauss. + Game directories are discovered at startup: FS_CheckForXashGameDir + (filesystem/gameinfo.c:611-634) walks each sub-folder of the base path + and keeps the ones that contain gameinfo.txt or liblist.gam. + FS_ParseGenericGameInfo (filesystem/gameinfo.c:231-430) reads the mod + descriptor out of either file: `basedir` names the fallback game + (chained one level, e.g. czeror -> czero -> cstrike -> valve, see + filesystem/searchpath.c:327), `fallback_dir` names a second fallback, + and `game` / `gamename` carry the human-readable title. + + Each supported mod's data is a Valve-style game folder with its own + pak0.pak / pak1.pak, maps/, models/, sound/, overviews/ and a game + descriptor. The engine does not hash any file; the pak header is the + only sanity check (filesystem/pak.c). liblist.gam ships inside each + retail mod and is also written out by the engine as gameinfo.txt the + first time it imports a Valve folder (filesystem/gameinfo.c:538-544). + + A Quake-engine game dir is recognised separately by + FS_CheckForQuakeGameDir (filesystem/gameinfo.c:578-603), which looks + for pak0.pak + progs.dat / quake.rc; Xash3D FWGS can run Quake 1 total + conversions this way. + + Below are the folders Half-Life retail / official addon releases + install under the Steam install root. Each entry marks the per-mod + descriptor and base pak so the engine can detect the game; map / model + / sound trees that live beside them are too open-ended to enumerate + and are counted as part of the same game data. + +files: + # ================================================================ + # Half-Life (valve/) — base game, chained parent of every HL1 mod + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: halflife + path: "valve/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617 (gamedir probe), 538-544 (liblist.gam -> gameinfo.txt conversion), 695 (parser)" + note: "Game descriptor shipped with retail Half-Life. Engine converts it to gameinfo.txt on first run." + + - name: "pak0.pak" + category: game_data + system: halflife + path: "valve/pak0.pak" + required: true + source_ref: "filesystem/pak.c (PAK loader), filesystem/searchpath.c:912 (valve fallback)" + note: "Retail Half-Life base pak." + + - name: "pak1.pak" + category: game_data + system: halflife + path: "valve/pak1.pak" + required: false + source_ref: "filesystem/pak.c" + note: "Patch pak, present on Steam Half-Life installs." + + # ================================================================ + # Counter-Strike 1.6 (cstrike/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: cstrike + path: "cstrike/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617, filesystem/searchpath.c:327 (cstrike -> valve chain)" + note: "Declares fallback_dir \"valve\". Counter-Strike 1.6 retail descriptor." + + - name: "pak0.pak" + category: game_data + system: cstrike + path: "cstrike/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + note: "Loose files (maps/, sprites/, sound/, models/) are the usual retail layout; a bundled pak0.pak is optional." + + # ================================================================ + # Condition Zero (czero/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: czero + path: "czero/liblist.gam" + required: true + source_ref: "filesystem/searchpath.c:327 (czero -> cstrike -> valve chain)" + + - name: "pak0.pak" + category: game_data + system: czero + path: "czero/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Condition Zero: Deleted Scenes (czeror/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: czeror + path: "czeror/liblist.gam" + required: true + source_ref: "filesystem/searchpath.c:327 (czeror -> czero -> cstrike -> valve chain)" + + - name: "pak0.pak" + category: game_data + system: czeror + path: "czeror/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Deathmatch Classic (dmc/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: dmc + path: "dmc/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617" + + - name: "pak0.pak" + category: game_data + system: dmc + path: "dmc/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Opposing Force (gearbox/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: gearbox + path: "gearbox/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617" + note: "Gearbox folder is the retail Opposing Force game dir." + + - name: "pak0.pak" + category: game_data + system: gearbox + path: "gearbox/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Blue Shift (bshift/) + # Half-Life source dir still called "bshift" in Steam depot. + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: bshift + path: "bshift/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617" + + - name: "pak0.pak" + category: game_data + system: bshift + path: "bshift/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Ricochet (ricochet/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: ricochet + path: "ricochet/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617" + + - name: "pak0.pak" + category: game_data + system: ricochet + path: "ricochet/pak0.pak" + required: false + source_ref: "filesystem/pak.c" + + # ================================================================ + # Team Fortress Classic (tfc/) + # ================================================================ + + - name: "liblist.gam" + category: game_data + system: tfc + path: "tfc/liblist.gam" + required: true + source_ref: "filesystem/gameinfo.c:617" + + - name: "pak0.pak" + category: game_data + system: tfc + path: "tfc/pak0.pak" + required: false + source_ref: "filesystem/pak.c" diff --git a/emulators/yquake2.yml b/emulators/yquake2.yml new file mode 100644 index 00000000..2feaa483 --- /dev/null +++ b/emulators/yquake2.yml @@ -0,0 +1,104 @@ +emulator: Yamagi Quake II +type: standalone +core_classification: game_engine +source: "https://github.com/yquake2/yquake2" +upstream: "https://github.com/yquake2/yquake2" +profiled_date: "2026-10-04" +source_commit: "f190ac496d00ef9238a5f16dd012c6dc81a997c9" +core_version: "8.51+git" +display_name: "Yamagi Quake II" +cores: [yquake2] +systems: [quake2, xatrix, rogue, ctf] + +notes: | + Quake II source port. BASEDIRNAME = "baseq2" (src/common/header/common.h + :36). FS_AddDirToSearchPath (src/common/filesystem.c:1646) loops + pak%d. from 0 to MAX_PAKS-1 (=99) across fs_packtypes = { pak, pk3 } + for the active game directory, loading each one as a protected pak. + retail Quake II ships only pak0.pak and pak1.pak; later paks are + consumed by community mods and the Nightdive remaster. + + Supported official mods are listed in first_mods[] + (src/common/filesystem.c:1331) = { "baseq2", "xatrix", "rogue", "ctf" }. + Mod game dirs are selected via the `game` cvar (FS_InitFilesystem + + FS_BuildGameSpecificSearchPath, src/common/filesystem.c:2075-2097). + Each mod ships its own pak0.pak / pak1.pak (The Reckoning, Ground Zero, + Three Wave CTF). Zaero support uses the same path layout (`game zaero`) + but no official repository under the yquake2 org. + + The engine never hashes a pak. Validation is "does the pack read as a + valid PAK header" (FS_LoadPAK, src/common/filesystem.c:873). Missing + files produce "Couldn't load %s" at Com_Error level only for the + baseq2 lookup when the game cannot find any game assets at all. + + Background music is streamed from /music/track02.ogg ... track22.ogg + by OGG_InitTrackList (src/client/sound/ogg.c), not required for gameplay. + +files: + # ================================================================ + # Quake II (baseq2/) + # Retail v3.20 ships pak0.pak (max 2 GiB PAK, holds everything) and + # pak1.pak (demo-related). Patched installations may add pak2.pak+. + # ================================================================ + + - name: "pak0.pak" + category: game_data + system: quake2 + path: "baseq2/pak0.pak" + required: true + source_ref: "src/common/filesystem.c:1688 (pak%d.%s scan), 36 (BASEDIRNAME), 1331 (first_mods[0]=baseq2)" + note: "Retail Quake II data pak. Not hash-validated." + + - name: "pak1.pak" + category: game_data + system: quake2 + path: "baseq2/pak1.pak" + required: false + source_ref: "src/common/filesystem.c:1688" + + - name: "pak2.pak" + category: game_data + system: quake2 + path: "baseq2/pak2.pak" + required: false + source_ref: "src/common/filesystem.c:1688" + note: "Added by community re-releases and the KMQuake2 content pack." + + # ================================================================ + # The Reckoning (xatrix/) — official Mission Pack 1 + # Separate yquake2 game library repo: yquake2/xatrix. + # ================================================================ + + - name: "pak0.pak" + category: game_data + system: xatrix + path: "xatrix/pak0.pak" + required: false + source_ref: "src/common/filesystem.c:1331 (first_mods[1]=xatrix), 1688" + note: "The Reckoning data. Loaded when `+set game xatrix` is passed." + + # ================================================================ + # Ground Zero (rogue/) — official Mission Pack 2 + # Separate yquake2 game library repo: yquake2/rogue. + # ================================================================ + + - name: "pak0.pak" + category: game_data + system: rogue + path: "rogue/pak0.pak" + required: false + source_ref: "src/common/filesystem.c:1331 (first_mods[2]=rogue), 1688" + note: "Ground Zero data. Loaded when `+set game rogue` is passed." + + # ================================================================ + # Three Wave Capture The Flag (ctf/) — official free addon + # Separate yquake2 game library repo: yquake2/ctf. + # ================================================================ + + - name: "pak0.pak" + category: game_data + system: ctf + path: "ctf/pak0.pak" + required: false + source_ref: "src/common/filesystem.c:1331 (first_mods[3]=ctf), 1688" + note: "Three Wave CTF data. Loaded when `+set game ctf` is passed."