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).
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.
Every figure is now its current 2D frame on one flat quad, the shader's
alpha discard cutting the silhouette. It still faces south and leans by
the camera's pitch, so it reads face-on at every tilt as before.
Removes the contoured slab and the carved visual-hull models --
lib/VoxelModels.lua, tools/build_voxels.py and ~70 generated files under
assets/voxels/ (2 MB). A sprite is a drawing, not an object seen from one
side: Gen 1's overworld figures are 16x16 icons with a fixed front-on
reading, and solidifying one invents a body the artist never drew. Those
files were also the one place this mod carried a description of the ROM
art, since a carve records a sprite's silhouette pixel for pixel.
The card needs no pixel access, and the solid draw, the sun pass and the
player's occlusion silhouette now share one mesh -- which the inverted
depth test the silhouette uses requires, since self-overlap would repaint
the figure on open ground. overrides/voxels/<name>.lua still wins where a
mod ships one.
The tower's twelve ROUTE_10 rows are `gabled_block_6x6` tile for tile --
the artist drew the top of the tower as an ordinary six-cell block -- so
that template matched at (24,132) and stood a whole second building
behind it. Templates were matched and stamped independently, with
nothing stopping two grids claiming one drawing.
Placement is now first-claim-wins: a template never stamps into cells
another already claimed, which makes the list order the priority order.
The tower's own two templates move to the front so they take those
cells first.
Also corrects the split: the Route 10 half is TWELVE rows, not eight --
the 64px purple roof band plus two window courses -- so topRows and the
claimOnly twin now carry all of it, and the model is the complete
twenty-row drawing (96px facade under a real 64px roof). Both templates
verified to place exactly once world-wide.
The mound probe gains a MOUND_LEVEL knob; the low rungs are where this
was visible.
The tower's drawing straddles the map boundary -- roof band and top
window courses in Route 10's last rows, the rest in Lavender -- so each
map folded its half upright alone: two half-buildings, Lavender's under
a fabricated yellow cap.
Buildings templates gain `topRows`: drawing rows composited ABOVE the
matched grid, for a drawing no single map holds. The model is built
from the complete 16-row artwork (96px facade under the real 32px
purple band) while placement still matches only the on-map rows; depth
now derives from the matched footprint rather than sprite height,
identical for every whole-drawing template. A `claimOnly` twin template
claims Route 10's roof rows and stamps nothing, so the top half no
longer also stands as its own building. Both templates verified to
place exactly once, world-wide, at the intended coordinates.
Adds `when_above` conditional pins, resolved per position in
TileShape.at: one graphic can mean two things (the gates' $32 is both
wall base course and counter front), and a flat pin has to pick one.
Gates get half-height counters and level walls.
Pokemon Tower gains a buildings entry -- it is the drawing the map edge
cuts off, sealed on the north -- and the Indigo Plateau statues are
built like the gym statues.
Fixes: grass stands one full-height clump per tile instead of two
half-cut stubs at different depths; ledge pillars drop to ledge height;
a prop only rides furniture when its own cell is blocked (chairs were
being lifted onto tables); and the caves had water and rock pinned
backwards, which stood the Seafoam sea up as rock and cut trenches
through Mt Moon. No cave tile is below the datum now.