fix: check six doom-era profiles against source

This commit is contained in:
Abdessamad Derraz committed 2026-10-04 17:05:13 +02:00
1 parent bc7b124a44
commit b97ee26b32
6 files changed
+981 -392

No files matched your search

+98 -58
View File
@@ -17,20 +17,28 @@ notes: |
Engine resources (built from wadsrc*/static/ via add_pk3): Engine resources (built from wadsrc*/static/ via add_pk3):
gzdoom.pk3 BASEWAD, searched by BaseFileSearch gzdoom.pk3 BASEWAD, searched by BaseFileSearch
ref: src/version.h:90, src/d_main.cpp ref: src/version.h:90, src/d_main.cpp:3757-3761
game_support.pk3 OPTIONALWAD, filter/game assets per IWAD game_support.pk3 OPTIONALWAD, filter/game assets per IWAD
ref: src/version.h:92 ref: src/version.h:92, src/d_main.cpp:3794
lights.pk3 dynamic light definitions lights.pk3 dynamic light definitions
brightmaps.pk3 brightmap textures brightmaps.pk3 brightmap textures
game_widescreen_gfx.pk3 widescreen HUD/menu replacements game_widescreen_gfx.pk3 widescreen HUD/menu replacements
The last three are skipped for shareware IWADs and with -noextras.
ref: src/d_main.cpp:2050-2071
Game data is a user-supplied IWAD. iwadinfo.txt declares each known IWAD Game data is a user-supplied IWAD. iwadinfo.txt declares each known
with its IWADName, MustContain lumps and support files. IWAD with its IWADName, MustContain lumps and support files. The
ref: wadsrc_extra/static/iwadinfo.txt search directories are scanned for the file names of its Names block
and for any .iwad, .ipk3 or .ipk7 file; each candidate is then
identified by its lumps, not by its name. The Names block also lists
doomu.wad, doom1.wad, bfgdoom.wad, bfgdoom2.wad, freedoomu.wad,
freedoom.wad, hereticsr.wad, heretic1.wad, hexendemo.wad, hexdemo.wad,
strife0.wad and strife.wad.
ref: wadsrc_extra/static/iwadinfo.txt:650-703, src/d_iwad.cpp:502-530
Startup refuses to run if BASEWAD (gzdoom.pk3) is absent. The other Startup refuses to run if BASEWAD (gzdoom.pk3) is absent, and stops
engine pk3s and the IWAD selection are read from the same base search with "Cannot find a game IWAD" when no candidate is identified.
(fs_basepath, home dir, system paths). ref: src/d_main.cpp:3757-3761, src/d_iwad.cpp:789-798
files: files:
# ================================================================ # ================================================================
@@ -40,29 +48,50 @@ files:
- name: "gzdoom.pk3" - name: "gzdoom.pk3"
category: game_data category: game_data
required: true required: true
source_ref: "src/version.h:90 (BASEWAD), wadsrc/CMakeLists.txt:1" source_ref: "src/version.h:90, src/d_main.cpp:3757-3761, wadsrc/CMakeLists.txt:1"
note: "Fonts, menus, zscript, textures. Fatal if absent." note: "Fonts, menus, zscript, textures. Fatal if absent."
- name: "game_support.pk3" - name: "game_support.pk3"
category: game_data category: game_data
required: false required: false
source_ref: "src/version.h:92 (OPTIONALWAD), wadsrc_extra/CMakeLists.txt:1" source_ref: "src/version.h:92, src/d_main.cpp:3794-3796, wadsrc_extra/CMakeLists.txt:1"
note: "Per-game filters under static/filter/ (doom.id, strife, hexen, heretic, chex...)." note: "Per-game filters under static/filter/ (doom.id, strife, hexen, heretic, chex...)."
- name: "lights.pk3" - name: "lights.pk3"
category: game_data category: game_data
required: false required: false
source_ref: "src/d_main.cpp:2055, wadsrc_lights/CMakeLists.txt:1" source_ref: "src/d_main.cpp:2053-2058, wadsrc_lights/CMakeLists.txt:1"
- name: "brightmaps.pk3" - name: "brightmaps.pk3"
category: game_data category: game_data
required: false required: false
source_ref: "src/d_main.cpp:2061, wadsrc_bm/CMakeLists.txt:1" source_ref: "src/d_main.cpp:2059-2064, wadsrc_bm/CMakeLists.txt:1"
- name: "game_widescreen_gfx.pk3" - name: "game_widescreen_gfx.pk3"
category: game_data category: game_data
required: false required: false
source_ref: "src/d_main.cpp:2067, wadsrc_widepix/CMakeLists.txt:1" source_ref: "src/d_main.cpp:2065-2070, wadsrc_widepix/CMakeLists.txt:1"
- name: "gzdoom.sf2"
category: game_data
path: "soundfonts/gzdoom.sf2"
required: false
source_ref: "src/common/audio/music/i_soundfont.cpp:427-430, src/CMakeLists.txt:1429"
note: "Default soundfont, used when the soundfont directories hold none."
- name: "GENMIDI.GS.wopl"
category: game_data
path: "fm_banks/GENMIDI.GS.wopl"
required: false
source_ref: "src/CMakeLists.txt:1431, src/gameconfigfile.cpp:165-195, src/common/audio/music/i_soundfont.cpp:355-359"
note: "OPL3 bank copied next to the executable; fm_banks is one of the scanned soundfont directories."
- name: "gs-by-papiezak-and-sneakernets.wopn"
category: game_data
path: "fm_banks/gs-by-papiezak-and-sneakernets.wopn"
required: false
source_ref: "src/CMakeLists.txt:1433, src/gameconfigfile.cpp:165-195, src/common/audio/music/i_soundfont.cpp:360-364"
note: "OPN2 bank copied next to the executable."
# ================================================================ # ================================================================
# IWADs (user-supplied). At least one is needed to launch a game. # IWADs (user-supplied). At least one is needed to launch a game.
@@ -75,136 +104,145 @@ files:
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (The Ultimate DOOM / DOOM Registered)" source_ref: "wadsrc_extra/static/iwadinfo.txt:420, 437, 659"
note: "Ultimate Doom (version 2) or Doom Registered (version 1)." note: "The Ultimate DOOM and DOOM Registered both use this name; told apart by their lumps."
- name: "doom2.wad" - name: "doom2.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: Hell on Earth)" source_ref: "wadsrc_extra/static/iwadinfo.txt:640, 653"
- name: "doom2f.wad" - name: "doom2f.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: L'Enfer sur Terre)" source_ref: "wadsrc_extra/static/iwadinfo.txt:625, 657"
- name: "doombfg.wad" - name: "doombfg.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM: BFG Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:332, 666"
- name: "doom2bfg.wad" - name: "doom2bfg.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: BFG Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:560, 667"
- name: "doomunity.wad" - name: "doomunity.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM: Unity Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:369, 661"
- name: "doom2unity.wad" - name: "doom2unity.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: Unity Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:592, 655"
- name: "doomkex.wad" - name: "doomkex.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM: KEX Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:350, 662"
- name: "doom2kex.wad" - name: "doom2kex.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: KEX Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:576, 656"
- name: "doomxbox.wad" - name: "doomxbox.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM: XBox Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:403, 660"
- name: "doom2xbox.wad" - name: "doom2xbox.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM 2: XBox Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:608, 654"
- name: "doom_complete.pk3" - name: "doom_complete.pk3"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (DOOM: Complete: WadSmoosh)" source_ref: "wadsrc_extra/static/iwadinfo.txt:389, 652"
- name: "plutonia.wad" - name: "plutonia.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Final Doom: Plutonia Experiment)" source_ref: "wadsrc_extra/static/iwadinfo.txt:545, 670"
- name: "plutoniaunity.wad" - name: "plutoniaunity.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Plutonia Unity Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:514, 671"
- name: "plutoniakex.wad" - name: "plutoniakex.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Plutonia KEX Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:529, 672"
- name: "tnt.wad" - name: "tnt.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Final Doom: TNT - Evilution)" source_ref: "wadsrc_extra/static/iwadinfo.txt:499, 673"
- name: "tntunity.wad" - name: "tntunity.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (TNT Unity Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:468, 674"
- name: "tntkex.wad" - name: "tntkex.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (TNT KEX Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:483, 675"
- name: "nerve.wad" - name: "nerve.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Load = \"nerve.wad\" under DOOM 2: BFG/XBox)" source_ref: "wadsrc_extra/static/iwadinfo.txt:565, 614, src/d_iwad.cpp:877-895"
note: "No Rest for the Living. Autoloaded by Doom 2 BFG and Xbox editions." note: "No Rest for the Living. Autoloaded by Doom 2 BFG and Xbox editions."
- name: "nerveunity.wad" - name: "nerveunity.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Load under DOOM 2: Unity Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:598, src/d_iwad.cpp:877-895"
note: "Loaded from the IWAD directory by DOOM 2: Unity Edition."
- name: "extras.wad" - name: "extras.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Load under KEX/Unity editions)" source_ref: "wadsrc_extra/static/iwadinfo.txt:357, 376, 488, 534, 582, 598"
note: "Loaded from the IWAD directory by the KEX and Unity editions."
- name: "soundtrack"
category: game_data
system: doom
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:376, 598, src/d_iwad.cpp:877-895"
note: "Loaded from the IWAD directory by the DOOM and DOOM 2 Unity editions."
- name: "id24res.wad" - name: "id24res.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (SupportWAD on every id iwad)" source_ref: "wadsrc_extra/static/iwadinfo.txt:341, 360, 379, src/d_iwad.cpp:862-875"
note: "id24 resource WAD. Loaded with any id IWAD when present." note: "id24 resource WAD. SupportWAD of every id IWAD block, loaded when found and i_loadsupportwad is set."
# ---- Freedoom (free) ---- # ---- Freedoom (free) ----
@@ -212,19 +250,19 @@ files:
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Freedoom: Phase 1)" source_ref: "wadsrc_extra/static/iwadinfo.txt:307, 676"
- name: "freedoom2.wad" - name: "freedoom2.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Freedoom: Phase 2)" source_ref: "wadsrc_extra/static/iwadinfo.txt:294, 677"
- name: "freedm.wad" - name: "freedm.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (FreeDM)" source_ref: "wadsrc_extra/static/iwadinfo.txt:281, 680"
# ---- Heretic ---- # ---- Heretic ----
@@ -232,14 +270,15 @@ files:
category: game_data category: game_data
system: heretic system: heretic
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Heretic / Heretic: Shadow of the Serpent Riders)" source_ref: "wadsrc_extra/static/iwadinfo.txt:241, 244, 254, 257, 681"
note: "Both Heretic 1.0 and Shadow of the Serpent Riders use this name; distinguished by EXTENDED lump." note: "Both Heretic and Shadow of the Serpent Riders use this name; told apart by the EXTENDED lump."
- name: "blasphem.wad" - name: "blasphem.wad"
aliases: ["blasphemer.wad"]
category: game_data category: game_data
system: heretic system: heretic
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Blasphemer)" source_ref: "wadsrc_extra/static/iwadinfo.txt:228, 692-693"
# ---- Hexen ---- # ---- Hexen ----
@@ -247,13 +286,13 @@ files:
category: game_data category: game_data
system: hexen system: hexen
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Hexen: Beyond Heretic)" source_ref: "wadsrc_extra/static/iwadinfo.txt:188, 684"
- name: "hexdd.wad" - name: "hexdd.wad"
category: game_data category: game_data
system: hexen system: hexen
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Hexen: Deathkings of the Dark Citadel)" source_ref: "wadsrc_extra/static/iwadinfo.txt:196-207, 685"
note: "Deathkings expansion. Requires hexen.wad (Required = Hexen: Beyond Heretic)." note: "Deathkings expansion. Requires hexen.wad (Required = Hexen: Beyond Heretic)."
# ---- Strife ---- # ---- Strife ----
@@ -262,20 +301,20 @@ files:
category: game_data category: game_data
system: strife system: strife
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Strife: Quest for the Sigil)" source_ref: "wadsrc_extra/static/iwadinfo.txt:151, 688"
- name: "sve.wad" - name: "sve.wad"
category: game_data category: game_data
system: strife system: strife
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Strife: Veteran Edition)" source_ref: "wadsrc_extra/static/iwadinfo.txt:136, 140, 689"
note: "Veteran Edition. Required = Strife: Quest for the Sigil (loads voices.wad)." note: "Veteran Edition. Required = Strife: Quest for the Sigil (loads voices.wad)."
- name: "voices.wad" - name: "voices.wad"
category: game_data category: game_data
system: strife system: strife
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Load = \"voices.wad\" on Strife entries)" source_ref: "wadsrc_extra/static/iwadinfo.txt:142, 155"
# ---- Chex Quest ---- # ---- Chex Quest ----
@@ -283,13 +322,13 @@ files:
category: game_data category: game_data
system: chex system: chex
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Chex(R) Quest)" source_ref: "wadsrc_extra/static/iwadinfo.txt:123, 694"
- name: "chex3.wad" - name: "chex3.wad"
category: game_data category: game_data
system: chex system: chex
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Chex(R) Quest 3)" source_ref: "wadsrc_extra/static/iwadinfo.txt:109, 695"
# ---- Standalone commercial / community IWADs ---- # ---- Standalone commercial / community IWADs ----
@@ -297,46 +336,47 @@ files:
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Hacx: Twitch'n Kill)" source_ref: "wadsrc_extra/static/iwadinfo.txt:83, 698"
- name: "hacx2.wad" - name: "hacx2.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Hacx 2.0)" source_ref: "wadsrc_extra/static/iwadinfo.txt:71, 699"
- name: "action2.wad" - name: "action2.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Action Doom 2: Urban Brawl)" source_ref: "wadsrc_extra/static/iwadinfo.txt:97, 696"
- name: "harm1.wad" - name: "harm1.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Harmony)" source_ref: "wadsrc_extra/static/iwadinfo.txt:57, 697"
- name: "square.pk3" - name: "square.pk3"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (The Adventures of Square)" source_ref: "wadsrc_extra/static/iwadinfo.txt:33"
note: "Absent from the Names block: picked up only when named with -iwad."
- name: "square1.pk3" - name: "square1.pk3"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (The Adventures of Square - Squareware)" source_ref: "wadsrc_extra/static/iwadinfo.txt:45, 700"
- name: "delaweare.wad" - name: "delaweare.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Delaweare)" source_ref: "wadsrc_extra/static/iwadinfo.txt:22, 701"
- name: "rotwb.wad" - name: "rotwb.wad"
category: game_data category: game_data
system: doom system: doom
required: false required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt (Rise Of The Wool Ball)" source_ref: "wadsrc_extra/static/iwadinfo.txt:9, 702"
+58 -47
View File
@@ -16,21 +16,27 @@ notes: |
own filesystem layer under SP/code/ and MP/code/. own filesystem layer under SP/code/ and MP/code/.
BASEGAME is "main" for both builds. BASEGAME is "main" for both builds.
ref: SP/code/qcommon/qcommon.h:628, MP/code/qcommon/qcommon.h:656 ref: SP/code/qcommon/qcommon.h:628, MP/code/qcommon/q_shared.h:62
Single-player (SP/code/qcommon/files.c): Both builds stop with a fatal error when main/pak0.pk3 is missing, or
main/pak0.pk3 retail base, checksum 1886207346 present with a checksum other than 1886207346. A demo pak0 under
fatal if present with wrong checksum demomain/ is accepted with a warning and skips the point-release
main/sp_pak1.pk3 patch pak, five localized checksums (en/fr/gm/it/sp) check.
main/sp_pak2.pk3 patch pak, same localization split ref: SP/code/qcommon/files.c:3842-3972, MP/code/qcommon/files.c:3836-3966
main/sp_pak3.pk3 patch pak, same localization split
main/sp_pak4.pk3 GOTY edition pak, single checksum across languages
ref: SP/code/qcommon/files.c:183-230 (checksum arrays),
SP/code/qcommon/qcommon.h:637 (NUM_ID_PAKS 6),
SP/code/qcommon/files.c:3859-3883 (pak0 fatal check)
Multiplayer (MP/code/qcommon/files.c): Single-player (SP/code/qcommon/files.c) then requires the four
main/pak0.pk3 shared base, checksum 1886207346 point-release paks; a missing one is fatal, a wrong checksum only
prints a warning:
main/sp_pak1.pk3 five localized checksums (en/fr/gm/it/sp)
main/sp_pak2.pk3 3033901371, or 285968110 for the German release
main/sp_pak3.pk3 five localized checksums
main/sp_pak4.pk3 GOTY edition pak, 4131017020 for every language
ref: SP/code/qcommon/files.c:187-225 (checksum arrays),
SP/code/qcommon/qcommon.h:637-638 (NUM_ID_PAKS 6, NUM_SP_PAKS 4),
SP/code/qcommon/files.c:3720-3827 (FS_CheckSPPaks)
Multiplayer (MP/code/qcommon/files.c) requires the six mp_pak files
the same way:
main/mp_pak0.pk3 checksum 764840216 main/mp_pak0.pk3 checksum 764840216
main/mp_pak1.pk3 checksum -1023558518 main/mp_pak1.pk3 checksum -1023558518
main/mp_pak2.pk3 checksum 125907563 main/mp_pak2.pk3 checksum 125907563
@@ -38,10 +44,8 @@ notes: |
main/mp_pak4.pk3 checksum -137448799 main/mp_pak4.pk3 checksum -137448799
main/mp_pak5.pk3 checksum 2149774797 main/mp_pak5.pk3 checksum 2149774797
main/mp_bin.pk3 or mp_bin0.pk3 (1.51c) - VM/binary pak, optional main/mp_bin.pk3 or mp_bin0.pk3 (1.51c) - VM/binary pak, optional
ref: MP/code/qcommon/files.c:188-225 (mppak_checksums, binpak_checksums) ref: MP/code/qcommon/files.c:198-218 (mppak_checksums, binpak_checksums),
MP/code/qcommon/files.c:3721-3821 (FS_CheckMPPaks)
The SP build's pak0 fatal-error check only fires when a mismatched
pak0 is present; a missing pak0 ends up as "no game data found".
files: files:
# ================================================================ # ================================================================
@@ -53,102 +57,109 @@ files:
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/pak0.pk3" path: "main/pak0.pk3"
required: true required: true
source_ref: "SP/code/qcommon/files.c:183-184 (pak_checksums), SP/code/qcommon/files.c:3859 (fatal check)" source_ref: "SP/code/qcommon/files.c:183-185, 3865-3882, 3950-3967, MP/code/qcommon/files.c:194-196, 3859-3876, 3944-3961"
note: "RTCW retail base. Checksum 1886207346; same checksum used by SP and MP." note: "RTCW retail base. Checksum 1886207346 in both builds; fatal when missing or when the checksum differs."
# ================================================================ # ================================================================
# main/ - single-player patches (localized sp_pak1-3, universal sp_pak4) # main/ - single-player point-release paks
# ================================================================ # ================================================================
- name: "sp_pak1.pk3" - name: "sp_pak1.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/sp_pak1.pk3" path: "main/sp_pak1.pk3"
required: false required: true
source_ref: "SP/code/qcommon/files.c:187-224 (en/fr/gm/it/sp_sppak_checksums[0])" source_ref: "SP/code/qcommon/files.c:188, 196, 204, 212, 220, 3735-3767, 3806-3826"
note: "Localization-specific patch pak. One of five checksums expected." note: "Single-player build: fatal when missing. One checksum per language (en/fr/gm/it/sp); a mismatch prints a warning."
- name: "sp_pak2.pk3" - name: "sp_pak2.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/sp_pak2.pk3" path: "main/sp_pak2.pk3"
required: false required: true
source_ref: "SP/code/qcommon/files.c:188-225 (sppak_checksums[1])" source_ref: "SP/code/qcommon/files.c:189, 197, 205, 213, 221, 3806-3826"
note: "Single-player build: fatal when missing."
- name: "sp_pak3.pk3" - name: "sp_pak3.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/sp_pak3.pk3" path: "main/sp_pak3.pk3"
required: false required: true
source_ref: "SP/code/qcommon/files.c:189-226 (sppak_checksums[2])" source_ref: "SP/code/qcommon/files.c:190, 198, 206, 214, 222, 3806-3826"
note: "Single-player build: fatal when missing."
- name: "sp_pak4.pk3" - name: "sp_pak4.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/sp_pak4.pk3" path: "main/sp_pak4.pk3"
required: false required: true
source_ref: "SP/code/qcommon/files.c:190 (\"sp_pak4.pk3 from GOTY edition\"), checksum 4131017020" source_ref: "SP/code/qcommon/files.c:191-192, 199-200, 207-208, 215-216, 223-224, 3806-3826"
note: "GOTY-edition patch; single checksum shared across languages." note: "Single-player build: fatal when missing. GOTY edition pak, one checksum (4131017020) for every language."
# ================================================================ # ================================================================
# main/ - multiplayer patches # main/ - multiplayer paks
# ================================================================ # ================================================================
- name: "mp_pak0.pk3" - name: "mp_pak0.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak0.pk3" path: "main/mp_pak0.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:188 (mppak_checksums[0]=764840216)" source_ref: "MP/code/qcommon/files.c:199, 3736-3751, 3800-3820"
note: "Multiplayer base. MP build warns if absent but continues." note: "Multiplayer build: fatal when missing. A checksum mismatch prints a warning."
- name: "mp_pak1.pk3" - name: "mp_pak1.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak1.pk3" path: "main/mp_pak1.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:189 (mppak_checksums[1])" source_ref: "MP/code/qcommon/files.c:200, 3800-3820"
note: "Multiplayer build: fatal when missing."
- name: "mp_pak2.pk3" - name: "mp_pak2.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak2.pk3" path: "main/mp_pak2.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:190 (mppak_checksums[2])" source_ref: "MP/code/qcommon/files.c:201, 3800-3820"
note: "Multiplayer build: fatal when missing."
- name: "mp_pak3.pk3" - name: "mp_pak3.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak3.pk3" path: "main/mp_pak3.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:191 (mppak_checksums[3])" source_ref: "MP/code/qcommon/files.c:202, 3800-3820"
note: "Multiplayer build: fatal when missing."
- name: "mp_pak4.pk3" - name: "mp_pak4.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak4.pk3" path: "main/mp_pak4.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:192 (mppak_checksums[4])" source_ref: "MP/code/qcommon/files.c:203, 3800-3820"
note: "Multiplayer build: fatal when missing."
- name: "mp_pak5.pk3" - name: "mp_pak5.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_pak5.pk3" path: "main/mp_pak5.pk3"
required: false required: true
source_ref: "MP/code/qcommon/files.c:193 (mppak_checksums[5])" source_ref: "MP/code/qcommon/files.c:204, 3800-3820"
note: "Multiplayer build: fatal when missing."
- name: "mp_bin.pk3" - name: "mp_bin.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_bin.pk3" path: "main/mp_bin.pk3"
required: false required: false
source_ref: "MP/code/qcommon/files.c:199 (binpak_checksums, \"mp_bin.pk3 (1.4/1.41)\")" source_ref: "MP/code/qcommon/files.c:209, 1596-1613"
note: "VM/binary pak, 1.4/1.41 retail." note: "VM/binary pak, 1.4/1.41 retail. The client extracts game dlls only from paks whose checksum is listed."
- name: "mp_bin0.pk3" - name: "mp_bin0.pk3"
category: game_data category: game_data
system: return-to-castle-wolfenstein system: return-to-castle-wolfenstein
path: "main/mp_bin0.pk3" path: "main/mp_bin0.pk3"
required: false required: false
source_ref: "MP/code/qcommon/files.c:200 (binpak_checksums, \"mp_bin0.pk3 (1.51c)\")" source_ref: "MP/code/qcommon/files.c:210, 1596-1613"
note: "VM/binary pak, 1.51c variant." note: "VM/binary pak, 1.51c variant."
+157 -105
View File
@@ -1,5 +1,5 @@
emulator: Jazz² Resurrection emulator: Jazz² Resurrection
type: standalone type: standalone + libretro
core_classification: game_engine core_classification: game_engine
source: "https://github.com/deathkiller/jazz2-native" source: "https://github.com/deathkiller/jazz2-native"
upstream: "https://github.com/deathkiller/jazz2-native" upstream: "https://github.com/deathkiller/jazz2-native"
@@ -7,199 +7,251 @@ profiled_date: "2026-10-04"
source_commit: "cc06bdac1b957a069e1d05761c7437cd59886552" source_commit: "cc06bdac1b957a069e1d05761c7437cd59886552"
core_version: "3.8.0" core_version: "3.8.0"
display_name: "Jazz Jackrabbit 2 (Jazz² Resurrection)" display_name: "Jazz Jackrabbit 2 (Jazz² Resurrection)"
cores: [] cores: [jazz2]
systems: [jazz-jackrabbit-2] systems: [jazz-jackrabbit-2]
notes: | notes: |
Open-source reimplementation of Jazz Jackrabbit 2 by Dan R. The engine Open-source reimplementation of Jazz Jackrabbit 2 by Dan R. The engine
ships its own Content/ tree (animations, metadata, translations, ships its own Content/ tree (animations, metadata, translations) that
shaders) that must sit next to the executable. sits next to the executable in a portable copy, or under
ref: Sources/Jazz2/ContentResolver.cpp:187-240 (GetContentPath per <prefix>/share/<package>/ once installed.
platform), ContentResolver.cpp:415-452 (desktop fallbacks) ref: Sources/Jazz2/ContentResolver.cpp:187-238 (GetContentPath per
platform), Sources/Jazz2/ContentResolver.cpp:409-485 (Unix layouts)
Original Jazz Jackrabbit 2 data is read from Source/ and converted Original Jazz Jackrabbit 2 data is read from Source/ and converted
on first launch into the engine's own pak format under Cache/. on first launch into the engine's own formats under Cache/: Anims.j2a
ref: Sources/Jazz2/ContentResolver.cpp:279-310 (GetSourcePath), and Data.j2d into a package, then every .j2e, .j2l and the tilesets
Sources/Jazz2/Compatibility/AssetConverter.cpp:139-170 the levels name. Music and cinematics are read from Source/ as they
(ConvertSourceAssets, iterates .j2e / .j2l / .j2t / .j2b) are.
ref: Sources/Jazz2/ContentResolver.cpp:279-309 (GetSourcePath),
Sources/Main.cpp:2224-2288 (RefreshCache),
Sources/Jazz2/Compatibility/AssetConverter.cpp:152-168,
Sources/Jazz2/Compatibility/AssetConverter.cpp:400-516
Content/ is the engine runtime — it is shipped with the release Content/ is the engine runtime, shipped with the release package.
package. Source/ holds the user's own copy of the 1998 game data. Source/ holds the user's own copy of the 1998 game data. Without
The engine runs its UI with Content/ alone; levels and episodes Anims.j2a (or the shareware AnimsSw.j2a) and without an existing
require Source/ to carry JJ2 files. cache the engine starts but is not playable.
The libretro build looks for Content/ next to the loaded file, in the
core assets directory or in <system>/jazz2/, and for the original
files in Source/ beside it, in the system directory itself or in
<system>/jazz2/Source/.
ref: Sources/Main.cpp:267-355
files: files:
# ================================================================ # ================================================================
# Content/ (bundled runtime data, shipped with each release) # Content/ (bundled runtime data, shipped with each release)
# These are generated at build time from the Content/ tree in the
# repo; the engine refuses to render its UI without them.
# ================================================================ # ================================================================
- name: "Animations/" - name: "Animations/"
category: game_data category: game_data
path: "Content/Animations" path: "jazz2/Content/Animations/"
standalone_path: "Content/Animations/"
bundled: true
required: true required: true
source_ref: "Sources/Jazz2/ContentResolver.cpp:2651 (CombinePath Content/Animations)" source_ref: "Sources/Jazz2/ContentResolver.cpp:1093, 1223, 2734-2735"
note: "Native animation sheets, loaded by ContentResolver for every actor." note: "Native graphics, sounds and the UI fonts, opened through OpenContentFile."
- name: "Metadata/" - name: "Metadata/"
category: game_data category: game_data
path: "Content/Metadata" path: "jazz2/Content/Metadata/"
standalone_path: "Content/Metadata/"
bundled: true
required: true required: true
source_ref: "Sources/Jazz2/ContentResolver.cpp (metadata loader for actors, UI, bosses)" source_ref: "Sources/Jazz2/ContentResolver.cpp:839"
note: "Actor .res descriptors (Common, Enemy, Player, UI, Boss, ...)." note: "Actor .res descriptors (Common, Enemy, Player, UI, Boss, ...)."
- name: "Translations/" - name: "Translations/"
category: game_data category: game_data
path: "Content/Translations" path: "jazz2/Content/Translations/"
standalone_path: "Content/Translations/"
bundled: true
required: false required: false
source_ref: "Sources/Jazz2/ContentResolver.cpp (translation loader)" source_ref: "Sources/Main.cpp:2019-2025, Sources/Jazz2/UI/Menu/LanguageSelectSection.cpp:82-88"
note: "Language bundles. Engine falls back to English if absent." note: "Language .mo bundles, searched in Cache/Translations/ first. Built-in English is used when none is loaded."
- name: "Shaders/"
category: game_data
path: "Content/Shaders"
required: false
source_ref: "Sources/nCine (shader loader)"
note: "GLSL shaders used by the Jazz² renderer. Shipped with the engine."
# ================================================================ # ================================================================
# Source/ (original Jazz Jackrabbit 2 data, user-supplied) # Source/ (original Jazz Jackrabbit 2 data, user-supplied)
# Converted into Content/Cache on first launch. # Converted into Cache/ on first launch.
# ================================================================ # ================================================================
- name: "Anims.j2a" - name: "Anims.j2a"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/Anims.j2a" path: "jazz2/Source/Anims.j2a"
standalone_path: "Source/Anims.j2a"
required: true
source_ref: "Sources/Main.cpp:2224-2240, Sources/Jazz2/Compatibility/AssetConverter.cpp:156-159"
note: "Main animation archive. The cache cannot be created without it and the game is not flagged playable."
- name: "AnimsSw.j2a"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/AnimsSw.j2a"
standalone_path: "Source/AnimsSw.j2a"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/JJ2Anims.cpp (JJ2Anims::Open)" source_ref: "Sources/Main.cpp:2227-2229"
note: "Main animation archive. Required to generate the first-run cache." note: "Animation archive of the shareware demo, read when Anims.j2a is absent."
- name: "Data.j2d" - name: "Data.j2d"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/Data.j2d" path: "jazz2/Source/Data.j2d"
standalone_path: "Source/Data.j2d"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:162 (data.Open \"Data.j2d\")" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:161-164"
note: "Converted into the cache package when present."
- name: "Plus.j2d"
category: game_data
system: jazz-jackrabbit-2
path: "Source/Plus.j2d"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp (JJ2+ data block)"
note: "JJ2+ extended data (optional)."
- name: "Jazz2.exe"
category: game_data
system: jazz-jackrabbit-2
path: "Source/Jazz2.exe"
required: false
source_ref: "Sources/Jazz2/Compatibility/JJ2Strings.cpp (localization extracted from executable)"
note: "Original executable used only to extract localized strings. The engine does not run it."
# Episode descriptors (.j2e) and level files (.j2l) are optional per # Episode descriptors (.j2e) and level files (.j2l) are optional per
# episode. Any present in Source/ get discovered at scan time. # episode. Every one present in Source/ is converted.
# ref: Sources/Jazz2/Compatibility/AssetConverter.cpp:338-437 # ref: Sources/Jazz2/Compatibility/AssetConverter.cpp:400-516
- name: "prince.j2e" - name: "prince.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/prince.j2e" path: "jazz2/Source/prince.j2e"
standalone_path: "Source/prince.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412 (episodesPath enumeration)" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:184-191, 310-312, 407-436"
note: "Episode 1 - Formerly a Prince." note: "First episode of the chain prince, rescue, flash, monk."
- name: "rescue.j2e" - name: "rescue.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/rescue.j2e" path: "jazz2/Source/rescue.j2e"
standalone_path: "Source/rescue.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:193-199, 313-314, 407-436"
note: "Episode 2 - Rescue of the Princess (Shareware episode)." note: "Second episode of the chain."
- name: "flash.j2e" - name: "flash.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/flash.j2e" path: "jazz2/Source/flash.j2e"
standalone_path: "Source/flash.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:201-208, 315-316, 407-436"
note: "Episode 3 - Flashback to the Past." note: "Third episode of the chain."
- name: "monk.j2e" - name: "monk.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/monk.j2e" path: "jazz2/Source/monk.j2e"
standalone_path: "Source/monk.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:210-215, 317-318, 407-436"
note: "Episode 4 - Clash of the Jazz & Monk." note: "Fourth episode of the chain."
- name: "funky.j2e"
category: game_data
system: jazz-jackrabbit-2
path: "Source/funky.j2e"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412"
note: "Episode 5 - Jazz in Time (The Secret Files)."
- name: "share.j2e" - name: "share.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/share.j2e" path: "jazz2/Source/share.j2e"
standalone_path: "Source/share.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:217-219, 290-291, 407-436"
note: "Shareware episode descriptor." note: "Shareware Demo episode."
- name: "xmas98.j2e"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/xmas98.j2e"
standalone_path: "Source/xmas98.j2e"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:292-293, 412, 420-421, 434"
note: "Holiday Hare '98. Stored under the name xmas99 and skipped when xmas99.j2e is present."
- name: "xmas99.j2e" - name: "xmas99.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/xmas99.j2e" path: "jazz2/Source/xmas99.j2e"
standalone_path: "Source/xmas99.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:182 (hasChristmasChronicles probe)" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:182, 221-223, 294-295"
note: "Holiday Hare 99. Also auto-renamed from xmas98.j2e by the converter." note: "The Christmas Chronicles."
- name: "secretf.j2e" - name: "secretf.j2e"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/secretf.j2e" path: "jazz2/Source/secretf.j2e"
standalone_path: "Source/secretf.j2e"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:412" source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:225-233, 296-297, 407-436"
note: "The Secret Files (TSF) episode." note: "The Secret Files episode."
- name: "home.j2e"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/home.j2e"
standalone_path: "Source/home.j2e"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:423-429"
note: "Entry that lists custom levels."
# Music, read from Content/Music/ then from Source/
# ref: Sources/Jazz2/ContentResolver.cpp:2681-2691
# Audio tracks
- name: "menu.j2b" - name: "menu.j2b"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/menu.j2b" path: "jazz2/Source/menu.j2b"
standalone_path: "Source/menu.j2b"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:536 (MainMenu::PlayMenuMusic)" source_ref: "Sources/Jazz2/UI/Menu/MainMenu.cpp:509-511, Sources/Jazz2/Compatibility/AssetConverter.cpp:535-538"
note: "Main menu music." note: "Main menu music."
- name: "intro.j2b"
category: game_data
system: jazz-jackrabbit-2
path: "Source/intro.j2b"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:537 (Cinematics::Initialize)"
- name: "ending.j2b"
category: game_data
system: jazz-jackrabbit-2
path: "Source/ending.j2b"
required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:537"
- name: "bonus2.j2b" - name: "bonus2.j2b"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/bonus2.j2b" path: "jazz2/Source/bonus2.j2b"
standalone_path: "Source/bonus2.j2b"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:536" source_ref: "Sources/Jazz2/UI/Menu/MainMenu.cpp:503-504, Sources/Jazz2/Compatibility/AssetConverter.cpp:535-538"
note: "Menu music of the reforged main menu, picked at random with bonus3.j2b."
- name: "bonus3.j2b" - name: "bonus3.j2b"
category: game_data category: game_data
system: jazz-jackrabbit-2 system: jazz-jackrabbit-2
path: "Source/bonus3.j2b" path: "jazz2/Source/bonus3.j2b"
standalone_path: "Source/bonus3.j2b"
required: false required: false
source_ref: "Sources/Jazz2/Compatibility/AssetConverter.cpp:536" source_ref: "Sources/Jazz2/UI/Menu/MainMenu.cpp:503-504, Sources/Jazz2/Compatibility/AssetConverter.cpp:535-538"
note: "Menu music of the reforged main menu, picked at random with bonus2.j2b."
- name: "intro.j2b"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/intro.j2b"
standalone_path: "Source/intro.j2b"
required: false
source_ref: "Sources/Jazz2/UI/Cinematics.cpp:255, Sources/Main.cpp:558, Sources/Jazz2/Compatibility/AssetConverter.cpp:535-538"
note: "Music of the intro cinematic."
- name: "ending.j2b"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/ending.j2b"
standalone_path: "Source/ending.j2b"
required: false
source_ref: "Sources/Jazz2/UI/Cinematics.cpp:255, Sources/Main.cpp:964, Sources/Jazz2/Compatibility/AssetConverter.cpp:535-538"
note: "Music of the ending cinematic."
# Cinematics, read from Content/Cinematics/ then from Source/
- name: "intro.j2v"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/intro.j2v"
standalone_path: "Source/intro.j2v"
required: false
source_ref: "Sources/Jazz2/UI/Cinematics.cpp:267-281, Sources/Main.cpp:558"
note: "Intro cinematic. Skipped when absent."
- name: "ending.j2v"
category: game_data
system: jazz-jackrabbit-2
path: "jazz2/Source/ending.j2v"
standalone_path: "Source/ending.j2v"
required: false
source_ref: "Sources/Jazz2/UI/Cinematics.cpp:267-281, Sources/Main.cpp:964"
note: "Ending cinematic. Skipped when absent."
+132 -62
View File
@@ -15,21 +15,32 @@ notes: |
1994). Reads the original DOS game data; no asset bundling in the 1994). Reads the original DOS game data; no asset bundling in the
engine binary. engine binary.
File lookup walks a path list (shareware share, home dir, binary dir, File lookup walks a path list (platform paths, command-line paths,
command-line) and opens the first match. binary directory, working directory, compiled-in DATAPATH) and opens
ref: src/io/file.cpp:46-80 (File::File) the first match.
ref: src/io/file.cpp:51-77 (File::File), src/main.cpp:186-220
PANEL.000 is loaded during startup; the engine aborts with PANEL.000 is the first file opened at startup; the engine aborts with
"Unable to find game data files" if that first probe fails. "Unable to find game data files" if that probe fails. The five .0FN
ref: src/main.cpp:281, src/main.cpp:287-294 fonts follow and abort startup the same way.
ref: src/main.cpp:279-295, src/main.cpp:308-333
Level, tileset, sprite and planet names are built by createFileName():
LEVEL<n>.<world>, BLOCKS.<world>, SPRITES.<world>, PLANET.<world>,
with a three-digit world extension. The episode menu enables an
episode when LEVEL0.<world> exists for its first world (0, 3, 6, 9,
12, 15, then 30, 33, 36 and 50).
ref: src/util.cpp:123-193, src/jj1/jj1episodeutils.cpp:19-36,
src/menu/gamemenu.cpp:557-566
JJ2 engine support is experimental and gated by `ENABLE_JJ2` at build JJ2 engine support is experimental and gated by `ENABLE_JJ2` at build
time; it reads JJ2's .j2l/.j2t files directly (no conversion step). time (off by default); it reads JJ2's .j2l/.j2t files directly (no
ref: src/jj2/level/jj2level.cpp:52-70 conversion step).
ref: CMakeLists.txt:241-255, src/jj2/level/jj2level.cpp:54-67
files: files:
# ================================================================ # ================================================================
# Required files (loaded unconditionally at startup) # Required files (startup aborts without them)
# ================================================================ # ================================================================
- name: "PANEL.000" - name: "PANEL.000"
@@ -39,41 +50,107 @@ files:
source_ref: "src/main.cpp:281 (fatal: \"Unable to find game data files\")" source_ref: "src/main.cpp:281 (fatal: \"Unable to find game data files\")"
note: "Status bar sprites plus two embedded fonts. Fatal if absent." note: "Status bar sprites plus two embedded fonts. Fatal if absent."
- name: "SOUNDS.000" - name: "FONT2.0FN"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: true required: true
source_ref: "src/io/sound.cpp:278 (loadSounds(\"SOUNDS.000\"))" source_ref: "src/main.cpp:312, 318-333, src/io/gfx/font.cpp:60-64"
note: "Digital sound effects. Absence disables sfx but engine continues; audio init logs failure." note: "Startup font. File::File throws when absent and startup aborts."
- name: "FONTBIG.0FN"
category: game_data
system: jazz-jackrabbit
required: true
source_ref: "src/main.cpp:313, 318-333"
- name: "FONTINY.0FN"
category: game_data
system: jazz-jackrabbit
required: true
source_ref: "src/main.cpp:314, 318-333"
- name: "FONTMN1.0FN"
category: game_data
system: jazz-jackrabbit
required: true
source_ref: "src/main.cpp:315, 318-333"
- name: "FONTMN2.0FN"
category: game_data
system: jazz-jackrabbit
required: true
source_ref: "src/main.cpp:316, 318-333"
- name: "STARTUP.0SC" - name: "STARTUP.0SC"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: true required: true
source_ref: "src/main.cpp:437 (new JJ1Scene(\"STARTUP.0SC\"))" source_ref: "src/main.cpp:435-443"
note: "Opening Epic logo cutscene. Throws E_FILE on absence (startup aborts before menu)." note: "Opening cutscene. play() returns the error before the menu when it is absent."
# ================================================================
# Required for menu entry (loaded when main menu opens)
# ================================================================
- name: "MENU.000" - name: "MENU.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: true required: true
source_ref: "src/menu/mainmenu.cpp:74 (new File(\"MENU.000\", PATH_TYPE_GAME))" source_ref: "src/menu/mainmenu.cpp:72-82, src/main.cpp:458-466"
note: "Main menu graphics and layout. Required to show the menu." note: "Main menu graphics. The MainMenu constructor throws when it is absent."
- name: "SOUNDS.000"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/io/sound.cpp:278, 478-485"
note: "Digital sound effects. loadSounds returns false when absent and the engine runs without sfx."
- name: "MENUSNG.PSM"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/main.cpp:408, src/io/sound.cpp:337-344"
note: "Menu music. playMusic returns silently when the file is absent."
# ================================================================
# Menu extras (each reports its absence and returns to the menu)
# ================================================================
- name: "INSTRUCT.0SC"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/menu/mainmenu.cpp:177-187"
note: "Instructions screen."
- name: "ORDER.0SC"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/menu/mainmenu.cpp:209-217"
note: "Order information screen."
- name: "MACRO.1"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/menu/mainmenu.cpp:277-289"
note: "Demo recording played when the menu idles. MACRO.1 to MACRO.4 are probed."
- name: "END.0SC"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/main.cpp:479-489"
note: "Cutscene played when the main menu is left."
# ================================================================
# Required when entering gameplay (level load fails without them)
# ================================================================
- name: "FONTS.000" - name: "FONTS.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: true required: true
source_ref: "src/io/gfx/font.cpp:291-292 (JJ1Font constructor)" source_ref: "src/io/gfx/font.cpp:288-292, src/jj1/level/jj1levelload.cpp:412-421"
note: "Main game font (dialog, HUD numbers)." note: "Level font. JJ1Level::load returns the error when it is absent."
# ================================================================
# Required when entering gameplay (fatal when first level loads)
# ================================================================
- name: "MAINCHAR.000" - name: "MAINCHAR.000"
category: game_data category: game_data
@@ -86,42 +163,49 @@ files:
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/bonuslevel/jj1bonuslevel.cpp:55 (new File(\"BONUS.000\"))" source_ref: "src/jj1/bonuslevel/jj1bonuslevel.cpp:53-61, 204-206, src/io/gfx/font.cpp:292"
note: "Bonus level sprites + the bonus-screen font (loaded via FONTS.000 code path with the 'bonus' flag)." note: "Bonus level sprites and the bonus-screen font."
- name: "BONUS.0SC"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/jj1/bonuslevel/jj1bonuslevel.cpp:764-766"
note: "Cutscene played when a bonus level is won."
# ================================================================ # ================================================================
# Level data (per world: 1-9 shareware/registered, 50/51 secret). # Level data. Not every episode is required to run; a user may own
# Not every episode is required to run; a user may own only one. # only one. The episode menu probes LEVEL0.<world> for the first
# LEVEL*.* path pattern uses a two-digit level and a three-digit # world of each episode; the levels that follow are named by the
# world extension, built by createFileName() in src/util.cpp. # level data itself (next level and next world numbers).
# ================================================================ # ================================================================
- name: "LEVEL0.000" - name: "LEVEL0.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78, src/menu/gamemenu.cpp:559 (createFileName \"LEVEL\")" source_ref: "src/menu/gamemenu.cpp:324-325, 557-561"
note: "World 0 first level (shareware episode 1 opener)." note: "First level of world 0, the opener of episode 1."
- name: "PLANET.000" - name: "PLANET.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1levelload.cpp:437-450 (planet.### file open)" source_ref: "src/jj1/level/jj1levelload.cpp:437-473"
note: "World intro planet screen (name + preview)." note: "World intro planet screen (name + preview). The level loads under the name CUSTOM when it is absent."
- name: "BLOCKS1.000" - name: "BLOCKS.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1levelload.cpp:583-584 (createFileName \"BLOCKS\")" source_ref: "src/jj1/level/jj1levelload.cpp:577-599"
note: "World 0 tileset. BLOCKS<n>.<world> per level, n = 1..9." note: "World 0 tileset. The extension is the world number unless the level names another one."
- name: "SPRITES1.000" - name: "SPRITES.000"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1levelload.cpp:604 (createFileName \"SPRITES\")" source_ref: "src/jj1/level/jj1levelload.cpp:602-609"
note: "World 0 enemy/object sprites. One file per world." note: "World 0 enemy/object sprites. One file per world."
- name: "BONUSMAP.000" - name: "BONUSMAP.000"
@@ -131,48 +215,34 @@ files:
source_ref: "src/jj1/level/jj1level.cpp:690, src/menu/gamemenu.cpp:324,570" source_ref: "src/jj1/level/jj1level.cpp:690, src/menu/gamemenu.cpp:324,570"
note: "Bonus level map for episode 1." note: "Bonus level map for episode 1."
# Shareware episode has worlds 0-2, registered adds 3-5 (6 full worlds
# across 3 episodes). The engine opens LEVEL<n>.<world>, PLANET.<world>,
# BLOCKS<n>.<world> and SPRITES<n>.<world> for each world the player
# visits; absent episodes just stop progression at the end of the
# last available world.
- name: "LEVEL0.001" - name: "LEVEL0.001"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78 (createFileName \"LEVEL\", worldNum=1)" source_ref: "src/jj1/level/jj1level.cpp:794-801"
note: "World 1 level 0 (shareware episode 1 world 2 opener)." note: "First level of world 1, reached from the level data of world 0."
- name: "LEVEL0.002" - name: "LEVEL0.002"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78" source_ref: "src/jj1/level/jj1level.cpp:794-801"
- name: "LEVEL0.003" - name: "LEVEL0.003"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78" source_ref: "src/menu/gamemenu.cpp:557-561, src/jj1/jj1episodeutils.cpp:26-28"
note: "World 3 (registered episode 2 opener)." note: "First level of world 3, the opener of episode 2."
- name: "LEVEL0.004" - name: "LEVEL0.004"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78" source_ref: "src/jj1/level/jj1level.cpp:794-801"
- name: "LEVEL0.005" - name: "LEVEL0.005"
category: game_data category: game_data
system: jazz-jackrabbit system: jazz-jackrabbit
required: false required: false
source_ref: "src/jj1/level/jj1demolevel.cpp:78" source_ref: "src/jj1/level/jj1level.cpp:794-801"
# Cutscene scripts (one per episode intro/outro)
- name: "END.0SC"
category: game_data
system: jazz-jackrabbit
required: false
source_ref: "src/jj1/scene/jj1scene.cpp (JJ1Scene loader; path assembled per cutscene)"
note: "Ending cutscene script. Loaded on episode completion."
+459 -72
View File
@@ -20,13 +20,27 @@ notes: |
ref: source/core/version.h:66, source/core/gamecontrol.cpp:1020-1023, ref: source/core/version.h:66, source/core/gamecontrol.cpp:1020-1023,
source/core/initfs.cpp:335-336, wadsrc/CMakeLists.txt:2 source/core/initfs.cpp:335-336, wadsrc/CMakeLists.txt:2
Game detection reads wadsrc/static/engine/grpinfo.txt. Each entry maps Game detection reads engine/grpinfo.txt from raze.pk3. Every file of
a size+CRC32 (or mustcontain lump set) to a game id, flags and the search directories is a candidate, whatever its name: a file is
identified when its size and CRC32 equal those of a grpinfo block, or
when it is an archive holding every `mustcontain` entry of a block
that declares no CRC. A block also carries a game id, flags and
optional `loadgrp` / `loadart` dependencies. optional `loadgrp` / `loadart` dependencies.
ref: source/core/gamecontrol.cpp (GrpScan), wadsrc/static/engine/grpinfo.txt ref: source/core/searchpaths.cpp:286-326, source/core/searchpaths.cpp:696-704,
source/core/searchpaths.cpp:738-870, wadsrc/static/engine/grpinfo.txt:1-45
The names below are the ones the releases ship. The engine itself
names DUKE3D.GRP, DUKEDC.GRP, NWINTER.GRP, VACATION.GRP, NAM.GRP,
NAPALM.GRP, WW2GI.GRP, REDNECK.GRP and BLOOD.RFF, as the defaults of
its -addon, -nam, -napalm, -ww2gi, -route66 and -cryptic switches.
ref: source/core/gamecontrol.cpp:328-367
At least one game's GRP (or equivalent archive) must be present for At least one game's GRP (or equivalent archive) must be present for
Raze to run. Addons depend on the base game CRC via `dependency`. Raze to run. An addon block names the CRC of its base game in
`dependency`. grpinfo.txt also identifies the Mac demos of Duke Nukem
3D and Shadow Warrior, the Nuclear Winter demo, Duke!ZONE II,
Penthouse Paradise, Alien World Order, Platoon Leader, the ProAsm
build of Wanton Destruction and the SSI build of Cryptic Passage.
files: files:
# ================================================================ # ================================================================
@@ -44,207 +58,580 @@ files:
# ================================================================ # ================================================================
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D"
category: game_data category: game_data
system: duke3d system: duke3d
path: "DUKE3D.GRP"
required: false required: false
size: 26524524 size: 26524524
crc32: "BBC9CE44" crc32: "bbc9ce44"
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Nukem 3D)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:3, 48-59"
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D (South Korean Censored)"
category: game_data category: game_data
system: duke3d system: duke3d
path: ".variants/DUKE3D.GRP.aa4f6a40" path: "DUKE3D.GRP"
required: false required: false
size: 26385383 size: 26385383
crc32: "AA4F6A40" crc32: "aa4f6a40"
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Nukem 3D South Korean Censored)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:4, 61-72"
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D: Atomic Edition"
category: game_data category: game_data
system: duke3d system: duke3d
path: ".variants/DUKE3D.GRP.fd3dcff1" path: "DUKE3D.GRP"
required: false required: false
size: 44356548 size: 44356548
crc32: "FD3DCFF1" crc32: "fd3dcff1"
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Nukem 3D: Atomic Edition)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:5, 74-85"
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D: Plutonium Pak"
category: game_data category: game_data
system: duke3d system: duke3d
path: ".variants/DUKE3D.GRP.f514a6ac" path: "DUKE3D.GRP"
required: false required: false
size: 44348015 size: 44348015
crc32: "F514A6AC" crc32: "f514a6ac"
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Nukem 3D: Plutonium Pak)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:6, 113-124"
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D: Atomic Edition (WT)"
category: game_data category: game_data
system: duke3d system: duke3d
path: ".variants/DUKE3D.GRP.982afe4a" path: "DUKE3D.GRP"
required: false required: false
size: 44356548 size: 44356548
crc32: "982AFE4A" crc32: "982afe4a"
source_ref: "wadsrc/static/engine/grpinfo.txt (Atomic Edition World Tour)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:7, 87-98"
- name: "DUKEDC.GRP" note: "World Tour release."
category: game_data
system: duke3d
required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke it out in D.C.)"
note: "Expansion; dependency DUKE15_CRC (Atomic Edition)."
- name: "VACATION.GRP"
category: game_data
system: duke3d
required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Caribbean: Life's a Beach)"
note: "Expansion; dependency DUKE15_CRC."
- name: "NWINTER.GRP"
category: game_data
system: duke3d
required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke: Nuclear Winter)"
- name: "DUKE3D.GRP" - name: "DUKE3D.GRP"
description: "Duke Nukem 3D: Atomic Edition (WT)"
category: game_data category: game_data
system: duke3d system: duke3d
path: ".variants/DUKE3D.GRP.983ad923" path: "DUKE3D.GRP"
required: false
size: 44486702
crc32: "89792e05"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:100-111"
note: "World Tour release, second known build."
- name: "DUKE3D.GRP"
description: "Duke Nukem 3D Shareware 0.99"
category: game_data
system: duke3d
path: "DUKE3D.GRP"
required: false
size: 9690241
crc32: "02f18900"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:8, 126-136"
- name: "DUKE3D.GRP"
description: "Duke Nukem 3D Shareware 1.0"
category: game_data
system: duke3d
path: "DUKE3D.GRP"
required: false
size: 10429258
crc32: "a28aa589"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:9, 138-148"
- name: "DUKE3D.GRP"
description: "Duke Nukem 3D Shareware 1.1"
category: game_data
system: duke3d
path: "DUKE3D.GRP"
required: false
size: 10442980
crc32: "912e1e8d"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:10, 150-160"
- name: "DUKE3D.GRP"
description: "Duke Nukem 3D Shareware 1.3D"
category: game_data
system: duke3d
path: "DUKE3D.GRP"
required: false required: false
size: 11035779 size: 11035779
crc32: "983AD923" crc32: "983ad923"
source_ref: "wadsrc/static/engine/grpinfo.txt (Duke Nukem 3D Shareware 1.3D)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:11, 162-172"
- name: "DUKEDC.GRP"
description: "Duke it out in D.C. (1.3D)"
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 7926624
crc32: "a9242158"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:14, 198-208"
note: "Addon of the 1.3D release (dependency DUKE13_CRC)."
- name: "DUKEDC.GRP"
description: "Duke it out in D.C."
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 8225517
crc32: "b79d997f"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:15, 210-220"
note: "Addon of the Atomic Edition (dependency DUKE15_CRC)."
- name: "DUKEDC.GRP"
description: "Duke it out in D.C."
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 8410183
crc32: "a8cf80da"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:16, 222-232"
- name: "DUKEDC.GRP"
description: "Duke it out in D.C."
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 8410187
crc32: "39a692bf"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:234-245"
- name: "DUKEDC.GRP"
description: "Duke it out in D.C."
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 8410183
crc32: "777c77b1"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:247-258"
- name: "DUKEDC.GRP"
description: "Duke it out in D.C."
category: game_data
system: duke3d
path: "DUKEDC.GRP"
required: false
size: 8410149
crc32: "c63b6a8b"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:260-271"
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach (1.3)"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 23559381
crc32: "4a2dbb62"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:17, 273-285"
note: "Addon of the 1.3D release (dependency DUKE13_CRC)."
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22551333
crc32: "2f4fccee"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:18, 287-299"
note: "Addon of the Atomic Edition (dependency DUKE15_CRC)."
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22521880
crc32: "b62b42fd"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:19, 301-313"
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22213819
crc32: "18f01c5b"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:20, 316-328"
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22397273
crc32: "65b5f690"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:330-343"
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22201375
crc32: "b28e883c"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:345-358"
- name: "VACATION.GRP"
description: "Duke Caribbean: Life's a Beach"
category: game_data
system: duke3d
path: "VACATION.GRP"
required: false
size: 22213795
crc32: "64cf2351"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:360-373"
- name: "NWINTER.GRP"
description: "Duke: Nuclear Winter"
category: game_data
system: duke3d
path: "NWINTER.GRP"
required: false
size: 16169365
crc32: "f1cae8e4"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:21, 375-388"
note: "Addon of the Atomic Edition (dependency DUKE15_CRC)."
# ================================================================ # ================================================================
# Blood # Blood
# ================================================================ # ================================================================
- name: "BLOOD.RFF" - name: "BLOOD.RFF"
description: "BLOOD: 1.0"
category: game_data category: game_data
system: blood system: blood
path: "BLOOD.RFF"
required: false required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (BLOOD: One Unit Whole Blood - mustcontain blood.pal; loadgrp BLOOD.GRP)" size: 8200353
note: "Blood main resource. Shipped as part of One Unit Whole Blood / Fresh Supply." crc32: "b291418f"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:32, 485-499"
- name: "BLOOD.GRP" - name: "BLOOD.RFF"
description: "BLOOD: 1.1"
category: game_data category: game_data
system: blood system: blood
path: "BLOOD.RFF"
required: false required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (BLOOD: One Unit Whole Blood loadgrp)" size: 8231173
crc32: "c3a99936"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:33, 501-515"
- name: "BLOOD.RFF"
description: "BLOOD: One Unit Whole Blood"
category: game_data
system: blood
path: "BLOOD.RFF"
required: false
size: 9570681
crc32: "a8fdda84"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:34, 517-531"
note: "Any other archive holding help1.qav, normal.plu, inverse.clu, cosine.dat and blood.pal is taken as an unknown Blood version (lines 533-544)."
- name: "SOUNDS.RFF" - name: "SOUNDS.RFF"
category: game_data category: game_data
system: blood system: blood
path: "SOUNDS.RFF"
required: false required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (BLOOD loadgrp \"SOUNDS.RFF\")" source_ref: "wadsrc/static/engine/grpinfo.txt:494, 510, 526, 542"
note: "Named by loadgrp in every Blood block; loaded with the main resource."
- name: "GUI.RFF" - name: "GUI.RFF"
category: game_data category: game_data
system: blood system: blood
path: "GUI.RFF"
required: false required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (BLOOD loadgrp \"GUI.RFF\")" source_ref: "wadsrc/static/engine/grpinfo.txt:494, 510, 526, 542"
note: "Named by loadgrp in every Blood block; loaded with the main resource."
- name: "BLOOD.GRP"
category: game_data
system: blood
path: "BLOOD.GRP"
required: false
source_ref: "wadsrc/static/engine/grpinfo.txt:494, 510, 526, 542"
note: "Named by loadgrp in every Blood block; loaded with the main resource."
- name: "CRYPTIC.INI" - name: "CRYPTIC.INI"
category: game_data category: game_data
system: blood system: blood
path: "CRYPTIC.INI"
required: false required: false
source_ref: "wadsrc/static/engine/grpinfo.txt (BLOOD: Cryptic Passage addon)" source_ref: "wadsrc/static/engine/grpinfo.txt:574-585, source/core/gamecontrol.cpp:361-367, source/core/searchpaths.cpp:712-730"
note: "Cryptic Passage addon. Detected next to the Blood files when CRYPTIC.INI, CP01.MAP and CP02.MAP are all present; depends on One Unit Whole Blood and loads CPART07.AR_ and CPART15.AR_."
# ================================================================ # ================================================================
# Shadow Warrior # Shadow Warrior
# ================================================================ # ================================================================
- name: "SW.GRP" - name: "SW.GRP"
description: "Shadow Warrior"
category: game_data category: game_data
system: shadow-warrior system: shadow-warrior
path: "SW.GRP"
required: false required: false
size: 47536148 size: 47536148
crc32: "7545319F" crc32: "7545319f"
source_ref: "wadsrc/static/engine/grpinfo.txt (Shadow Warrior registered)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:36, 614-625"
- name: "WD.GRP" - name: "SW.GRP"
description: "Shadow Warrior (Europe)"
category: game_data category: game_data
system: shadow-warrior system: shadow-warrior
path: "SW.GRP"
required: false
size: 47536148
crc32: "d4a1e153"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:627-638"
- name: "SW.GRP"
description: "Shadow Warrior (UK)"
category: game_data
system: shadow-warrior
path: "SW.GRP"
required: false
size: 47536148
crc32: "3ee68767"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:640-651"
- name: "SW.GRP"
description: "Shadow Warrior (Censored)"
category: game_data
system: shadow-warrior
path: "SW.GRP"
required: false
size: 47537951
crc32: "1a8776d2"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:653-664"
- name: "SW.GRP"
description: "Shadow Warrior Shareware 1.0"
category: game_data
system: shadow-warrior
path: "SW.GRP"
required: false
size: 25702245
crc32: "daa6bece"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:666-676"
- name: "SW.GRP"
description: "Shadow Warrior Shareware 1.1"
category: game_data
system: shadow-warrior
path: "SW.GRP"
required: false
size: 25833456
crc32: "f21a6b35"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:678-688"
- name: "SW.GRP"
description: "Shadow Warrior Shareware 1.2"
category: game_data
system: shadow-warrior
path: "SW.GRP"
required: false
size: 26056769
crc32: "08a7fa1f"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:690-700"
- name: "WT.GRP"
description: "Shadow Warrior: Wanton Destruction"
category: game_data
system: shadow-warrior
path: "WT.GRP"
required: false required: false
size: 48698128 size: 48698128
crc32: "A9AAA7B7" crc32: "a9aaa7b7"
source_ref: "wadsrc/static/engine/grpinfo.txt (Shadow Warrior: Wanton Destruction)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:37, 714-724"
note: "Addon of the registered game (dependency SWREG12_CRC)."
- name: "TD.GRP" - name: "WT.GRP"
description: "Shadow Warrior: Wanton Destruction"
category: game_data category: game_data
system: shadow-warrior system: shadow-warrior
path: "WT.GRP"
required: false
size: 48698128
crc32: "8b6e8011"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:726-736"
- name: "TD.GRP"
description: "Shadow Warrior: Twin Dragon"
category: game_data
system: shadow-warrior
path: "TD.GRP"
required: false required: false
size: 12499012 size: 12499012
crc32: "A1A65BE8" crc32: "a1a65be8"
source_ref: "wadsrc/static/engine/grpinfo.txt (Shadow Warrior: Twin Dragon)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:38, 751-762"
note: "Addon of the registered game (dependency SWREG12_CRC)."
- name: "TD.GRP"
description: "Shadow Warrior: Twin Dragon"
category: game_data
system: shadow-warrior
path: "TD.GRP"
required: false
size: 6236287
crc32: "b5b71277"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:764-774"
- name: "TD.GRP"
description: "Shadow Warrior: Twin Dragon"
category: game_data
system: shadow-warrior
path: "TD.GRP"
required: false
size: 6235578
crc32: "acc8dcde"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:776-786"
# ================================================================ # ================================================================
# Powerslave / Exhumed # Powerslave / Exhumed
# ================================================================ # ================================================================
- name: "STUFF.DAT" - name: "STUFF.DAT"
description: "Powerslave"
category: game_data category: game_data
system: exhumed system: exhumed
path: "STUFF.DAT"
required: false required: false
size: 27020745 size: 27020745
crc32: "303CBD89" crc32: "303cbd89"
source_ref: "wadsrc/static/engine/grpinfo.txt (Powerslave)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:40, 901-912"
- name: "STUFF.DAT" - name: "STUFF.DAT"
description: "Exhumed"
category: game_data category: game_data
system: exhumed system: exhumed
path: ".variants/STUFF.DAT.e3b172f1" path: "STUFF.DAT"
required: false required: false
size: 27108170 size: 27108170
crc32: "E3B172F1" crc32: "e3b172f1"
source_ref: "wadsrc/static/engine/grpinfo.txt (Exhumed)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:41, 914-925"
- name: "STUFF.DAT"
description: "Powerslave Demo"
category: game_data
system: exhumed
path: "STUFF.DAT"
required: false
size: 27020745
crc32: "1d8c7645"
validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:42, 927-937"
# ================================================================ # ================================================================
# Redneck Rampage # Redneck Rampage
# ================================================================ # ================================================================
- name: "REDNECK.GRP" - name: "REDNECK.GRP"
description: "Redneck Rampage"
category: game_data category: game_data
system: redneck system: redneck
path: "REDNECK.GRP"
required: false required: false
size: 141174222 size: 141174222
crc32: "19D9BC79" crc32: "19d9bc79"
source_ref: "wadsrc/static/engine/grpinfo.txt (Redneck Rampage)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:28, 788-801"
- name: "REDNECK.GRP" - name: "REDNECK.GRP"
description: "Redneck Rampage Rides Again"
category: game_data category: game_data
system: redneck system: redneck
path: ".variants/REDNECK.GRP.958018c6" path: "REDNECK.GRP"
required: false required: false
size: 191798609 size: 191798609
crc32: "958018C6" crc32: "958018c6"
source_ref: "wadsrc/static/engine/grpinfo.txt (Redneck Rampage Rides Again)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:29, 803-816"
# ================================================================ # ================================================================
# Nam / Napalm / WWII GI # Nam / Napalm / WWII GI
# ================================================================ # ================================================================
- name: "NAM.GRP" - name: "NAM.GRP"
description: "NAM"
category: game_data category: game_data
system: nam system: nam
path: "NAM.GRP"
required: false required: false
size: 43448927 size: 43448927
crc32: "75C1F07B" crc32: "75c1f07b"
source_ref: "wadsrc/static/engine/grpinfo.txt (NAM)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:24, 846-858"
- name: "NAPALM.GRP" - name: "NAPALM.GRP"
description: "NAPALM"
category: game_data category: game_data
system: nam system: nam
path: "NAPALM.GRP"
required: false required: false
size: 44365728 size: 44365728
crc32: "3DE1589A" crc32: "3de1589a"
source_ref: "wadsrc/static/engine/grpinfo.txt (NAPALM)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:25, 860-872"
- name: "WW2GI.GRP" - name: "WW2GI.GRP"
description: "WWII GI"
category: game_data category: game_data
system: ww2gi system: ww2gi
path: "WW2GI.GRP"
required: false required: false
size: 77939508 size: 77939508
crc32: "907B82BF" crc32: "907b82bf"
source_ref: "wadsrc/static/engine/grpinfo.txt (WWII GI)" validation: [size, crc32]
source_ref: "wadsrc/static/engine/grpinfo.txt:26, 874-886"
+77 -48
View File
@@ -4,30 +4,37 @@ core_classification: game_engine
source: "https://github.com/TheXTech/TheXTech" source: "https://github.com/TheXTech/TheXTech"
upstream: "https://github.com/TheXTech/TheXTech" upstream: "https://github.com/TheXTech/TheXTech"
profiled_date: "2026-10-04" profiled_date: "2026-10-04"
source_commit: "48f15208ff2857985d3534f191dab494ea3cd3d0" source_commit: "a72915cd9a2c811f2388423775f20d75bb2107bd"
display_name: "TheXTech" display_name: "TheXTech"
cores: [] cores: []
systems: [smbx] systems: [smbx]
notes: | notes: |
C++ reimplementation of the SMBX 1.3 engine. The engine itself ships C++ reimplementation of the SMBX 1.3 engine. The engine itself ships
no game assets; an asset pack is probed at startup from no game assets; asset packs are searched at startup under every root
AppPathManager::assetsSearchPath() and the first pack with a valid of AppPathManager::assetsSearchPath(): the root itself (legacy
graphics/ui/ directory is used. layout), then each directory or archive of its assets/ folder.
ref: src/main/asset_pack.cpp:249-340 (s_find_asset_packs, ref: src/main/asset_pack.cpp:249-378 (s_find_asset_packs),
s_scan_asset_pack), lib/AppPath/private/app_path.cpp:135-170 lib/AppPath/private/app_path.cpp:135-181
A pack is accepted when it carries graphics/ui/ plus an identification A directory is scanned when it carries graphics/ui/, an archive when
file. Two schemas are recognized: it carries _meta.ini. Two descriptors are recognized:
_meta.ini modern asset pack (engine field "TheXTech", platform _meta.ini archive pack ([content] engine "TheXTech", platform
field matching the running target, pack-id) matching the running target, pack-id)
gameinfo.ini legacy SMBX-style descriptor read under [android] gameinfo.ini directory pack ([game] id, menu images under
ref: src/main/asset_pack.cpp:138-212 [android])
A pack under assets/ is ignored when no id could be read; the legacy
root pack needs none.
ref: src/main/asset_pack.cpp:125-207, 334-339
Three images are loaded unconditionally to render the pack-selection The pack-selection menu loads an icon, a logo and a background. Only
menu; without them the pack is rejected ("Could not load UI assets the logo is checked: without it the pack is ignored ("Could not load
from possible asset pack"). UI assets from possible asset pack").
ref: src/main/asset_pack.cpp:115-117, 285-291 ref: src/main/asset_pack.cpp:115-117, 225-233, 282-283
The selected pack is then loaded by GFX_t::load, which fails when one
of the UI images it requires from graphics/ui/ is missing.
ref: src/gfx.cpp:121-229, src/main/asset_pack.cpp:415-438
TheXTech is content-agnostic. The reference packs that TheXTech TheXTech is content-agnostic. The reference packs that TheXTech
releases alongside the engine are the SMBX 1.3 asset pack releases alongside the engine are the SMBX 1.3 asset pack
@@ -37,97 +44,119 @@ notes: |
files: files:
# ================================================================ # ================================================================
# Asset pack identification files (one of the two is required) # Asset pack identification files
# ================================================================ # ================================================================
- name: "_meta.ini" - name: "_meta.ini"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/asset_pack.cpp:138-168 (modern asset pack schema)" source_ref: "src/main/asset_pack.cpp:125, 131-181, 318-319"
note: "Modern asset pack descriptor. [content] engine=TheXTech + pack-id." note: "Archive pack descriptor. [content] engine=TheXTech, platform, pack-id. An archive without it is skipped."
- name: "gameinfo.ini" - name: "gameinfo.ini"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/asset_pack.cpp:169-180 (legacy schema)" source_ref: "src/main/asset_pack.cpp:126, 182-190, src/main/game_info.cpp:143"
note: "Legacy SMBX descriptor. [game] id + [android] logo/background." note: "Directory pack descriptor. [game] id names the pack, [android] logo/background override the menu images."
# ================================================================ # ================================================================
# UI assets probed to validate an asset pack # Images of the pack-selection menu
# ================================================================ # ================================================================
- name: "thextech_128.png" - name: "thextech_128.png"
category: game_data category: game_data
path: "graphics/ui/icon/thextech_128.png" path: "graphics/ui/icon/thextech_128.png"
required: true required: false
source_ref: "src/main/asset_pack.cpp:115 (assets_icon)" source_ref: "src/main/asset_pack.cpp:115, 225"
note: "Pack icon. Loaded during pack scan." note: "Pack icon. Loaded during pack scan, result not checked."
- name: "MenuGFX2.png" - name: "MenuGFX2.png"
category: game_data category: game_data
path: "graphics/ui/MenuGFX2.png" path: "graphics/ui/MenuGFX2.png"
required: true required: true
source_ref: "src/main/asset_pack.cpp:116 (logo_image_path_default), 285-291" source_ref: "src/main/asset_pack.cpp:116, 226-230, 334-335, src/gfx.cpp:201"
note: "Main menu logo. Pack rejected if this image fails to load." note: "Main menu logo. Pack ignored if no logo loads; GFX_t::load requires it as well."
- name: "background2-2.png" - name: "background2-2.png"
category: game_data category: game_data
path: "graphics/background2/background2-2.png" path: "graphics/background2/background2-2.png"
required: true required: false
source_ref: "src/main/asset_pack.cpp:117 (bg_image_path_default)" source_ref: "src/main/asset_pack.cpp:117, 227-233"
note: "Menu background. Covered by the UI-assets gate." note: "Menu background. Loaded during pack scan, result not checked."
# ================================================================ # ================================================================
# Core content directories (engine iterates on disk, filenames are # Core content (engine iterates on disk, filenames are the pack's
# the pack's own; the directory contract is what the engine checks) # own; the directory contract is what the engine checks)
# ================================================================ # ================================================================
- name: "graphics/" - name: "graphics/"
category: game_data category: game_data
required: true required: true
source_ref: "src/main/asset_pack.cpp:275-291 (DirMan::exists(root + \"graphics/ui/\"))" source_ref: "src/main/asset_pack.cpp:274, 326-327, src/gfx.cpp:121-229, src/load_gfx.cpp:120-123"
note: "Pack validation requires graphics/ui/ to exist." note: "graphics/ui/ must exist for a directory to be scanned as a pack; GFX_t::load rejects the pack when a required UI image is missing."
- name: "sound/" - name: "sound/"
category: game_data category: game_data
required: false required: false
source_ref: "src/load_gfx.cpp:443 (LoadGFXFromList), src/sound.h" source_ref: "src/sound.cpp:1319"
note: "SFX directory read from sounds.ini. Game runs without sounds." note: "SFX directory, files named by sounds.ini. Game runs without sounds."
- name: "music/" - name: "music/"
category: game_data category: game_data
required: false required: false
source_ref: "src/sound.cpp (music loader)" source_ref: "src/sound.cpp:1318"
note: "Music tracks read from music.ini." note: "Music tracks, files named by music.ini."
- name: "sounds.ini" - name: "sounds.ini"
category: game_data category: game_data
required: false required: false
source_ref: "src/sound.cpp (SFX index file)" source_ref: "src/sound.cpp:1322, 1348-1354, 1363"
note: "SFX index. A message box reports its absence and the game runs without SFX."
- name: "music.ini" - name: "music.ini"
category: game_data category: game_data
required: false required: false
source_ref: "src/sound.cpp (music index file)" source_ref: "src/sound.cpp:1321, 1341-1347, 1356"
note: "Music index. A message box reports its absence and the game runs without default music."
- name: "intro/" - name: "intro.lvlx"
category: game_data
required: true
source_ref: "src/game_main.cpp:172-185, 224-250, 1095-1106"
note: "Level shown behind the main menu. intro.lvl and a level picked from introset/ take its place; with none of the three the game exits on a fatal error."
- name: "intro.lvl"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/game_main.cpp (intro level loader)" source_ref: "src/game_main.cpp:176-177"
note: "Intro level episode; played before the main menu when present." note: "Read when intro.lvlx is absent."
- name: "outro/" - name: "introset/"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/game_main.cpp (outro episode)" source_ref: "src/game_main.cpp:194-222, 247"
note: "Directory of .lvl/.lvlx intro levels; one is picked at random when present."
- name: "outro.lvlx"
category: game_data
required: false
source_ref: "src/game_main.cpp:857-869"
note: "Level shown behind the credits, unless the episode names its own."
- name: "outro.lvl"
category: game_data
required: false
source_ref: "src/game_main.cpp:865-866"
note: "Read when outro.lvlx is absent."
- name: "worlds/" - name: "worlds/"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/game_main.cpp (world loader)" source_ref: "src/main/menu_main.cpp:361-370"
note: "Default world episodes shipped with the pack." note: "Episodes shipped with the pack, listed next to the user's worlds directory."
- name: "battle/" - name: "battle/"
category: game_data category: game_data
required: false required: false
source_ref: "src/main/game_main.cpp (battle mode levels)" source_ref: "src/main/menu_main.cpp:701-706"
note: "Battle mode levels shipped with the pack."