Commit graph

110 commits

Author SHA1 Message Date
d08879c48d worldgen: embed the 48 underwater_ruin templates 2026-08-26 16:36:11 +03:00
264292d192 docs: ocean ruin ground truth from the (7,5) capture
The grid's ocean_ruins claim at chunk (7,5) matches a fresh vanilla
capture: one cold small brick_2 piece, COUNTERCLOCKWISE_90, template
position (112,50,80), integrity 0.8. Notes record the addPieces draw
order, the template arrays, and the two open mechanics for the port
(piece descent from y=90 to the ocean floor, integrity draw order).
2026-08-26 16:33:07 +03:00
e0623be504 world: place template air, flood connected pockets, age stairs and slabs
The portal's air pocket is placed for real now: vanilla's fluid ticks
then flood every pocket cell connected to surrounding water while
sealed cells stay air, so the piece ends with a bounded BFS over its
own air cells from water neighbours. BlockAgeProcessor gains the
stairs/slab branches with their property-preserving mossy variants,
and horizontal facings rotate with the piece (mirror first, then
quarter turns).

Portal box match against the fixture jumps from 52.7% to 84.1%;
region parity rises to 98.047% with biomes and heightmaps exact.
Remaining box diffs trace to drip columns reading the shared decoration
stream, which is approximated per-cell.
2026-08-26 15:51:03 +03:00
39092b2cc1 worldgen: fix stale clockwise-90 assertion to the target-172 formula 2026-08-26 15:27:49 +03:00
120531c13d 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.
2026-08-26 15:26:42 +03:00
0bb480279f world: drop temporary verification probe 2026-08-26 14:42:39 +03:00
90eb08f37d world: ruined portal stub matches vanilla's saved start bit-for-bit
Three fixes close the loop against the captured region file: the giant
roll precedes the template draw, surfaceY is the topmost non-air block
(getHeight already returns one past it), and structure biome refs
resolve through has_structure/ tags to the extracted tag files. The
weighted variant pick walks a fresh per-attempt GenerationContext
stream while failed entries drop from the pick stream without reseeding.

TestRuinedPortalStubMatchesVanillaStart pins chunk (1,0) to vanilla's
own saved start: portal_6, CLOCKWISE_90, mirror NONE, air pocket,
template position (16,12,0) — and asserts the neighbouring fixture
chunks stay portal-free.
2026-08-26 14:42:18 +03:00
798a3ec7b4 world: port ruined portal generation point and expose pre-carve terrain
generateBaseTerrain now factors the noise+surface stage out of chunk
generation so structure placement can read pre-carve heights exactly
like vanilla's STRUCTURE_STARTS stage. RuinedPortalGenerationPoint
replays the ruined_portals set: the weighted pick across all seven
variants on its own stream, each attempt's setup/template/rotation/
mirror draws on a fresh GenerationContext stream (makeRandom reseeds
per attempt, confirmed from bytecode), findSuitableY with corner-column
settle scan against those heights, and the post-draw 3D-biome filter at
quart-snapped coordinates.

Known gap, documented in STRUCTURE_NOTES.md: no variant is accepted in
the window around the fixture's portal yet while vanilla placed one;
the biome/surface inputs need a vanilla-side probe to bisect. Not wired
into the production replay until that closes.
2026-08-26 13:56:51 +03:00
6e04bd8bbc docs: ruined portal seeding chain and postProcess map 2026-08-26 11:41:23 +03:00
482654bf7a worldgen: load structure templates and transform them like vanilla
LoadResolvedTemplate parses the extracted .nbt files with every palette
entry resolved to concrete state IDs through an injected resolver, and
TransformBlockPos reproduces StructureTemplate.transform's mirror-then-
rotate order around the pivot, including all three quarter-turn cases
read off the bytecode. MthGetSeed gives processors their per-block
positional Legacy stream. Verified against the real ruined_portal
templates: every block lands inside the declared size for all eight
mirror/rotation combinations.
2026-08-26 11:40:23 +03:00
3eaa9d834e docs: structure port notes from the jar bytecode
Captures the decoded placement grid, the four legacy frequency reducers,
the full ruined-portal findGenerationPoint and findSuitableY algorithms
with their exact draw order, the template name arrays, and the fixture
marker coordinates that pin the grid to vanilla. This is the working map
for the piece-placement ports that follow.
2026-08-26 10:39:28 +03:00
c488ce274f worldgen: parse structure sets and place them on the vanilla grid
Loads the 26.1.2 structure datapack: 20 structure sets, 34 structure
definitions, and the worldgen biome tags they reference. Random-spread
placement follows RandomSpreadStructurePlacement byte for byte — region
floorDiv by spacing, one Legacy stream salted per region, two
spread-type draws for the offset — and the four legacy frequency
reducers keep their exact draws, including the hardcoded buried-treasure
salt and the outpost's discarded full-range int.

