Pin feature ordering to vanilla runtime
This commit is contained in:
parent
a73b689449
commit
e9fe526300
5 changed files with 264 additions and 1 deletions
|
|
@ -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).
|
||||
|
|
|
|||
28
internal/world/feature_sorter_test.go
Normal file
28
internal/world/feature_sorter_test.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue