worldbuilding

Use when

You need to turn a theme into a concrete visual brief — palette, contrast, depth, silhouette — that survives the vision judge.

Aesthetic Direction — briefing the Regalia look

What it is. The art brief: the palette, contrast rules, depth plan, and silhouette language that give a game one coherent look. The house default is Regalia — a small, AA-gated set (docs/STYLE.md) built on one hue at two opacities: bold, rounded, friendly, no outlines. This module is how you brief a look that clears both the pattern-readability floor and the six-axis vision judge (design/JUDGE.md), not just how to pick pretty colours.

Player fantasy / why it’s fun. The look is the first thing the player believes about the world — before a single mechanic fires. A frame that reads as shipped, not debug earns trust; a flat grey grid loses it in a second.

The Regalia palette

Import REGALIA, REGALIA_DAY (light), REGALIA_NIGHT (dark) from @hayao (docs/API.md). It’s a core of four, grown by the job — never a big box of crayons:

HueTokenReads as
Regalia Goldgoldprimary — marks, joy, coins, magic
Ink Navyinkstructure — line, type, night
Meadowgreengrowth — nature, success
Dusk Bluebluecalm — sky, water, tech
Rose (ext)rosevitality — hearts, health, damage
Bark (ext)barkmaterial — wood, earth, crates

Surfaces run light paper → mist → cloud and dark ground → night → shade; text is ink/soft on light, paperInk/softInk on dark. Grow the palette by the job, not the mood — a new hue earns its place only by owning one specific thing the core four can’t (that is exactly how rose and bark got in), and it stays out of the core UI chrome. Every pairing is WCAG-AA verified — npm run palette is the gate. The engine stays palette-agnostic; Regalia is a consistent starting point, never a restriction (docs/CONVENTIONS.md).

Vectors / options — dialing the look to the theme

The palette is fixed-ish; the composition is where you express theme:

LeverPolesServes
Groundlight REGALIA_DAY (paper) ↔ dark REGALIA_NIGHT (ground)daytime/cosy ↔ night/dread; sets the whole mood
Accent count2 (austere) ↔ 5 (rich)tension of a lean frame vs a busy world
Value rangewide (ink→paper) ↔ narrowdrama & focal points ↔ flat/foggy atmosphere
Mass vs focalbroad 32% mass ↔ 100% focal detailthe duotone depth cue — light backdrop, bright detail on top
Lightflat ambient ↔ LightLayer+PointLight poolseven scene ↔ carved-out focal depth

Warm accents (gold, rose, bark) push a scene toward harvest/vitality/craft; cool accents (green, blue, ink) toward night/order/calm. Let the theme’s register from world-theme-vectors pick the corner.

Method

  1. Choose the ground (REGALIA_DAY vs REGALIA_NIGHT) from the theme’s tone. This decision colours everything after it.
  2. Pick 3–5 accents by meaning, not prettiness — one alarm/focal hue for the avatar, the rest for world & factions (world-faction-identity). Reserve the highest-contrast pairing for the player so the avatar out-contrasts the scenery (JUDGE axis 1).
  3. Plan depth in three layers — background / midground / foreground — before placing anything. Emptiness (objects floating in a void) is the JUDGE’s most common failure (axis 2). Grade a sky, pin a horizon, layer ridges as stacked duotone masses.
  4. Give interactables an ink edge or a bright focal. Pickups/actors read via the duotone split — a 32% mass carrying a 100% focal detail — plus a glow/pulse; contrast lives in the edge and the focal, not a flat fill (docs/CONVENTIONS.md).
  5. Set the silhouette language — the shape rules that make avatar, enemies, and pickups readable as black shapes (pattern-readability).
  6. If lit, own the light. A real LightLayer + PointLight carves a focal point out of ambient dark; but multiply-lighting lowers contrast, so the Regalia AA guarantee holds only pre-lighting — judge lit contrast from the rendered PNG, and let the lightingIssues feel-gate (npm run feel) own it.
  7. Render and judge. Run npm run judge <slug>, look at the pixels, fix every high-severity finding cosmetically (the golden hash must stay unchanged), re-render until it reads shipped.

The JUDGE bar — brief to pass all six axes

AxisThe brief that passes it
ReadabilityAvatar on the reserved high-contrast pairing; threats warm-loud, pickups focal-bright
Depth & compositionThree real layers; a focal point; breathing room — never a void
Palette harmonyEvery hue from the one Regalia set; a controlled value range, not all mid-tone
Juice restraintParticles/shake that punctuate; nothing seizure-bright (pattern-juice-choreography)
Motion clarityThe eye tracks the important thing frame to frame
Chrome & finishHUD framed as DOM overlay; consistent margins; nothing clipped; the title invites

Worked example — a keeper walking into the dusk

Theme: a small-scale, elegiac ascent (elegiac, intimate).

Aesthetic hook

This whole module is the aesthetic hook. The one thing to internalise: Regalia gives you harmony and AA for free, but not depth or contrast-under-light — those you compose per scene and prove from the rendered pixels, never from the hexes (design/JUDGE.md axis 2). Design in the palette; judge in the PNG.

Traps

Composes with

See also

This module rendersthe repo's markdowndirectly — edit it there, it changes here.