Commit Graph

40 Commits

Author SHA1 Message Date
DramaticShape 458a1d7bf9 Merge pull request #4 from DramaticShape/3d-battle-mod
3d battle mod
1.1.0
2026-07-28 13:38:39 -04:00
DramaticShape 5781c28b60 added FULL menu option for voxel mod 2026-07-28 13:37:19 -04:00
DramaticShape 6280cdffe7 Added overworld battles 2026-07-28 13:01:38 -04:00
DramaticShape acc66b51bb Merge pull request #3 from DramaticShape/20260726_various_fixes
20260726 various fixes
2026-07-27 11:19:36 -04:00
DramaticShape d464751cee probe comment no longer spells out the ROM cache path
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.
2026-07-27 11:17:31 -04:00
DramaticShape 894a4b4a55 Merge pull request #2 from DramaticShape/20260726_various_fixes
20260726 various fixes
2026-07-27 11:13:57 -04:00
DramaticShape 6d7e1c51ae gym entrance mat lies flat; fence posts never ride a support
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.
2026-07-27 11:08:59 -04:00
DramaticShape 56a32f1c43 console class: a machine on furniture, without the furniture's edging
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).
2026-07-27 10:49:43 -04:00
DramaticShape 8b73cbd54d keep the block-edit hook in the mod, not in the engine
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.
2026-07-27 10:44:00 -04:00
DramaticShape d229622b09 conditional pins must not mark the shared class shape authored
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.
2026-07-27 10:35:06 -04:00
DramaticShape 326c595336 characters are flat sprite cards; drop the voxelized sprite path
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.
2026-07-27 10:31:22 -04:00
DramaticShape 2a4269b20e Merge pull request #1 from DramaticShape/20260726_various_fixes
20260726 various fixes
1.0.6
2026-07-27 04:58:07 -04:00
DramaticShape 2ff518a6d1 stop a second tower stamping behind the Pokemon Tower
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.
2026-07-27 04:52:52 -04:00
DramaticShape 0b8730fbf6 rejoin the Pokemon Tower across the LAVENDER_TOWN / ROUTE_10 seam
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.
2026-07-27 04:39:27 -04:00
DramaticShape cf25f54352 add a building-placement probe, with its own caveat
Prints the building models built and the tiles objects claimed. The
comment carries the trap it cost me: Buildings.stats() is the module's
memoisation cache, global and cumulative for the session, so it reads
as "a foreign building stamped here" when nothing of the sort happened.
Match template grids offline against maps.lua instead -- and remember a
drawing can straddle a map boundary, as the Pokemon Tower's does.
2026-07-27 04:21:19 -04:00
DramaticShape 89b6c8513f 1.0.6: conditional pins, Pokemon Tower, plateau statues, cave elevation
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.
2026-07-27 03:54:33 -04:00
DramaticShape 7f41f323f5 one standing clump per grass tile; ledge pillars at ledge height
Grass: each 8x8 tile is one whole clump, so it stands as ONE full-height
slab at its own depth. The first cut split every tile again into its top
and bottom four art rows and stood those at two different depths, which
cut each blade in half -- two 4px stubs 4px apart rather than a tuft.
A cell's 2x2 tiles still stand independently, so the player walks
between the north and south rows.

Ledges: $34 is the cliff slope's foot AND the pillar between hop-down
segments. Pinned `wall` with the rest of the slope chain it stood 16px
beside a 6px lip, breaking the ledge line with blocks nearly three times
its height. At ledge height the run reads continuous, and the Diglett
mound is unchanged -- its foot row reads as the talus it is drawn as.
2026-07-27 03:06:27 -04:00
DramaticShape be02443e97 Merge branch 'worktree-viridian-forest' into 20260726_various_fixes
# Conflicts:
#	data/voxel_heights.lua
2026-07-27 02:57:30 -04:00
DramaticShape 0ba9109e40 1.0.5: furnish every remaining interior
Extends the shape profile from ten tilesets to twenty-three -- 1,190
pinned tiles over ~130 maps -- surveyed against the standard the
finished interiors set: one 16px wall band carrying its built-ins,
half-cell counters, bookcase-collapsed shelving, thin-pool plant
standees, objects riding the furniture they are drawn above.

The recurring failures were rooms sunk into ponds by the three
stale-cache water ids (collision is per cell, so one trapped tile sank
its neighbours too), counters and cave edges towering to 32-48px,
racks fusing into deep monoliths, and anything in a walkable cell --
stools, tables, staircases, gravestone arches -- vanishing into the
floor.

