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.
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:
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 |
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. 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. 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. 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. 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. 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 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. 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. 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.
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.
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.
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.
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.
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.
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.
| 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 |
#120F1C.| 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 |
| 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.
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 |
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.
#000000) lines or shadows; pure white
(#FFFFFF) anywhere except the core of a crit flash.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.
canvas_items,
aspect expand, linear filtering with mipmaps on all art.
project.godot is set this way since the look pass, the
camera at zoom 4 (480×270 units), and the gate’s frames are
1920×1080.| 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.
| 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) |
| 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:
Node2D bones, animated
with AnimationPlayer. No
Skeleton2D/Polygon2D mesh skinning on
characters (CPU-skinned on every platform, and 150 skinned characters
per map is not viable on web). Capes, long hair, scarves and tails use a
3–5 segment verlet chain for secondary motion.AnimationPlayer authoring is too slow.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.
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.
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.
| 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.
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 |
#7FE3F0), Cinder Eye and
fire bosses warm-red (#E0533F); both use the same shapes.
Warm-gold pools are always safe.| 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.
Collision is footholds: line segments the designer draws (04-architecture.md §5.2).
Art is never a grid:
08-scale.md §3) reuse the surface
kit’s strips and props under a darker LUT and ambient, plus a 20–30
piece deep extension (roots, cave lips, buried Concord ruin, Lampghost
absences). The Deep’s map pieces are built from these kits; they add
layout work, not art.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:
props[].def)
whose footholds run along every flat-enough visible top: porches,
balconies, roof ridges, crate and barrel tops. A top too high to reach
still gets its foothold; reach is the map’s business, honesty is the
art’s."back": true: drawn behind every other prop, darker,
desaturated and hazed toward the map’s low sky
(back_prop.gdshader), so it reads as behind the play plane.
Trees (a canopy is a round, inviting top), lamps and the hearth are back
props.front) draw over the
ground and are not surfaces; nothing on them may look flat and
standable.tests/test_map_file.gd holds every map to this: each
prop has footholds, is back, or is a front
def. If frames still read poorly, the next step is a lit lip along
walkable prop tops, as the ground strips have.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).
addons/mapkit).docs/platform.md), so creators can later dress maps with
the same kits.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:
kit/moss in holds and
the Mossway’s fields) laid along the run at its own aspect, its walkable
top on the foothold with the 2 ref px top line, overhanging and fading
out at both ends; under it the body texture (kit/shell,
kit/soil) fades to the region’s deep colour. A solid run
with a foothold below it is a tapered shell-plate slab.kit/deck)
standing on timber posts (kit/plank) at most 90 units
apart, nudged off even spacing so a row never reads as scaffolding, each
reaching down to the nearest foothold below (or the map’s bottom); the
end posts brace inward and rise above the deck as its caps, inner posts
brace at most one side. No floating platforms.kit/rope) with a knot on an iron hook at the top
(kit/knot) and a plain frayed end of loose strands (no coil
or tassel, which reads as a noose); 12 units and wider are wooden
ladders. Every climbable hangs a lantern hook (kit/hook) at
its top.town/house (a def, door at ground
level, 74 units wide, its roof ridge walkable), town/crates
(a def, 32 units, barrel and crate tops walkable), and the back props
town/lamp (about 22), town/tree and the
hearth; the Mossway has back props field/tree,
field/lamp and ponds/lantern_lily.ponds/lily (a giant lily pad on its
stem, its pad a one-way foothold), ponds/water (a
translucent pond lens with over, drawn over the characters
wading in a crater) and tollbridge/span (a two-arch Concord
span, pier to pier, its deck a one-way foothold; three join into the
bridge). Every surface in the play plane that looks walkable, deck,
mound, pad or bridge, carries a foothold; trees, lamps and
lantern-lilies are back decoration, hazed behind it.props[].def): a JSON beside
the art (assets/world/<def>.json: ref size, anchor at
the feet, footholds and climbables in ref px) whose walkable lines and
ladders the loader adds to the map, mirrored when the prop is flipped,
so a porch, balcony or roof is walkable where it is painted.
game/render/props.gd draws props behind the ground, a def
with front over it, and one with over over the
characters; ground.gd dresses only the map’s own footholds
but every climbable. The Rim’s four Lodges and storage hall are defs;
the Stair head is a front def drawn over the ground slope
that is its stair.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 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.
| 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.
+--------------------------------------------------------------------+
| [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 ] |
+--------------------------------------------------------------------+
03-systems.md), each with its
own fill: Warden Resolve brass, Kindler Heat ember with a band marking
its bonus zone, Ranger Focus leaf-gold, Shade Gloom void-black with a
warm edge. XP heartfire gold.03-systems.md’s; this sketch
shows 2×10.game/ui/hud.gd and
game/ui/hud_layout.gd on
game/ui/lantern_glass.gd (the window theme is
game/ui/lantern_glass.tres, set by
game/main.gd), laid out in ref px and scaled by min(height
/ 1080, width / the bottom bar’s width). The level plate and XP bar read
game/sim/progression.gd and the Resolve bar the sim’s
Resolve; until the sim has it, the name is a placeholder (“Wanderer”).
The lantern gauge is game/ui/lantern_gauge.gd, the guide
line sits where the quest tracker will, and the hotbars are two rows of
10: skill bar 1 (game/ui/skill_bar.gd, keys 1–0, painted
placeholder medallions with a cooldown sweep and a level lock) over the
inventory’s first 10. The XP bar is 20 ref px tall with “EXP xp / next
(pct%)” across it, so it reads at 1920x1080 (it was a 10 px line).03-systems.md §7.9),
game/ui/boon_prompt.gd: the held boons are a row of six
round placeholder icons (brass rim for Warden boons, heartfire for
lantern boons, the initial in the middle; name and text as a tooltip)
right-aligned over the lantern, with the motes toward the next offer
beside them. An offer is three cards top center under the boss bar:
icon, name, text and its key cap. It never pauses or takes focus; the
cards and row take clicks and taps, so clicks on them never swing.+--------------------------------------------------------------------+
| [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] |
+--------------------------------------------------------------------+
03-systems.md’s; this layout
draws them. Controls stay out of the bottom 16 dp and the notch sides
(safe areas).| 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 | 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 |
CPUParticles2D (consistent on the
Compatibility renderer used on web).00-canon.md, World rules). In
a field they touch it and run up its thread as a brief bright streak,
banked. Below the surface carried motes are visible on every character
as a small swarm around the lantern (count-capped above 12), so a player
loaded with cargo reads as a prize. On death they scatter to the ground
as pickups. Banking them at a titan or beacon plays a rising stream into
the heartfire.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.
| 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 |
Godot 4.3+ has AudioStreamSynchronized (vertical layers)
and AudioStreamInteractive (clips with a transition table),
enough without middleware.
| 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 |
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.
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.
| 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.
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.
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.
art/refs/ (separate art repo, Git LFS):
40–80 approved images, grouped as characters, monsters, Lampghosts,
environments by region, props, icons, UI. Every image is labeled with
what it is a reference for (“palette”, “line”, “brushwork”,
“scale”).tools/art/prompts/, with fixed blocks (style block,
lighting block, palette block, negative block) and a slot for the item.
No artist names, game names or “in the style of” phrases, ever.img/ has the right mood and the wrong finish (smooth CG).
Round 0 generates 2,000–4,000 candidates from the templates, selects the
60–120 that best hit the painted-brushwork look and the palette rules,
and trains style LoRA v1 on them. Round 1 generates with v1, curates
again, trains v2. Expect the look to settle by v3. After that the LoRA
only changes through a versioned retrain, and every asset records which
version made it.wh-style-env (backgrounds,
kits, props, titans), wh-style-char (characters, gear,
monsters), wh-style-icon (icons and UI ornaments). Plus
small per-subject LoRAs where identity must hold across hundreds of
images: one per titan, one for the base body and face.| 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 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.
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 |
tools/art/export.py writes 2x
PNGs, 1x and 0.5x downsamples, trims, records pivots from the part
atlas, and writes the sidecar.| 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 |
<name>.prov.json: model and version, LoRAs and
versions, prompt template and filled prompt, seed, control inputs, QA
results, curator, approval date. CI fails a build that ships an asset
without one or with a model not on the allow-list.tools/art/
(MaxRects, 2048² pages for 1x, 4096² for 2x) writing PNG plus JSON
rects, so the same format serves the data-only map and creator packages.
Atlases are grouped by what loads together: one per region kit, one per
monster family, gear by tier-set, UI by window. Characters are re-baked
at runtime anyway.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.
| 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).
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 |
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).
| 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.
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 |
| 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 |
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 |
| 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 |
| 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 |
— |
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.
mflux-train): mflux; Z-Image LoRA
training in AI-Toolkit: guide.