Compare ore feature biome orders
This commit is contained in:
parent
51b4891f81
commit
a24ffb98f3
3 changed files with 116 additions and 2 deletions
|
|
@ -2,8 +2,10 @@ package world
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"regionio/internal/registry"
|
||||||
"regionio/internal/worldgen"
|
"regionio/internal/worldgen"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -51,6 +53,48 @@ func TestOreScheduleDiagnostic(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOreFeatureOrderDiagnostic(t *testing.T) {
|
||||||
|
if os.Getenv("REGIONIO_ORE_ORDER_DIAGNOSTIC") != "1" {
|
||||||
|
t.Skip("set REGIONIO_ORE_ORDER_DIAGNOSTIC=1 to compare biome orders")
|
||||||
|
}
|
||||||
|
set := mustFeatureSet(t)
|
||||||
|
orders := map[string][]string{
|
||||||
|
"climate": append([]string(nil), possibleBiomeOrder()...),
|
||||||
|
"sorted": sortedBiomeNames(set),
|
||||||
|
"registry": registryBiomeOrder(),
|
||||||
|
}
|
||||||
|
for _, label := range []string{"climate", "registry", "sorted"} {
|
||||||
|
steps, err := set.FeatureSteps(orders[label])
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s order: %v", label, err)
|
||||||
|
}
|
||||||
|
for index, name := range steps[undergroundOresStage] {
|
||||||
|
placed := set.Placed[name]
|
||||||
|
if set.Configured[placed.Feature].Type == "minecraft:ore" {
|
||||||
|
t.Logf("%s %s=%d", label, name, index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortedBiomeNames(set *worldgen.FeatureSet) []string {
|
||||||
|
names := make([]string, 0, len(set.Biomes))
|
||||||
|
for name := range set.Biomes {
|
||||||
|
names = append(names, name)
|
||||||
|
}
|
||||||
|
sort.Strings(names)
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
func registryBiomeOrder() []string {
|
||||||
|
for _, synced := range registry.Synced() {
|
||||||
|
if synced.Name == "minecraft:worldgen/biome" {
|
||||||
|
return append([]string(nil), synced.Entries...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func localFeatureIndices(set *worldgen.FeatureSet, biomes []string, stage int, feature string) map[string]int {
|
func localFeatureIndices(set *worldgen.FeatureSet, biomes []string, stage int, feature string) map[string]int {
|
||||||
indices := make(map[string]int)
|
indices := make(map[string]int)
|
||||||
for _, biomeName := range biomes {
|
for _, biomeName := range biomes {
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,69 @@ func TestRegionOreFeatureIndexDiagnostic(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRegionOreBiomeOrderDiagnostic(t *testing.T) {
|
||||||
|
if os.Getenv("REGIONIO_ORE_ORDER_PARITY_DIAGNOSTIC") != "1" {
|
||||||
|
t.Skip("set REGIONIO_ORE_ORDER_PARITY_DIAGNOSTIC=1 to compare biome orders against the fixture")
|
||||||
|
}
|
||||||
|
fixtures, seed := loadOreFixtureChunks(t)
|
||||||
|
od, err := worldgen.LoadOverworldFinalDensity(seed)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
fluidPicker := worldgen.OverworldFluidPicker(od.SeaLevel)
|
||||||
|
veins := worldgen.NewOreVeinifier(od)
|
||||||
|
carver, err := worldgen.NewCarver(od, seed)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
initCarverReplaceable(carver.ReplaceableBlocks())
|
||||||
|
set := mustFeatureSet(t)
|
||||||
|
orders := map[string][]string{
|
||||||
|
"climate": possibleBiomeOrder(),
|
||||||
|
"registry": registryBiomeOrder(),
|
||||||
|
"sorted": sortedBiomeNames(set),
|
||||||
|
}
|
||||||
|
clayState, ok := nameToStateID("minecraft:clay", nil)
|
||||||
|
if !ok {
|
||||||
|
t.Fatal("minecraft:clay state missing")
|
||||||
|
}
|
||||||
|
for _, label := range []string{"climate", "registry", "sorted"} {
|
||||||
|
mismatches, clayMismatches := 0, 0
|
||||||
|
for _, fixture := range fixtures {
|
||||||
|
var chunks []*Chunk
|
||||||
|
for cx := fixture.x - 1; cx <= fixture.x+1; cx++ {
|
||||||
|
for cz := fixture.z - 1; cz <= fixture.z+1; cz++ {
|
||||||
|
chunks = append(chunks, generateVanillaWithoutDecoration(od, fluidPicker, veins, carver, seed, cx, cz))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
region, err := newDecorationRegion(chunks)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := region.setSource(fixture.x, fixture.z); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := region.placeScheduledOresWithOrder(seed, orders[label], 0); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
chunk := region.chunks[[2]int32{fixture.x, fixture.z}]
|
||||||
|
for index, want := range fixture.blocks {
|
||||||
|
y := MinY + index/(16*16)
|
||||||
|
column := index % (16 * 16)
|
||||||
|
z, x := column/16, column%16
|
||||||
|
got := chunk.GetBlock(x, y, z)
|
||||||
|
if got != want {
|
||||||
|
mismatches++
|
||||||
|
if got == clayState || want == clayState {
|
||||||
|
clayMismatches++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.Logf("%s biome order: block mismatches %d, clay mismatches %d", label, mismatches, clayMismatches)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type oreFixtureChunk struct {
|
type oreFixtureChunk struct {
|
||||||
x, z int32
|
x, z int32
|
||||||
blocks []uint16
|
blocks []uint16
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,22 @@ package world
|
||||||
import "regionio/internal/worldgen"
|
import "regionio/internal/worldgen"
|
||||||
|
|
||||||
func (r *decorationRegion) placeScheduledOres(seed int64) error {
|
func (r *decorationRegion) placeScheduledOres(seed int64) error {
|
||||||
return r.placeScheduledOresAtOffset(seed, 0)
|
return r.placeScheduledOresWithOrder(seed, possibleBiomeOrder(), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *decorationRegion) placeScheduledOresAtOffset(seed int64, featureIndexOffset int) error {
|
func (r *decorationRegion) placeScheduledOresAtOffset(seed int64, featureIndexOffset int) error {
|
||||||
|
return r.placeScheduledOresWithOrder(seed, possibleBiomeOrder(), featureIndexOffset)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *decorationRegion) placeScheduledOresWithOrder(seed int64, biomeOrder []string, featureIndexOffset int) error {
|
||||||
set, err := worldgen.LoadFeatureSet()
|
set, err := worldgen.LoadFeatureSet()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
schedule, err := r.scheduledFeatures(undergroundOresStage)
|
if err := r.ensureSourceNeighborhood(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
schedule, err := set.FeatureSchedule(biomeOrder, r.sourceBiomes(), undergroundOresStage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue