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:
world.edit.devmapInvLoadout— present on 23 of 39 maps' world entity, naming adevInvLoadoutdecl (43 such decls exist: one per major story checkpoint, one per challenge map, one per DLC episode, plus a generic fallback nameddevinvloadout/code_referenced/default_sp_devloadoutthat carries all 9 player weapon families with ammo).- 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. - Kiscule script
ActionGiveItemsnodes — 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
devmapInvLoadoutactually fires via the existing load route (which issues amapload) or specifically requires the literaldevmapcommand — 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 owndevmapInvLoadout/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)
- On the already-proven custom kit map, change its
world.edit.devmapInvLoadoutfield from its own loadout todevinvloadout/code_referenced/default_sp_devloadout, rebuild, install. - Load the map twice to settle the
devmap-vs-mapquestion in one pass: once through the normal existing load route, and — if the console accepts it at that point — once directly withdevmap <map-id>. - 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.