Update the fidelity notes for the aquifer

The gap list still said aquifers were absent and that the water condition used
sea level, and it did not mention deepslate never being placed -- which is the
loudest thing gendump prints now that the fluids are right.
This commit is contained in:
Master290 2026-07-27 02:06:45 +03:00
parent c10719cb78
commit e77fe3dc07

View file

@ -71,7 +71,8 @@ of guess anywhere.
``` ```
cmd/regionio/ entry point (flags, listener, graceful shutdown) cmd/regionio/ entry point (flags, listener, graceful shutdown)
cmd/gendump/ client-free generator diagnostics — biome spread, surface blocks, cmd/gendump/ client-free generator diagnostics — biome spread, surface blocks,
subsurface banding, deep-layer composition, bedrock band, cross-section subsurface banding, deep-layer composition, bedrock band, fluid census,
cross-section
cmd/genblocks/ generates internal/worldgen/generated_blocks.go from the block report cmd/genblocks/ generates internal/worldgen/generated_blocks.go from the block report
cmd/genlight/ legacy light-table generator, superseded by tools/VanillaLightDump.java cmd/genlight/ legacy light-table generator, superseded by tools/VanillaLightDump.java
tools/ Java dumpers run against the jar, plus their Go-side fixtures tools/ Java dumpers run against the jar, plus their Go-side fixtures
@ -81,7 +82,7 @@ internal/registry/ 28 embedded synced registries + tags, verbatim from vanilla
internal/world/ chunk model, wire encoder, cache + tickets, Anvil store, lighting, internal/world/ chunk model, wire encoder, cache + tickets, Anvil store, lighting,
the chunk generator itself (vanilla.go), decoration the chunk generator itself (vanilla.go), decoration
internal/worldgen/ the library: noise, density-function interpreter, surface rules, internal/worldgen/ the library: noise, density-function interpreter, surface rules,
climate/biome finder, embedded datapack under data/ aquifer, climate/biome finder, embedded datapack under data/
internal/network/ per-connection state machine internal/network/ per-connection state machine
internal/server/ shared core: config, sessions, status, profiles, entity loops internal/server/ shared core: config, sessions, status, profiles, entity loops
``` ```
@ -97,23 +98,38 @@ Bit-exact and parity-tested — treat as settled, change only with a vanilla ref
with trilinear interpolation, the climate/biome finder, and the chunk wire encoder with trilinear interpolation, the climate/biome finder, and the chunk wire encoder
(`TestGoldenAgainstVanilla` compares bytes against a real vanilla chunk). (`TestGoldenAgainstVanilla` compares bytes against a real vanilla chunk).
Ported from the decompiled source and checked by behaviour rather than by bytes — faithful as far as
we can tell, but no vanilla capture confirms them: the aquifer (`worldgen/aquifer.go`, the whole of
`Aquifer.NoiseBasedAquifer` bar `shouldScheduleFluidUpdate`), the surface-rule interpreter
(`worldgen/surface.go`), and the column pass in `world/vanilla.go` that mirrors `SurfaceSystem`.
The whole `noise_router` is parsed. `preliminary_surface_level` is reachable through
`od.PreliminarySurfaceLevelAt`, which quart-aligns and memoises across chunks the way `NoiseChunk`
does; the `vein_*` keys are parsed but nothing reads them yet.
Known gaps, roughly in order of how visible they are: Known gaps, roughly in order of how visible they are:
- **Aquifers are absent.** `vanilla.go` floods every air block below sea level with water, so every
cave below y=63 is solid water and there are no lava lakes. Vanilla resolves fluid per position
through `Aquifer.computeSubstance`; the datapack ships all four router keys (`barrier`,
`fluid_level_floodedness`, `fluid_level_spread`, `lava`) and they are not parsed.
- **`above_preliminary_surface` is wrong**, so there is no subsurface banding: every land column is - **`above_preliminary_surface` is wrong**, so there is no subsurface banding: every land column is
one grass block directly on stone, no dirt, no sandstone under sand. Vanilla is one grass block directly on stone, no dirt, no sandstone under sand. Vanilla is
`blockY >= preliminarySurfaceLevel + surfaceDepth - 8`; we compare against the actual top block, `blockY >= preliminarySurfaceLevel + surfaceDepth - 8` with the level bilinearly interpolated from
which gates the whole biome surface subtree to a single block per column. `gendump` prints this. the four corners of the 16-block cell; we compare against the actual top block, which gates the
whole biome surface subtree to a single block per column. `gendump` prints this. The router value
it needs is already available.
- **`surfaceDepth` is always 0.** Vanilla is `surfaceNoise*2.75 + 3 + rand*0.25`, so the dirt band is
three-ish blocks deep; ours is one. This is the other half of the missing banding, and it also
neuters every `add_surface_depth`/`surface_depth_multiplier` term in the rule tree.
- **Several surface-rule conditions are stubs**: `hole` is hardcoded false (vanilla is - **Several surface-rule conditions are stubs**: `hole` is hardcoded false (vanilla is
`surfaceDepth <= 0`), `steep` is never assigned, `water` uses sea level instead of the column's `surfaceDepth <= 0`), `steep` is never assigned, the `minecraft:surface` noise is a per-column
real water height, and 6 of the 7 `noise_threshold` noises are unsupported so calcite, ice, packed random draw rather than the real noise, `surface_secondary` is not sampled at all (so
ice, powder snow, swamp water and gravel patches never appear. `bandlands` is a 4-colour cycle `secondary_depth_range` is ignored), and 6 of the 7 `noise_threshold` noises are unsupported so
rather than the 192-band array. calcite, ice, packed ice, powder snow, swamp water and gravel patches never appear. `bandlands` is
- **No carvers and no ore veins.** Caves come only from the density router; `configured_carver` and a 4-colour cycle rather than the 192-band array.
the `vein_*` router keys are unimplemented. - **`vertical_gradient` ignores absolute anchors**, reading only `above_bottom`. The bedrock floor
works because its anchors are `above_bottom`; the deepslate rule's are `absolute` 0..8, so both
collapse to y=-64 and **no deepslate is ever placed**`gendump`'s deep-layer line reads
`deepslate=0` everywhere.
- **No carvers and no ore veins.** Caves come only from the density router; `configured_carver` is
not extracted and the `OreVeinifier` over the parsed `vein_*` keys is not written.
- **Decoration is hand-written heuristics**, not the vanilla feature system: oak trees only and - **Decoration is hand-written heuristics**, not the vanilla feature system: oak trees only and
without a biome check (so oaks grow in deserts), ores that cannot generate below y≈0 because they without a biome check (so oaks grow in deserts), ores that cannot generate below y≈0 because they
only replace stone and never deepslate, and no grass, flowers, lakes or springs. only replace stone and never deepslate, and no grass, flowers, lakes or springs.
@ -122,9 +138,17 @@ Known gaps, roughly in order of how visible they are:
`make verify` is the gate, but most generator defects are invisible to it — they show up as terrain `make verify` is the gate, but most generator defects are invisible to it — they show up as terrain
that looks wrong. `cmd/gendump` exists for that: biome distribution, top surface blocks, subsurface that looks wrong. `cmd/gendump` exists for that: biome distribution, top surface blocks, subsurface
banding, deep-layer composition, the bedrock band, and an ASCII cross-section, with no client banding, deep-layer composition, the bedrock band, the underground fluid census, and an ASCII
involved. Add an assertion to it whenever you fix a class of defect; the bedrock-band check is the cross-section, with no client involved. Add an assertion to it whenever you fix a class of defect;
model — it prints per-layer counts and fails loudly on any air or water in the floor. the bedrock-band check is the model — it prints per-layer counts and fails loudly on any air or
water in the floor. The fluid census is the same shape: it prints water as a share of the open
volume under inland chunks (3.8% now, 100% before the aquifer) and fails if caves flood again.
Anything gendump can assert on, prefer to also assert in a test — `TestCavesAreDry` and
`TestNoFluidUnderBedrock` in `internal/world` are gendump checks that run under `make verify`.
`go test -race` needs cgo and a C toolchain; on a Windows box without gcc, `make test-race` cannot
run at all.
`internal/world/vanilla_parity_test.go` compares surface heights against a capture from the official `internal/world/vanilla_parity_test.go` compares surface heights against a capture from the official
server and skips when the capture is absent. Note it reads a hardcoded `/tmp` path, so on Windows it server and skips when the capture is absent. Note it reads a hardcoded `/tmp` path, so on Windows it