worldbuilding

Use when

You want the world to tell its story through play and place, not cutscenes — a fit for a small, text-light deterministic game.

Narrative Delivery — story with little text

What it is. How the world reaches the player without a wall of text. A small deterministic game can’t (and shouldn’t) lean on cutscenes and codex dumps. Its story lives in place (what the level shows), in systems (what the rules generate), and in objects (what a single item implies). The best delivery is the one the player finds, not the one they’re told.

Player fantasy / why it’s fun. Discovered story is yours. A player who pieces the world together from a broken lantern and a drowned path owns that understanding in a way no narrator can give them. Show-don’t-tell isn’t a style choice — it’s how you make the player a participant instead of an audience.

The three delivery channels

ChannelThe story is in…CostsBest for
Environmentalthe place — layout, ruins, what’s worn or brokenart & level designpremise, history, mood
Systemicthe rules interacting — what the systems generatemechanical depthemergent, personal, replayable story
Embeddedobjects & fragments — one item, one line, one namea little authored textspecific lore, character, the twist

The house lean is environmental + systemic first, embedded in tiny doses. Text is a DOM overlay (world-naming-and-tone); spend it sparingly. A game that shows its drowning coast and lets its light-mechanic enact the loss needs almost no words.

Vectors / options — how much story, and where

Match delivery to the game’s shape (system-session-structure):

Game shapePrimary channelWhat it looks like
Puzzle / arcadeenvironmentalthe level is the premise; one title line
Roguelitesystemiceach run’s events author a small story (system-emergent-systems)
Metroidvania / campaignenvironmental + embeddedplace tells history; fragments gate the twist
Systemic / emergentsystemicthe nemesis pattern — the game remembers and narrates back
Deductionembeddedthe player reconstructs the story (Obra Dinn)

Method

  1. Decide what the player must understand vs what they may infer. Only the first needs delivery; the rest is theirs to imagine (world-worldbuilding-scaffold kept it minimal — hold that line).
  2. Assign each beat a channel. Premise → environmental (show it in the first screen). Stakes → systemic (let a loss happen, don’t narrate it). A specific reveal → embedded (one fragment).
  3. Make the environment tell the premise. The world-aesthetic-direction brief is your first narrator: a drowned path, a snuffed lantern, a mended crack say more than a paragraph. Compose the frame to be read.
  4. Let systems generate the personal story. Where you have memory or relationships (system-emergent-systems), the game authors specifics you didn’t write — the guard who caught you twice, the lantern you always lose. That’s the Shadow of War trick at small scale.
  5. Spend embedded text like a miser. One line on a gravestone, one name on a crest. Diegetic, in-world, in the register (world-naming-and-tone). Never a scrolling codex.
  6. Show the change, not the state. Story is difference — the path that was lit and now isn’t; the crack that’s now gold. Deliver transformations the player caused, so the narrative and the mechanic are the same event.

Worked example

World: the drowned-coast keeper (from world-worldbuilding-scaffold).

Aesthetic hook

Environmental storytelling is world-aesthetic-direction doing double duty: the Regalia frame that passes the JUDGE’s depth axis (a real fore/mid/back, a focal point) is also the frame that narrates — a snuffed lantern reads as loss only if the scene has the depth and contrast to show it. Because text is a DOM overlay and the palette carries the mood, you can tell a whole story in the ink line, a paper ground, and one gold glow going out. Keep embedded text set in the serif the JUDGE renders true (design/JUDGE.md), and let restraint here reinforce the house voice (world-naming-and-tone): the systems and the light say it; the words just confirm it.

Traps

Composes with

See also

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