Verified against the fixture: on seed 12345 the ruined_portals set
claims exactly chunk (1,0), the chunk whose captured blocks carry the
ruined portal's obsidian, gold, and crying obsidian. TestStructure-
PlacementGrid pins that plus village separation invariants.
2026-08-26 10:33:10 +03:00
f162698302 docs: monster rooms replayed; lakes and structure sets named next 2026-08-26 02:51:15 +03:00
790d7e3144 world: replay stage-3 monster rooms
Ports MonsterRoomFeature from bytecode with vanilla draw order and loop
structure: shell validation (solid floor and ceiling, one to five open
side columns), interior cave_air carving, cobblestone walls with the
mossy three-in-four floor roll drawn only where vanilla draws it, chest
placement faced away from its single opaque neighbour with the loot-seed
long consumed even though block entities are not modelled yet, and the
spawner's one-draw mob pick. Writes go through Feature.safeSetBlock
semantics against #minecraft:features_cannot_replace, captured verbatim
from the jar into the embedded datapack data.

The pass slots between geodes and the ores so the rooms' cave_air
pockets exist before ore ellipsoids roll their air-exposure discards.
The committed fixture's four chunks happen to contain no dungeons, so
measured parity holds at 98.028%, but the generator's output can differ
elsewhere: generatorVersion bumps to 22.
2026-08-26 02:49:33 +03:00
9454da3ab3 ci: run the whole verify suite on the self-hosted windows runner
All three jobs move to [self-hosted, windows]. The race job now adds the
machine-wide MSYS2 mingw64 toolchain to GITHUB_PATH: the runner service
account only sees the machine PATH, which has no C compiler, so -race
could not build its cgo runtime. The dead verify.yml.selfrun file goes
away — GitHub never reads that suffix and its content already lives
here.
2026-08-26 02:27:10 +03:00
0f3e592957
Rename verify.yml.bck to verify.yml 2026-08-26 02:13:45 +03:00
38c620295a
Add self-run workflow for verification 2026-08-26 02:13:33 +03:00
9c7f02662f docs: attribute the residual parity gap to unreplayed pre-ore stages
The featureless capture settles what the 98.028% gap is made of: base
terrain is bit-exact, so the drift comes from air-writing features
(monster rooms, geode voids, lava lakes) that vanilla runs before the
ores and the region replay does not cover yet. Both files now point at
monster rooms as the next step instead of at carver and aquifer edges.
2026-08-26 02:06:45 +03:00
f0a7cf815d world: prove undecorated base terrain bit-exact against vanilla
TestVanillaBaseTerrainParity compares our noise+surface+carver+aquifer+
vein pipeline against a vanilla capture whose biomes carry no features
and no structure sets: all 393,216 cells match. The plain-state fixture
mismatches the base-terrain diagnostic used to attribute to carver or
aquifer defects are therefore feature outputs wearing plain states —
monster-room cave_air, geode voids, lava-lake lava — and its doc comment
now says so.
2026-08-26 02:06:31 +03:00
f150d2e717
Update verify.yml 2026-08-26 02:05:56 +03:00
d3e645daf5 vanillacapture: capture featureless base terrain
-featureless derives a world datapack from the server jar (inner server
or bundler layout): every biome keeps its carvers but loses its feature
stages and every structure set loses its structures, so the capture is
pure noise terrain with surface rules, carvers, aquifers, and veins.
-blocks-only writes a blocks-only RIOBASE1 fixture for it. -port avoids
colliding with something else already listening on 25565.
2026-08-26 02:05:42 +03:00
4a9d4a7407
Add GitHub Actions workflow for code verification
This workflow defines jobs for verifying Go code, including building, vetting, and testing with race detection.
2026-08-26 02:00:06 +03:00
ee634ae830
Remove backup verify.yml file 2026-08-26 01:59:48 +03:00
808f2272ea
Update verify.yml 2026-08-26 01:58:12 +03:00
8d5cf5533b docs: sync fidelity status with the datapack feature replay
CLAUDE.md still claimed there was no placed/configured feature system and
that ores never generate below y=0; both stopped being true when the
stage-6 region replay landed. Document what the replay covers, which
decoration stays hand-written, the measured parity baseline, and the new
env-gated base-terrain diagnostic. README gains the same correction plus
the 966-cell base-terrain measurement.
2026-08-26 01:35:29 +03:00
524f5567cb world: add base-terrain mismatch classification diagnostic
Splits fixture mismatches into classes that name the responsible
subsystem: plain-vs-plain cells are direct base-terrain defects and come
with sample coordinates, single-side feature states count as flips per
family, and disk-shaped outputs land in an ambiguous bucket so they
cannot pollute the plain signal.

