world: place ruined portal pieces into the region replay

PlaceRuinedPortalPiece runs the template through the decoded processor
stack — positional Legacy streams per cell drive the gold-to-air,
lava-to-magma, netherrack-to-magma and block-age mossiness rolls, the
features-cannot-replace guard skips protected cells, and template lava
stays when it lands in existing lava. Drip columns below the portal
draw from a documented approximation of the shared decoration stream;
spreadNetherrack is not needed for the underground setups.

The placement chain is now proven end to end: chunk (1,0) reproduces
vanilla's saved start (portal_6, CLOCKWISE_90, NONE, air pocket at
(16,12,0)) and the fixture parity ticks up to 98.033% with biomes and
heightmaps still exact. generatorVersion bumps to 23.
This commit is contained in:
Daniar Mannanov 2026-08-26 15:26:42 +03:00
parent 0bb480279f
commit 120531c13d
10 changed files with 366 additions and 14 deletions

View file

@ -123,7 +123,7 @@ func vanillaRegionGeneratorFromInputs(seed int64, od *worldgen.OverworldDensity,
if err != nil {
panic("world: creating decoration region: " + err.Error())
}
if err := region.replayScheduledOres(seed, targetX, targetZ); err != nil {
if err := region.replayScheduledOres(od, seed, targetX, targetZ); err != nil {
panic("world: replaying region ores: " + err.Error())
}
target := region.chunks[[2]int32{targetX, targetZ}]
@ -158,7 +158,7 @@ func vanillaRegionBatchGeneratorFromInputs(seed int64, od *worldgen.OverworldDen
if err != nil {
return nil, err
}
if err := region.replayScheduledOres(seed, cx, cz); err != nil {
if err := region.replayScheduledOres(od, seed, cx, cz); err != nil {
return nil, err
}
target := region.chunks[[2]int32{cx, cz}]
@ -192,3 +192,4 @@ func classifyColumnAtSurface(c *Chunk, x, z int) (top int, grass bool) {
}
return classifyColumn(&column)
}