Skip to content

SetManifest

Namespace Nfty.Core.Output in assembly Nfty.Core.

public record SetManifest

The Set's own record, written to set.json: its name, size, seed, the hash of the book that produced it, the collection-wide rarity table and the per-recipe distribution. Reports such as SetReport read it alone, so inspecting a large Set costs the same as inspecting a small one.

Constructors

SetManifest(string, int, string, string?, string, IReadOnlyList<RecipeCount>, IReadOnlyList<RarityAttribute>, bool?, SetModels?, string?, int?, SetFiles?)

public SetManifest(string Name, int Count, string Seed, string? CookbookSha256, string GeneratorVersion, IReadOnlyList<RecipeCount> Distribution, IReadOnlyList<RarityAttribute> Rarity, bool? UniqueDna = null, SetModels? Models = null, string? Symbol = null, int? MetadataShape = null, SetFiles? Files = null);

Parameters

  • Name (string) - The collection's name.
  • Count (int) - How many assets the Set holds.
  • Seed (string) - The seed that produced it; the same seed and cookbook reproduce it exactly.
  • CookbookSha256 (string?) - SHA-256 of the source .cbk — what ties a Set back to the exact archive that produced it. Null when the cookbook never came from a file (an in-memory book). Documented here rather than on the parameter itself: a <summary> inside a positional record's parameter list is not a valid documentation location, so the compiler discarded it with CS1587 and no tooling ever saw it — on the one field CLAUDE.md insists stays threaded through.
  • GeneratorVersion (string) - The engine version stamp.
  • Distribution (IReadOnlyList<RecipeCount>) - Per-recipe counts and shares across the Set.
  • Rarity (IReadOnlyList<RarityAttribute>) - The collection-wide rarity table.
  • UniqueDna (bool?) - Whether every asset was required to have distinct DNA. Recorded because the seed does NOT reproduce a run on its own. The same cookbook and the same seed generate a different collection depending on this switch — with uniqueness on, a colliding roll is discarded and re-rolled, which consumes RNG draws that the unlimited run never spends, so the two diverge from the first collision onward. Without this field a Set carried two thirds of its own recipe. Null means "not recorded", not "false": Sets written before this field existed cannot say, and claiming they were unique would be inventing a fact. Additive and optional, so Schema.Current is deliberately NOT bumped — older builds ignore unknown properties, whereas a bump would make them reject the file outright.
  • Models (SetModels?) - The 3D models the cook made, or null (and absent from the file) when it made none. Additive and optional, no schema bump.
  • Symbol (string?) - The collection's ticker-style symbol, so an export can write collection.json without the source book. Additive and optional, no schema bump; null in a Set cooked before it existed.
  • MetadataShape (int?) - Which shape of per-item metadata the Set carries (MetadataTraits): absent means 1, the shape before color traits and explicit None; new cooks write 2. extend keeps writing the recorded shape. Additive and optional, no schema bump.
  • Files (SetFiles?) - How the Set's per-asset files are NAMED when an export renamed them (token ids, a different start id), or marks an export whose metadata links were rewritten; null (and absent from the file) means the writer's own padded names from 1. Written only by an export, and read by every reader of per-asset files through SetFiles, so an export reopens as a Set whatever it was named. Additive and optional, no schema bump.

Properties

CookbookSha256

public string? CookbookSha256 { get; init; }

SHA-256 of the source .cbk — what ties a Set back to the exact archive that produced it. Null when the cookbook never came from a file (an in-memory book).

Documented here rather than on the parameter itself: a <summary> inside a positional record's parameter list is not a valid documentation location, so the compiler discarded it with CS1587 and no tooling ever saw it — on the one field CLAUDE.md insists stays threaded through.

Count

public int Count { get; init; }

How many assets the Set holds.

Distribution

public IReadOnlyList<RecipeCount> Distribution { get; init; }

Per-recipe counts and shares across the Set.

FileNaming

public SetFiles FileNaming { get; }

The naming this Set's per-asset files follow: SetManifest.Files, or the writer's own.

Files

public SetFiles? Files { get; init; }

How the Set's per-asset files are NAMED when an export renamed them (token ids, a different start id), or marks an export whose metadata links were rewritten; null (and absent from the file) means the writer's own padded names from 1. Written only by an export, and read by every reader of per-asset files through SetFiles, so an export reopens as a Set whatever it was named. Additive and optional, no schema bump.

GeneratorVersion

public string GeneratorVersion { get; init; }

The engine version stamp.

MetadataShape

public int? MetadataShape { get; init; }

Which shape of per-item metadata the Set carries (MetadataTraits): absent means 1, the shape before color traits and explicit None; new cooks write 2. extend keeps writing the recorded shape. Additive and optional, no schema bump.

Models

public SetModels? Models { get; init; }

The 3D models the cook made, or null (and absent from the file) when it made none. Additive and optional, no schema bump.

Name

public string Name { get; init; }

The collection's name.

Rarity

public IReadOnlyList<RarityAttribute> Rarity { get; init; }

The collection-wide rarity table.

Seed

public string Seed { get; init; }

The seed that produced it; the same seed and cookbook reproduce it exactly.

Symbol

public string? Symbol { get; init; }

The collection's ticker-style symbol, so an export can write collection.json without the source book. Additive and optional, no schema bump; null in a Set cooked before it existed.

UniqueDna

public bool? UniqueDna { get; init; }

Whether every asset was required to have distinct DNA.

Recorded because the seed does NOT reproduce a run on its own. The same cookbook and the same seed generate a different collection depending on this switch — with uniqueness on, a colliding roll is discarded and re-rolled, which consumes RNG draws that the unlimited run never spends, so the two diverge from the first collision onward. Without this field a Set carried two thirds of its own recipe.

Null means "not recorded", not "false": Sets written before this field existed cannot say, and claiming they were unique would be inventing a fact. Additive and optional, so Schema.Current is deliberately NOT bumped — older builds ignore unknown properties, whereas a bump would make them reject the file outright.