First run on seed 12345: 966 base cells (0.246%), dominated by vanilla-
carved cave segments missing from our carver output and deepslate-to-
water aquifer edges.
2026-08-26 01:31:08 +03:00
1f097de233 world: drop dead per-type feature replay wrappers
The combined stage-6 pass in placeScheduledUndergroundOresStage already
replays ores, underwater magma, and disks in datapack order; the separate
placeScheduledDisks and placeScheduledUnderwaterMagma passes have no
callers left. Keep the per-position helpers the combined pass and tests
use.
2026-08-26 01:30:57 +03:00
cca7b1d3f1 docs: refresh measured region replay parity 2026-08-25 10:24:20 +03:00
edf624e77b docs: describe region replay parity status 2026-08-25 10:24:20 +03:00
c4be38acdd world: publish decorated region batches 2026-08-25 10:24:19 +03:00
d8b5d0f79b world: replay datapack features across regions 2026-08-25 10:24:19 +03:00
f1d1d109f4 worldgen: parse configured feature definitions 2026-08-25 10:24:19 +03:00
fd32c65da9 worldgen: add vanilla biome search and decoration RNG 2026-08-25 10:24:19 +03:00
736f387b41 chore: ignore local development artifacts 2026-08-25 10:24:19 +03:00
40bdd1b755
Update README.md 2026-08-21 22:21:51 +03:00
b8c57be2f7 Add vanilla base batch generator 2026-08-18 01:43:55 +03:00
9a38622747 Test batch cache persistence 2026-08-18 01:34:36 +03:00
d804dc11f1 Coalesce overlapping chunk batches 2026-08-18 01:24:20 +03:00
3f0f1f70b9 Publish generated chunk batches 2026-08-18 00:58:12 +03:00
cdee55b613 Document current worldgen status 2026-08-18 00:46:09 +03:00
641da0e078 Bound placed ore verification 2026-08-17 22:52:59 +03:00
56a1a5f8d6 Bound tree stage verification 2026-08-17 22:28:55 +03:00
a2ee6f6a8f Measure single-chunk ore transition 2026-08-17 22:12:49 +03:00
798016b055 Preserve lazy feature placement RNG 2026-08-17 18:29:10 +03:00
aeb7e4d2c2 Keep race world tests within timeout 2026-08-17 18:05:13 +03:00
d2e89a03fe Capture feature seed vectors 2026-08-17 14:39:18 +03:00
2cf6ab4775 Preserve trapezoid height plateaus 2026-08-17 14:16:34 +03:00
4fa0a5e554 Match very biased height sampling 2026-08-17 10:56:05 +03:00
8e73993adf Measure per-feature ore parity 2026-08-17 10:18:18 +03:00
a24ffb98f3 Compare ore feature biome orders 2026-08-17 01:47:10 +03:00