Pin feature ordering to vanilla runtime

This commit is contained in:
Daniar Mannanov 2026-08-11 09:29:17 +03:00
parent a73b689449
commit e9fe526300
5 changed files with 264 additions and 1 deletions

View file

@ -62,6 +62,7 @@ func depthRange(v any) (worldgen.ClimateRange, bool) {
var (
biomeTable *worldgen.ParameterTable
biomeTableOnce sync.Once
biomeOrder []string
)
// loadBiomeTable parses the embedded biome parameters once and returns the full
@ -76,18 +77,28 @@ func loadBiomeTable() *worldgen.ParameterTable {
panic(fmt.Sprintf("world: parsing embedded biome_parameters.json: %v", err))
}
params := make([]worldgen.BiomeParameter, 0, len(raw.Biomes))
seen := make(map[string]bool)
for _, e := range raw.Biomes {
dp, ok := depthRange(e.Param.Depth)
if !ok {
continue // malformed depth; skip defensively
}
params = append(params, makeBiomeParameter(e, dp))
if !seen[e.Biome] {
seen[e.Biome] = true
biomeOrder = append(biomeOrder, e.Biome)
}
}
biomeTable = worldgen.NewParameterTable(params)
})
return biomeTable
}
func possibleBiomeOrder() []string {
loadBiomeTable()
return biomeOrder
}
// makeBiomeParameter converts a raw JSON entry into a BiomeParameter, mapping
// the [min,max] ranges to quantized ClimateRanges. depth is a ClimateRange
// (exact range for scalar depths, explicit range for cave biomes).

View file

@ -0,0 +1,28 @@
package world
import (
"slices"
"testing"
"regionio/internal/worldgen"
)
func TestOverworldFeatureStepsBuildWithoutCycles(t *testing.T) {
set, err := worldgen.LoadFeatureSet()
if err != nil {
t.Fatal(err)
}
steps, err := set.FeatureSteps(possibleBiomeOrder())
if err != nil {
t.Fatal(err)
}
if len(steps) != 11 {
t.Fatalf("feature steps = %d, want 11", len(steps))
}
ores := steps[undergroundOresStage]
for _, name := range []string{"minecraft:ore_clay", "minecraft:ore_diamond", "minecraft:ore_tuff"} {
if !slices.Contains(ores, name) {
t.Errorf("underground ores missing %s", name)
}
}
}