Also fixes the door fold overwriting profile pins: it replaced the
resolved shape unconditionally, so stair pins on tiles their tileset
lists in doorTiles (Celadon Mansion, Pokemon Mansion 3F) silently did
nothing.
2026-07-27 02:24:05 -04:00
DramaticShape 5712f854b5 one tall hull per forest tree; project stump ring faces onto round tops
The trees' 2x2-cell drawings unfolded onto the ground as quarter-hull
pancakes -- each tree read as cut in half. The carver is now parametric
over its canvas: a `canopy` anchor tile carves the whole 2x2-cell
drawing as ONE 32px hull, and stamps carry their footprint radius. The
stumps' drawn tops are a cut face, not body: the `stump` class builds
the hull from the bark rows and projects the ring ellipse across the
round flat top, near arc south (stump_cap = the ellipse's drawn rows).
2026-07-27 01:43:08 -04:00
DramaticShape d94b4dcf75 grow Viridian Forest real trees, stumps and signs
The forest was raw detector output: ragged mixed-height tree boxes
with 0px rim collars, stump rows fused into crate walls, and signs
broken by the $32 water-fallback trap. Every tile of the tree drawing
and the stumps now takes the per-cell voxel hull the border forest
wears (a tree's four quarter-hulls tile into one lumpy canopy), signs
take the signpost slab, and the white filler is flat ground.
2026-07-27 01:30:40 -04:00
DramaticShape 7b727aa684 furnish the Poke Marts to the finished interiors' standard
The MART tileset shares the Center's atlas but not its pins, so marts
were raw detector output: 32px walls, the racks fused into one deep
monolith, the clerk booth a 48px slab. Pinned like the references --
16px wall band with the built-in cases, bookcase-collapsed racks,
half-cell counter with the poster on top, register standing on it.
2026-07-27 01:01:10 -04:00
DramaticShape c8a432ee86 changelog: the trim-foot repeat fix 2026-07-27 00:43:46 -04:00
DramaticShape cbcffeea08 read repeats through a one-row trim foot: no more cliff fins
The volume repeat scan anchors at a column's front tile; a plateau
column ending in a rounded corner tile ($13/$35) never matched and
read its whole capped extent -- 48px fins and tents out of the 16px
mesas on Routes 3 and 4. When the two rows directly above the front
are identical, the column is that repeat wearing a trim foot: unit is
one course plus the trim. Doorway columns still answer to their
region first.
2026-07-27 00:43:18 -04:00
DramaticShape da0fc49176 level the cliff mounds: pin the east slope chain, region-adopt doorways
The cliff drawing's dark east slope ($02/$24/$34) broke the repeat scan
at its corners and rose to 32px towers; a folded doorway column read
its own drawn extent and towered a block over the 16px mound around
Diglett's Cave. The slope chain is pinned to one 16px course, and a
doorway column now takes height AND top from its region: roofed among
drawn facades (houses), flat among flat repeats (the mound). Adds the
voxel_mound_probe driver that prints per-column detector decisions.
2026-07-27 00:37:56 -04:00
DramaticShape 5a94dfe85a keep edge-row buildings' eave overhangs across the seam
A body-anchored building's eave juts frontEave voxels past the map
boundary; the neighbour-body mask read that overhang as a ring scrap
and opened the roof rim into the sky from across the seam. Building
placements only scan the body, so their quads now carry an `own` flag
the edge keep-rules never touch.
2026-07-27 00:21:52 -04:00
DramaticShape 0bc3d3f14d Merge branch 'worktree-dramatic-shape-water-facades' into 20260726_various_fixes
# Conflicts:
#	CHANGELOG.md
2026-07-27 00:12:18 -04:00
DramaticShape dcf078c2e0 1.0.4: flower/bush/statue/trash-can billboards, in-place mesh refresh
Flowers stand as 1px animated cutouts on their own pulled mesh (own-cell
flowers hide behind the walker, the cell south still overdraws feet).
Cuttable bushes, gym statues (single-block plinth) and Lt. Surge's trash
cans stand as 5-voxel prop cutouts; prop_ground names the tile painted
beneath. Block edits refresh meshes in place instead of blinking to 2D.
2026-07-27 00:11:06 -04:00
DramaticShape cd3c4300ae fix shoreline slits beside claimed tiles and dropped edge-row facades
Two voxel-mode holes, both in ChunkMesher's keep/emit rules:

1. A tile claimed by a standing object (building footprint, sign
   standee, pond bushes) painted only its flat synthesized ground and
   never emitted side faces, so beside recessed water the 2px step was
   an open slit into the sky. The skip branch now emits the same
   below-ground side bands ordinary ground does, cut from the
   synthesized ground's art.

2. A profiled building whose front row is the map's last tile row has
   its facade exactly on the shared boundary plane (Saffron's row
   houses seen from Route 6), where the strict overBody test and the
   closed neighbour mask dropped it. Outward-facing quads on the body's
   boundary planes are now kept, told apart from ring scraps -- the
   thing the mask exists to kill -- by their winding.
2026-07-27 00:00:48 -04:00
DramaticShape fdcd5f1fce fix flowers 2026-07-26 23:30:32 -04:00
DramaticShape 251bf85ba2 added player silhouette when passing in front of buildings 2026-07-26 22:57:10 -04:00
DramaticShape cec3d5e1ef fixed scaling issue on android 2026-07-26 21:30:28 -04:00
DramaticShape cc134a2a84 version to 1.0.1 with water fixes 2026-07-26 19:24:04 -04:00
DramaticShape 08246b03e5 fixed water not animating in red++ 2026-07-26 19:21:45 -04:00
DramaticShape 8de6c36a62 add gitignore 2026-07-26 18:25:47 -04:00
DramaticShape 39e855da34 update readme, mod card 2026-07-26 18:16:09 -04:00
DramaticShape 7046ead648 fix versioning, add sky blue on 75 degree tilt 2026-07-26 17:47:26 -04:00
DramaticShape ccc0105f3f fixed pallette transitioning errors 2026-07-26 17:22:56 -04:00
DramaticShape aa49898fd6 updated tests 2026-07-26 16:53:00 -04:00
DramaticShape 702d8049f0 initial commit 2026-07-26 16:43:53 -04:00