What changed
- The black is a marking now. Before, Showa and Utsuri were built black, with white, red or yellow patches cut into them like windows. Now the ground colour is the base and the black goes on top: a Showa is a Kohaku (red patches on white) with sumi laid over the red and the white, and an Utsuri is white, red or yellow with sumi over it. The black also reaches the head, as it does on real Showa and Utsuri, and the tail fin keeps the ground colour.
- A sumi gene. The amount of black comes from a new `sumi` gene, rolled after every other gene so older seeds keep the rest of their genes. Utsuri carry 30% to 65% black. Showa do too, except about one in seven, which are light, Kindai-style fish at 15% to 30%. Sanke and Bekko black is their spots, a separate gene, so they are unchanged.
- Black shapes that hit their share. The sumi is a low-frequency noise field, so it comes as a few bold markings that wrap over the back and down the flanks, with a finer wobble on rough skin. Each koi gets the field value above which exactly its share of the body is black, found by sampling a 64×16 grid and taking that quantile. Measured over 200 plain koi of each: Showa 13% to 64% black, Utsuri 26% to 63%.
- Judging follows. Utsuri cover is now judged on the black, 30% to 65%. Showa cover counts red and black together, 50% to 85%. Grades come out close to Kohaku and Sanke: of 400 Showa, 81 Pond, 180 Fine, 118 Show and 21 Champion.
- Names and rarity. An Utsuri's colour now lives in its base colour, so Shiro, Hi and Ki Utsuri names, their metallic names and Ki Utsuri's rarity read that. Every seed keeps its variety, name and rarity.
Why
A r/Koi judge: Showa and Utsuri should read as black markings over the base colour, not as a black fish with windows, at about 30% to 65% black. A Showa looks like a Kohaku with sumi on top, and a Kindai Showa can have very little black.
The code
Before: black as the base, the colour as patches.
case KoiVariety.Showa:
g.baseColor = KoiPigment.Black;
g.primaryColor = KoiPigment.White;
g.secondaryColor = KoiPigment.Red;
g.spotCount = rng.Range(2, 5);
break;
...
case KoiVariety.Utsuri:
g.baseColor = KoiPigment.Black;
g.primaryColor = Pick(ref rng, KoiPigment.White, 0.55f, KoiPigment.Red, 0.35f, KoiPigment.Yellow);
After: the colour is the base, and the black comes from the sumi gene.
case KoiVariety.Showa:
// A Kohaku with sumi on top: red patches on white, then black markings from the sumi gene.
g.baseColor = KoiPigment.White;
g.primaryColor = KoiPigment.Red;
g.secondaryColor = KoiPigment.Black;
rng.Range(2, 5); // was the count of red spots; still drawn so every later gene stays on its seed
break;
...
// Showa and Utsuri sumi, also last for the same reason.
g.sumi = rng.NextFloat();
float SumiField(float x, float y, bool ragged)
{
float f = 0.7f ValueNoise(x 1.5f + sumiOffsetX, y * 2.2f + sumiOffsetY)
+ 0.3f ValueNoise(x 3.4f + sumiOffsetY, y * 4.6f + sumiOffsetX);
if (ragged) f += (ValueNoise(x 9f + sumiOffsetX, y 9f) - 0.5f) 0.08f edgeNoise;
return f;
}
...
System.Array.Sort(values);
int index = Mathf.Clamp(Mathf.RoundToInt((1f - share) * values.Length), 0, values.Length - 1);
return values[index];
...
float black = Mathf.Clamp01((SumiField(x, y, ragged) - sumiThreshold) / (edgeSoftness * 0.6f) + 0.5f);
Plain Showa and Utsuri never have a black base, and land in their black ranges (with a few points of slack for the measuring grid). The Sanke test from the last change still passes: the blackest Sanke has less black than the lightest Showa.

