Art and audio direction

How Halvesper looks and sounds, and how a tiny team produces it with a fully AI-generated pipeline. Builds on 00-canon.md (HD hand-painted-look sprites, layered equipment, titans at nightfall, light against the dark, AI-generated art and audio). Supersedes the art, UI and audio sections of the retired docs/design.md (deleted from git), which were written for pixel art.

Names come from 01-world.md and 02-atlas.md; controls, hotbar counts and touch sizes come from 03-systems.md; this document draws them. 09-glossary.md lists who owns what.

What went wrong before, and what the mood tests show

docs/design.md produced a 16 px pixel-art frame: square tile terrain, lollipop trees, a flat purple gradient sky and two tiny people. Foster’s verdict was “a cheap little Terraria game, nothing unique original or cool”. The reasons, so we do not repeat them:

  1. The grid was visible. Every surface was a 16 px tile. Nothing broke the grid, so the world read as a voxel sandbox.
  2. Nothing was big. The largest thing on screen was a house. No scale, no awe.
  3. The theme was a color, not an image. “Dusk” was a purple sky gradient. Nothing in the frame was only possible in this world.
  4. Generic everything. Stock tree, stock brick, stock dirt. Any asset pack.

The two AI mood sheets (concepts/sheet-dusk.jpg, sheet-beast.jpg, quick renders, not targets) are useful mainly as a list of corrections:

Keep Fix
Warm lantern pools against a deep violet dusk (dusk sheet) Thick uniform black outlines and flat vector fills: the generic “cozy indie” look. The target is a painted look with colored, variable lines
A town that only exists on a creature’s back, with a ladder up its flank (beast sheet, bottom right) The titan is pet-sized. A titan is a mountain; a house on its back should be a crumb
Mossy shell, mist, distant holds on the horizon Blue noon sky (beast sheet). The sun never rises in this world; no midday, ever
Chibi heads, simple silhouettes Faceless blob characters. Faces carry the charm; they need eyes and expressions
Lanterns on posts and at ladder tops Blue glowing mushrooms. Cold cyan light is reserved for the Lampghosts (below); here it reads as “enemy”
Platforms built from square blocks: the Terraria grid again
Cartoon “cute turtle” face on a titan: titans are ancient and strange, not mascots

Key-art references for the chosen direction

The renders in img/ are AI references for mood, composition and color, not final art and not a style to copy stroke for stroke. They are much closer to the target than the mood sheets. What they share and get right: the half-sunk orange sun on the horizon, warm lantern light against a violet-blue dusk, tiny figures for scale, and holds built onto living backs. What they share and get wrong: a smooth airbrushed CG finish instead of visible painted brushwork, and titans that are still too small (barn- or hill-sized, not mountain-sized).

Mossback

Mossback. Right: moss on the shell, warm windows, a ladder up to the hold, people the size of a toe at its feet, the sun on the horizon. Wrong: the houses are a third of the shell’s height, so the tortoise is about four stories tall; at titan scale the hold is a whole town and a house is a crumb on the shell ridge. The hold is a cluster, not a town. The face is good: ancient and plain, not a mascot.

Greyhorn

Greyhorn. Right: the hold strapped on with saddle straps, buckles and bags (signature 5 in one image), forges glowing inside the buildings, canyon framing, ground lanterns. Wrong: horse-to-house scale again; no heartfire glow through the beast’s own body (its ribs or chest should burn faintly); the fur reads as a dark mass with no form.

Ystra

Ystra. Right: the best scale of the set (the scholars’ city is small on the hide), the cloud sea, white towers that suit mages, glyph markings on the hide. Wrong: the glyphs glow cold white-blue; if they are heartfire seams they must glow warm (cold light is the Lampghosts’). The finish is the most CG of the set: a 3D render, not a painting.

The Moth Queen

The Moth Queen. Fails (redo is decision D10 in 07-decisions.md). Her hold, Lampblack, is woven into her fur, and this bazaar sits on the ground under her. She is also tent-sized, a big bug, with no hold and no awe. Keep the cream wing glow, the strings of paper lanterns and the night palette for how she looks until level 68: Lampblack dusts her wings each Glow with warm wing-scale powder so they read cream from a distance. Redo: silk houses, rope stairs and hammocks woven into the fur of her thorax, lantern strings along her wing struts, the whole hold tilting with each wingbeat, seen from far enough away that she spans the sky. A second sheet shows her undusted, wings shining cold coldlight: the level-68 reveal (01-world.md §1.5).

The fallen titan

The fallen titan. Right: the body as terrain (ribs you could walk through), dying ember light inside the ribcage, Lampghosts crawling over it, ruins at the edges, one lantern for scale. Wrong: it is a humanoid skeleton. The fallen titan is Wend, a beast built like a heron crossed with a millipede, lying on its side with its eye open (01-world.md §4.5); regenerate it (decision D9). A beast’s skull, many jointed legs and rib-arches read as awe without grimness.

The classes

The four classes. Right: chibi proportions, every class carries or stands by a lantern, silhouettes read apart (helmet and shield, flowing hair and flame, hood and bow, cloak and hood). Wrong: the Shade’s dark face with pale eyes reads as a Lampghost and a borrowed look; the Shade wears a hood and mask with real colour instead (proposed: a deep plum or slate-teal hood with a stitched mask, the face visible above it); thick uniform black outlines and flat cel shading, the mobile-gacha look we are avoiding; front-facing poses (gameplay is three-quarter side view); the Warden’s weapon is a lantern staff, not a lantern-halberd; lanterns hang from nothing.

The Lampghosts

The Lampghosts. Right: familiar creature shapes (a wolf, a ghost, a knight, a slime), eerie and cute at once, which fits pillar 3 better than sharp, menacing shapes. Wrong: the black, empty bodies with big glowing round eyes read as another game’s shadow creatures, not ours (Foster, 2026-10-04); the eyes glow pale yellow-green; the purple slime is a normal purple monster, not a Lampghost. Keep the shapes, drop the black bodies and orb eyes: Lampghosts are coloured coldlight with small faces and a stolen ember inside (signature 4).

A gameplay map

A gameplay map. The closest to a real screen. Right: a titan silhouette walking in the far background, sagging wooden platforms with rope rails, ladders, lantern posts at platform ends lighting the walkable edges, foreground silhouettes at the screen corners. Wrong: the titan is too near and too small (it should span half the sky, fainter); the whole scene is a teal-green forest with no sun and no dusk, and teal is too close to the Lampghosts’ cold light; the purple-pink magic orb reads as a Lampghost; the characters are small flat cel figures with thick outlines; the hotbar is a generic frame.

Visual identity: five signatures

A screenshot is recognizable as Halvesper if it shows at least two of these. Every map must show at least two; every marketing shot shows three.

1. A titan in every sky

Every outdoor map has a titan somewhere in its parallax: the one carrying you, the one walking past on the horizon, or the dead one lying across the far hills. They are never shown whole and never in the gameplay layer. A titan’s leg fills a screen; its head is a hill. Scale comes from cropping, atmospheric fade and parallax speed (far layers at 0.03–0.08 of camera speed), and from tiny lit windows of a hold on its back. Each titan’s heartfire glows through seams in its body (between shell plates, along Greyhorn’s ribs, in Ystra’s gill slits, through the Moth Queen’s wing veins): the warmest light in any frame where it appears.

The titan in a hunting map’s background is in the place the server says it is. If Mossback is two regions east, it is a faint silhouette on the eastern horizon; if it is walking through, its feet come down in the mid layer and dust falls on the gameplay layer. The world map is never quite the same twice (pillar 1), and you can see that from any map.

2. The sun that will not set

One low sun, always on the western horizon (Lampward; it is how players navigate). Maps are laid out so west is screen-left or behind the scene. It is a big orange disc half-sunk into the horizon (as in every key-art reference), never higher. How much of it you see is the depth gauge of the world:

Depth Sun Sky above it
Ystra’s hold, above the clouds the largest, clearest disc, two-thirds visible, over a cloud sea gold to lavender
Other holds (on titans) half-sunk disc, wide gold-to-rose glow violet to rose; brightest skies in the game
First lands (Mossy Field) a third of the disc behind hills, amber glow deep violet
Middle lands a red sliver on the horizon indigo, first stars
Deep lands gone; a faint red smear behind haze near-black, Lampghost aurora

The disc is visible from any high or glare map (holds on titans, the Cloudshelf, the Sunfoot), and the sun does not move until Morrow’s birth (08-scale.md §1).

Every surface lit by the sun is lit from that side, low and raking: long shadows stretch away from it, rim light catches the sun-side edges. No noon light, no light from straight above, no blue daytime sky anywhere in the game.

3. Light pools are the composition

Below the holds, darkness is real. The scene is darkened by a per-map ambient level, and light sources carve readable areas out of it: player lanterns, heartfire braziers, glow fauna, Lampghost light. A party moving through a dark map is a moving bubble of warm light; a solo player’s radius is smaller. Map designers compose with light first: safe ledges are lit, ropes have a lantern hook at the top, danger sits at the edge of a pool. In holds the opposite holds: everything is warmly lit and the dark is only the sky.

Every Lanternbearer carries a lantern, always visible on the character (hip, hand, shield boss, staff tip or bow limb depending on class). It is the one piece of equipment every silhouette shares and it is a cosmetic slot.

4. The Lampghosts are made of stolen cold light

Everything in the world is painted in warm light, except the Lampghosts, which are made of the cold light they steal. A Lampghost creature is a coloured, semi-translucent body of coldlight (proposed): each kind has its own cool tint (sea-glass aqua, sea-green, frost blue, teal, violet, periwinkle; never black, never warm amber, which is the player’s fire), with soft inner gradients brighter at the core and edges that trail and fade into cold light, so the scene shows faintly through the thin parts. A thin lighter rim with a soft halo outside it draws the shape. Faces are real faces: small eyes and a mouth with expressions, so they read cute-eerie, never a blank void with glowing orbs. They “wear the shapes of what they consumed”: a Lampghost bat is the shape of a bat made of cold light. Eerie and cute at once, never gruesome.

What reads. This is a grind game: a Lampghost must read at a glance anywhere on a 1920x1080 screen, on dark ground and light. A flat black fill does not (it vanished on Mossy Field’s dusk ground); the tinted glow of the body, the rim and the halo carry the shape. Out of light (Shrouded) the body and halo dim, but the body stays dense enough to read and the rim stays strong: the dark changes how a Lampghost is hurt, not whether it can be seen.

The stolen ember (proposed). Every Lampghost carries a small warm spark of stolen fire visible inside its body: the one tell no other creature has (Cinderkin are made of fire; they do not hold a spark in a cold body). It is never a cut-out, never a teardrop or keyhole shape, and never centred in the chest as an emblem: it sits where the kind would hold something, the low belly, the throat or a tail tip (Puddling low belly, Mossnip and Thornpig belly, Dandlehop tail puff, Dimwing and Afternooner throat). It grows and brightens with how much fire the Lampghost holds and dims as you knock fire out of it: a Puddling’s is a firefly, the Herdmother’s a hearth, Wend’s Absence’s a buried sun. It stays clear of the face and visible in every pose (a point on the rig). At 48 px the ember is at least 3 px across.

Their light is cold (cyan-white to violet). Cold light means absence, not “enemy”: it also lights the Moth Queen’s true wings, the Stay’s caged farms, a Shade’s cracked lantern and Morrow’s veins. What marks a hostile Lampghost is the coloured coldlight body plus the stolen ember, not cyan alone. A screenshot with a small glowing creature of teal or violet light, a warm spark caught inside it, in a warm painted world is this game.

5. Holds that walk

Hold maps are built on a creature’s back and look it: buildings strapped and chained to shell plates, horn or blubber; rope bridges between moss ridges; the ground has texture that is clearly hide, shell or fur. The far background scrolls on its own, slowly, because the town is moving (2–6 ref px/s on the farthest layer, independent of the camera). Every 8–12 s a footfall: the whole scene bobs 2–3 ref px over 400 ms, hanging lanterns swing, dust sifts down, a low thud plays. Ystra’s hold bobs slower and rolls instead; the Moth Queen’s hold dips with each wingbeat.

Style rules

Shape language

Group Primary shapes Notes
Players, NPCs Circles and soft rounded rectangles Big round head, small body; hands are mitts with a thumb
Holds (architecture) Stacked domes, leaning timber, rounded roofs, rope curves Hand-built, slightly crooked; nothing ruler-straight
Natural monsters Rounded, bottom-heavy, readable from silhouette Cute first, a little odd second
Titans Huge simple masses with geological texture; plateau, ridge, cliff Read as landscape before they read as animal
Lampghosts Familiar creature shapes, rounded but wispy, trailing edges that fade into cold light; small eyes and a mouth Soft and glowing rather than flat or sharp; the faces carry the cute-eerie read
Heartfire, warm magic Sparks, curls and rings Light rises
Lampghost magic, darkness Spikes, inward spirals, falling streaks Dark sinks and pulls inward

Line

Layer Outer silhouette line Inner lines
Actors (players, monsters, NPCs) 3 ref px, tapered 1–1.5 ref px, broken where light hits
Gameplay surfaces (platforms, ropes, ladders, interactive props) 2 ref px on the top edge only 1 ref px or none
Back props (0.8 parallax) 1 ref px, low contrast none
Mid and far layers none none
Foreground silhouettes (>1.0 parallax) none; solid dark shapes, slightly blurred none

Rendering

Lighting model: painted light plus a light buffer, no normal maps

Option Verdict
Fully painted light, no runtime lights Cannot do signature 3: lanterns that move with players, light pools in dark maps
Godot PointLight2D per light Correct but per-light cost multiplies with every lit canvas item. 100+ player lanterns per map is not viable on web and mobile
Normal-mapped sprites with 2D lights Doubles generation and QA cost for every sprite (normal maps from AI are unreliable), looks plastic on chibi faces, still pays the per-light cost
Painted base + light buffer (chosen) Art carries its own form lighting. Runtime light is a separate low-resolution buffer composited over the scene

How it works: 1. A SubViewport at 1/4 of screen resolution draws soft additive light sprites (lantern pools, heartfire, spell glows, Lampghost glows) on top of the map’s ambient color. Each light is one textured quad, so 300 lights cost about what 300 particles cost. 2. The scene is multiplied by that buffer in a full-screen pass, then light sources themselves (flames, lantern glass, eyes) are drawn unlit on top with an additive bloom sprite. Only the UI is drawn after. 3. Per-map values: ambient color, ambient level (holds 0.9–1.0, first lands 0.7, middle 0.45, deep 0.25, boss arenas set by the boss), sun side, rim color. 4. A rim shader on actors samples their own alpha offset toward the sun side and adds a thin rim of the map’s rim color. In dark maps the rim comes from the nearest strong light instead (one direction per actor, updated at 10 Hz). 5. No shadow casting. Contact shadows are soft painted ellipses under actors. 6. A per-region color grade (a 3D LUT strip, 16³) is the last scene pass.

Light budget: unlimited soft lights in the buffer; at most 32 drawn per frame on mobile and web, prioritized as self, party, bosses and hazards, then nearest. Other players’ lanterns beyond that draw a small glow sprite only.

Value and color structure

Global anchor palette

These do not change by region.

Name Hex Use
Heartfire core #FFF4D6 hottest point of any warm light
Heartfire #FFC46B lantern glow, player light, warm UI accents
Ember #F28A3C sun band, warm rims, fire
Deep ember #B8452A fire shadows, Cinder Eye body
Coldlight core #E8FBFF hottest point of any cold (absence) light
Coldlight #7FE3F0 Lampghost rims and halos, Lampghost telegraphs, other absence light
Lampghost violet #8E7BFF Lampghost aurora, deep Lampghost magic
Lampghost tints (proposed) per kind, cool hues only Lampghost bodies: each kind’s own coldlight tint (aqua, sea-green, frost blue, teal, violet, periwinkle), never black or amber
Line floor #120F1C darkest allowed line or shadow (no #000000)
Parchment #F3E6C8 UI text, paper, bone highlights
Danger #E0533F damage taken, enemy-only warnings
Heal #9CDB6A heals, buffs

Region palettes (three key regions plus the holds)

Each region defines sky, sun, terrain, foliage, accent and ambient. Hex values are the mid step of each ramp; the palette tool extends each ramp with one lighter and two darker steps.

Lantern Town, on Mossback (starting hold)

Role Hex
Sky top / mid / horizon #33305E / #7A4F7E / #F2A06A
Sun band #FFD38A
Shell stone light / shadow #8E8770 / #3E3C3A
Moss light / mid / dark #B5CF6A / #5E8A44 / #2F4A33
Timber / timber shadow #8A5A3A / #4A2F28
Roof tile / plaster #A8493A / #E8D3B0
Window glow #FFC46B
Ambient (shadow tint) #3A3F6B at 0.95
Accent brass #C99B4A

Mossy Field (first hunting land, below Mossback’s route)

Role Hex
Sky top / mid / horizon #2B2A55 / #61477A / #D9805E
Sun band #F2A65A
Grass light / mid / dark #8DB85A / #4F7A44 / #22382F
Soil / root #6B4A3A / #3B2A2A
Glow fauna (spores, moss-lamps) #D8F07A (chartreuse; never cyan)
Stone #6D6F78
Ambient #2F3466 at 0.7
Accent lantern posts #FFC46B, wildflowers #E58FA0

A deep land (Lowlight’s fens and the deep strata of late regions)

Role Hex
Sky top / mid / horizon #0E0C1C / #1D1733 / #4A1F2E
Sun gone; faint smear #6A2E3A behind haze
Rock light / mid / dark #4A4760 / #2A2838 / #15131F
Lampghost aurora #8E7BFF to #7FE3F0 bands, 20% opacity
Dead growth #5C5A4E
Ambient #151633 at 0.25
Accent heartfire braziers #FFC46B (the only warm light not carried by players)

The other holds (ambient 0.9–1.0, each with its own key accent)

Hold Key colors Signature
Brazenbrow (Greyhorn) basalt #3B3840, iron #6F6E78, forge #FF7A2E, soot #221E24, horn ivory #D8C9A6 Lit from below by forges; chimneys vent between the horns; sparks instead of fireflies
The Almanac (Ystra) cloud top #F4D9C4, sky #E9A27A to #8C6FA8, whale hide #5C6E8E, barnacle #B8B2A0, brass #C99B4A The brightest, airiest map in the game; the clearest sun disc; things float
Lampblack (the Moth Queen) night blue #151A3A, dusted wing glow #F5E6B8, true wing light #7FE3F0 to #E8FBFF (after the level-68 reveal), wing powder #C9A8E8, lantern red #E0533F, silk #7A2F5C Visited while she roosts in the Glow; lit by paper lanterns and her dusted wings’ cream glow; dust motes of wing powder in the air

Wend’s Fall (the dead titan, region 9): bone #CFC2A8, ash #5A5560, cooling heartfire veins #FF6A3D fading to #7A2A30. The only place where warm light is dying and the Lampghosts have moved into it.

Never

Resolution and scale

One reference frame

All sizes in this document are ref px: pixels at a 1920×1080 reference screen at zoom 1. The sim keeps its own units; 1 sim unit = 4 ref px. A tile is 8 units (game/sim/tiles.gd SIZE := 8), so 32 ref px; the player’s 12×22 collision box is 48×88 ref px, and today’s 480×270-unit view becomes a 1920×1080 frame, so the sim does not change. Collision moves from the tile grid to footholds (04-architecture.md §5.2); the tile survives only as a measuring unit and in the text test maps.

Quantity Sim units Ref px
Tile (measuring unit) 8 32
Player collision 12 × 22 48 × 88
Player art height (feet to top of hair, no hat) ~28 112
Jump height 44 176 (~1.6 character heights)
View at desktop zoom 480 × 270 1920 × 1080

A character is about 10% of screen height on desktop, close to MapleStory’s proportion, so a map shows enough to read platforms and other players.

Project settings

Per platform

Platform Visible gameplay area (ref px) Camera zoom Texture set
Desktop 1080p 1920 × 1080 1.0 1x
Desktop 1440p / 4K 1920 × 1080 1.0 (rendered at native) 2x for actors, UI, VFX, icons; environments 2x from the optional HD download, else 1x
Web (desktop browser) 1920 × 1080 1.0 1x everything; render resolution capped at 1080p, upscaled
Phone, landscape (19.5:9) ~1755 × 810 1.33 2x actors, UI, icons; 1x environments, VFX
Tablet (4:3) 1440 × 1080 1.0 as phone

Phones see about the same width as desktop and three quarters of the height, so a character renders about 150 physical px tall on a 1080-tall phone screen. Zoom is not competitive in PvE; if PvP is added, its maps lock zoom 1.0 on every platform.

Pixel density

Texture memory budget

Platform Per-map budget (VRAM, compressed) Notes
Desktop 384 MB BPTC / S3TC
Web 192 MB S3TC on desktop browsers, ETC2 on mobile browsers
Phone (≥ 4 GB RAM) 192 MB ASTC 4×4 for actors and UI, 6×6 for environments
Phone (< 4 GB RAM) 128 MB 1x actors, lower bake resolution for others (below)

Characters

Proportions

Skeletal cutout, not frame-by-frame

Frame-by-frame paper doll (MapleStory’s way) Cutout rig (chosen)
Cost of one new hat a sprite for every frame of every action (Maple-style sets run to hundreds of frames per item) 1–3 part images, generated once
Cost of one new top ~6–10 parts × every frame ~10 parts (front view + back view), generated once
New animation later redraw every item ever made for it key the rig once; every item works
Look crisp, hand-drawn punch risks “Flash puppet” stiffness unless animated well
Runtime cost one sprite per layer per frame; texture memory heavy ~12 baked parts per character; light
UGC later creators must make hundreds of frames creators fill a template

With 300+ gear pieces at launch and cosmetics forever after, frame-by-frame paper dolls would need tens of thousands of frames that all line up, which no image model can hold consistent. Cutout is the only option a tiny team can sustain, and it is the only one an AI pipeline can align automatically (see Characters: the hard part). We pay for it in animation craft:

First cut (look pass). The starter character is a side-view cutout cut from one Z-Image Turbo painting, dressed with a Klein edit, plus an armless Klein edit that gives the torso clean shoulders (tools/art/player/, prompts and seeds in player.json). Fifteen parts plus lantern, sword and bow props share one 512×256 atlas at 2x master. The rig draws every part from one node (game/render/player_view.gd) with poses keyed in code (player_art.gd), not Node2D bones and AnimationPlayer, so the paper-doll order stays one flat list; move the keys into AnimationPlayer data when animations are hand-authored. There is no back view yet, so climbing uses the side view.

Animation timing is data: each skill in the sim has windup, active and recovery ticks; the attack animation is retimed to fit them, with the impact key pose on the first active tick. Animation never drives gameplay.

Paper-doll layers and draw order

Back to front, facing right. The back arm and back leg are the character’s left side (away from camera).

# Layer Source slot Notes
1 Cape (back) cape verlet chain
2 Back hair hair long styles only
3 Weapon (when held in back hand or stowed) weapon
4 Back arm: upper, lower, hand body + top sleeve + gloves sleeve and glove baked onto the arm
5 Back leg: thigh, shin, foot body + bottom + shoes
6 Torso body + top + bottom waist overall/one-piece fills top and bottom
7 Front leg body + bottom + shoes
8 Belt / waist accessory cosmetic
9 Head base, ears body
10 Face: eyes, brows, mouth face (expression swap)
11 Face accessory, eye accessory accessories
12 Front hair hair trimmed by hat’s hair rule
13 Hat hat declares hair rule: none, top, full
14 Lantern (when on hip) lantern its light is in the light buffer, its glass is drawn unlit
15 Shield / offhand shield
16 Front arm: upper, lower, hand body + top sleeve + gloves
17 Weapon (held in front hand) weapon per-animation key decides layer 3 vs 17
18 Weapon smear / trail VFX

Climbing uses a back view of the same rig (head, torso, limbs from behind). Each hat, top, bottom, cape and hair includes back-view parts; shoes, gloves and faces do not need them (hidden or shared).

Hair rule: each hairstyle ships full, under_hat (cropped at the crown) and back_only variants; the hat’s rule picks one.

Combining gear without combinatorial art cost

  1. Cosmetic override per slot. Every slot has an equip item and an optional cosmetic item; the cosmetic’s parts render, the equip item’s stats apply.
  2. Dye regions instead of recolors. Gear is stored in value with up to three dye regions stored in the R, G and B channels of a mask. A gradient map per region gives tiers and dyes from one generation (e.g. a tier-3 helmet is the tier-1 helmet plus a new trim part and a different gradient). Target: one generated base yields 3–5 shipped items.
  3. Runtime bake. When a character’s look changes, a one-off pass composites each body part with everything on it (arm + sleeve + glove, dyed) into a per-character atlas: about 12 parts in one texture. The rig then draws one texture per character, so characters batch, no per-part shader runs per frame, and dye is free at runtime.
  4. Equipment icons are renders. Each gear item’s icon is rendered from its own parts on a mannequin pose with a fixed light; no separately painted icon.

Animation list (player)

Durations at 1x speed. Combat timings are defaults; skill data overrides them.

Action Loop Duration Key poses Notes
Idle yes 1.6 s 3 breathing, lantern sway; blink swap every 3–6 s
Idle (combat ready) yes 1.2 s 3 weapon raised
Walk yes 0.6 s cycle 6 90 px/s sim walk = 360 ref px/s; feet must not slide
Jump rise no until apex 2
Fall yes 0.4 s 2
Land no 0.12 s 1 squash
Prone / crouch yes 1.0 s 2 hitbox change comes from sim
Climb rope (back view) yes 0.5 s 4
Climb ladder (back view) yes 0.5 s 4
Sit (chair or ground) yes 2.0 s 2 chairs are cosmetic items with their own pose key
Hurt no 0.25 s 1 + flash
Downed (lantern out) no 1.2 s 3 character slumps, lantern gutters to a spark; no corpse
Revive no 0.8 s 3 lantern relights
Swing, one-handed (×3 variants) no 0.45 s 3 windup, impact, follow-through + smear
Swing, two-handed (×2) no 0.6 s 3
Stab (×2) no 0.4 s 3
Shoot bow no 0.5 s 3 draw, release, recover
Throw no 0.4 s 3 Shade
Cast forward no 0.5 s 3 Kindler
Cast up / channel yes 0.8 s 2
Shield raise / guard yes 0.6 s 2 Warden
Slam no 0.7 s 4
Dash no 0.25 s 2
Lantern raise no 0.6 s 3 universal “light” action
Emotes (×12 face swaps) — 2.0 s — face only; body stays in current action
Social emotes (wave, cheer, bow, dance ×2) mixed 1–4 s 3–8
Level up no 1.5 s 3 plus VFX

About 30 body animations at launch, each keyed once on the rig. Class advancements add skill poses by reusing these with new VFX, not new animations; budget 4 new animations per advancement at most.

Monsters, bosses and titans

Size classes

Class Height (ref px) Screen share Rig Examples
Small 48–96 < 9% 4–8 parts Puddling, Dimwing
Medium 96–160 9–15% 8–14 parts Afternooner (player-sized)
Large 160–260 15–24% 12–20 parts elites, region brutes
Field boss 300–700 30–65% 20–40 parts one per region
Dungeon / raid boss 500–1600 may exceed the screen; arena built around it 30–60 parts, Polygon2D skinning allowed the Cinder Choir, the Second Noon
Titan thousands of px never whole parallax layers Mossback, Greyhorn, Ystra, the Moth Queen, Wend

Monsters use the same cutout tech as players with fewer parts. Bosses alone may use Polygon2D skinning (one or two on screen, not 150).

The existing slime, cave bat and skeleton are regenerated under these rules as the Puddling, Dimwing and Afternooner (02-atlas.md); a first single-sprite pass of all three (per-kind tinted translucent body, face, rim and an ember scaled by held fire in game/render/lampghost.gdshader) is in the game, waiting on the cutout rig. The Cinder Eye becomes a field-boss-class creature drawn as a warm fire that wrongly hungers for lanterns: it is the one enemy that uses heartfire colors, which is exactly what makes it unsettling.

Natural versus Lampghosts

How titans are drawn

Boss telegraph language

Every telegraph is coded three ways: shape, color and sound.

Shape Meaning Lead time
A line drawn along a foothold beam or charge along that path 800 ms
A ring that closes on a spot eruption at that spot when it closes 1000 ms
A dome or column of light from above falling strike 1000 ms
Chevrons on the floor charge direction 600 ms
Edge vignette from one side of the screen screen-wide attack from that side; move off-side 1500 ms
Safe zones lit warm (a heartfire pool) stand here duration of the attack

Environments

Layer stack (per map)

Z Layer Parallax Content
0 Sky 0 gradient, sun band, stars, Lampghost aurora
1 Titan far 0.03–0.08 titan silhouettes at their world positions
2 Far terrain 0.1–0.2 mountains, distant holds
3 Mid terrain 0.3–0.5 forests, cliffs, titan legs during passes
4 Back props 0.7–0.9 houses, trees, ruins behind the play space
5 Gameplay 1.0 platforms, ropes, ladders, portals, interactables
6 Actors 1.0 monsters, NPCs, players (own player last)
7 Front props 1.0 grass tufts, signs that overlap feet
8 Foreground 1.15–1.4 dark silhouettes of leaves, chains, roots at the screen edges
9 Weather and motes various fireflies, ash, spores, wing powder, dust
10 Light buffer composite — see lighting
11 Color grade — per-region LUT
12 UI —

Foreground silhouettes cover at most 15% of the screen and never a walkable edge or an actor’s hitbox at standard zoom.

Map kits

Collision is footholds: line segments the designer draws (04-architecture.md §5.2). Art is never a grid:

Standable surfaces

Anything drawn in the play plane that looks like a surface is standable on its visible top. A prop that is not standable must read as background or offer no flat top:

Portals are drawn at every portal’s feet as a slowly turning, breathing swirl of lantern light (kit/portal, added onto the scene, game/render/portal_view.gd). The sim widens every trigger to at least Zone.PORTAL_REACH (40 units) around its centre, so maps need no edit, and Up takes a portal as E does (03 §2).

Authoring

  1. A designer draws footholds, walls and climbables in the Godot map plugin (addons/mapkit).
  2. The designer dresses it with the region kit: surface strips are placed automatically along footholds (an auto-dresser picks variants and caps, seeded per map so it is stable), then props and decals by hand.
  3. Lights, parallax layers, sun side, ambient level and titan anchor points are set in a per-map resource.
  4. The map saves to the data-only map format the platform uses (see docs/platform.md), so creators can later dress maps with the same kits.
  5. Review: grayscale test, a phone-zoom screenshot, and a light-off screenshot (ambient 0.25) to check that walkable edges are still visible.

Target: a hunting map takes a designer 1–2 days to dress once its kit exists.

Built so far (look pass, town kit, Mossway maps). Lantern Town and the Mossway’s Mossy Field, Footprint Ponds and Old Tollbridge use this stack. The sky gradient, sun band and disc are drawn in code from the region palettes; the titan, far and mid layers, foreground silhouettes, props and kit pieces are painted locally with Z-Image Turbo by tools/art/world.py (prompts, seeds and crops in tools/art/world.json, only the finished PNGs are committed under assets/world/). game/render/ground.gd dresses the footholds with no extra map fields:

Layers fade into each other: a layer may carry a mist that hazes its base into the layer in front, so no band has a hard bottom edge, and every looping layer is wider than a 1920 ref px frame so it never repeats on screen. In a hold the near layers are the hold itself: the town’s titan layer is Mossback’s head far ahead, behind it the shell’s dome with the upper rings (town/dome, parallax 0.12, not looping), and nearer a terrace ring of upright houses on shell plates (town/mid). Fields keep the titan walking on the horizon. The town’s far layer drifts 4 ref px/s and the scene bobs 3 ref px every 10 s. The light overlay treats the sky around the sun as a light, so a Dusk map dims the ground but not the sun. Per-map values live in game/render/looks.gd until mapkit sets them. The tile rows in *.art.json are retired as art (still loaded, ids append-only). Still to do: strip variants and sag, chains as their own kind, more Rim props (stalls, NPCs), weather and motes, the actor rim shader and the LUT grade.

UI and UX art

Style

UI is the “lantern-glass” look: panels of deep dusk translucency (#1B1A33 at 88%) with a thin brass frame (#C99B4A), warm parchment text, rounded corners of 12 ref px, and a soft inner glow along the top edge as if lit from above by a lantern. Windows have painted brass corner pieces (9-slice). No Godot default theme anywhere, no flat gray, no hard drop shadows.

Typography (all SIL Open Font License)

Use Font Size at 1x desktop
Titles, map names, banners Fraunces (variable; soft “wonky” serif) 28–64
UI body, menus, tooltips, chat Nunito (rounded sans) 16 (min 13)
Damage numbers, level, counters Lilita One (chunky display) 22–44
CJK and other scripts Noto Sans families match Nunito
Accessibility option for body text Atkinson Hyperlegible 16

All text has a 2 px outline in #120F1C at 70% or sits on a panel; nothing relies on a blur shadow. Fraunces and Nunito are variable fonts, whose overlapping outlines Godot’s MSDF breaks into stepped, notched edges, so they rasterize per size instead; the static Lilita One stays MSDF.

HUD layout, desktop

+--------------------------------------------------------------------+
| [minimap]                                     [quest tracker]      |
| [buffs]                                       [party frames]       |
|                                                                    |
|                         (gameplay)                                 |
|                                                                    |
| [chat: 6 lines, tabs]                                              |
| [Lv 34 Name ][ HP ======== ][ Resolve === ] (lantern) [hotbars     |
|  ================ XP bar (full width) ==================  2 x 10 ] |
+--------------------------------------------------------------------+

HUD layout, mobile (landscape)

+--------------------------------------------------------------------+
| [HP/res/Lv] (lantern) [buffs]           [minimap] [menu]           |
| [quest: 1 line]                                                    |
|                                                                    |
|                           (gameplay)                               |
|  ( move   )                              [s1][s2][s3]  [ctx1]      |
|  ( stick  )                           [s4][s5][ ATTACK ][jump]     |
| [chat: 1 line, tap to open]           [s6]  [potion]  [ctx2]       |
+--------------------------------------------------------------------+

Iconography

Accessibility

VFX language

Light and dark families

Heartfire (players, holds) Lampghosts (enemies)
Motion rises, blooms outward, settles slowly sinks, pulls inward, snaps
Shapes sparks, circles, rings, petals, curls shards, spikes, spirals, thin arcs
Color white-gold core, amber, ember edges tinted coldlight body, cyan rim, violet haze
Blend additive alpha (translucent tinted body) plus additive rim
Particles embers and sparks drifting up specks drawn inward, falling streaks
End of effect lingering warm motes, 0.5–1 s collapses to a point, no residue

Class motifs

Class Motif Example
Warden arcs, shield plates, wards as geometric rings of light, lantern flares a halberd sweep leaves a gold crescent; taunt is a lantern flash
Kindler ribbons of fire, glyph circles, floating embers a fireball has a comet tail of petals
Ranger streaks, feathers, leaf trails, small trap-lanterns arrows leave a thin gold line that fades back to front
Shade ink cuts, smoke, afterimages; void-black with a warm edge a dash leaves three fading silhouettes rimmed in ember

Production rules

Damage numbers and hit feedback

Audio

Direction

Acoustic and warm in the holds, sparse and strange in the dark. Prompts ask for real acoustic instrument timbres, with ambient electronics only as texture below. No orchestral-epic default; the holds should sound like places people live.

Music by hold and region

Place Instrumentation Tempo / feel
Lantern Town (Mossback) nylon guitar, fiddle, hammered dulcimer, bassoon (Mossback’s low “breath”), hand percussion, accordion in the market 76–92 BPM, lilting 6/8
Brazenbrow (Greyhorn) low brass, anvil and metal percussion, frame drums, hurdy-gurdy drone, men’s choir hum 96–110 BPM, heavy 4/4
The Almanac (Ystra) harp, celesta, glass harmonica, women’s choir, bowed bass and waterphone for whale calls 60–72 BPM, 3/4, airy
Lampblack (the Moth Queen) clarinet, upright bass pizzicato, oud, brushes, muted trumpet, accordion 100–120 BPM, smoky night waltz and tango
First lands (Mossy Field) guitar and woodwind from Lantern Town, thinner, with marimba 90–100 BPM, bright with a minor turn
Middle lands fewer warm instruments, more drones, prepared piano, bowed cymbal 70–90 BPM
Deep lands almost no melody: bowed metal, sub drones, distant choir, a lone heartfire motif when a brazier is near free time
Wend’s Fall the titan motif with a missing note, played on low strings that never resolve slow
Bosses the region’s palette plus full percussion; Lampghost bosses add reversed material (below) 120–150 BPM

Leitmotifs

Adaptive music

Godot 4.3+ has AudioStreamSynchronized (vertical layers) and AudioStreamInteractive (clips with a transition table), enough without middleware.

SFX language

Family Material Character
Player and warm magic wood, cloth, brass, glass chime, fire crackle rounded transients, warm low-mids
Lampghosts reversed swells, airy hiss, glass breath, inhales sucking pre-transients, no low thump; hits on Lampghosts sound like breath leaving glass
Natural monsters squelch, chirp, clack cartoon, short
UI soft wood and paper clicks, brass latch for windows, a chime for loot by rarity quiet; rarity drops climb in pitch
Titans sub thud (30–60 Hz) plus a mid-band creak, debris and moss rustle always with a mid layer so phones hear it

Ambience

Each map has a 2-minute ambient bed plus 6–12 randomized one-shots (birds, creaks, distant Lampghost calls). Holds add the titan’s breathing: a 10–14 s rise and fall in the low end, synced to the visual footfall cycle. Crowd ambience is not faked in towns full of real players.

Voice

Barks and emotes only; no voiced dialogue at launch. - Players: 4 voice types (two higher, two lower), about 25 lines each (efforts, hurt, downed, level up, 8 emotes), in a short constructed gibberish language so nothing is localized. - NPCs: syllable “voice blips” per character, pitch and timbre set per NPC (Animal Crossing’s approach), plus named NPCs with 6–10 gibberish barks. - Bosses: 5–10 non-verbal vocalizations each.

Audio budget and tech

Item Desktop Web Mobile
Music format Ogg Vorbis 128 kbps stereo, streamed Ogg 96 kbps, downloaded per region on demand Ogg 96 kbps, per region on demand
SFX format WAV with QOA compression (Godot 4.3+), 44.1 kHz mono same, 32 kHz same, 32 kHz
Initial download (audio) — ≤ 12 MB (UI, core SFX, Lantern Town) ≤ 25 MB
Per region music pack ~15–20 MB ~12 MB ~12 MB
Simultaneous voices 64 32 32

As built (placeholder, D81–D82). tools/audio/synth.py synthesizes everything (seed 81): mus_lanterntown_day_explore (48 s loop, D major, lilting 6/8 at a dotted quarter of 80: nylon guitar arpeggios, hammered dulcimer and fiddle on the heartfire figure, bassoon in the B section, frame drum and shaker) and mus_mossway_day_explore (60 s, G major, 4/4 at 96: marimba, guitar and flute, thinner, with Cm and E♭ for the minor turn), Ogg Vorbis 44.1 kHz stereo; 15 SFX as 16-bit mono WAV at 32 kHz. Level-up and lantern relight play the heartfire figure (1-5-6) on dulcimer. client/sound_cues.gd maps each tick’s change in one’s own character to a cue (a swing per class, hit, hurt, down, a monster’s pop, pickup, level-up, portal, relight, gutter below a fifth, snuff) and each map to its theme; client/audio.gd plays them on Music, SFX and UI buses, crossfades themes over 2.5 s, clicks on every button, plays nothing headless and nothing on the web until the first input.

Production pipeline: fully AI-generated

Canon fixes it: every shipped image and sound is AI-generated, directed and curated by us. There are no commissioned artists or composers and no paint-over requirement. People here are art directors, curators and toolsmiths, not painters: they write the style bible and prompts, pick and reject outputs, train the style models, build the tools that cut, align and check assets, and key animations on the rig.

The danger of this choice is the look Foster rejected: generic, inconsistent, obviously generated. Consistency therefore comes from four things, in this order: 1. Templates. Anything that must fit something else (character parts, platform strips, icons, UI frames) is generated on a fixed template image with control conditioning, never free-form. 2. Our own style models. LoRAs trained only on outputs we approved. 3. Automated QA. Scripts reject anything off palette, off silhouette, misaligned or seamed before a person sees it. 4. Curation. A person approves every asset against the style bible; nothing ships unreviewed.

Machine and toolchain

One Apple M5 Max with 128 GB of unified memory (this Mac) runs the whole image pipeline locally with mflux 0.20 (MLX-native). A second Mac can be added for throughput; nothing needs a cloud GPU.

Only models whose licenses allow commercial use are on the production allow-list (tools/art/models.toml); CI rejects an asset whose provenance names a model off the list.

Job Tool (local unless noted) License Status
Base generation Z-Image Turbo (mflux-generate-z-image-turbo) Apache 2.0 proven for free generation (lanternfall, delve’s first monster sprites); ~18–19 s per 768×1024 image at 9 steps. Failed for gear in spike A (below)
Higher-fidelity generation Z-Image (base), Qwen-Image (mflux-generate-qwen) Apache 2.0 compare in spike A
Gear generation (primary) FLUX.2 Klein 4B edit (mflux-generate-flux2-edit): adds one item at a time to the fixed base mannequin Apache 2.0 spike A partial pass (2026-10-03): ~8–9 s per 768×1024 image at 4 steps; body held near pixel-identical
Pose / shape conditioning (environments, props, kit strips) Z-Image Turbo Fun ControlNet Union 2.1 (mflux-generate-z-image-controlnet): canny, depth, pose, MLSD, HED Apache 2.0 (model card, checked 2026-10-03) kit strips; spike D
Image editing (expressions, back views, variants) FLUX.2 Klein 4B edit (primary); Qwen-Image-Edit (mflux-generate-qwen-edit) as the alternative Apache 2.0 (both checked 2026-10-03) spike B: first look positive (2 samples)
Style LoRA training mflux-train on Z-Image / Z-Image Turbo, FLUX.2 Klein 4B or Qwen-Image; fallback AI-Toolkit or musubi-tuner Apache 2.0 base models spike C
Background removal BiRefNet (MIT); or generate on a flat key color and chroma-key (the existing game-sprite-chromakey skill) MIT proven (chroma key); BiRefNet quick check
Part segmentation SAM 2 (Apache 2.0) with point prompts from the rig template Apache 2.0 spike A
Depth for layer splitting Depth Anything V2 Small (run from Python or ONNX outside mflux) Apache 2.0 (Small only; Base and Large are CC BY-NC 4.0, checked 2026-10-03) spike D
Upscaling SeedVR2 3B/7B (mflux-upscale-seedvr2) Apache 2.0 quick check
Pose control images Drawn directly from our own rig: the rig renders its bone positions as an OpenPose-format skeleton image. No pose detector is involved, so no detector license applies ours with the mannequin
Pose detection (QA only: did a generated figure keep its pose?) RTMPose / DWPose through rtmlib rtmlib Apache 2.0; DWPose repo Apache 2.0; RTMPose weights from OpenMMLab (Apache 2.0). Confirm the weight files’ terms and training-data notes at pin optional

Excluded from production (non-commercial weights): FLUX.1 [dev] and everything built on it (dev-fill, dev-kontext, dev-redux, dev-depth, dev-controlnet-*, CatVTON on dev-fill, in-context LoRAs on dev), FLUX.2 Klein 9B, OpenPose (CMU academic non-commercial license; commercial use needs a separate CMU license), Apple Depth Pro (weights under the Apple ML Research license, research use only, which covers mflux’s mflux-save-depth) and Depth Anything V2 Base/Large (CC BY-NC 4.0). They may be used for internal exploration only, never for a shipped asset or a LoRA training set. Krea 2, Ernie-Image, Fibo, Ideogram 4 and others mflux ships stay off the list until someone reads their licenses.

Style bible and reference sets

Per-asset-type workflows

Asset type Workflow Automated QA
Sky and far parallax layers Generate wide panoramas (2:1–4:1) with wh-style-env; seamless horizontally by rolling 50% and regenerating the seam with img2img at low strength; downscale to 0.5x palette histogram vs region palette; value range within the layer’s band; seam delta
Mid and back layers Generate the full layered scene once, split it into bands with Depth Anything V2 Small, then regenerate the holes behind each band by img2img on the band with a masked-area fill; cut each band out with BiRefNet value band per layer; no hard alpha holes; horizontal tiling seam
Platform kits Generate strips on a template control image (strip silhouette + lip line, canny/depth ControlNet) at fixed 128/256/512 lengths; end caps and thin platforms likewise; tiling seams fixed by the roll-and-regenerate pass top-lip contrast (walkable edge visibility) ≥ threshold in grayscale; alpha matches template within 4 px; tiling seam
Props and decals Generate on a flat key color in batches from a prop list per region; cut out; light direction declared in prompt (sun side), mirrored versions made by flipping only when the prop is symmetric palette; silhouette-size band; light side check (brightness gradient direction)
Titans Per-titan subject LoRA from 20–40 curated images; generate far silhouettes, mid body parts (legs, head, tail as separate generations on part templates) and near pieces; heartfire seams added as an emissive mask generated from the luminance of a separate “glow only” pass identity similarity to the titan’s reference set; heartfire hue in the warm band; no cyan emissive except the Moth Queen’s undusted wing set and Morrow
Monsters Concept round (text only) → pick → generate the chosen design in a neutral side pose on a key color → SAM 2 cuts it into parts using points placed on the monster’s rig template → occluded areas behind each part regenerated with a masked fill → parts saved with pivots parts reassemble to the original within 2 px; joint seams in 6 test poses; silhouette readable at 48 px
Lampghost variants No new generation: a shader tints the creature’s painted pale body with the kind’s coldlight tint, rim and halo, and places the stolen ember from a per-rig ember point (sized and brightened by the fire it holds) ember visible, ≥ 3 px across at 48 px, clear of the face in all test poses; no black or void fill
Bosses As monsters, with more parts and a generated telegraph-pose variant per attack; Polygon2D meshes built by a script from the part alpha as monsters, plus readability of the wind-up pose at phone zoom
Item icons Generate on a fixed 3/4 composition template (centered object, top-left light) from the item database: one prompt per item from its name, type and tier keywords silhouette contrast at 32 px; fills 60–85% of the frame; palette; no text
Equipment icons Rendered from the item’s own parts on the mannequin (no generation) —
Skill icons Generate the inner painting on a round template; the brass rim and class motif frame are fixed assets warm/cold temperature matches the skill’s element
UI Generate 9-slice frame sets (corners, edges, centers) on layout templates at 2x, then cut by script; buttons, bars and slot frames likewise; layout and text stay in Godot themes; fonts stay OFL 9-slice seams; contrast of text areas (WCAG AA 4.5:1 for body text on panels)
VFX Generate single-frame textures (smoke puffs, sparks, glyph rings, slashes, light petals) and animate them in Godot with shaders and particles; flipbooks from a video model only if spike E proves it particle and overdraw budgets per platform
Key art and store Free generation with the style LoRAs at high resolution, upscaled with SeedVR2 curator only

Characters: the hard part

Characters must be consistent across ~1,000 gear items and every one must line up on the same cutout rig in every pose. Free generation cannot do that, so the pipeline generates gear on our own rig, then cuts it apart with the rig’s own part map.

1. The canonical mannequin. A base body built once (curated generations on a rig-drawn skeleton + depth control from a hand-built proportion template, then locked, face included). It must stand in a true open A-pose: spike A showed that a base with arms touching the torso tears at the shoulders and hips when posed. It is rigged and stored as a canonical part atlas: each part (head, torso, upper arm, forearm, hand poses, thigh, shin, foot, for the front three-quarter view and the back view) has a fixed canvas size, a pivot, joint sockets with overlap margins, and an id color in a part map (an image where each pixel’s color says which part it belongs to).

2. The reference pose. Gear is generated on the mannequin in one reference pose: an open A-pose, three-quarter view, arms clear of the body, legs apart, so almost no part hides another. The pose renders to control images (rig skeleton, depth, silhouette line) and to the part map. A matching back-view reference pose exists for climbing.

3. Generating an item. For a slot (say a hat), the base mannequin render on a flat key color goes into FLUX.2 Klein 4B edit with an instruction (“add a dented iron helmet with a lantern crest”) and wh-style-char. One item per pass, always onto the same base, never stacking items. Qwen-Image-Edit is the fallback when Klein will not draw a given item. Then: - Envelope: each slot declares its envelope (the region where that slot’s pixels may appear, with room for brims, plumes and capes) in the slot definition, not as fixed image rows. Pixels changed outside the envelope are either rejected or, if they belong to another slot (Klein added trousers with armor in spike A), routed to that slot or the generation is redone. - Extract: chroma key the background, then a color-matched difference against the base render, then morphological cleanup. Spike A found this alone gives clean layers; BiRefNet matting is the fallback for soft edges (fur, plumes). - Split: the part map assigns each item pixel to a part (a sleeve’s pixels split into upper-arm and forearm pieces at the elbow socket). Pixels near a joint are written to both neighboring parts so joints overlap. - Fill: each part’s area hidden in the reference pose (the inside of a sleeve behind the torso edge) is completed by a masked regeneration on the part’s own canvas. - Back view: the same item generated on the back-view pose with the front result as an image reference (Qwen-Image-Edit or FLUX.2 Klein 4B edit), then extracted and split the same way. - Dye regions: colors clustered by hue into up to three regions; the item is stored as value plus an RGB region mask, so one generation yields its tiers and dyes. - Variants: tier variants (trim, studs, glow) by low-strength img2img on the extracted item with the same mask, not a fresh generation, so tiers share shape.

4. Faces, hair, hands. Face sets: one neutral face generated on the head template, then each of the 12 expressions made by instruction editing (“eyes closed, smiling”) with the face mask locked. Hair: generated on the head template in full, then under_hat and back_only made by masked edits of the same hair. Hand poses: five fixed templates, generated once per glove item.

5. Limb angle variants. Each limb’s 2–3 angle swaps (extended, bent, foreshortened) are separate reference poses with their own part maps; gear parts for those limbs are generated on them too. This is the most expensive part of an item and is limited to arms.

6. Automated QA, in order (fail = regenerate, no human time spent):

Check Pass rule
Alignment each part’s alpha bounding box within its canvas; joint sockets covered; offset from the template part ≤ 3 px at 1x
Silhouette item stays inside the slot envelope; hats do not cover the eyes unless flagged; total silhouette change at 48 px tall still reads as a person (IoU with base ≥ 0.75 except capes and large hats)
Seams the rig posed in 8 test poses (idle, walk extremes, attack windup and impact, climb, jump) is rendered; alpha gaps and edge discontinuities at joints flagged
Palette ΔE histogram against the item’s declared palette and the global rules (no cyan emissive, no pure black or white)
Line outer-edge darkness band present and of the right width
Style CLIP-style embedding distance to the wh-style-char reference set below a threshold (catches off-style drift)
Similarity not a near-duplicate of the competitor reference set (MapleStory, Terraria and other screenshots kept privately for this check only)

Survivors go to the curator as a contact sheet: the item on the mannequin in the 8 poses, dyed three ways, beside its tier siblings. Approve, reject with a reason (the reason is logged and feeds prompt fixes), or send back for a variant.

7. Animation. Animations are keyed on the rig by us in AnimationPlayer (or written as data by a script from pose references). AI pose references help; AI does not key cutout animation. This is about 30 player animations, done once.

Spike A result (2026-10-03, this Mac): PARTIAL.

Measured FLUX.2 Klein 4B edit Z-Image Turbo img2img
Speed (768×1024) ~8–9 s, 4 steps ~18–19 s, 9 steps
Body drift vs base (leg outline offset) median 1 px, p90 1–5 px on an ~870 px figure: ~0.1–0.6 px at 112 ref px, inside the ≤ 3 px rule median 2–6 px; invents a new face
Silhouette IoU vs base 0.94–0.98 0.84–0.91
Extraction (chroma key + color-matched diff + morphology) clean layers; re-dressing the base with them looked correct not usable
Identity in a back view and an expression (spike B) kept (2 samples) —

Passed: one-item-at-a-time editing onto a fixed body is the gear generator; Z-Image Turbo img2img is out for gear. Failed: the rig split. The base body was not in an open A-pose, so the walk and swing test poses tore at shoulders and hips; and fixed-row envelopes caught pixels from the wrong slot. Next, in order: (1) a true open A-pose mannequin with a locked face; (2) a drawn part map with joint sockets and overlap margins; (3) slot-defined envelopes; (4) 10 seeds each of a hat, a top and a cape through extraction, split and the 8-pose seam check. Pass: ≥ 1 of 10 per item survives the seam check with no hand-fixed pixels. If the split still tears, the fallback is generating each part on its own canvas with Klein, using the part’s silhouette as the reference, which aligns perfectly but risks style drift between parts.

Spike A3 result (2026-10-03, this Mac): PASS on the open mannequin. An open A-pose mannequin with a cutout rig, hidden socket discs under each joint and a separate pelvis part:

Measured Result
Joint tears in the 8-pose seam check 1 of 72 (was 15 of 72 on the closed-pose base)
Tops 10 of 10 usable once the prompt describes the legs as already wearing grey leggings, plus a hem clip at the waist
Hats, capes 10 of 10 usable
Cape motion a 3-bone cape chain with spring lag reads as cloth
12-frame walk loop works, but the front-facing mannequin reads sideways in a side-view game

Next: a side or three-quarter view mannequin, a tunic skirt chain for long tops, and a readability check at 1x (112 px) in the client.

Audio pipeline

All music, SFX, ambience and barks are generated. The audio direction above stands; these are the tools that produce it.

Need Option Where it runs License for game use Verdict
Music, local ACE-Step 1.5 local (fast on Apple silicon per its authors; verify) MIT (model card, checked 2026-10-03); authors say training data is licensed, royalty-free and synthetic primary; spike F
Music, commercial Suno Pro/Premier cloud commercial-use license while subscribed, but Suno’s terms say you are generally not the owner; Universal and Sony suits still open backup only; don’t use it for leitmotifs or anything we’d want to defend
Music, commercial ElevenLabs Music cloud trained on licensed data, but game use needs an Enterprise plan only if ACE-Step fails and Enterprise is affordable
SFX and ambience, local Stable Audio 3.0 Small SFX / Small / Medium local Stability Community License: free commercial use below $1M annual revenue (register), Enterprise above; trained on licensed and CC audio primary for SFX and ambience; spike G
SFX, commercial ElevenLabs Sound Effects cloud commercial license on paid plans backup and for hard-to-get sounds
Barks and NPC blips Chatterbox (MIT) or Kokoro (Apache 2.0) TTS with gibberish scripts; ElevenLabs voice design as a backup local / cloud permissive / paid-plan commercial spike H
Stem separation Demucs (MIT) local MIT proven tech

Music workflow. 1. Per cue, a written brief from the music table above (instrumentation, tempo, meter, key, mood) becomes the prompt; leitmotifs are written as short melodies in MIDI by us and rendered with a CC0 soundfont as a guide track. 2. ACE-Step generates candidates conditioned on the brief and, where it supports audio reference, the guide track, so the heartfire and titan motifs actually appear. 3. Stems: generate the explore layer, then generate the combat and danger layers as extensions/variations of the same piece (ACE-Step’s repaint and edit modes), or split one full mix with Demucs into layers. Spike F decides which holds sync better. 4. Lampghost versions are made by script: reverse, detune −30 to −50 cents, low-cut. No generation needed, which also makes them recognizably “the same tune, wrong”. 5. A loop tool finds bar-aligned loop points (beat tracking), crossfades, and checks seam loudness; cues are normalized to −16 LUFS (music) and fit the per-region download budget.

SFX workflow. A sound list generated from game data (every skill × windup, release, impact; every monster × attack, hurt, death; every surface × footsteps), batched prompts to Stable Audio, 6–10 candidates each, automatic trim, peak normalize, onset alignment (the transient lands at sample 0 for hits), duplicates rejected by spectral similarity. Telegraph sounds get a fixed rising template so they stay recognizable.

Spikes: F, can ACE-Step hold a leitmotif and produce layerable stems; G, are Stable Audio SFX punchy enough for hits (short transients are where generative audio is weakest); H, gibberish barks with emotional range.

Topic What applies What we do
Copyright in our assets US Copyright Office (Jan 2025): prompts alone do not make a human author; purely AI output is not copyrightable. Human selection and arrangement of material can be, and so are our code, game data, maps as designed, text and names Treat the art and audio as unprotected: anyone can rip and reuse a sprite and we likely cannot stop them with copyright. Protect what can be protected: register the Halvesper name and logo as trademarks, keep the game’s code, data, LoRAs, prompts and tools private (trade secrets), and use platform ToS and DMCA only for the parts that are ours (code, written lore, the compiled game)
Model licenses Z-Image, Z-Image Turbo ControlNet Union 2.1, Qwen-Image and Qwen-Image-Edit, FLUX.2 Klein 4B, SeedVR2, SAM 2, Depth Anything V2 Small, rtmlib: Apache 2.0. BiRefNet, Demucs, Chatterbox, ACE-Step 1.5: MIT. Kokoro: Apache 2.0. Fonts: SIL OFL. Non-commercial (excluded): FLUX.1 [dev] family, FLUX.2 Klein 9B, OpenPose, Apple Depth Pro, Depth Anything V2 Base/Large. Stable Audio 3.0: Stability Community License, free below $1M annual revenue. Suno: commercial use without ownership Allow-list in tools/art/models.toml; provenance on every asset; Stability Enterprise license budgeted before revenue passes $1M
Third-party claims A permissive model license covers the weights, not whether an output resembles someone’s work Similarity check against a competitor reference set; never name artists or games in prompts; reject anything that looks like a known character
Steam Disclosure required for pre-generated AI content that players see (art, audio, store page assets); internal tools exempt (rules rewritten 2026-01-16). Live-generated content would need its own guardrails; we have none at runtime Disclose plainly: “All art and audio are generated with AI models and curated by the team.”
Apple App Store No rule against pre-generated AI assets; the AI-specific guideline (5.1.2(i), Nov 2025) is about sending users’ personal data to AI services, which we don’t do. Normal IP rules (5.2) apply Provenance records ready for any IP dispute; credits screen states AI generation
Google Play The AI-Generated Content policy targets apps that generate content for users; an app that only ships pre-made AI assets is outside it Nothing beyond normal content rules
UGC Creators will upload their own AI art later Same similarity check in the review pipeline; platform doc owns the rest
Audience Some players and press dislike AI art on principle; awards can disqualify (the Indie Game Awards withdrew Clair Obscur’s wins in Dec 2025) Disclose up front, never deny it, don’t enter AI-excluding awards; the defense is quality and consistency, which the pipeline exists to deliver

Cleanup and assembly (all automated, curator approves)

  1. Generate N candidates from the template prompt and conditioning (N by asset type: 8 for icons, 20 for gear, 40 for key backgrounds).
  2. Automatic QA (the per-type checks above) drops failures; the reasons are logged.
  3. Cut, split, fill, dye-mask, downscale (Lanczos from the generation size to 2x, 1x, 0.5x), trim, pivot.
  4. Curator reviews contact sheets in a small web tool (approve / reject with reason / variant).
  5. Export with a provenance sidecar; approved outputs go into the next LoRA training pool if tagged “exemplary”.

Files, naming and atlasing

Kind Pattern Example
Body / gear part chr_<slot>_<item>_<part> chr_top_wardencoat01_sleeve_front_upper
Face swap chr_face_<set>_<expression> chr_face_round03_angry
Monster part mon_<id>_<part> mon_puddling_body
Environment piece env_<region>_<kit>_<piece>_<variant> env_mossyfield_surface_body256_b
Parallax layer bg_<region>_<layer>_<n> bg_lanterntown_far_1
Titan ttn_<titan>_<range>_<part> ttn_mossback_far_shell
Icon icon_<category>_<id> icon_potion_hp_small
VFX vfx_<family>_<name> vfx_kindler_ember_puff
UI ui_<kit>_<piece> ui_panel_corner_tl
Music / SFX mus_<place>_<cue>_<stem>, sfx_<family>_<name>_<n> mus_lanterntown_day_combat, sfx_hit_wood_03

Launch asset count, effort and throughput

Counts are unchanged by the production method. Curation minutes include reviewing contact sheets, rejecting, re-prompting and approving; rig and animation work is keyed by us. Generation compute is local and nearly free; it runs overnight.

Category Count Curation per asset Curation hours Notes
Base mannequin, 2 builds, back view, part atlas 1 — 60 plus tooling below
Player animations (keyed on the rig) ~30 3 h 90 not AI
Face sets (12 expressions each) 24 90 min 36
Hairstyles (3 variants each) 40 60 min 40
Gear bases (hat, top, bottom, shoes, gloves, cape, shield) 220 45 min 165
Gear tier/dye variants (→ ~600 items) 380 10 min 63
Weapons 120 20 min 40
Cosmetic pieces 120 45 min 90
Regular monsters (incl. rig and ~8 animations) 50 4 h 200
Lampghost variants 25 30 min 13 shader
Elites 15 5 h 75
Field and dungeon bosses 14 16 h 224
Raid boss 1 40 h 40
Titans (far, mid, near sets) 5 24 h 120
Region and hold kits 14 30 h 420
Strata extensions (2 per region) 20 10 h 200 reuse the region kit; deep extension, LUT, ambient beds
Deep pieces (layout from kits) 400 0.5 h 200 40 per region (08-scale.md §7); mostly map building, little new art
NPC unique pieces 25 1 h 25
Item icons 600 6 min 60
Skill icons 220 10 min 37
UI kit 1 60 h 60
VFX (textures + Godot authoring) 250 90 min 375 mostly effect authoring, not generation
Key art, store pages — — 40
Art curation total ≈ 2,650 h full 10-region scope; the launch scope (D1, regions 1–5) is about half
Music: ~35 cues with stems and loops 35 6 h 210
SFX ~600 10 min 100
Ambience beds 40 1 h 40
Barks and blips ~200 lines — 30
Audio mix and implementation — — 150
Audio total ≈ 530 h

Tooling build (once, before and during S1):

Tool Estimate
Mannequin, part atlas, part maps, reference-pose renders 3 weeks
Character generate → extract → split → fill → dye pipeline 5 weeks
QA suite (alignment, seams in 8 poses, palette, line, style, similarity) 3 weeks
Environment pipelines (panorama tiling, depth split, kit strips) 3 weeks
Icon, prop and UI batchers from game data 1.5 weeks
Curation web tool and provenance/CI checks 2 weeks
LoRA training loop (dataset export, train, A/B eval sheets) 1.5 weeks
Audio batcher, loop tool, stem pipeline 3 weeks
Total ≈ 22 weeks, about 880 h

Cost:

Line Estimate
Compute: ~40,000–80,000 generated images (about 20 candidates per approved asset) at roughly 5–15 s each on the M5 Max (S0 measures), plus 15–25 LoRA training runs and audio generation: about 300–600 machine-hours electricity, under $200; a second Mac (~$4–5k) only if overnight runs are not enough
Subscriptions: ElevenLabs paid plan for backup SFX (12 months) ~$1–1.2k
Stability Enterprise license $0 until revenue passes $1M a year
People: ~4,060 h (2,650 art + 530 audio + 880 tooling), done by us if paid contractors were used for curation at $30–50/h, ~$95k–$160k (tooling excluded)

Previously, with commissioned art, this was about $510k–$990k.

Throughput per curator-week (30 focused hours, tooling done):

Asset Per week
Gear bases ~40
Gear variants ~180
Item icons ~300
Monsters, rigged and animated ~7
Region kit ~1
Music cues with stems ~5
SFX ~180

With tooling done, the full 10-region art and audio is about 106 curator-weeks: about 12 months for two curators, 8 for three, and more than two years for Foster with agents alone. D1 launches with regions 1–5 (roughly 55–65 curator-weeks, shared tooling and characters included), curated by Foster with agents on the 14–16 month path in 06-roadmap.md; regions 6–10 are made for the Act updates. Region count stays the biggest lever if the schedule slips.

Art milestone plan

S0: pipeline spikes and style lock (4–6 weeks)

Spike Question Pass
A Can gear be generated onto a fixed body, extracted and split onto the rig? Pass (2026-10-03): Klein edit + extraction pass; on the open A-pose mannequin with socket discs and a pelvis part (A3) joint tears fell to 1/72 and hats, tops and capes were 10/10 usable. Open: side or 3/4 view mannequin, tunic skirt chain, 1x readability
B Do FLUX.2 Klein 4B / Qwen-Image-Edit edits keep identity for expressions and back views? First look positive (2 samples). Pass: 12 expressions of one face and back views of 5 items judged on-model
C Does mflux-train produce a usable style LoRA on this Mac, and how long does a run take? v1 LoRA from ~80 images measurably closer to the board (embedding distance) and preferred by Foster in a blind A/B
D Depth split (Depth Anything V2 Small) and fill for parallax layers one region’s 4-layer stack with no visible holes when scrolled
E Can any commercially licensed local video model make usable VFX flipbooks? if not, VFX stay procedural (already the plan)
F ACE-Step: leitmotif adherence and layerable stems the Lantern Town cue with explore/combat/danger stems that switch without seams and audibly carry the heartfire motif
G Stable Audio SFX punch 20 hit and impact sounds that hold up beside a reference library in a blind test
H Gibberish barks one player voice set with readable effort, hurt and joy

Also in S0: generate round 0, train style LoRA v1 and v2, lock the reference board, and redo the three style frames (Lantern Town on Mossback at true titan scale, Mossy Field with Mossback’s leg in the mid layer, a deep-land map with three light pools and Lampghosts) with the LoRA. Exit: Foster signs off that the frames are not generic, and the S0 blind test passes (10 people, ours next to MapleStory, Terraria and two cozy indie games; 8 of 10 describe ours without naming another game).

S1: pipeline proof (8–10 weeks)

The first deliverable proves the AI pipeline produces a playable slice at consistent quality, in the real engine, on all three platforms.

Deliverable Contents
One fully polished map “Mossback’s Flank” (placeholder): a hunting map below Lantern Town with Mossback in the background, a titan-pass event, a lit half and a dark half, ropes, ladders, one-way platforms, the full parallax stack, light buffer, LUT, weather
Two fully layered characters Warden and Shade on the mannequin, two body builds, 3 hairstyles, 2 face sets with all expressions, all ~30 animations
Three equipment sets three complete sets (hat, top, bottom, shoes, gloves, cape, weapon, shield or offhand), each wearable by both characters, each with two tiers and three dyes; dye and runtime bake working
Three monsters a natural small (the Shellmite), a Lampghost small (the Puddling, regenerated from the slime, with its stolen ember), and one Large elite with a telegraphed attack
HUD desktop and mobile layouts with the lantern gauge and class resource bar, inventory and equipment windows, damage numbers, boss bar, fonts installed
VFX 4 skills per class shown, hits, motes (release, carry, scatter, bank), deaths
Audio the map’s cue with three stems, Mossback’s motif, the heartfire motif, ~60 SFX, an ambience bed with titan breathing, one player voice set

What it must prove, with numbers:

Question Pass
Consistent Foster cannot pick out which of 20 mixed assets (gear, props, icons, monsters) came from which generation batch; every asset passes the style check
Recognizable The S0 blind test repeated with in-game screenshots, 8/10
Aligned All three gear sets pass the 8-pose seam check on both body builds, with no hand-fixed pixels
Gear is cheap One new hat, brief to in-game and dyed, in ≤ 45 curator minutes; one new top in ≤ 90
Pipeline yield QA pass rate and candidates per approved asset measured per type; the estimates above revised with real numbers
Readable on a phone Testers find their character, every monster and every edge within 1 s in the grayscale and dark-map screenshots on a 6.1” phone
Performs 150 geared characters in one map at 60 fps on desktop and web (2020 MacBook Air, Chrome) and at 30 fps minimum, 60 target, on an iPhone 12 and a 2023 mid-range Android; VRAM within budget
Cutout looks drawn, not puppeted Foster agrees attacks have punch; if not, add more angle swaps per action or revisit Spine before S2
Kits work A second map dressed from the same kit in ≤ 2 days
Sound fits Stems switch with combat without audible seams on web

S2 onward

Phase 1 art to make

What 06-roadmap.md’s Phase 1 build order still needs drawn, from the gaps in the asset catalog (generated from the repo by tools/art/catalog.py, published beside this bible; it shows what exists, its size, its footholds and who uses it, and flags anything unused). Generation is not part of this list. Sizes are sim units with ref px in brackets (1 unit = 4 ref px); masters are 2x, so a 28-unit character is a 224 px master cut from a 768×1024 generation, as today.

Prompt families. A prompt below is the subject slot only. The generator adds its family’s fixed blocks, which are the ones that worked in the look pass:

Family Generator and fixed blocks Key
W tools/art/world.py: world.json style (gouache, visible brushwork, desaturated, side view, no people) + key_prompt; haze, crop and fade per item cyan #00FFFF
N tools/art/monsters.py, style natural (side view profile, gouache, chunky rounded shapes, warm amber palette, dark warm outline) magenta
L tools/art/monsters.py, style lampghost (one pale glowing monochrome creature, rounded and wispy, with a small face), tinted by lampghost.gdshader; the ember point is a per-item field magenta
P tools/art/player/: a FLUX.2 Klein 4B edit of base, ending “Keep the exact same pose, body, head, face, hair, painting style and plain light grey background. Remove the ground shadow.” Each outfit is two edits, dressed and armless, as player.json does light grey
H player.json hand-prop block (chunky toy-like proportions, storybook gouache, thin warm brown linework, never black lines, top-front light) light grey
V Single-frame VFX texture, W’s style block without “desaturated”, centered on black for additive textures black, or magenta for anything cold

Rules that every row follows: side view profile, warm light from the sun side (left) on environments and neutral top-front on actors, the dusk palette of its region, no text, no cyan except absence (a cyan key would eat a coldlight edge, hence V’s magenta). Anything marked (proposed) is open in 07-decisions.md (D50–D55).

Classes: Ranger, Kindler, Shade

Asset Kind Size / scale Style notes Prompt
Ranger outfit P, cutout parts 28 u (112 px) figure, 15 parts + props in the 512×256 atlas Leaf-green and leaf-gold (Focus); hood down so the face reads; lantern on the bow’s lower limb (proposed, D52) Dress the character as a ranger: a short hooded cloak in mossy leaf green with a ragged leaf-cut hem, hood down on the shoulders, a fitted brown leather jerkin laced at the front, a leaf-gold scarf, a leather quiver of fletched arrows on the back, brown leggings tucked into soft leather boots
Kindler outfit P, cutout parts as Ranger Ember and soot (Heat); the glyph book hangs at the hip; lantern caged at the rod tip (proposed, D52) Dress the character as a young fire mage: a knee-length ember-orange wool robe with a soot-darkened hem and rolled sleeves, a wide brown leather belt with a small leather-bound book hanging from a short chain at the hip, a brass-buckled leather apron, fingerless gloves, brown boots
Shade outfit P, cutout parts as Ranger A coloured hood and mask over a real, lit face: plum violet cloak, wine-red mask, warm grey tunic, brass buckles; never a dark face, pale or orb eyes, black void or keyhole (Foster, 2026-10-04). The lantern at the hip takes one thin pale crack while Crack the Glass is on (cold light is allowed here, Value and color structure). As built: parts_shade.png and rig_shade.json, shade_dressed seed 1, shade_armless seed 3; arms cut by colour difference (arms_by_color) so they survive over the cloak Dress the character as a nimble rogue: a deep plum violet hooded cloak with the hood up framing the face, the face, cheeks and eyes stay clearly visible and lit, a soft wine red cloth mask pulled up over the nose and mouth, a fitted warm grey tunic with long sleeves, a brown leather belt with small pouches and warm brass buckles, dark brown leggings and soft brown leather boots
Bow, re-edit with lantern H (Klein edit of bow) 512×768 gen, in the atlas Keep the existing bow; add the lantern Hang a small round brass lantern with a warm amber flame from the bow’s lower limb by a short cord. Keep the bow, its shape, painting style and plain light grey background the same
Arrow H 512×128 gen, ~10 u (40 px) long in game Read as a line at speed: thin shaft, bright fletching a single short wooden arrow lying horizontal pointing right, small brass arrowhead, leaf-green fletching
Kindling-rod H 512×768 gen, ~18 u (72 px) The rod is the Kindler’s lantern pole a short stubby wooden kindling rod pointing straight up, chunky toy-like proportions, copper wire wrapped grip, a small brass cage at its tip holding a round lantern with a warm glowing amber flame
Glyph book H 512×512 gen, ~6 u (24 px) Glyphs are shapes, never letters a small thick leather-bound book seen from the side, closed, brass corners and a brass clasp, a warm glowing ring of abstract glyph shapes pressed into the cover
Shade dagger H, one in each hand 512×768 gen, ~8 u (32 px) Blued iron with a warm ember edge. As built: seed 4 a single short curved dagger pointing straight up, dark blued iron blade with a thin warm ember-orange edge sheen, dark leather wrapped grip, small brass pommel
Quickshot streak V 1024×128, stretched along the shot Ranger: “a thin gold line that fades back to front” a thin straight streak of warm golden light, bright white-gold head on the right fading to nothing on the left, a few tiny leaf-shaped sparks
Flare Arrow burst V 512×512, scaled to the 5-tile pool Heartfire family: blooms outward, settles slowly a soft round burst of warm amber light with petal-shaped rays and drifting ember sparks, white-gold core
Leaf trail (Vault, Split Shot) V 256×256, particle Leaf motif one small glowing golden leaf-shaped spark with a soft warm halo
Spark petal (Spark comet tail) V 256×256, particle “a comet tail of petals” one glowing curled flame petal, white-gold core, amber edge, soft glow
Glyph ring (Kindle, Flareburst) V 1024×1024, squashed flat in engine Kindler motif: glyph circles; abstract marks only a flat circle of thin warm golden lines seen from straight above, two concentric rings with abstract curling glyph marks between them, glowing amber
Ember puff (Blink) V 512×512, flipbook-free, dissolved by shader Rises, warm a small puff of warm smoke and rising embers, amber and ember orange, soft edges
Ink slash (Quick Cut, Shadow Fang) V on light grey 1024×512 Shade: deep violet ink with a warm edge, never black; paler while it deals Coldlight. As built: seed 3, drawn mirrored so it bows forward, x1.5 for Fan of Knives a crescent slash of thick deep violet ink, sharp at both tips, a thin ember-orange edge along its outer curve, flecks of ink
Afterimage smoke (Flicker) V on magenta 512×512 Three fading silhouettes rimmed in ember are drawn from the rig; this is the smoke between a soft drifting puff of near-black violet smoke with a faint warm ember rim
Crack (Crack the Glass) V on black, brightness as alpha 512×512, over the lantern glass The one friendly cold light: thin and small. As built: seed 4 a thin branching crack of pale cold white light, like a crack in glass, no glow beyond the crack lines
Skill icons, 12 Icon template (round, inner painting only; rim fixed) 64 px at 1x, 128 master Warm for Heartfire skills, cold only for Coldlight ones (Crack the Glass, Shadow Fang); one action each the inner painting of a round game skill icon, a single bold action in the center: (Ranger) an arrow loosed, a flare arrow bursting, a leaping vault, three arrows fanning; (Kindler) a homing spark, a pool of warm light, a blink of embers, a ring of flame; (Shade) twin quick cuts, a cracked lantern, a dash of smoke, a fang-shaped slash

As built for the Kindler (build.py --outfit kindler, tools/art/vfx.py): parts_kindler.png and rig_kindler.json re-painted on the base bones (a rod extra held like the sword, upright at rest, and a pelvis region of its own), with Spark petal, glyph ring and ember puff in assets/vfx/kindler/ as premultiplied alpha (premultiplied in vfx.json). The painted robe already carries a book pouch at the hip, and every glyph book seed put letter-like runes on its cover, so the glyph_book part is cut but not drawn (TODO: a re-roll without marks). The skill bar keeps drawn glyphs until the skill icons above are generated.

As built for the Ranger (tools/art/player/player.json outfits, build.py --outfit ranger, tools/art/vfx.json): parts_ranger.png and rig_ranger.json cut on the base bones, the bow re-edited with its lantern and the arrow as an outfit extra; the three V textures in assets/vfx/, drawn additively (game/render/enemy_view.gd), the leaf spark also marking a Waymarked monster. The hood stays up (owner, 2026-10-04: the “hood and bow” silhouette, as long as the face reads). The cloak hides the back upper arm, so that part is absent and skipped.

Lodge yard and its dummies

The Lodge yard (10-operations.md §4) is a small hold map built from the town kit and Lantern Town’s palette and layers; it needs only these.

Asset Kind Size / scale Style notes Prompt
Training dummy (D51, built) N, creature sprite 24 u (96 px) A friendly object, not a monster: no stolen ember, no eyes that read alive a straw and burlap training dummy on a wooden post, a blank faceless round sack head with no face and no eyes, a dented tin pot for a helmet, rope bindings, a wooden crossbar for arms
Archery butt (D51, built) N, creature sprite 20 u (80 px) The Ranger’s dummy; its rings are faded, not a bullseye graphic a round straw archery target on a wooden easel, painted rings in faded red and cream, a few arrows stuck in it
Drill shed (D51, built) W, def (roof foothold) 160 × 108 u (354 × 240 px) Gives the yard a dark corner where the Shade’s Gloom fills front side view of a small open-sided timber drill shed with a sloped plank roof on four posts, a weapon rack with wooden practice swords and staves at the back, flat bottom standing on the ground, warm light from the left

The Mossway: Dewline Hedgerows, Shellshed Slopes, the Soak

Asset Kind Size / scale Style notes Prompt
hedgerows/far W, layer, 0.5x 1536×640 gen, loops Mossy Field palette; hedge lines step to the horizon a continuous band of long parallel lines of tall dark hedges stepping away to the horizon across dusky meadows, runs off both edges of the frame, hazy deep violet and moss green
hedgerows/mid W, layer 2304×640 gen, loops Contrast within 35% of the sky a continuous wall of tall clipped hedges with gaps, dense round leaves, a few tiny amber dew glints, rim lit from the left by a low amber sun, deep violet green
hedgerows/hedge W, def: top and two branch shelves are footholds ~40 × 100 u (160 × 400 px) Every flat-looking ledge gets a foothold a tall narrow block of dense hedge seen from the side, flat mossy top, thick twisted branches poking out of both sides as small flat ledges, standing on the ground
kit/branch (proposed, D54) W, climbable kit, 64 px segments 512×1024 gen The Hedgerows’ “climbing through branches”; a third climbable look beside rope and ladder, which ground.gd must learn a single thick twisted vine branch growing straight and vertical through the whole frame, small leaves and knots as handholds, centered, narrow
slopes/far W, layer, 0.5x 1536×640 gen Mossback’s shell on the skyline (signature 1) a continuous band of long gentle slopes piled with huge shed tortoise shell plates, the domed shell of a colossal tortoise faint on the skyline, hazy violet and mauve
slopes/scute_a, _b, _c W, defs (curved top foothold) 64, 96 and 128 u wide (256–512 px) Shed scutes are the platforms; tan horn with moss in the growth rings one huge shed tortoise shell plate lying tilted on its edge, a thick curved horn plate with growth rings, weathered tan and grey-green, moss in its grooves, a broad gently curved top
soak/far W, layer, 0.5x 1536×640 gen West is toward the Glasslands: a glint of glass on the horizon a continuous band of flat boggy marsh with pools and reed beds stretching west, a faint warm glint of glass on the far horizon, hazy violet and olive
soak/mid W, layer 2304×640 gen a continuous line of reed beds and drowned willow stumps standing in still dark water, rim lit from the left by a low amber sun
soak/water W, def with over 1536×512 gen Like ponds/water, but peat-brown and opaque lower down side-scrolling cross-section of a shallow peat bog pool, a flat water surface line with amber sunset reflections, below it murky brown water fading to dark, reeds at the edges
kit/peat W, body texture 1024×1024 gen, seamless The Soak’s ground body seamless flat texture of dark wet peat mud with fibrous roots and moss, even lighting, fills the whole frame
soak/reeds, soak/sunk_lamp W, back props 16–24 u wide The sunk lamp is a dark Concord post leaning half under, its lantern out a clump of tall bog reeds and cattails; and separately: an old iron lamp post leaning half sunk in bog water, its lantern dark and empty
Teacup Puddling L 15 u (60 px) Same tint, face and ember as the Puddling; the cup is part of the silhouette a small wobbling droplet creature, a round bottom-heavy dome with a flat base, wearing an upturned teacup with a curled handle on its head like a hat
Tollkeeper L 30 u (120 px) An Afternooner kind of its own (02 §2.1) a small slender skeleton standing, chibi proportions with a big round head, a long faded toll-collector’s coat with big buttons and a peaked cap, holding a long pole with an unlit lantern hanging from its top
Puddle Mayor L, field boss 100 u (400 px) (proposed, D55) Splits into Puddlings, so it is the Puddling’s shape scaled up; its ember about a tenth of its height a huge wobbling droplet creature the size of a cottage, a round bottom-heavy dome with a flat base, a tricorn hat perched on top, a heavy chain of office with a big medallion hanging across its front

The Glasslands to the Cinder Eye

05 has no Glasslands palette yet; the rows assume the proposed one in D50: smoky amber lit from cracks below, glass warm amber and rose, never cold (glass must not read cyan).

Asset Kind Size / scale Style notes Prompt
glass/far W, layer, 0.5x 1536×640 gen Middle-lands sun: a red sliver; Mossback on the north rim a continuous band of a flat plain of fused glass dunes glinting amber, a colossal tortoise silhouette walking far away on the horizon, a thin red sliver of sun, hazy indigo and smoky amber
glass/mid W, layer 2304×640 gen The atlas’s signature: ghost-shapes of lanterns in the glass, chimes a continuous band of smooth wave-shaped dunes of melted amber glass with the faint ghost shapes of old lanterns trapped inside, wind chimes on leaning poles, lit from below by warm cracks
kit/glass W, edge strip 1536×512 gen Walkable lip reads in grayscale side view cross-section of a long horizontal strip of fused amber lantern glass crust along the flat top edge of dark sand, glassy melted drips over the front, warm glints, runs off both edges
kit/glasssand W, body texture 1024×1024 gen, seamless seamless flat texture of dark sand with embedded shards of amber and smoky glass, even lighting, fills the whole frame
glass/road_post W, back prop ~20 u wide The Lantern Road: most posts dark a single leaning stone lantern post by an old road, its glass lantern cracked and dark, wind chimes hanging from its arm
glass/bounty_board W, back prop ~40 u wide Gilded Hour board; papers carry scribble shapes, no words a wooden notice board on two posts covered in pinned papers with scribbled marks and a gilded hourglass emblem on top
glass/dune W, def (one-way top) 128 u (512 px) Chime Dunes platforms one smooth wave-shaped dune of melted amber glass seen from the side, a gently curved top, ghost shapes of lanterns inside it
kit/mirror W, edge strip 1536×384 gen Mirrormere floor; the reflection (where Mirrorkin show) is a shader, not art side view of a long flat strip of polished dark mirror glass, its top edge a bright thin line, reflecting a dusky sky
lamphouse/hall, lamphouse/tower W, defs (floors and ladders) ~200 × 160 u and ~120 × 260 u The Broken Lamphouse’s vertical climb; empty lantern hooks everywhere exact side elevation of a ruined stone waystation with broken floors open to the sky, timber beams, empty lantern hooks on the walls, collapsed roof; and separately: a tall ruined stone lantern tower, floors broken open
glass/empty_lantern W, prop ~6 u Quest pickup look: warm, empty, still faintly glowing a single old brass lantern lying on its side, glass intact, no flame, a faint warm glow left inside
kit/slag W, body texture 1024×1024 gen Slagway: glow comes from below the cracks seamless flat texture of cracked dark glass over glowing orange slag, bright molten seams in the cracks
glass/vent W, prop ~24 u The heat lift; the puff is VFX a low round vent in cracked glass ground breathing warm orange heat shimmer
kiln/mid W, layer 2304×768 gen The Kiln’s crater bowl the inside rim of a huge crater bowl of melted amber glass, smooth curved walls, glowing cracks, lit from below
kiln/pillar_1, _2, _3 W, defs 24 × 80 u, three melt stages The pillars it melts one by one: whole, slumped, a puddle a tall pillar of fused amber glass with lead seams; the same pillar slumped and melting; the same pillar melted into a low puddle
glassbreak/plate W, def 96 u Shattered plates over buried lanterns a large flat plate of cracked amber glass lying tilted, a radial shatter pattern
Glassback N 14 u (56 px) A natural creature; glass shell warm, never clear-blue a round beetle on short legs with a domed shell of fused amber and smoky lantern glass in panes held by lead seams
Cinderling N 8 u (32 px) Of the Cinder Eye: deep ember and danger-red, so it never reads as player heartfire a tiny fleck of living fire with two little round eyes, a curling flame body in deep red and ember, trailing sparks
Chimehound L 18 u (72 px) Chime tubes in the silhouette a lean dog howling with its head raised, a wind chime of hanging tubes tangled on its back and tail
Lamplicker L 12 u tall, 30 u long Long and low a long low lizard with a very long curling tongue licking forward, slender curling tail, short legs
Pilgrim Afternooner L 28 u (112 px) Afternooner rig with a pilgrim’s hat and staff a small slender skeleton walking with a tall walking staff, chibi proportions with a big round head, a wide-brimmed straw sun hat, a pilgrim’s satchel and a long cloak
Slagworm N 20 u (80 px) Molten glass that hardens; its cooled form is the platform it leaves a fat worm of molten orange glass rising in an arc out of a crack, cooling dark glass crust plates along its back
Lostbearer L 28 u (112 px) Wears a Lanternbearer: the player’s silhouette, a coat and a dark lantern a small chibi adventurer standing in a long coat holding an unlit lantern out in front, big round head
Mirrorkin none — A blurred copy of the player’s own silhouette in the Lampghost shader, drawn only in reflections —
Cinder Eye, regenerated N, field boss ~76 u (300 px), from today’s 34 u body Atlas: cart-sized, lidded with plates of fused lantern glass; the current sprite has no lids a floating molten eye the size of a cart, a round glowing ember iris with a dark slit pupil, upper and lower lids made of plates of fused amber lantern glass held by lead seams, soft flames curling up from its top

The prologue: the Pilgrim’s Stair and the Lighting

Asset Kind Size / scale Style notes Prompt
stair/foreleg W, titan near piece, 1x 1536×2048 gen, cropped A titan is never whole: one foreleg, hide as cliff, heartfire warm through the scale seams a colossal tortoise foreleg seen from the side up close like a cliff wall, wrinkled scaled hide with huge round scales, moss in the folds, faint warm amber glow in the seams between scales
stair/far W, layer, 0.5x 2048×640 gen Seen from high on the leg during a Kneeling; crowd lights at the foot the Mossway meadows far below seen from high up at dusk, round footprint lakes ringed with tiny warm lights, a crowd of tiny lantern lights gathered at the foot
stair/landing W, def (deck foothold) ~60 u wide Strapped on like Greyhorn’s hold: straps, buckles, rope rails a small wooden landing platform strapped to rough scaled hide with wide leather straps and iron buckles, rope rails, a lantern hook at one end
Pilgrims, 3 outfits P as the player The crowd of newcomers: plain travel clothes, packs, each with a lantern Dress the character as a traveler arriving with a pack: (1) a patched brown travel coat and a big backpack; (2) a knitted shawl and a satchel; (3) a straw hat and a bedroll
Fen Cobble (proposed, D53) P as the player Junior Lamplighter, first day; slightly too-big uniform Dress the character as a nervous junior lamplighter: a soot-grey coat with brass buttons a size too big, a cap that slips over one eye, a satchel of wicks, holding a long brass lighting pole
The Vent W, def ~120 × 60 u Where every lantern is lit: the warmest light in the frame a round vent opening in a huge tortoise shell plate, deep warm heartfire glow and rising embers from a crack inside it, brass guard rails and short ladders around its rim
Beacon W, def ~40 × 120 u The first beacon; its fire is the light buffer, not painted a tall iron and brass beacon tower on a round stone base, a big empty fire cage at the top, rope pulleys and a ladder up its side

UI: party, finder and class select

Asset Kind Size / scale Style notes Prompt
Brass corner 9-slice UI template 64 px corner at 1x, 2x master “painted brass corner pieces” (UI and UX art); panels stay code-drawn lantern glass an ornate brass corner piece for a game window frame, a quarter-round bracket with a tiny lantern finial and a rope-twist edge, flat front view, on a flat key color
Class emblems, 4 Icon template 64 px, used at 24 px in party frames The skill-icon motifs: Warden shield, Kindler flame, Ranger leaf, Shade crescent; brass relief a round brass medallion in relief with a single bold motif in the center: a shield; a flame; a leaf; a crescent moon, flat front view
Complexity plates UI 160 × 40 px Text stays in Godot; the plate’s notch count codes the label (proposed, D51: one notch Simple, two Standard, three Involved), never color alone a small brass name plate with rounded ends and one, two or three notches cut in its top edge, flat front view
Class cards Render, no generation 360 × 520 px Each class’s outfit rendered from the rig in its idle pose on lantern glass —
Finder purpose icons Icon template 32–48 px One per finder purpose (03-systems.md §5.5); shape-distinct a small round brass badge with one simple bold symbol for each purpose: a sword for hunting, a door for a dungeon, a lantern for a beacon, a scroll for a quest, a coin for trade
Party marks Icon template 24 px Leader, offline, elsewhere: shapes, not colors a tiny brass crown; a tiny unlit lantern; a tiny signpost
Resource fills Code first — Heat ember with its bonus band, Focus leaf-gold, Gloom void-black with a warm edge (HUD layout); gradients in lantern_glass.gd before any texture —

Decisions for Foster

Open art and audio decisions live in 07-decisions.md: D8 (native Godot cutout vs Spine), D9 (Wend’s key art as a beast), D10 (Moth Queen key art), D19 (music fallback), D20 (fonts), D22 (the Stability revenue trigger) and the Phase 1 art proposals D50–D55. Settled: launch scope and curation (D1, Acts I–II curated by Foster with agents), the Lampghosts name (D3), and in 00-canon.md the reference scale (1920×1080, 1 unit = 4 ref px, 8-unit tiles), “cyan means absence”, and Wend as a beast.

Sources