Sprites & Character Models
World props are painted sprite cells. People and creatures are parametric box models that the client bakes into facing sheets. Both ship through the same asset publish.
Sprite sheets
Each animation frame is its own PNG. A sheet YAML names the cells and modes (idle, lit, unlit, grow_*, and so on). Cell size is 32, 64, or 128. The client draws with nearest-neighbor filtering. Technical rules for the image model — transparency, camera, palette — are in Gfx sprite art.
the sprite generator stamps the content files into every Gemini or OpenRouter request, then strips the backdrop and scales the subject into the cell. content editor World → Gfx sprites reviews sheets. World → Terrain forge builds seamless ground tiles, including a text-to-decal path on the same image pipeline. World → LoRA studio trains style adapters from gold-marked sheets (a terrain style for terrain, a prop style for resources, items, containers, and buildings) and imports the results back into the sprite library.
Items, resource nodes, chests, buildings, and ground loot use tile_id sprite sheets. They do not use character models.
Character models
NPCs and the player hero are skeletons of colored boxes, not hand-drawn facing sets.
- Skeleton (
the content files) — body type: parts, palette slots, shape params. - Skin (
the content files) — one look: palette colors and shape multipliers. - Bind —
paperdoll_refon the NPC, or onthe content filesfor the hero.tile_idstays empty. The client does not fall back to a character PNG.
Parts stay hinged when they attach from an edge (stack_on, hang_under, and the other aligns). A fixed center does not keep joints glued when a skin changes length or bulk.
Poses are static snapshots. Animations are keyframed clips. A skin lists mode ids (walk, idle, …). Clips resolve as {skeleton_id}_{mode} first, then a clip whose id matches and whose skeleton matches. content editor authors this under Characters: Skeletons, Skins, Poses, Animations, and Bake camera.
Bake
The play client bakes every skin at startup and again when content republishes. The result is a runtime sheet paperdoll.<skin_id> with eight facings (sixteen under the flat or lit renderer when the skin asks for it). South on the compass is the character’s front. Missing bakes show a chevron until the sheet is ready. Finished atlases cache under ~/.flatland3/cache/paperdoll/, keyed by skeleton, skin, clips, camera, and style.
the content files sets the shared camera and default_style:
| Style | Look |
|---|---|
legacy |
Painter’s-order boxes, per-frame auto-fit |
flat |
True orthographic camera, shared pixels-per-meter, feet on one baseline, 1 px outline |
lit |
Flat, plus cel shading from a light direction, ambient, and ramp steps |
A skin may set bake.style to override the default. a server setting overrides the play client without editing content.
Installed clients receive skeletons, skins, and sprite sheets in the published asset pack. They do not ship that art inside the binary.