Wolfenstein Modloader Buy me a coffeeKaffee spendieren

Wiki / Latest research roundsNeueste Forschungsrunden

R4 Research Report: Pickups, Givers and Start Loadouts (TNC)

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

In plain wordsIn einfachen Worten

This report scanned every single-player and DLC map of Wolfenstein II: The New Colossus to see how weapons, ammo, health and armor are placed or given to the player. All 6,931 world pickups use the same generic object type, driven by its game definition. Starting gear comes from three separate definition-based sources, not from the spawn point. The smallest way to start the kit map with all 9 weapon families is one field change, but this was found by reading files and is not yet tested in the game.

  • 6,931 of 6,931 pickups use one generic prop class; eleven pickup-like classes are placed zero times.
  • Player start points carry no inventory; gear comes from a map loadout field, the global player and script nodes.
  • Route A: point the map's devmapInvLoadout field at the built-in default loadout to get all 9 weapon families.
  • Open: whether that field works with the normal map load or only with the devmap command.

Dieser Bericht durchsuchte jede Einzelspieler- und DLC-Karte von Wolfenstein II: The New Colossus danach, wie Waffen, Munition, Gesundheit und Rüstung platziert oder dem Spieler gegeben werden. Alle 6.931 Pickups in der Welt nutzen denselben allgemeinen Objekttyp, gesteuert über seine Spieldefinition. Die Startausrüstung kommt aus drei getrennten, definitionsbasierten Quellen, nicht vom Spawnpunkt. Der kleinste Weg, die Kit-Karte mit allen 9 Waffenfamilien zu starten, ist eine einzige Feldänderung, aber das wurde durch Lesen der Dateien gefunden und ist im Spiel noch nicht getestet.

  • 6.931 von 6.931 Pickups nutzen eine allgemeine Prop-Klasse; elf pickup-artige Klassen werden nirgends platziert.
  • Spieler-Startpunkte tragen kein Inventar; die Ausrüstung kommt aus einem Loadout-Feld der Karte, dem globalen Spieler und Skriptknoten.
  • Weg A: Das Feld devmapInvLoadout der Karte auf das eingebaute Standard-Loadout zeigen lassen, um alle 9 Waffenfamilien zu bekommen.
  • Offen: ob das Feld beim normalen Kartenladen wirkt oder nur mit dem Befehl devmap.

Technical detailsTechnische Details

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

A corpus scan of every TNC single-player/DLC map file (27 archives, 39 distinct map files, 637,117 entities), plus the related decl types. Builds on the existing .entities format and weapon-decl research.

Summary

The question was which entity classes place weapons/ammo/health/armor in the world or into the player's inventory, and what the smallest edit is to hand the player every weapon at the kit map's start. Every single world pickup placement across all 39 scanned maps — 6,931 of them, zero exceptions — is the same generic engine class, driven entirely by its decl and one field naming what it actually gives; a set of eleven RTTI classes that look purpose-built for pickups/inventory are compiled into the game but placed zero times anywhere in the single-player corpus (a genuine negative control, not just an unsearched gap). No map "target" entity gives items either. Starting loadout instead comes from three separate, additive decl mechanisms, none of them console commands or save-file edits. This is corpus-wide static analysis of the real shipped archives — the game was never launched, though the underlying decl-edit mechanism this report's recipe uses is the same one already confirmed working in game for an unrelated field.

1. The pickup class

