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
- 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.
- 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.