Wolfenstein Modloader Buy me a coffeeKaffee spendieren

Wiki / Research reportsForschungsberichte

Override-Chunk: Custom edits under the Retail card name c2v1

Partly solvedTeilweise gelöst Original page in the GitHub wikiOriginalseite im GitHub-Wiki

In plain wordsIn einfachen Worten

This report builds a modified archive for Wolfenstein II: The New Colossus that changes the DLC map 'Gestapo Office' (c2v1) under its original name, so a normal game load should pick it up. Exactly one entry, the map's entity list, is changed, with 49 edits: retyped enemies and pickups, swapped player starts and recolored lights. All offline checks and deliberate error tests pass. The edits have not yet been seen in the game.

  • Only one archive entry changes; all hash checks pass (7,127 of 7,127 entries, both header values).
  • The 49 edits are 4 enemies, 10 pickups, 33 lights and 2 player starts.
  • Edits were re-applied to the original map text, because a simple rename of the older alias version would have broken 20 entities.
  • All negative tests (missing edit, leftover alias name, unfinished archive) are caught.
  • Open: whether a save file keeps the old enemies and pickups; starting the chapter fresh is the cleaner test.

Dieser Bericht baut ein geändertes Archiv für Wolfenstein II: The New Colossus, das die DLC-Karte „Gestapo Office“ (c2v1) unter ihrem Originalnamen verändert, sodass ein normales Laden es übernehmen sollte. Genau ein Eintrag, die Objekt-Liste der Karte, ändert sich, mit 49 Änderungen: umgebaute Gegner und Pickups, vertauschte Spielerstarts und umgefärbte Lichter. Alle Offline-Prüfungen und absichtlichen Fehlertests bestehen. Im Spiel wurden die Änderungen noch nicht gesehen.

  • Nur ein Archiveintrag ändert sich; alle Hash-Prüfungen bestehen (7.127 von 7.127 Einträgen, beide Header-Werte).
  • Die 49 Änderungen sind 4 Gegner, 10 Pickups, 33 Lichter und 2 Spielerstarts.
  • Die Änderungen wurden neu auf den Original-Kartentext angewendet, weil ein einfaches Umbenennen der älteren Alias-Version 20 Objekte zerstört hätte.
  • Alle Negativtests (fehlende Änderung, übrig gebliebener Alias-Name, unfertiges Archiv) werden erkannt.
  • Offen: ob ein Spielstand die alten Gegner und Pickups behält; ein frischer Kapitelstart ist der sauberere Test.

Technical detailsTechnische Details

Der technische Teil ist auf Englisch – so, wie er im Wiki steht. Unterstrichene Begriffe haben eine Erklärung auf Deutsch.

Task dlc4_override, 2026-09-24 (New build; the output of the aborted run was discarded and not used). Files: tools/build_dlc4_override.py, re_probes/dlc4_override/ (chunk_22.resources, manifest.json), this report.

Result

re_probes/dlc4_override/chunk_22.resources is the installed Custom Bundle (re_probes/entitypipe/base/chunk_22.resources, 7128 entries, sha256 a8da9e4e... = today dlc/dlc_0/base/chunk_22.resources) with exactly one modified entry: compfile:maps/game/dlc/c02/c2v1.entities (Index 873) which carries the 49 Manifest edits on the Retail text, without any alias names. All Gates green, all negative controls caught.

  • sha256 cadfbfce256d1a99ec1b4b151d801457b08cdb02724bc004c157d2eed06ab2f5, 151 702 019 bytes (same size as the source: +248 bytes payload disappear in alignment padding).
  • Reproducible: the new build is sha256-identical to the output of the aborted run.
  • Install as dlc/dlc_0/base/chunk_22.resources. Since dlc_0 wins according to runtime test (18:44) for game/dlc/c02/c2v1, a normal game load reads this file. Structurally valid; the edits under c2v1 are not yet seen in-game.

How built

  1. Retail text from entry 873 of the source bundle; its raw bytes are byte-identical to dlc/dlc_2/base/chunk_22.resources (verified).
  2. Edits from re_probes/entitypipe/manifest.json re-applied with functions from tools/build_custom_map.py (only imported): retype for 4 enemies + 10 pickups, swap_placement for the 2 player starts, light_color (color from manifest, LIGHT_MIN_INTENSITY) for 33 lights, in the order of author().
  3. tnccrypt.compfile_wrap, then idcl.Archive.rebuild + idclwrite.finalize (= idclwrite.write, called separately to allow the state before finalize to be probed as a negative control).

The alias text was not used as source: it deviates from Retail in 186 entities only by alias names, 19 of them with lowercase Kiscule-decl paths (c2v1_geo_Office -> c2v1_custom_geo_office), plus codex' cyan light c2v1_geo_lobby_detail_light_point_9_563923954 (no manifest edit). A replace("c2v1_custom", "c2v1") on the alias text would cause 20 entities to be incorrect -- the script measures this at every run.

