Wolfenstein Modloader Buy me a coffeeKaffee spendieren

Wiki / Research reportsForschungsberichte

DLC-/Patch Container as Primary Source — Static Finding

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

In plain wordsIn einfachen Worten

This report studies how Wolfenstein II: The New Colossus decides which archive holds a DLC map. Each retail DLC map names its own main archive ('chunkid'), while 'refchunks' are only extra dependencies. So a mod DLC can, by format, register its own main archive for a map instead of just adding a dependency. What happens when a DLC entry has the same map name as a base game entry, and which archive wins, cannot be proven without a game test.

  • DLC 1, 2 and 3 use main archives 20, 22 and 24; DLC 3 has no refchunks at all.
  • Listed refchunks are almost never duplicated (15 copies), unlisted dependencies strongly are (1,495 copies).
  • An earlier test only added archive 26 as a refchunk, which does not test this main-archive path.
  • The patch level should stay at 4 for base map names; whether this limit is per entry or global is open.
  • Proposed test: a DLC entry with the same map name and chunkid 26 plus a visible marker change.

Dieser Bericht untersucht, wie Wolfenstein II: The New Colossus festlegt, welches Archiv eine DLC-Karte enthält. Jede DLC-Karte des Spiels nennt ihr eigenes Hauptarchiv („chunkid“), „refchunks“ sind nur zusätzliche Abhängigkeiten. Ein Mod-DLC kann vom Format her also ein eigenes Hauptarchiv für eine Karte anmelden, statt nur eine Abhängigkeit hinzuzufügen. Was passiert, wenn ein DLC-Eintrag denselben Kartennamen wie ein Eintrag des Hauptspiels hat, und welches Archiv dann gewinnt, lässt sich ohne Spieltest nicht beweisen.

  • DLC 1, 2 und 3 nutzen die Hauptarchive 20, 22 und 24; DLC 3 hat überhaupt keine refchunks.
  • Angegebene refchunks werden fast nie doppelt mitgeliefert (15 Kopien), nicht angegebene Abhängigkeiten dagegen stark (1.495 Kopien).
  • Ein früherer Test hat Archiv 26 nur als refchunk hinzugefügt; das prüft diesen Hauptarchiv-Weg nicht.
  • Die Patch-Stufe sollte für Kartennamen des Hauptspiels bei 4 bleiben; ob diese Grenze pro Eintrag oder global gilt, ist offen.
  • Vorgeschlagener Test: ein DLC-Eintrag mit gleichem Kartennamen und chunkid 26 plus einer sichtbaren Markierungsänderung.

Technical detailsTechnische Details

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

Result

High Confidence: The Retail format has a primary DLC path separated from the refchunks mechanism. Each Retail DLC map is assigned its own chunkid via its packagemapspec.json entry; refchunks are only additional dependencies. Therefore, a dedicated dlc_4/base/chunk_26 can be registered as a primary map container on a format level, rather than merely sitting as a refchunk next to chunk_1.

Not statically provable: When two specs share the same name, it is not proven whether the DLC MapSpec entry selects/overrides the Base entry and whether its primary chunk wins against gameresources in case of a name collision. The existing runtime finding for refchunks: [26] tests only an additionally mounted dependency and does not refute this primary path.

Exact Retail Evidence

From the fully read Retail Specs (documented measurement in docs/patchprecedence.md, Section 1; reproducible via tools/probe_patchprec.py --spec):

Retail Path Maps / Fields Statement Confidence
dlc/dlc_1/base/packagemapspec.json 4 Maps; chunkid: 20, basechunkid: 6, layer: -1, refchunks: [9,12,13], patchinfo.patchlevel: 2 chunk_20 is the primary DLC container; the three refchunks are secondary. High
dlc/dlc_2/base/packagemapspec.json 3 Maps; chunkid: 22, basechunkid: 6, layer: -1, refchunks: [9,13], patchlevel: 3 Same primary pattern with a different chunk ID. High
dlc/dlc_3/base/packagemapspec.json 3 Maps; chunkid: 24, basechunkid: 6, layer: -1, no refchunks, patchlevel: 3 A DLC chunk is also a regular primary map container even without refchunks. High
base/packagemapspec.json 31 Maps; chunkid 0,1,3,4,5,7–16; basechunkid 0/6; patchlevel: 4 The same chunkid mechanism selects primary map archives in the base case. High

The engine knows these parser fields as adjacent literals at NewColossus_x64vk.exe VA 0x1426D0228 (refchunks), 0x1426D0238 (chunkid), 0x1426D0240 (basechunkid), 0x1426D0250 (packagemapspec.json) and 0x1426D0268 (patchinfo). This supports that chunkid and refchunks are separate inputs to the MapSpec parser. High.

The set of Retail data confirms the separation negatively: reported refchunks are almost never duplicated, whereas unreported ones are strongly so (dlc_1/2: total 15 versus 1,495 copies for the compared dependency chunks; dlc_3 without refchunks: 692/459/217 from chunk_9/12/13). A refchunk is thus an additional source, not the container that the map primarily names via chunkid. High.

Relevance for dlc_4

The already archived specs correctly identify the primary candidate:

  • re_probes/tnc_dlc_test/dlc_4/dlcinfo.json: dlcid: 4.
  • re_probes/tnc_dlc_test/removed_from_game/dlc_4/base/packagemapspec.json: for game/wolf/c02/c02p0 stands chunkid: 26 (primary source), basechunkid: 6, layer: -1, refchunks: [1], patchlevel: 4.
  • In contrast, the measured detour was refchunks: [26] next to the base chunk_1: the canary was missing from chunk_1. This shows only that an additional refchunk does not receive override priority. High confidence.

patchlevel: 4 must be maintained for an existing base map name: Retail DLCs show that it is the patch search upper bound, and base/ uses 4. A lower value can omit patch layers for this map. Whether the upper bound is strictly per-spec or globally maximized remains open; 4 is compatible in both interpretations. Medium.

What a Single Test Must Decide

A controlled test must use a duplicated MapSpec name, not merely list chunk_26 in refchunks:

{ "name": "game/wolf/c02/c02p0", "chunkid": 26,
  "basechunkid": 6, "layer": -1, "refchunks": [1] }

At patchinfo.patchlevel: 4, combined with dlc_4/base/chunk_26.resources and .texdb. A distinctly different, valid Canary in chunk_26 decides:

  • Canary visible: The DLC Mapspec was primarily selected for the base map, and its container has won the collision.
  • Canary unchanged upon confirmed Mount: The Base Mapspec or its container takes precedence.
  • Map/Assets missing: The Mapspec may have been primarily selected, but the dependency set is incomplete; this is not a precedence judgment.

Previous hurdle: A newly built IDCL container requires a valid header hash at +0x08; this algorithm was still open in the documented runtime state. Therefore, a header rejection cannot be interpreted as refuting the primary DLC path. High.

Counter-evidence against an overly strong structural interpretation

basechunkid: 6 does not enforce layer: -1: Retail base maps with basechunkid: 6 have layer: 1, while all ten Retail DLC maps have layer: -1. Thus, the DLC values represent a tested pattern but are not a statically proven priority rule. Similarly, Retail provides bit-identical content for 7,733 DLC↔Base collisions; no direction for an unequal collision can be inferred from this.