DEC-79 production decision
2:1 dimetric, preserving the shipped board
The grid advances 42px east/west and 21px south per axis. A logical tile occupies an 84×42 diamond; the terrain face remains the shipped 66×34 inset diamond. This choice avoids asset and input-coordinate churn.
Measured grid
Generator handoff surface
The solid diamonds are the drawn terrain faces; dotted outlines show logical tile bounds. Cyan marks the tile-centre prop anchor, parchment marks actor feet, and amber outlines show multi-tile footprints.
Runtime fallback proof
ImageBitmap cache
These code-owned fallback maps are rasterized once, cached as ImageBitmap objects, and drawn with smoothing disabled. Validated commissioned PNGs use the same cached-bitmap rule through the runtime index.
Non-negotiables
Asset acceptance rules
- Transparent PNG, nearest-neighbour scaling, no baked drop shadow.
- Northwest key light; darkest cast shadow falls southeast.
- Logical props register to tile centre. Node, building, and actor canvases use a bottom-centre ground contact at their measured renderer offsets.
- Multi-tile buildings declare width × depth in grid cells; their anchor is the footprint centre.
- Every prompt repeats the locked palette and cites two approved anchors from the same material family.
- States are blueprint, construction, active, disabled, and damaged. A missing state falls back through the contract ladder without blocking gameplay.
- Filename:
sprites/<family>/<id>__<state>__f<frame>.png; IDs use lowercase snake_case and two-digit frames.
Palette lock