Real badlands clay bands and a real biome temperature table
The bandlands rule cycled four terracotta colours off a per-column random draw. Vanilla generates a 192-entry band table once per world, from a random source named clay_bands, and reads it at the block's height shifted by the clay_bands_offset noise. Brown, red and light grey terracotta were never placed anywhere; the stripes were the wrong thickness and did not line up between neighbouring columns. All seven colours now appear. The temperature condition matched a hand-written list of eleven biome names. Replacing it with the temperature field read out of the jar's 65 biome JSONs fixes one of them: deep_frozen_ocean reads cold by name but its base temperature is 0.5, so vanilla does not freeze it. taiga and the pine taigas were the other way round -- excluded by name, and correctly so, but by coincidence rather than by data. Two parts of the vanilla calculation are left out and documented where they belong: the height adjustment that cools peaks, and the "frozen" modifier that warms scattered patches of frozen ocean. Both need PerlinSimplexNoise. Neither is reachable from the overworld tree in a way that shows: the single condition that consults temperature sits under a frozen_ocean biome check, below a water check, and decides whether a hole in the ocean floor ices over. The snowy mountain tops come from biome selection, not from here -- which is not what the plan for this commit assumed. The per-column *rand.Rand threaded through SurfaceContext goes away with the old bandlands rule; nothing needs it now that vertical_gradient rolls positionally.
This commit is contained in:
parent
c19e5f0e4f
commit
3a255b52e1
8 changed files with 289 additions and 68 deletions
|
|
@ -17,6 +17,7 @@ type Loader struct {
|
|||
rs *RandomState
|
||||
dfCache map[string]DensityFunction
|
||||
interpolated []*Interpolated
|
||||
bands *clayBands
|
||||
}
|
||||
|
||||
// OverworldDensity is the parsed final_density plus the set of Interpolated
|
||||
|
|
@ -446,3 +447,17 @@ func (l *Loader) parseSplineValue(v any) (DensityFunction, error) {
|
|||
}
|
||||
return l.parseNode(v)
|
||||
}
|
||||
|
||||
// clayBands builds the world's badlands band table on first use. It is seeded
|
||||
// from the root positional factory hashed by name, as SurfaceSystem does.
|
||||
func (l *Loader) clayBands() (*clayBands, error) {
|
||||
if l.bands != nil {
|
||||
return l.bands, nil
|
||||
}
|
||||
offset, err := l.noiseField("minecraft:clay_bands_offset")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("clay_bands_offset noise: %w", err)
|
||||
}
|
||||
l.bands = newClayBands(l.rs.Positional().FromHashOf("minecraft:clay_bands"), offset)
|
||||
return l.bands, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue