Wolfenstein Modloader Buy me a coffeeKaffee spendieren

Wiki / Latest research roundsNeueste Forschungsrunden

NPC Model and Skin Swap: Reskinning vs. Replacing a Model

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

In plain wordsIn einfachen Worten

This report asks whether enemy looks in Wolfenstein II can be changed: either a new skin or head on the same character, or a completely different model. Reskinning works through text definitions alone, and a three-line example mod applied cleanly to the real game data, but has not been checked visually in game. Swapping in a different character is risky: none of the 403 character models shares its skeleton with another distinct model. What the game does with such a swap (adapt, freeze or crash) can only be found out by starting it.

  • A three-line mod switches a placed mini-boss to one of 16 existing head variants; it applies cleanly but is not confirmed in game.
  • 403 models with their own mesh use 369 distinct skeletons; none is shared between two different meshes.
  • Hit zones, mesh variants and ragdoll pose travel with the model; two joint-name fields on the enemy definition must be copied by hand.
  • A new 'modelAsset' layer was found, used by 26% of model references; no broken references were found there.
  • The cross-species model swap is completely untested in the running game.

Dieser Bericht fragt, ob sich das Aussehen von Gegnern in Wolfenstein II ändern lässt: entweder ein neuer Skin oder Kopf für dieselbe Figur oder ein ganz anderes Modell. Neu einfärben geht allein über Textdefinitionen, und ein Beispiel-Mod mit drei Zeilen ließ sich sauber auf die echten Spieldaten anwenden, wurde aber im Spiel noch nicht angeschaut. Eine andere Figur einzusetzen ist riskant: Keines der 403 Figurenmodelle teilt sein Skelett mit einem anderen Modell. Was das Spiel bei so einem Tausch macht (anpassen, erstarren oder abstürzen), lässt sich nur durch Starten herausfinden.

  • Ein Drei-Zeilen-Mod stellt einen platzierten Mini-Boss auf eine von 16 vorhandenen Kopfvarianten um; er lässt sich sauber anwenden, ist aber im Spiel unbestätigt.
  • 403 Modelle mit eigenem Mesh nutzen 369 verschiedene Skelette; keines wird von zwei verschiedenen Meshes geteilt.
  • Trefferzonen, Mesh-Varianten und Ragdoll-Pose wandern mit dem Modell mit; zwei Felder mit Gelenknamen in der Gegnerdefinition muss man von Hand kopieren.
  • Eine neue Zwischenebene „modelAsset“ wurde gefunden, genutzt von 26 % der Modellverweise; dort gab es keine kaputten Verweise.
  • Der Tausch gegen ein artfremdes Modell ist im laufenden Spiel völlig ungetestet.

Technical detailsTechnische Details

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

This research asked whether enemy models and skins in TNC can be swapped — reskinning the same character versus replacing one enemy type's model with a different one entirely — and what constraints (skeleton, animation, hit zones, ragdoll) apply. Reskinning turns out to be fully decl-only and low-risk: a validated three-line mod design was built and dry-run-checked against live retail decl text, though not yet tested in a running game. Replacing a model with a visually different character crosses a hard, corpus-proven boundary: not one of the 403 character models with their own mesh in the entire game shares its skeleton with any other distinct mesh, so a true cross-species model swap is a jump into genuinely untested territory whose in-game outcome (graceful fallback, frozen pose, or crash) cannot be determined without starting the game.

The reference chain

entityDef.renderModelInfo.model
  → (optionally through a modelAsset "X.idasset" — a previously undocumented indirection layer
     that can also carry cloth physics, used by 26% of model references)
  → md6Def "Y.md6" (skeleton/skin config)
  → the .md6mesh binary (actual geometry)
skins "Y" (same path as the mesh, no extension)  -- material-redirect table, picked by name

827 of 1,602 entityDefs set renderModelInfo.model directly; all 25 of the fully-animated (idTreeAnimator) modelAsset indirections resolve correctly to a real mesh config — no dangling references found at this layer.

Reskinning (same mesh, different texture/sub-mesh) — low risk, decl-only

130 of 1,495 md6Defs carry a defaultSkin; 126 skins decls exist; some characters additionally expose per-instance overrides (entityDef.edit.initialSkin, edit.meshKits.*). The richest example found: a mini-boss character has 16 named head variants shared identically between its mesh-kit sub-mesh groups and its material-redirect skins decl — 6 of the 16 names are already used by named retail instances of that character, a built-in positive control for any mod reusing one of those same strings. A validated example mod (a 3-line decl "set" patch, retargeting one placed instance to a different already-existing head variant) applies cleanly against live retail decl text; not yet confirmed visually in a running game.

Model swap (different character entirely) — the hard constraint

Of the 403 md6Defs that own their own mesh, decoding each one's embedded skeleton name directly from the binary mesh data (not guessed from the decl text) found 369 distinct skeletons and zero shared by two different meshes — not even within the single largest "family" of 90 characters that share the same decl-inherit ancestor, which alone spans 70 different skeletons. The only skeleton reuse found anywhere is between literal duplicate wrapper files of the exact same mesh. A same-inherit-chain or "both are humanoid" intuition is not a valid proxy for swap-safety at all — any swap to a genuinely different-looking model crosses a skeleton boundary, full stop, with zero counter-examples in 403/403 checked.

Hit zones, mesh-kit variants, and the ragdoll-pose alias all live inside the md6Def, so they travel automatically with any model swap. Two things that live on the entityDef instead do not travel and must be hand-copied: radiusDamageJoints (18/1,602 entities) and declConstrainedBodies (5/1,602) — both reference joint names from the old skeleton. This is the same class of gotcha already documented for retyping a placed enemy's definition on the map-instance level (losing its encounter-group wiring), just on the decl-template level instead.

A true humanoid ragdoll is not gated by the small articulatedFigure decl type (only 3 exist, all non-humanoid creatures) — the real mechanism is unresolved, likely the declConstrainedBodies reference or an engine-generic humanoid path keyed by the skeleton itself.

For modders

  • A decl-only reskin (texture/head-variant swap) is proven low-risk; it needs a target entity whose own decl text already carries the field being edited (editing an inherited-only field needs a full-replace, not a patch).
  • A genuine model swap across species is structurally a one-field edit but functionally unknown territory — the skeleton always changes, and whether the engine degrades gracefully (fallback animation retargeting), freezes in a bind pose, or crashes is a real open question only a live test can answer.

In-game test

  1. Reskin (low risk): apply the validated head-variant mod, go to where the mini-boss character is placed (a frequently-reloaded hub area), and look — any visible face/head change confirms decl-level skin control over an already-placed instance.
  2. Cross-species swap (risky, optional): point a species-wide enemy base entity at a completely different retail character's mesh, load an early area with that enemy type, and observe: normal combat behavior, a frozen pose, or a crash are all informative, previously-unknown outcomes.