100% (6,931/6,931) of prop/pickup/* placements are the same generic prop class; its behavior comes entirely from its inherit decl (one of ~52 pickup decls for weapons/ammo/health/armor) and one field, useableComponentDecl (present on 98.9% of placements), which names the item decl it actually grants. The remaining ~1.1% without that field are narrative collectibles (gold, readables), identifiable by a different field cluster.

Negative control: eleven RTTI classes that look pickup/inventory-shaped by name (coop starting inventory, item-case loot, inventory storage, deathmatch player start, etc.) have zero placements across the same 637,117-entity scan that correctly finds the 6,931 real pickups and 152 player starts — multiplayer/coop-only or genuinely dead surface for single-player modding. One more class, the "static weapon" prop, is used (50 times) but exclusively for AI-operated turrets, never a player pickup.

No idTarget_* class gives anything. The full RTTI list of 14 target classes contains nothing named Give/Item/Inventory; only two are ever placed at all (AI-spawn and fake-enemy triggers), neither item-related. Item-giving runs exclusively through the pickup-prop mechanism above and the script layer below, never a map "target" entity.

2. Player-spawn placement vs. loadout — two separate things

Player-start entities (152 placements corpus-wide) carry zero inventory-shaped fields — pure placement data (position, orientation, an "initial" flag). What the player holds on spawn comes from three independent, additive mechanisms instead:

  1. world.edit.devmapInvLoadout — present on 23 of 39 maps' world entity, naming a devInvLoadout decl (43 such decls exist: one per major story checkpoint, one per challenge map, one per DLC episode, plus a generic fallback named devinvloadout/code_referenced/default_sp_devloadout that carries all 9 player weapon families with ammo).
  2. The single global player entity's startingInventory — exactly one item in retail (the perk tracker), the campaign-wide floor every spawn gets regardless of map.
  3. Kiscule script ActionGiveItems nodes — 45 uses across 29 scripts, mid-script grants (catalogued separately, reused unchanged here).

3. The smallest edit for "every weapon at the kit map's start"

Three routes were compared; only one reaches all 9 weapon families:

Route What it does Weapon coverage New entities needed
A — loadout redirect Point the map's world.edit.devmapInvLoadout at the generic fallback decl (devinvloadout/code_referenced/default_sp_devloadout) instead of its own all 9, including the two "super-weapons" that have zero placed pickups anywhere in the 39-map corpus 0 — target decl already exists and is always reachable
B — donor retype (existing technique: retype an existing non-weapon prop onto a weapon-pickup prop already placed in the map) reuses an existing placed pickup only 4 of 9 — the kit map itself only has donor pickups for four weapon types in retail 0, but structurally capped
C — edit the global player's own startingInventory extend the one-item list directly all, if extended the same way the fallback decl already is 0, but global — affects every chapter start in the whole campaign, not just the kit map

Route A is the smallest and most targeted fix — a single field-value swap, the same shape as every other proven decl edit in this project. One caveat: the custom-map build tool's own safety check (which rejects any string value that wasn't already present in the map's own text) would currently reject this specific edit as "novel," since it can't tell a valid decl reference from a typo — a known, not-yet-fixed tooling gap, not a game-side blocker.

4. devmap is a real, separate console command

Both map and devmap are registered commands with different callback functions — not aliases. Since the loadout field is literally named devmapInvLoadout, it's plausible the field is specifically read on the devmap path rather than map; this was not resolved offline (see "Open questions").

Open questions

  • Whether devmapInvLoadout actually fires via the existing load route (which issues a map load) or specifically requires the literal devmap command — the one open question that decides whether Route A works as a pure field edit or needs the load route changed too.
  • Whether editing the global player's startingInventory (Route C) is layered under or overridden by a map's own devmapInvLoadout/script grants, or double-grants ammo — untested.
  • The custom-map build tool's "novel string" safety gate needs a fix (an allowlist, or a check against the mounted archives) before Route A can go through the normal unattended build pipeline.

In-game test (for the tester)

  1. On the already-proven custom kit map, change its world.edit.devmapInvLoadout field from its own loadout to devinvloadout/code_referenced/default_sp_devloadout, rebuild, install.
  2. Load the map twice to settle the devmap-vs-map question in one pass: once through the normal existing load route, and — if the console accepts it at that point — once directly with devmap <map-id>.
  3. Open the weapon wheel and count equipped weapons. Expected on success: all 9 weapon families instead of the map's retail default loadout. If only one of the two load routes shows the effect, that settles the open question above without needing a second session.