Wolfenstein Modloader Buy me a coffeeKaffee spendieren

Wiki / Latest research roundsNeueste Forschungsrunden

Custom TNC Maps Without Owning Any DLC

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

In plain wordsIn einfachen Worten

The project's working custom map for Wolfenstein II: The New Colossus borrows a Freedom Chronicles DLC map slot, so it needs that DLC. This report asks how to avoid that. Reading the code shows a DLC folder can never take over a base campaign map, because the base game is always checked first. The recommended DLC-free route is to edit a base map's own archive directly with already-proven techniques; the routes are ranked by code reading and are not yet tested in the game.

  • The base map list is always checked first, so none of the 31 base map names can be taken over by a DLC folder.
  • Route 1: edit a base map chunk in place; many small edits fit into the existing padding without a rebuild.
  • Chapter entries are normal editable definitions, and the game itself ships one new entry only in a patch file.
  • Several older ideas failed: save edits gave File Corrupt, and loading maps from the menu console failed.
  • Open: whether the chapter-select menu shows a newly appended chapter variation.

Die funktionierende eigene Karte des Projekts für Wolfenstein II: The New Colossus leiht sich einen Kartenplatz aus dem DLC Freedom Chronicles und braucht deshalb diesen DLC. Dieser Bericht fragt, wie man das vermeidet. Das Lesen des Codes zeigt, dass ein DLC-Ordner nie eine Karte der Hauptkampagne übernehmen kann, weil das Hauptspiel immer zuerst geprüft wird. Der empfohlene Weg ohne DLC ist, das Archiv einer Basis-Karte direkt mit bereits bewährten Techniken zu bearbeiten; die Wege sind per Code-Lesen eingestuft und im Spiel noch nicht getestet.

  • Die Kartenliste des Hauptspiels wird immer zuerst geprüft, keiner der 31 Basis-Kartennamen kann also von einem DLC-Ordner übernommen werden.
  • Weg 1: einen Chunk einer Basis-Karte direkt bearbeiten; viele kleine Änderungen passen ohne Neuaufbau in den vorhandenen Leerraum.
  • Kapiteleinträge sind normale, bearbeitbare Definitionen, und das Spiel selbst liefert einen neuen Eintrag nur in einer Patch-Datei aus.
  • Mehrere ältere Ideen sind gescheitert: Spielstand-Edits ergaben File Corrupt, und Karten über die Menü-Konsole zu laden schlug fehl.
  • Offen: ob das Kapitelauswahl-Menü eine neu angehängte Kapitelvariante anzeigt.

Technical detailsTechnische Details

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

The proven custom-map route rides on dlc/dlc_0 claiming the Freedom Chronicles map slot c2v1, which needs the real DLC2 payload (sound, virtual-texture pages, intro video, ~400 MB) to exist on disk — so that whole route still requires Freedom Chronicles ownership. This note asks whether a route exists that needs no DLC ownership at all: claiming a base-campaign map slot instead, exposing a brand-new map name through the menu, or overriding a base slot the way dlc_0 overrides c2v1. Static disassembly of the map-mount code gives a firm no for "a DLC folder steals a base map's slot" — base is always checked first. What is open and DLC-free is editing an existing base map's own archive directly with the already-proven technique, and a newly-investigated, retail-precedented route through the chapter-select data. All mechanism claims here are static analysis; only the dlc_0-beats-dlc_2 collision itself was previously confirmed with a screenshot.

Why a DLC folder can never steal a base map name

idResourceManagerLocal::LoadNamedResourceBlock (0xac1730) does two spec lookups — 0xabf440 (chunk id) and 0xabf500 (directory prefix) — and both check base/packagemapspec.json first, consulting the DLC list only when base has no entry for that name; first hit wins, no comparison across DLCs ever happens. 0xabd940 builds the chunk filename, 0x1211e70 joins the directory, 0xacc6b0 mounts. DLC discovery itself (0xabdcf0, SearchDLC) appends folders in scan order and skips a duplicate id, logging found dlc id %d at %s. Measured live: a dlc_0/id-4 folder beat retail dlc_2/id-2 for the identical map name game/dlc/c02/c2v1 — not a "last-registered wins" effect, since dlc_2 is scanned later and still lost.

