MK301 greps .lua/.json bodies for the generated-tree paths, so the
comment explaining how to match a template offline read exactly like a
real load path. Nothing here ever opened that tree -- the probe walks
the live map through the engine -- so describe the tables instead and
point at tools/voxel-survey.md, which keeps the literal paths because
the gate exempts .md and .py.
The mat inside every gym door ($06 over $16, 28 placements and nowhere
else) is drawn from straight above, but $06 had been swept into the wall
band -- so the mat's top half stood as a 16px box in the doorway, and the
cell rule could not save it because a pin outranks the cell. Both halves
are now pinned ground.
And the `post` pool no longer takes the support lift. A post stands IN
the ground by definition rather than on top of something, but its cell is
blocked like any other post, so the blocked-cell test that separates
furniture-top props from floor seats cannot tell it apart. Pinning the
cliff slope chain gave posts along a cliff edge an authored box to their
south and hoisted them onto the clifftop.
The Poke Mart register shares its two tiles with the counter, which draws
a full-height black rule down each outer edge. Black always survives the
shade flood, so the billboard pool extruded those rules too and the
machine stood flanked by a pair of tall black slabs.
A white column separates them from the register body, so they are their
own connected components -- which is exactly what `cutout`'s one-object
contract drops. `cutout` is a single voxel though, and a register wants
body, so this adds `console`: the billboard treatment at ten voxels with
that same contract. It cannot be the default for the thick pools,
because a cluster there may legitimately hold several objects (two
stools side by side, a leaf beside a vase).
Cut, the tree regrowth on re-entry and the card-key door stamps all write
the block layer directly without emitting world.block_replaced, so
meshes derived from that layer went stale unannounced. An earlier cut of
this work made the engine announce each one -- the wrong place: it edits
the game for one mod's benefit, and every future path that writes a
block has to remember to do the same.
They all funnel through one choke point, so wrap Map:setBlock from the
mod instead. Map is a plain metatable shared by every instance, so this
covers paths written after this mod too. The write is read back rather
than trusted: setBlock ignores an out-of-bounds write, and a stamp that
rewrites a block with the value it already held is not an edit and must
not throw the mesh away.
src/world/OverworldController.lua is reverted to stock.
A `when_above` match returned shapes.classes[class] after setting
.authored on it -- but those canonical shapes are SHARED, and
shapes.classes.wall is the very object rule 4 hands every unauthored
solid tile. Marking it authored made all of them return early from
TileShape.at, skipping the cell rules, so walkable floors stopped
flattening: the gate houses came out as a checkerboard of raised blocks
with the room's floor standing 16px.
Conditional pins now resolve to their own authored shape per class,
built alongside the canonical ones and kept apart from them.