Team Cereustooling wiki

Seeds reference

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

Status partial: the tool tables were read from code. "Stan's seed rules" at the end are dated notes from the team memory, not something code can confirm.

seedgen (S:/fromsoftware-rs/.tmp/seedgen-vanilla/seedgen/)

File What it is
README.md The decoded generator rules, the verification numbers and the Eclipse layer. Read it for the "why".
model.py Decodes the params into slots, categories, rules and vanilla patterns. Reads NR_REGULATION_XML and NR_SEED_VIEWER.
generate.py The generator. Flags: --lord (6), --earth (0), --era (launch), --count (1), --seed (1), --mode (vanilla), --config (eclipse.json), --first-id (90000), --new-content, --out.
eclipse.py The Eclipse layer: dedupe, ailment spacing, themes, coverage, catalog, mimic chest, invasion.
eclipse.json Eclipse settings. Keys are listed in Generate a Limveld seed.
catalog.tsv New content for Eclipse mode. Does not exist yet. Columns: era, group, cat, map, var, name, ailment, weight, status (off or disabled skips a line).
validate.py check(pattern) for one pattern. Run alone ([--verbose]) it checks all baked vanilla patterns.
render.py <pattern id or file.json> [--index N] [--bg image] [--out png]. Needs Pillow.
export.py <patterns.json> [--params file] [--viewer file].
compare.py [K] [--mode vanilla|eclipse] [--per-earth]. Writes compare-<mode>.json in the current folder.
report.py [n] (default 40). Writes report.json, sample-eclipse.json, sample-vanilla.json in the current folder.
calibrate.py Writes calibration.json (slot pairs vanilla almost never gives the same POI type).
fit_spread.py [era] (default launch). Fits the soft same-type spacing rule.
treasure-assets.tsv Every Treasure-event asset of the vanilla POI maps. The mimic pick reads it. Made by tools/chestlist (C#).
renders/ Check pictures, for example check-240-vs-fifthmatt.png.

Numbers from seedgen's README (2026-11-06): 414 of 440 launch and DLC-era vanilla patterns pass the decoded rules; 58 of 80 Great Hollow patterns pass.

castle-variants seed planner (S:/souls-script-kt/scripts/tools/castle-variants/)

Command What it does
py -3.12 -I -B seeds.py list Every seed with its slot file and placement counts.
seeds.py check [--seed a,b] [--parts <plan>/vanilla-parts.json] Cross-seed checks. Exit code says pass or fail.
seeds.py maps <pattern> [--seed ...] The pattern's attach slots and night maps, with what the seeds edit there.
seeds.py candidates [--seed ...] [--top 25] [--parts ...] Normal-earth patterns ranked by how few edited parts they would also show.
seeds.py tiles <pattern> [--seed ...] [--parts ...] Attach slots that show another seed's parts, and clean tiles for tiles.tsv.
py -3.12 -I plan.py <out dir> [<mod out dir>] [--no-arena] [--seed a,b] Writes rowlist.tsv, edits.json, plan.json and the arena feed files.
py -3.12 -I build.py <plan dir> <package dir> [--refresh-arena] [--skip-verify] [--seed a,b] The whole build chain.
py -3.12 -I package.py <plan dir> <package dir> Copies the placed ports' files into the package.
py -3.12 -I verify.py <plan dir> <package dir> [<base package>] Offline checks of the package.
py -3.12 -I -B poi_variants.py registry <plan dir> [--write] Rebuilds the vanilla and in-place lines of poi-variants.tsv.
py -3.12 -I -B poi_variants.py check Checks the registry against vanilla data.

--seed takes a comma list, can repeat, and accepts all (every line of seeds.tsv). --seeds is the same flag.

CastleVariants.exe

Source: S:/eclipse-build/tools/dotnet/CastleVariants. In tools.toml: castlevariants is the frozen 0.0.86 binary, castlevariants_src builds from source (eb.py tool build castlevariants_src).

Subcommands in Program.cs: msb, msball, rows, cmp, atk, emevd, emevdp, build msbjson|apply, matdiff, names, matbins, verify, arena, testevent, rapappend, fmgls, fmgadd, gaolgate, dcxd.

  • build msbjson <mapstudio dir> <out.json> <map>...: the vanilla enemy parts of the maps.
  • build apply <edits.json>: MSB part swaps, clones and drops, plus EMEVD name and music edits.
  • gaolgate <in emevd> <out emevd> <common_func emevd> <variation,...>: adds the evergaol prompt gate to a published file.

The seeds that exist (config/seeds/seeds.tsv, 2026-11-12)

Pattern Name in the file Status in the file
240 Caligo showcase live
1153 Seed B (Dreglord) next
216 Heide's Tower next
280 Lords of Cinder (Heolstor pattern) next

The status column may lag behind the releases: team notes say 1153 shipped in 0.0.48 and 216 in 0.0.78. Which patterns a release really plays is set by [seed] pool in its debug-nightreign.release.toml.

Seed viewer (S:/_modding/tools/seed-viewer/)

File What it is
seedviewer/index.html The page. Edited in place.
seedviewer/seeds.json Seeds, slots, night circles, names and icons. Also read by seedgen (NR_SEED_VIEWER).
seedviewer/place.json, lib_index.json, lib_00..07.json The 3D map data.
site/public/ The deployed copy.
site/wrangler.toml Worker nightseed-seeds, assets from ./public, routes for seeds.cereus.games and the old seeds.nightseed.app.
seeds.py <out json> Builds the seed list. --raw skips the height fixes. Env SEEDV_PARAMS = folder of patched param XML.
mk_live_params.py <cells.txt> <out dir> Patches the four seed tables with a live Eclipse regulation's changes.
eclipse_names.py <params dir> <in> <out> Writes Eclipse names and badges into seeds.json.
poinames.py <out.json> Names a POI map and variation from the vanilla maps.

Stan's seed rules (notes from team memory, dated)

These are decisions, not code. Check with Stan when one matters. Run a plan through seeds.py check before building.

2026-11-02:

  • Eclipse runs on more than one seed. Seed A is pattern 240 (Caligo). Seed B is a Dreglord pattern (1153). Later seeds follow the same rules.
  • No recycling: a boss family (all weapon variants count as one) appears in at most one seed, and in at most one boss spot of it (night 1, night 2, roof, basement, evergaol, field, POI). Trash may repeat.
  • Evergaols hold humanoid duelists. Humanoid NPCs go only in evergaols, never in POIs or castle basements (named exceptions exist, for example Havel in a basement).
  • Day 2 bosses must be spectacle bosses. Strong but not final bosses go to Day 1. Roof, basement and POI bosses are mid-tier.
  • A normal run follows the Nightlord the party picked. Deep of Night picks at random; the host decides. The seed pool is set in the DLL config.
  • Every new port gets a Boss Menu entry, even before it is on a seed.
  • A boss enemy appears only as a boss, unless it is weak enough to fit better as elite trash.

2026-11-03:

  • For a later seed's open POI and field spots, reusing a port from seed 240 is allowed when no new one fits. Prefer new.
  • Day 1 tier bosses may fill field boss spots, never POIs or camps.
  • A port never keeps the item drops of the enemy it replaces.
  • A POI variation is added as an option. It never overwrites a vanilla set.
  • Every evergaol gets an ailment badge on the map, chosen by what the duelist inflicts.

2026-11-07:

  • A seed that has an invasion gets it every run. The chance is per seed, not per run.
  • Never edit a vanilla variation in place, evergaol variation 0 included. Add a variation that only the seed loads.
  • Never put field bosses on POIs. Never use meteor crater maps on POI slots.

2026-11-10 (the Lords of Cinder seed proposal):

  • A new seed exists to test content that is on no seed yet. Fill slots with unused ports first, from any game. Theme only breaks ties.
  • A POI's ailment badge belongs to the vanilla map variation. It is not free to assign. Allowed: Fort magic; Great Encampment fire, lightning, madness; Ruins bleed, frost, holy, poison, magic, sleep, lightning; Great Church holy, fire. Camps, rises, churches, townships, the castle, fields and night maps carry none.

Generator rules from the same notes (2026-11-06 and 2026-11-07): every Eclipse seed has exactly one mimic chest; the mimic's reward is about 20,000 runes plus the Symbol of Avarice as a normal drop.

Source files this page documents (8)
  • fsrs:.tmp/seedgen-vanilla/seedgen/
  • sskt:scripts/tools/castle-variants/seeds.py
  • sskt:scripts/tools/castle-variants/plan.py
  • sskt:scripts/tools/castle-variants/build.py
  • sskt:scripts/tools/castle-variants/config/seeds/seeds.tsv
  • eb:tools/dotnet/CastleVariants/Program.cs
  • modding:seed-viewer/site/wrangler.toml
  • modding:seed-viewer/seeds.py

Changed one of these? Update this page: seeds/reference.md (how).