Consequence: none of the 31 base campaign map names in base/packagemapspec.json can ever be taken over by a DLC folder; the DLC fallback only fires for a name base has no entry for at all — exactly c2v1's case.

Routes, ranked

Route 1 — edit a base map's own chunk directly (recommended, DLC-free). The same technique already proven on the DLC map (c2v1: entity retype/relight/respawn, archive rebuild, header-hash finalize) applied to base/chunk_N.resources instead. Cost model (TNC-specific, not TNO's): every entry sits in a payload followed by a zero-filled gap before the next entry; median gap is 48 B in gameresources, 650 B in chunk_12, 63 B in patch_1. A representative edit (every integer in a decl scaled up) fits that gap 21–25 times out of 25 for most decl types without a full chunk rebuild; a rebuild, if needed, runs 73–466 MB depending on the chunk. This route needs zero DLC folders, zero ownership checks, zero name-collision gamble.

Route 2 — a self-built patch layer overriding a base map's entity data (untested). Patch containers are searched up to a declared patch level and the highest present layer wins for a name — proven for decls/tables/images (strong corpus evidence), not yet confirmed for the map-entity resource type specifically.

Route 3 — a DLC folder claiming an existing base map name — closed, by the lookup-order evidence above.

Route 4/5 — exposing a brand-new map through chapter-select. chapter and chaptervariation are ordinary, patchable decl entries (confirmed by their class hierarchy), not a hardcoded 4-slot list — 28 chapter + 105 chaptervariation decls exist in the live install, including Kraken-compressed ones, all read directly. Retail itself already ships a patch-only new chaptervariation name (present only in a patch archive, absent from the base archive) — proof the mechanism accepts brand-new decl names for this type, not just overrides. But the chapter-select UI does not enumerate every chapter decl present: at least 8 leftover debug/demo chapters sit in the same non-DLC-gated layers every player mounts yet never appear on screen (two even reuse an existing chapter's numeric id with no apparent ill effect). The safer sub-route is therefore not a whole new chapter, but appending one more chaptervariation entry to an already-shown chapter's variations list.

A related, already-tried dead end: flipping a map's "show in developer map menu" flag crashed the game on start in earlier work; not re-attempted.

Failed hypotheses

  • "The DLC folder enumerated later wins" — falsified by the dlc_0-beats-dlc_2 result (the loser was scanned later, not earlier).
  • "refchunks is an override mechanism" — tested twice, the primary chunk always won regardless.
  • "packagechunklist.json can pre-mount a DLC chunk at the main menu" — disassembly-traced dead end; on PC the streaming-install "chunk installed" check is hardwired to always-true with zero writers to the active flag.
  • "Console or resourceExec can load an arbitrary map without a save" — measured: resourceExec at the main menu fails with can't generate in production, because DLC chunks mount only inside the map-load function itself, never at startup/menu time.
  • "An offline-edited save can register a new map id" — two increasingly-correct candidate saves both produced File Corrupt; each save's six verification files are AES ciphertext with an unidentified signing key.

Open questions

  • Whether the patch level that gates container precedence is enforced per-container or as a global maximum across all mounted specs.
  • Whether the map-entity resource type follows the same patch-override rule proven for decls/tables/images.
  • Whether the chapter-select screen's own UI widget walks a chapter's full current variations array each time, or caches a fixed count baked at build time — the one question that decides whether appending a variation entry is enough.

In-game test (not yet run)

Two decisive tests, in order:

  1. Route 1–3 decision test: install a DLC-style folder carrying a modified base/packagemapspec.json that re-registers an existing base chapter's map name under a different chunk id, start that chapter fresh, and take a hit — normal damage confirms base always wins (expected, closes Route 3); no damage overturns this report's central claim.
  2. Route 5 test: build a one-entry patch archive that appends a new chaptervariation to an already-shown chapter's variations list (pointing at already-proven custom map content), bump the patch level, start the game fresh, and open chapter select. A new, selectable entry settles whether the Timeline UI reads appended chapter data at all.