Tests (this run, each can fail)

Test Result
Source Entry = dlc_2-Retail (Rawbytes) identical
Retail Text Round-Trip byte-exact
Change Log of Reapplication == changes in Manifest (Donor, inherit old/new, kept, Intensity, Colors, Spawn before/after) identical; 4/10/33/2
c2v1_custom in new text (case-insensitive) 0
Entity Diff against Retail-c2v1 49 changed = 49 claimed, names identical; 0 alias-only entities; no non-entity lines changed; order identical
build_custom_map.check including inherit against 996 entityDefs empty
new quoted names against Retail-c2v1 0
Cross-check against installed c2v1_custom.entities every Entity identical except alias names, sole exception is the Cyan Light
Negative: Edit omitted (..._pretzel_1_1) caught: claimed but unchanged
Negative: Alias renaming reverted (c2v1_geo_lobby_func_collision_only_2_1509497262, actual line from alias text) caught: carries 'c2v1_custom', alias rename only, unclaimed change
Negative: Container before finalize probe_idclhash BAD; probe_datahash exactly 1 BAD = our entry
probe_datahash (final) 7127/7127 (1 entry Mode 4, unchanged)
probe_idclhash (final) +0x08 1/1, +0x20 1/1
Table Diff Source -> Output (Payload + all fields except Offset+0x38) only Index 873, there +0x40/+0x48/+0x50; Header/Dependency-/String tables identical except +0x08/+0x20
finalize() 1 data hash new, hash_0x60 0, deps 0
Payload read back compfile_unwrap == new text, parses byte-exact

Image entries unchanged, so chunk_22.texdb from dlc_2 (identical to dlc_0 via cmp) fits. The alias entry c2v1_custom.entities (7079) remains in the chunk; map game/dlc/c02/c2v1_custom works as before.

Beifiles for a DLC folder serving c2v1

Paths relative to dlc/dlc_2/; Status read from dlc/dlc_0, nothing written.

File Bytes in dlc_0
base/sound/soundbanks/pc/sound.pack 26 003 310 yes
base/sound/soundbanks/pc/english(us).pack 27 082 593 yes
base/sound/soundbanks/pc/french(france).pack 25 505 509 yes
base/sound/soundbanks/pc/italian.pack 26 389 212 yes
base/sound/soundbanks/pc/portuguese(brazil).pack 25 664 560 yes
base/sound/soundbanks/pc/russian.pack 27 795 150 yes
base/sound/soundbanks/pc/spanish(mexico).pack 27 877 094 yes
base/sound/soundbanks/pc/spanish(spain).pack 28 487 489 yes
base/sound/soundbanks/pc/prodspec.json 15 078 yes
base/sound/soundbanks/pc/wwise_project.bin 4 470 035 yes
virtualtextures/maps/game/dlc/c02/c2v1.pages 166 318 272 yes
base/bink/chronicles/sd/one/c2v1_intro_row.bk2 90 664 632 yes
base/maps/game/dlc/c02/c2v1/textures.cache 67 216 392 no

Plus base/chunk_22.texdb (existing), base/packagemapspec.json, and dlcinfo.json. textures.cache is located in dlc_2 under the map path and is missing in dlc_0; the test at 18:44 ran without error messages, so whether the file is used remains open -- link for parity. Soundbanks are DLC-wide, MountDlc mounts dlc_N/base. Machine-readable in re_probes/dlc4_override/manifest.json (side_files_from_dlc_2, in_dlc_0).

Install (Master)

Delete first, then copy -- never write via a hardlink in dlc_2:

$G="<Steam library>\steamapps\common\Wolfenstein.II.The.New.Colossus"
Remove-Item "$G\dlc\dlc_0\base\chunk_22.resources"
Copy-Item re_probes\dlc4_override\chunk_22.resources "$G\dlc\dlc_0\base\"

Backtrack: the same two steps with re_probes\entitypipe\base\chunk_22.resources.

Worked, if the Gestapo Office Save loads with MountDlc: mounting ../dlc//dlc_0/base and you see the edits: red Lobby / green office, MP instead of Pretzel at (-3, -176), Elite soldiers in the first Lobby wave.

Open

  • Game State. A save file carries the entity state of your own entities; whether spawned enemies/pickups come from the save or from .entities (in which case Retypes only trigger on new spawns) is unspecified. Lights should be visible immediately; a fresh chapter start is the cleaner test.
  • The cyan light from the Alias bundle is intentionally not included.

Reproduction

python tools/build_dlc4_override.py     # ~2 min, each Gate printed, exit != 0 on FAIL

If a FAIL occurs after writing, the output will be cleared.