Team Cereustooling wiki

Check a skin's source parts before building

Partly checkedagainst the code on 2026-11-12 11:37

Each Nightfarer skin is one TOML file. The skin build is a Kotlin script in souls-script-kt. eclipse-build holds one skin tool, preflight.py: it lists the source part files every skin TOML needs and tells you where each one is, so a build does not fail halfway on a missing file.

Checked against code: preflight.py's arguments, defaults and the TOML keys it reads, and one live skin TOML. Not checked: the build script build-nightreign-skins.nr.kts itself and the parts-inspect tool it calls. Nothing was run.

What you need

  • Python 3.12 (py -3.12).
  • The skin TOMLs: S:/souls-script-kt/mods/nightreign-skins/skins/*.toml.
  • The store at S:/eclipse-build-store (or EB_STORE), if you want store copies counted.

Steps

  1. Check everything: the live skins plus every rescued skin TOML under S:/eclipse-build/rescue/*/. A skin name seen more than once keeps the newest file.

    py -3.12 -I -B S:/eclipse-build/tools/skins/preflight.py
    
  2. Or check some TOMLs, and show only what is missing:

    py -3.12 -I -B S:/eclipse-build/tools/skins/preflight.py some.toml --show missing
    
  3. If parts are only in the store, copy them out to a folder the build can read:

    py -3.12 -I -B S:/eclipse-build/tools/skins/preflight.py --materialize S:/eclipse-build-out/skin-parts
    

    This writes DIR/ds3/parts, DIR/ds2/parts, DIR/ds1/parts, DIR/ds3/chr and DIR/nr/parts. Files are copied and hash-checked, never linked.

  4. Run the skin build with those folders: --ds3-parts=DIR/ds3/parts --ds2-parts=DIR/ds2/parts --ds1-parts=DIR/ds1/parts --ds3-chr=DIR/ds3/chr --nr-lod-parts=DIR/nr/parts.

It exits 1 if any file is MISSING or any TOML is bad.

Arguments

Argument Meaning
TOML|DIR ... skin TOML files, globs or folders (searched recursively). None = the live skins plus the rescued ones.
--er-parts DIR default S:/SteamLibrary/steamapps/common/ELDEN RING/Game/parts
--ds3-parts DIR default S:/_modding/ds3-parts/parts
--ds2-parts DIR default S:/_modding/ds2-parts/parts
--ds1-parts DIR default S:/_modding/dsr-parts/parts
--ds3-chr DIR default S:/_modding/ds3-parts/chr
--nr-lod-parts DIR default S:/_modding/nr-parts/parts
--nr-unpacked-parts DIR default S:/souls-script-kt/.tmp/skins-work/nr/parts
--no-store do not count store copies as found
--materialize DIR copy every needed DS or NR source part out of the store into DIR
--show all|missing|notdir default all. notdir shows only rows the default folders cannot serve.

Each folder option can be given more than once.

It looks in the given folders first, then in the store (only rows under a DS or NR source folder, never built outputs), then in the Elden Ring install for ER ids.

The skin TOML

Lines are key = value. A line is cut at the first #. Example (duchess-aristocrat.toml, shortened):

hero = "Duchess"
slot = 1
name = "Aristocrat"
caption = "A tailored coat and tall hat from a noble house long fallen, ..."
source = "er"
head = 1870
body = 1870
arms = 1390
legs = 1860
status = "ported"

Keys preflight.py reads:

Key Meaning
source er (default), ds3, ds2 or ds1
head, body, arms, legs For er: a model number. It needs {hd,bd,am,lg}_m_%04d.partsbnd.dcx in the ER parts folder; the _l copy is optional. For ds3 / ds2 / ds1: a piece stem, with + joining several. The stem is matched without case against <stem>.partsbnd.dcx or <stem>.bnd. DS pieces need no _l source; the build makes it.
status planned skins are skipped, as the build skips them. A TOML with no status counts as planned.
add_meshes donor meshes, entries separated by ;. <stem>:<regex> comes from the ER parts, nr:<stem>:<regex> from the unpacked NR parts.
bone_cloth cloth donors, <piece>=er:<stem>@... or <piece>=nr:<stem>@...
ds_cloth_graft <piece>|<chr>|...: needs <chr>.chrbnd.dcx in the DS3 chr folder
variant_of such skins are checked too

The hero names it knows, in slot order: Wylder, Guardian, Ironeye, Duchess, Raider, Revenant, Recluse, Executor, Scholar, Undertaker.

The build reads many more keys (slim, limbs, extremities, hair_under_hat, hair_rig and others in the live TOMLs). They shape the fit and are not written up here; read the comments in the live TOMLs and the build script.

Fixed build inputs (the ER base body fc_m/f_0000, hd_m_1280, the regulation, matbins, c0000) are not per skin and are not checked by preflight.

Extract a missing DS3 part

tools/skins/README.md records how the four m_2950 parts were extracted with S:/eclipse-build/extract/ds3_parts.py:

py -3.12 -I -B S:/eclipse-build/extract/ds3_parts.py --build-only
py -3.12 -I -B S:/eclipse-build/extract/ds3_parts.py --out <dir> hd_m_2950.partsbnd.dcx bd_m_2950.partsbnd.dcx am_m_2950.partsbnd.dcx lg_m_2950.partsbnd.dcx

That script was not read for this page.

Background (dated notes from memory, not rechecked)

  • Id scheme (2026-10-22). Eclipse has its own skins mod and does not use Skin Overhaul. Proposed then: parts 8000 + hero*100 + slot, goods 41000+, CharaInit 51000+. The Custom Skins Framework's Protector range collides with Skin Overhaul's, so the two cannot be merged as they are.
  • Vanilla collab skins exist already (for example Solaire's set on Guardian, Havel's on Raider). Do not re-port those.
  • Model rules learned the hard way (2026-10-22 to 10-31). Every FLVER must list live bones before disabled ones, or the game draws stray triangles or crashes. Never grow a *_c.clm2 cloth file for added meshes. To hide a mesh that belongs to a cloth, collapse its triangles; do not empty its face sets, or the whole cloth freezes. Eye shaders on merged parts draw sheets and are swapped for a static material. These checks live in the parts-inspect tool in souls-script-kt, which is not version-controlled.
  • Releases. 0.0.28 brought the skins update, 0.0.31 the cloth fix, 0.0.37 the first Dark Souls skins, 0.0.38 the material table fix for them. Dark Souls cloth on skins was still waiting for an in-game look when the note was written.
  • Stan's decisions. Vagabond Knight is retired. Divine Bird uses Guardian's talons. Rigid robes on the Godskin skins were rejected.
Source files this page documents (3)
  • eb:tools/skins/
  • sskt:mods/nightreign-skins/skins/
  • sskt:scripts/mods/build-nightreign-skins.nr.kts

Changed one of these? Update this page: ports/skins.md (how).