LANTERNHOLD — Game Design Document
Status: Iteration 1 first draft. Numbers marked [UNSIM] are hand-derived and not yet proven by a simulation in
docs/sims/. Per the rubric, unproven balance or emergence claims do not count toward the score until a sim backs them. Canonical palette:docs/art/palette.hex. Art direction lives inART_BIBLE.md; this document references it but doesn't repeat it.
1. Pitch
You keep a small floating island drifting through an endless night. There's a warm house, a hearth, a pond where wisps rise, a lantern tree, and a cat named Wick. Below the grass is soil, then the bones of earlier keepers, then the crystal that holds the island up, then roots that move at night, then the thing the roots grow from.
You research what the world is made of, then build machines so you no longer have to do the chores yourself. Every machine leaks flux. Flux sinks into the soil, rides the rain and pools in low caverns, and it calls the things that live in the dark. They never attack. They take, rearrange and whisper. Your only wall is light. The crystal that powers your deepest lamps is the same crystal that keeps the island floating.
One line: a cozy-dread automation game where every machine you build brings the dark a little closer.
Genre: 2D side-view simulation/automation, building and digging (Terraria-style cross-section), no combat. Session target: 15–20 hours to a first ending, then endless play. Audience: players of Thaumcraft, Create, Factorio, Noita, Caves of Qud, Dwarf Fortress, Against the Storm and Outer Wilds.
2. Design pillars
| # | Pillar | What it means | What it rules out |
|---|---|---|---|
| P1 | Light is the only wall | Safety is a visible, spatial resource: the lit area. Void entities path only through darkness. Defense means where you put lamps, wards and walls. | Weapons, combat, player HP, turrets that damage. Invisible threat timers: every pressure must show on the light or flux map. |
| P2 | Every convenience casts a shadow | Each automation step has a cost in a different currency: machines leak flux, deep research costs warp, power costs buoyancy. Mitigations move costs around and never erase them. | Strictly-better upgrades. Any tech that makes a cost disappear. "Clean" endgame machines. |
| P3 | The world keeps the score | Consequences live in the simulation as tiles, gas, light, mass and water, not in HUD meters. Endings read world state. | Dialogue-choice or menu endings, morality meters, quest checklists, cutscene choices. |
| P4 | Learn the world, not the wiki | Essence relationships are scrambled per seed. Knowledge comes from experiment, observation and clues, and every experiment has a cost. | Fixed recipe trees you can memorize, random gates with no information, pure-reading puzzles. |
| P5 | Cozy first, dread creeping | The hearth is always a sanctuary. Dread grows out of the player's own expansion and choices. Nothing spawns on screen and nothing jumps. | Jump scares, gore, unprompted progress wipes, death, punishment for idling at home. |
3. Core loops
Moment to moment (seconds): dig, place and wire. Carry light into a new dark pocket, watch a lamp stutter as it strains against flux, catch a wisp, check whether that shape at the edge of the light is real.
Per session (one Night = 24 min, typically 2–4 Nights per sitting):
- Survey: read the night's state. Where is flux pooling, which lamps are strained, did anything get taken or rearranged, what's the weather?
- Research: distill new items, run tests, update the Ledger, identify a compound.
- Build: turn the most annoying chore into a machine and extend logistics.
- Defend: re-light, re-route and vent or capture the flux the new machine leaks.
- Descend: push one shaft deeper and carry light down it.
- Rest: sleep at the hearth (clears temporary warp) or work through the Deep-watch for its rewards and risks.
Across the game (hours): surface coziness → fossil-layer mystery → crystal boom and the start of sinking → living roots that fight your layout → the Heart, where the island's accumulated state decides which ending you can reach. Each stratum adds one new pressure and one new kind of value. The factory grows downward, and every level needs light carried to it.
4. The world
4.1 Grid and island
- Grid: 128 × 256 tiles, 8 × 8 px per tile.
xruns 0–127 left to right andyruns 0–255 top to bottom. - Surface line:
y_s = 72. Rows 0–71 are open sky you can build into, up to 72 tiles of towers. Every tile you build adds mass (§6.7). - Island depth
D(rows of rock below the surface): seeded in [172, 184]. - Island surface width
W0: seeded in [60, 76], centered atx = 64. - Profile: half-width
hw(d)at depthdrows below the surface, plus 1D value noise of ±2 tiles with a period of 12:0 ≤ d < 100:hw = W0/2 · (1 − 0.25 · (d/100)^1.5). This is the broad cup.100 ≤ d < 150:hw = W0/2 · (0.75 − 0.30 · (d−100)/50). Here the island narrows.150 ≤ d < D:hw = W0/2 · 0.45 · sqrt(1 − ((d−150)/(D−150))²). This is the root bulb that tapers to the tip.- Dangling root strands hang 3–14 tiles below the bulb as real root-wood tiles.
- Strata bands (
d= rows below the surface): Surface/topsoil 0–11, Fossil 12–49, Crystal 50–99, Roots 100–149, Heart 150–D. - Scaffolding: players may build out over the void within
x ∈ [2, 125]. Built tiles need structural support (§6.7). - World-gen stability guarantee: after generation, run the integrity solver. Any natural tile with integrity < 20 becomes stone. If that leaves an integrity < 20 tile, delete it. The starting island must have zero cracking tiles.
4.2 Time
- Simulation tick: 20 Hz (50 ms). All gameplay runs on ticks, and rendering interpolates.
- One Night = 24 real minutes = 28,800 ticks. There is no day. A Night has three
Watches of 8 minutes each:
- Dusk-watch (0–8 min): calm. Entities ×1.0. Rain chance at start: 20%.
- Deep-watch (8–16 min): entities ×1.5, roots move (§8.4), and the Visitor may pass (§6.5). Rain chance: 25%.
- Grey-watch (16–24 min): the calmest watch. Entities ×0.75. Rain chance: 45%.
- Moon: an 8-Night cycle. Phase index
p = night mod 8and moon light level by phase is[3,3,2,1,0,1,2,3](p0 = full). See §6.4. - Sleep: in a bed whose cell has warm light ≥ 8, the player can sleep until the next Dusk-watch. The sim keeps running at 8× speed with the screen dimmed, and any input wakes the player. Sleep clears 10 temporary warp, once per Night.
4.3 The starting island (all seeds)
A two-room plank house (3 tiles tall inside) with the Hearth, a bed, a table holding the first note, and a shelf. The Shed sits 10–14 tiles from the house with a broken alembic and a chest. There's a 6 × 2 garden plot, a pond of about 48 water cells (seeded 40–56), the Lantern Tree, two hanging lanterns (one lit), a ladder hatch through the floor, and Wick the cat. The shed's broken alembic leaks 0.4 flux/s until repaired. This is the first seed of dread, and it comes from the systems, not a script.
5. The player
- Body: collision box 6 × 14 px. Walk 5 tiles/s, jump 3 tiles high, coyote time 0.1 s, climb ladders and ropes at 3 tiles/s. No fall damage.
- Reach: place and break within 5 tiles. Hold-to-break times: soil 0.4 s, clay 0.8 s, shale 1.2 s, limestone 1.4 s, stone 1.6 s, root-wood 2.0 s, crystal 3.0 s (with a buoyancy preview and a hold-to-confirm), heartstone unbreakable.
- Inventory: 30 slots, stacks of 50, a 10-slot hotbar.
- No health, no hunger. The only player meter is Warp (§6.6).
- Falling off the island: the dark catches you. The screen fades and you wake at the hearth after a 3 s fade. You gain +5 temporary warp, and one random non-tool stack is taken to a midden (§6.5), where you can recover it.
- The Hearth sanctuary (hard rule): in any cell where the hearth's own warm light is ≥ 8, entities can't enter or spawn, dimmers can't attach to the hearth, and hallucinations never appear. The hearth burns 1 log every 6 min at full strength (warm 13). Unfed, it settles to embers (warm 6). It never goes fully out.
6. Systems
6.1 Essences and research
6.1.1 The essences
Everything is made of essences, measured in drams. They behave as fluids: they flow in pipes and are stored in jars.
Six primals. Their identities are fixed in every seed, and each has at least one surface source:
| Primal | Theme | Signature color (palette idx) | Surface sources |
|---|---|---|---|
| Ember | heat, burning | R2·5 #e0832b |
Log, Emberpepper, Soot |
| Dew | water, cold | R1·4 #8396bb |
Water, Leaf, Clay |
| Loam | earth, weight | R5·5 #8f6a48 |
Soil, Clay, Stone |
| Breath | air, lightness | R1·6 #c8d6ea |
Water, Moonwheat, Moth wing |
| Glim | cool radiance | R3·5 #3fbfa9 |
Glowfruit, Wisp, Silverleaf |
| Hush | dark, silence | R0·5 #2c3567 |
Nightshade, Soot, Moth wing |
Taint is special: it can only be captured from flux (§6.3) and never synthesized. It counts as tier 1 when it appears as a parent.
24 compounds in 4 tiers. Every compound has exactly two distinct parents. At least one parent must be exactly one tier below it, and the other parent must be of a lower tier. Each compound has a recipe pool (its Correspondence) of four plausible parent pairs, and the world seed picks one per compound (§6.1.3). The pools keep the theme intact (Growth is never Ember + Hush), and the pick makes every seed a new puzzle. Pools deliberately overlap: Dew+Loam is a candidate for Growth, Salt and Ore, and Ember+Loam for Ore, Ash and Glass. So learning one recipe strikes candidates elsewhere, which makes the Ledger a cross-referenced logic puzzle. (i3: a 4th option was added to every pool; S05 shows 3 options made seeds too similar and puzzles too short.)
| Tier | Compound | Role | Recipe pool / Correspondence (seed picks one) |
|---|---|---|---|
| T1 | Growth | plants, golems, Mend | Dew+Loam · Loam+Glim · Dew+Glim · Loam+Hush |
| T1 | Ore | minerals | Loam+Ember · Loam+Hush · Loam+Breath · Loam+Dew |
| T1 | Mist | vapor, dreams | Dew+Breath · Dew+Ember · Breath+Hush · Dew+Hush |
| T1 | Spark | energy | Ember+Breath · Ember+Glim · Glim+Breath · Glim+Hush |
| T1 | Shade | shadow | Hush+Glim · Hush+Breath · Hush+Dew · Hush+Loam |
| T1 | Salt | preservation, purity | Dew+Loam · Dew+Ember · Loam+Glim · Dew+Glim |
| T1 | Ash | remains, decay | Ember+Loam · Ember+Hush · Hush+Loam · Ember+Breath |
| T1 | Motion | movement | Breath+Loam · Breath+Ember · Dew+Breath · Breath+Glim |
| T1 | Glass | vessels, lenses | Ember+Loam · Glim+Loam · Glim+Ember · Ember+Breath |
| T2 | Metal | pipes, machines | Ore+Ember · Ore+Spark · Ore+Salt · Ore+Loam |
| T2 | Bone | structure, golems | Ash+Loam · Ash+Salt · Ash+Ore · Ash+Hush |
| T2 | Vigil | warding | Spark+Glim · Glass+Glim · Spark+Shade · Glass+Ember |
| T2 | Animus | golem life | Motion+Growth · Motion+Ash · Motion+Mist · Motion+Loam |
| T2 | Lift | buoyancy | Breath+Glass · Glim+Ore · Mist+Glass · Breath+Ore |
| T2 | Mind | thought | Spark+Mist · Glim+Shade · Spark+Hush · Mist+Glim |
| T2 | Hunger | lure, appetite | Growth+Shade · Ash+Hush · Growth+Ember · Ash+Shade |
| T2 | Root | the living deep | Growth+Hush · Growth+Ash · Growth+Shade · Growth+Loam |
| T3 | Memory | keepers' knowledge | Mind+Bone · Mind+Salt · Mind+Ash · Mind+Glass |
| T3 | Fetter | binding | Metal+Taint · Bone+Taint · Vigil+Taint · Animus+Taint |
| T3 | Dawn | true light | Vigil+Growth · Lift+Glim · Animus+Spark · Vigil+Ember |
| T3 | Dream | sleep-truth | Mind+Mist · Mind+Shade · Hunger+Mist · Mind+Hush |
| T3 | Echo | repetition, the dead | Mind+Hush · Animus+Shade · Root+Mind · Bone+Mind |
| T4 | Kindred | life-bond (Mend) | Dawn+Root · Dawn+Animus · Memory+Growth · Dawn+Growth |
| T4 | Abyss | the Heart's substance | Dream+Hunger · Echo+Taint · Fetter+Hunger · Echo+Hunger |
6.1.2 Items and their compositions
Item compositions are fixed across seeds, so players learn the world's materials. What changes per seed is what the compounds inside them are made of.
| Item | Where | Composition (drams on full distill) |
|---|---|---|
| Leaf | tree, bushes | Growth 1, Dew 1 |
| Log | tree | Growth 2, Ember 2, Loam 1 |
| Glowfruit | Lantern Tree, 1 per Night | Glim 2, Growth 1, Dew 1 |
| Soil | dig | Loam 2, Ash 1 |
| Clay | dig (topsoil pockets) | Loam 2, Dew 1 |
| Water (bucket) | pond, barrel | Dew 3, Breath 1 |
| Moth wing | moths (net) | Breath 1, Hush 1 |
| Nightshade | surface flower, opens in dark | Hush 2, Growth 1 |
| Soot | hearth, 1 per Night | Ember 1, Hush 1, Ash 1 |
| Moonwheat | crop | Growth 1, Breath 1, Glim 1 |
| Emberpepper | crop | Ember 2, Growth 1, Spark 1 |
| Silverleaf | crop | Glim 1, Salt 1, Growth 1 |
| Frogspawn | pond frogs, 1 per frog per Night | Dew 2, Motion 1 |
| Shale | fossil layer | Loam 1, Ore 1, Ash 1 |
| Limestone | fossil layer | Loam 2, Salt 1 |
| Bone | fossil layer | Bone 2, Ash 1, Hush 1 |
| Old iron | keeper caches | Metal 2, Ore 1 |
| Fossil fern | fossil layer | Ash 1, Growth 1, Hush 1 |
| Journal page | keeper sites (destroys the page) | Memory 1, Mind 1 |
| Stone | crystal layer | Loam 2, Ore 1 |
| Crystal shard | crystal tile (yields 8) | Glim 3, Lift 2, Breath 1 |
| Glass lichen | crystal layer | Glim 1, Growth 1, Glass 1 |
| Wisp (bottled) | pond | Glim 4, Breath 2, Mind 1 (+1 permanent warp to distill) |
| Root chunk | roots | Root 2, Hush 1, Growth 1 |
| Root-bloom | roots, opens in dark | Dream 1, Glim 1, Hush 1 |
| Heartstone dust | Heart chamber floor | Abyss 1, Hush 2 |
| Whisperwheat (mutated Moonwheat) | flux garden | Mind 1, Hush 1, Breath 1 |
| Many-eyed frogspawn (mutated) | fouled pond | Hunger 1, Dew 1, Mind 1 |
| Hollow bark (mutated tree) | fouled tree | Shade 2, Hush 1, Echo 1 |
Synthesis only (found in no item): Mist, Vigil, Animus, Fetter, Dawn, Kindred. These are the compounds where deduction matters most, because the Separator (§6.1.4) can't be used on an essence you've never held.
6.1.3 Seeded recipe generation
- Process compounds in tier order (T1 → T4), each in a seed-shuffled order.
- For each compound, pick uniformly among pool options whose unordered pair isn't already used by another compound. If none is left, backtrack (it always succeeds; S05 ran 400 seeds).
- Validation: every compound is synthesizable from primals plus Taint, and pairs are unique. Gate compounds (Glass, Metal, Animus) always resolve to surface primals; pools guarantee this.
- Variety (S05, pool size 4):
- 400 / 400 seeds produce distinct graphs.
- Two random seeds share only 25% of their 24 recipes on average (pool size 3 gave 34%).
- The rarest pool option still occurs in 16% of seeds.
- Gate compounds' primal ancestry varies widely. For example, Metal needs Ember+Hush+Loam in 15% of seeds and Breath+Ember+Loam in 14%. So the early factory's essence chain differs per seed: one world wants dark Hush (nightshade, soot) for its pipes, another wants Breath (water, moonwheat).
6.1.4 Research actions
Every research action produces facts, and the Ledger (§15.4) records them automatically. Players deduce; the Ledger never deduces for them.
The Correspondence (D38). When a compound's glyph is first seen (in a distilled item, a blueprint's requirements, a clue, or an arranger's shelf), the Ledger shows its tier and its four candidate parent pairs. The puzzle is never "what could it be?" but always "which of these four is true in this world?". S05 showed that without visible pools the synthesis-only compounds cost 40–70 failed tests each: a grind, not a puzzle.
| Action | Where | Cost | Fact produced |
|---|---|---|---|
| Distill (first time per item) | Hand Mortar (75% yield) or Alembic (100%) | the item; flux 9 (mortar) / 18 (alembic) | "Item = {essences}". Unidentified compounds show as their glyph with a tier ring, and their Correspondence appears. |
| Crucible test A+B | Research Desk | 2 drams each of A and B | Success: "A+B = X", gives 2 drams of X, flux +90. If X was already known, it's still a success, just more X. Failure: "A+B = ∅" (that pair makes nothing in this world, so it's struck from every pool), flux +360 burst, essences lost. |
| Prism scan of X | Desk add-on (needs Glass) | 1 dram of X; +1 temporary warp for T1–T2, +1 permanent warp for T3–T4 (looking at deep things leaves a mark) | One primal colour from X's ancestry that hasn't been shown yet (D39). Repeated scans reveal more. A pool candidate whose ancestry lacks a shown colour is struck. |
| Separator on X | 2×2 instrument (needs Bone + Metal) | 4 drams of X, +3 temporary warp, flux +270 | "X = A + B" (definitive), gives 2 drams of A and 2 of B. Only for essences you hold. |
| Journal clue | keeper sites | reading time; sealed pages need Memory | Riddle-form clue (§13.3), usually about synthesis-only or deep compounds. Warped keepers' clues are false: shaky font, violet ink. |
| Whisperer statement | void entity (§6.5) | +1 temporary warp per whisper | "X is born of A" (a single-parent claim). True with p = 0.5 + W/200. |
| Arranger shelf | void entity | items get rearranged | On a shelf of jars it rearranges, a compound always ends up next to one of its parents. Always true. |
Research by the numbers (S05, 200 seeds, identifying all 24 compounds):
| Approach | Failed tests | Flux | Temporary warp | Permanent warp (deep scans) | Aha share (identified with no failed test) |
|---|---|---|---|---|---|
| Guessing (random candidate each time) | 24.3 | 10.9k | 0 | 0 | 31% |
| Thinking + Prism when > 2 candidates | 14.6 | 7.4k | 18 | 10.9 | 55% |
| Thinking + Prism when > 1 candidate | 12.4 | 6.6k | 28 | 14.1 | 69% |
| Thinking + Prism + 6 journal clues | 10.5 | 5.9k | 19 | 6.5 | 64% |
- Thinking saves half the failed tests. Exploration (clues) saves more, including half the permanent warp. Warp buys information, and deep scans cost permanent warp, which feeds the Become path. Guessing stays affordable for players who dislike puzzles.
- Where the difficulty lives: compounds you can hold are usually solved by 1–3 Prism scans. The six synthesis-only compounds (Mist, Vigil, Animus, Fetter, Dawn, Kindred) average about 1.4 failed tests each and are the boss puzzles: they must be reasoned out through the overlaps or found in journals.
- Deduction difficulty is stable across seeds (median 12, p90 16), so no seed is a dud.
Worked example (seed 7).
- Glass's Correspondence is {Ember+Loam, Glim+Loam, Ember+Glim, Ember+Breath}. Ansel's note says "never from breath", so 3 candidates are left.
- The player tests Ember+Loam and it fails: a violet puff that the hearth clears in about 30 s. Ember+Loam is now struck from Ore's and Ash's pools too.
- Glim+Loam succeeds. Glass is identified, and Glim+Loam is struck from Growth's and Salt's pools.
- Growth, held from a leaf, is left with {Dew+Loam, Dew+Glim, Hush+Loam}. One Prism scan shows Dew, a second shows Loam, so Dew+Loam is confirmed with no failed test.
- That strikes Dew+Loam from Salt and Ore. Salt is left with {Dew+Ember, Dew+Glim}, and Ore with {Hush+Loam, Breath+Loam}. In this world Ore is Hush+Loam, so its Metal needs Hush, and the player starts planting nightshade.
Identifying compound X means its full recipe is confirmed by a successful Crucible test or a Separator. Identification unlocks synthesis of X and every blueprint gated by X (§11). Identifying a T3 or T4 compound adds +2 permanent warp: knowing it changes you.
First research chain (tutorial, every seed): the note on the hearth table reads: "The alembic's bulb is cracked. Glass wants the fire, the dirt or the glimmer, and I never once got it from the breath. — A." Glass's Correspondence appears in the Ledger with Ember+Breath already struck, leaving 3 candidates. The player distills a log, soil and a glowfruit with the Hand Mortar and runs 1–3 tests (1 failure on average). Each failure teaches flux: a 360-mote burst makes a visible violet puff that the lit hearth (4 AE) clears in about 30 s. Success identifies Glass, unlocks the Glass Bulb, and repairs the alembic. This is Milestone 1's research chain.
6.1.5 Synthesis
An automated Crucible (§6.2) turns 1 A + 1 B into 1 X every 4 s. Flux per dram made depends on tier: T1 9, T2 18, T3 36, T4 72 (×9 since i2, §6.3.5). Deep essences are dirty to make.
6.2 Automation and logistics
6.2.1 Chores that become machines
| Chore (manual) | First machine | Later machine | Cost it introduces |
|---|---|---|---|
| Grinding items in the Hand Mortar (4 s each, 75% yield) | Alembic (6 s, 100%) | Alembic banks fed by golems | flux 2/item, Ember fuel |
| Carrying jars of essence | Essence pipes | Cisterns and valves | Metal, layout |
| Combining at the desk | Crucible | Crucible chains | flux by tier |
| Hauling items (logs, soil, ore) | Clay Golem routes | Bone and Glass golems, Bucket Lift | golems need light |
| Refuelling lamps (candles, lanterns) | Golem "refuel" waypoint | Ember Lamps on pipes → Wisp → Crystal → Dawn lamps | fuel, wisps, crystal (lift) |
| Digging out rooms | Auger | Auger arrays with spoil chutes | flux 36/tile, cracks in shale |
| Bailing water | Pond intake + pipes | Rain barrels → cisterns | water mass (sinks you) |
| Clearing flux by hand (planting silverleaf) | Vent | Scrubber (captures Taint) | vented flux comes back as rain; scrubbers cost Ember |
| Tending crystal for power | Crystal Tap | Tap rotation by golems; Lodestone Keel | crystal charge → lift |
6.2.2 Logistics rules
- Fluids (essences and water) move through pipes. A connected network carries exactly one fluid type. The type locks when the first fluid enters and unlocks when the network is empty for 5 s. If a second type tries to enter at a junction, that junction blocks (violet pilot), stops both flows and leaks 1 flux/s until it's fixed.
- Pipe network model: each network is a logistics graph, not a pressure sim. Sources (machine outputs, tanks set to "provide") feed sinks (machine inputs, tanks set to "request") at up to 8 drams/s per network. The nearest sink in pipe distance is served first, with ties broken by lowest tile index. A segment holds 4 drams, which is cosmetic and used only for the flow animation. No pumps are needed, and direction doesn't matter.
- Items never travel in pipes. They move by golem, chute (free, downward only), or Bucket Lift (upward, 2 items/s, Ember 1 dram/min per 10 tiles of height).
- Power: heat machines burn Ember drams per cycle. Machines within 6 tiles of a Crystal Tap run on Resonance and need no Ember (§6.7.3). After the Bind ending, Heartpower runs every machine on the island.
6.2.3 Machine catalogue
Sizes are in tiles (W × H). "Light" is what the machine emits (§6.4). Flux is per cycle unless marked /s.
| Machine | Size | Unlock | Build cost | Function | Rate | Ember | Flux | Light |
|---|---|---|---|---|---|---|---|---|
| Hand Mortar (tool) | — | start | — | manual distill (75% yield) | 1 item / 4 s held | — | 9/item | — |
| Research Desk | 3×2 | start | — | Crucible tests, Ledger | — | — | per test | — |
| Prism (desk add-on) | — | Glass | Glass 4, Metal 1 | ancestry scan | 1 / 3 s | — | 0 | — |
| Alembic | 2×3 | Glass (repair) / Metal+Glass (build) | Glass 4, Metal 6, plank 4 | distills from adjacent chest or golem drop; routes each essence to a matching pipe, otherwise to an internal tank of 16 per essence; stalls when a tank is full | 1 item / 6 s | 1 per 2 items | 18/item (1 AE) | warm 3 |
| Crucible | 2×2 | Metal | Metal 6, Glass 2 | A + B → X | 1 dram / 4 s | 1 per 4 drams | 9/18/36/72 per dram by tier | warm 2 |
| Pipe | 1×1 | Metal | Metal 1 → 4 pipes | carries one fluid | 8 drams/s per network | — | 0 | — |
| Valve | 1×1 | Metal | Metal 1 | on/off; golems or arrangers can toggle | — | — | 0 | — |
| Jar | 1×1 | Glass | Glass 2 | 64 drams; provide/request toggle | — | — | 0 | — |
| Cistern | 2×2 | Metal+Glass | Metal 4, Glass 4 | 512 drams | — | — | 0 | — |
| Chest | 2×2 | start | plank 4 | 16 item slots | — | — | 0 | — |
| Chute | 1×1 | start | plank 2 | items fall down to the container below | 4 items/s | — | 0 | — |
| Bucket Lift | 1×N | Motion+Metal | Metal 2 per tile | items go up | 2 items/s | 1/min per 10 tiles | 0 | — |
| Golem Workshop | 2×2 | Animus | plank 6, Metal 4 | builds golems | 1 golem / 30 s | — | 45 per golem | warm 2 |
| Auger | 2×2 | Motion+Metal | Metal 8, Motion 4 | drills a 1-wide tunnel (left, right or down), up to 24 tiles; outputs to chest or chute; no crystal unless fitted with a Crystal Bit (Lift 4) | soil 6 s, clay 8 s, shale 9 s, stone 12 s, crystal 20 s | 2 per tile | 36 per tile | warm 2 |
| Spoil Chute | 1×1 at the island edge | start | plank 2 | drops items into the void, removing their mass | 4 items/s | — | 0 | — |
| Vent | 1×2 | Metal | Metal 4 | pulls air flux within radius 4 and expels it to the off-island reservoir R | 15 AE | — | 0 | — |
| Scrubber | 2×2 | Salt+Metal | Metal 6, Salt 6 | pulls air flux within radius 4 and condenses it into Taint (90 motes → 1 dram). Stored Taint is a liability: it counts toward V (§6.5.1) | 10 AE | 1 per 2 Taint | 0 | — |
| Silverleaf planter | 1×1 | start (seed from shed) | soil | plant that eats flux within 2 tiles | 0.5 AE | — | — | — |
| Ward Stone | 1×2 | Vigil | stone 4, Vigil 4 | entities treat cells within 5 tiles as light 6; gives no light | Vigil 1 / 2 min | — | 0 | — |
| Crystal Tap | 1×1, next to a crystal tile | Lift+Spark | Metal 4, Glass 2 | Glim 1 dram / 10 s and Resonance within 6 tiles; drains the tapped crystal's charge 0.5%/min | — | — | 1.5 AE | cool 2 |
| Assembler | 2×2 | Metal+Animus | Metal 10, Animus 2 | crafts any known item recipe from chest and pipe inputs | 1 craft / 10 s | 1 per craft | 54/craft | warm 2 |
| Separator | 2×2 | Bone+Metal | Metal 6, Bone 6 | research (§6.1.4) | 1 / 10 s | 2 | 270/use | — |
| Lift Bladder | 1×2 | Lift | Glass 4, Metal 2, wisp | +30 lift; the wisp leaves if flux at the bladder > 150 for 30 s | — | — | 0 | cool 3 |
| Crystal Nursery | 1×1 seed | Dawn+Lift | shards 4, Growth 4, Lift 2 | planted in stone next to a crystal tile with charge ≥ 0.5; becomes a crystal tile after 2 Nights while cool light ≥ 4 and flux < 50 (stalls otherwise, no reset) | — | — | 0 | — |
| Lodestone Keel | 3×2 | Fetter | Metal 12, Fetter 6 | +200 lift while fed; starved → lift falls to 0 over 30 s | Taint 2/min, Ember 2/min | — | 3 AE | — |
| Root Stake | 1×1 | Vigil | Metal 1, Vigil 1 | stops root growth and shoving within 2 tiles | Vigil 1 / Night | — | 0 | — |
| Fetter Pylon | 2×3 | Fetter+Abyss | Metal 8, Fetter 6, Abyss 4 | Bind ending multiblock (§9) | Taint 0.5/min, Ember 1.25/min | — | 6 AE | violet 3 (flux-colored, gives no safety) |
Lamps (all 1×1; the hearth is fixed). Suppression capacity C is in AE: how many running alembics' worth of flux the lamp can clear (§6.3.6).
| Lamp | Unlock | Channel / level | Fuel | Suppression C (AE) | Fails when |
|---|---|---|---|---|---|
| Hearth (3×2) | start | warm 13 (embers 6) | 1 log / 6 min | 4 (embers 2) | never fully out |
| Candle | start | warm 5 | 1 candle / 4 min | 0.5 | rain unroofed, wind 3, out of fuel |
| Lantern (hung or held) | start | warm 9 (held 7) | 1 lamp oil / 8 min | 1.5 | rain unroofed, out of fuel, dimmers |
| Ember Lamp | Metal+Glass | warm 11 | Ember 1 dram / 60 s (piped) | 2 | rain unroofed, starved, dimmers |
| Wisp Lantern | Glass | cool 9 | a bottled wisp | 6 | wisp flees: flux > 300 for 60 s, or strain > 2 for 60 s |
| Crystal Lamp | Lift | cool 12 | 1 crystal shard / Watch (3 per Night) | 12 | starved |
| Dawn Lamp | Dawn | warm 10 + cool 10 | Dawn 1 dram / 5 min | 10 | starved |
Lamp oil is crafted at the workbench: Ember 2 + Salt 1 makes 2 oil. Candles: Ember 1 + Leaf 1 makes 3 candles.
6.2.4 Golems
Golems are uncanny little helpers. They turn their heads to watch you, and they stop at the edge of the dark and stand facing it.
| Golem | Unlock | Recipe | Speed (tiles/s) | Carry | Works where Ls ≥ | Flux | Notes |
|---|---|---|---|---|---|---|---|
| Clay | Animus | Clay 10, Animus 2, Growth 2 | 3 | 8 items or 16 drams | 3 | 0.1 AE moving | — |
| Bone | Animus+Bone | Bone 4, Animus 2, Hush 2 | 5 | 16 items | 1 | 0.1 AE | climbs without ladders |
| Glass | Animus+Lift | Glass 6, Animus 3, Lift 1 | 4 | 16 items or 32 drams | 2 | 0.1 AE | emits cool 3 (a walking lamp) |
| Root (post-1.0 layer) | Animus+Echo | Root 4, Animus 2, Echo 1 | 2 | 24 items | 0 (works in darkness) | 1 AE | wanders 1 tile off-route per 30 s; at W ≥ 40 it whispers |
- Chalk routes: with the chalk tool, place up to 6 waypoints. Each waypoint has an action: Take (filter, quantity), Give, Wait (seconds), or Tend lamps (refuel every lamp within 2 tiles from carried fuel).
- In darkness: a golem that reaches a cell below its light threshold stops and waits, facing the dark. After 60 s in darkness, an Arranger within 20 tiles may borrow it. The golem walks into the dark and comes back at the next Dusk-watch carrying a random item from a midden. It is never destroyed.
6.3 Flux
Simulated (i2). Every number in §6.3 comes from
docs/sims/S01_flux.py(tuning against five written targets) and is exercised in the coupled probeS09_emergence.py. The reference implementation isdocs/sims/fluxcore.py; the build must match it step for step (§20.5 test 3).
6.3.1 State and units
- Each cell holds an integer
fluxin millimotes (u32). Gameplay thresholds and all numbers in this document are in motes (1 mote = 1,000 units). - What the value means depends on the cell: air flux for air, absorbed flux for solid absorbent tiles, and dissolved flux for water.
- All transfers are integer floors, subtracted from the source and added to the destination,
so flux is conserved exactly apart from explicit sources and sinks:
Σ cells + R + suppressed + sunk + captured = emitted. - Why millimotes: S01 showed that with 1 unit = 1 mote,
floor()freezes every cell under 10–50 motes, and a 1 mote/s source rounds to 0 per step.
6.3.2 The unit of pollution: the Alembic-Equivalent (AE)
1 AE = 3 motes/s, which is one Alembic running flat out (18 flux per item, one item per 6 s). Every emitter and every sink in the game is quoted in AE, so a player can reason "this lamp keeps 6 alembics clean". S01 tuned the absolute scale: at 1 AE = 0.33 motes/s, a dark workshop could never reach the gleaner threshold.
6.3.3 Thresholds and effects
| Band | Motes | Air effects | Soil/water effects |
|---|---|---|---|
| Clean | 0–49 | none | none |
| Tinged | 50–149 | faint sparkle haze; gleaners may spawn in dark tinged cells; wisps won't spawn in water ≥ 50 | soil faintly veined |
| Fouled | 150–399 | drifting haze; arrangers and whisperers may spawn here; crystal next to it loses charge 1%/min; animal mutation exposure ticks | plants rooted here start to mutate (Turned) |
| Thick | 400–799 | light levels in the cell −2; golem actions take 2× as long; Clay golems refuse the cell | soil ≥ 250 (near its 300 cap) hollows plants; pond goes dark violet |
| Rift | 800+ | entities may spawn even if Ls is 1; the cell shows tear lines | — |
6.3.4 Update (5 Hz, every 4 ticks; pass order is fixed)
Rates are per-mille (‰) of the cell's flux per step.
- Emit: each emitter keeps a carry accumulator in thousandths of a unit, so sub-unit rates emit exactly over time.
- Gravity (flux is heavy), g = 60‰: each air cell sends
floor(f·60/1000)to the cell below if that cell is air or water. Water dissolves it. This is equivalent to a bottom-to-top scan on a snapshot. - Diffusion, pairwise, from one snapshot:
- air–air 100‰ of the difference;
- water–water 150‰;
- absorbent solid–solid 1‰ (about 4 tiles per Night).
- Absorption, 2‰: an air cell sends
floor(f·2/1000)into each absorbent solid below, left and right of it, up to the solid's cap. Caps: soil/grass 300, clay 150, shale 100, limestone 80, stone 50, root-wood 400. Crystal has cap 0 (it taints instead, §6.7). Plank, brick and glass are non-absorbent. Seep, 5‰: a solid above 80% of its cap sendsfloor(f·5/1000)into each adjacent air cell. Saturated ground gives flux back. - Dissolution, 4‰: air next to water (above or beside it) dissolves into the water.
- Wind, 30‰ × s: sky-exposed air (no solid anywhere above) shifts sideways in the wind direction, where s ∈ {0,1,2,3}. Flux blown off the grid edge goes to R.
- Off-island loss, 100‰: air cells more than 2 tiles outside the island hull send flux to the reservoir R.
- Light suppression (§6.3.6).
- Sinks: silverleaf, roots, scrubbers, vents, tide drain.
- Rain (during rain fronts):
- Scrub, 6‰: each sky-exposed air cell sends flux down its column to the ground (3%/s). Roofs pass it to the drip line, the nearest absorbent or water ground cell.
- Runoff, 4‰: each exposed absorbent ground cell sends flux one column toward its drain direction, the nearest drop to lower ground or off the island edge on either side. Tile slopes are terraces, so a pure neighbor comparison would strand flux on every flat run. A basin holds its flux, like a puddle.
6.3.5 Emission table (in AE; motes = AE × 3)
| Source | Emission |
|---|---|
| Broken shed alembic (start, until repaired) | 1.2 AE continuous |
| Alembic | 18 per item (1 AE at full speed) |
| Hand Mortar | 9 per item |
| Crucible synthesis | 9 / 18 / 36 / 72 per dram for T1 / T2 / T3 / T4 (0.75 / 1.5 / 3 / 6 AE at full speed) |
| Failed Crucible test | 360 burst |
| Separator | 270 per use |
| Auger | 36 per tile dug |
| Golem (moving) | 0.1 AE (Root golem 1 AE) |
| Crystal Tap | 1.5 AE |
| Assembler | 54 per craft (1.8 AE at full speed) |
| Golem Workshop | 45 per golem |
| Lodestone Keel | 3 AE |
| Fetter Pylon | 6 AE |
| Hollowed organism (§6.9) | 1.5 AE |
| Blocked pipe junction | 1 AE |
What S01 measured (dark, closed 6 × 4 shed on a soil floor, no lamp):
| Load | Tinged (≥ 50) at | Fouled (≥ 150) at | Thick (≥ 400) at |
|---|---|---|---|
| Broken alembic (1.2 AE) | 6.5 min | never in 30 min | never |
| 1 AE | 13.5 min | never in 30 min | never |
| 3 AE | 1.75 min | 9.5 min | 21 min |
| 6 AE | 0.75 min | 2.75 min | 8.5 min |
Soil under the shed is tinged by 3–6 min and sits at its seep threshold (240) by 30 min. The ground is a buffer: one machine's flux soaks into the floor, and the air only climbs once the soil saturates. Big machines overwhelm it at once.
6.3.6 Light suppression (the lamp budget)
Each lamp has a suppression capacity C in AE (lamp table, §6.2.3). That's C·3/5 motes per flux step.
Proportional, light-weighted removal. Each step, every air or water cell where the lamp's light is L ≥ 1 wants to lose
floor(f · 30‰ · L / level): 15%/s right at the lamp, falling linearly to nothing at the edge of its light. If the total wanted fits in the budget, every cell gets it. Otherwise every cell's share is scaled down to fit.- Why (S09): a lamp that simply erased all flux in its radius made factories perfectly clean until a sudden collapse, so lamp placement never mattered. With proportional removal, haze is graded, thicker in dim corners and at the edge of the light, and where a lamp hangs matters (S09 E5).
Strain = wanted ÷ capacity, as a 10 s EMA.
- Strain ≥ 0.8: the lamp flickers. It's working near capacity. This is a warning, not a failure.
- Strain > 2 for 60 s: it gutters. A Wisp Lantern's wisp flees and the lantern is left empty. A flame lamp loses 2 radius until strain < 1 for 30 s. Crystal and Dawn lamps never gutter; they only flicker.
Measured (S01 §3b, closed shed, lamp at ceiling centre, peak air in motes):
Load (AE) Lantern (1.5 AE) Wisp Lantern (6 AE) Crystal Lamp (12 AE) 1 peak 3 peak 3 peak 2 1.5 peak 3, flickers peak 3 peak 3 3 gutters in 1.5 min peak 6 peak 6 5–6 — peak 11–14, flickers peak 9–11 7 — wisp flees in 3.3 min peak 13 9 — wisp flees in 1.8 min peak 17 13 — — peak 53, flickers, holds A lamp at capacity shows faint haze and flickers. An overloaded lamp fails within 1–4 min, depending on the overload.
6.3.7 The reservoir: vented flux comes back
Vented and off-island flux accumulates in R. At the start of each rain front, 60% of R is deposited evenly over the drip-line ground cell of every island column. R decays by 5% per Night. Venting moves pollution in time and space: it never deletes it.
6.3.8 What the sims proved about flux
| Claim | Evidence |
|---|---|
| Flux pools in low caverns | S01 §3c: with no wind, 34% of an outdoor 3-AE source's flux ends up in a cavern 12 tiles down within 20 min, with the cavern floor at 20 vs the shaft at 6. |
| Wind decides where it goes | Wind toward the shaft: 36% goes into the pond. Wind away: 31% goes off the island to R, and only 7% reaches the cavern. |
| Rides the rain | S01 §3d: 4 min of rain leaves 4% of the sky-exposed airborne flux vs 18% without rain, washing it into the soil and pond. |
| Runoff carries it downhill | S01 §3e: one Watch of rain strips a terraced hillside garden from 27% to 1% of its flux, and 21% of it reaches the pond 20 columns away (pond mean 26 motes). Runoff also pours down open shafts into caverns. |
| Exact conservation | Every S01 and S09 run reports ledger = exact. |
6.4 Light and darkness
- Levels: two channels per cell, warm (0–15) and cool (0–15). Both are integers.
- Propagation: a breadth-first max-fill from each source. The level drops per tile entered by: air 1, glass 1, water 2, any solid 4. Background walls don't block light. The light map is recomputed incrementally in dirty regions, at most 10 Hz.
- Safety light
Ls = max(warm, floor(cool · 0.6)). Warm light is the strong deterrent and cool light the strong flux suppressor. This is a core strategic split (decision K3). - Moonlight: sky-exposed cells get cool light equal to the moon level by phase
[3,3,2,1,0,1,2,3]. Full moon gives Ls 1. It's mostly cosmetic but helps a little on bright nights. - Ward Stones set the entity pathing Ls to 6 within 5 tiles. They aren't light: golems, warp and flux ignore them.
- Real entities occlude light: each real void entity subtracts 2 from both channels in its own cells (min 0). Hallucinations don't. This is a deliberate tell (§6.6).
- Player in darkness: after 10 s with Ls < 2 at the player, temporary warp rises 0.1/s, the vignette closes and faint handwritten whisper fragments drift at the screen edge.
- Lamps go out because of: fuel running out; rain (unroofed open flames get a 20% chance per rain-minute); wind 3 (candles 10% per minute); guttering under flux strain; dimmers (§6.5); roots shoving the lamp's tile (§8.4); and tide submersion, which halves radius (§6.7.4).
6.5 Void entities (no combat)
They never touch the player. They take, rearrange, whisper and dim. Light
works as walls for them: an entity's navigation grid is every cell where Ls < tolerance.
They pathfind with a flow field from their target, recomputed when the light map changes.
6.5.1 Void Attention
V = (F_total + 90·Taint_stored)/3600 + R/7200 + 0.5·T_rows + W/10 + 2·N_hollowed (flux terms rescaled ×9 in i2 with the emission scale; stored Taint drams count at 90 motes each, so hoarding captured flux still draws attention)
F_totalis total flux on the island, in all cells.T_rowsis how many rows the tide has risen (§6.7.4).Wis player warp andN_hollowedthe number of hollowed organisms.
Spawning is checked every 30 s. While the summed cost of active entities is below floor(V),
one entity spawns, with its type weighted by the stratum spawn table. Hard cap: 12 active.
[UNSIM: S07 must confirm first-hour V gives 0–1 gleaners and mid-game V gives 4–8 entities.]
Spawn cell rules (all must hold): Ls = 0. Air flux ≥ the type's threshold: gleaners 50 (tinged), arrangers, whisperers and dimmers 150 (fouled) (D28), or the cell is under the tide. The cell is outside the camera view plus a 4-tile margin. Entities fade in over 3 s, and nothing ever appears on screen.
6.5.2 The four kinds
| Entity | Cost | Tolerance (moves where Ls <) | Speed | What it does | Leaves when |
|---|---|---|---|---|---|
| Gleaner (small, many-legged, low) | 2 | 3 | 2 t/s | Goes for the nearest container, machine item buffer, or ground item reachable by a dark path within 40 tiles (it prefers cells with flux ≥ 50). Takes one stack (≤ 16) and carries it to the nearest midden, a dark pocket ≥ 20 tiles from any light. If no midden is within 60 path-tiles, it drops the stack into the void. | after delivering; if light reaches it, it retreats along its path; if it's trapped in light it dissolves and drops what it carried |
| Arranger (tall, thin, folded) | 4 | 2 | 1 t/s | Stands next to a machine, pipe, valve or chest whose cell has had Ls < 2 for 20 s, then makes one arrangement: rotates a pipe connector, toggles a valve, swaps a Crucible or Assembler recipe for another known one, or reorders container slots so jars end up next to a parent (a research clue). It leaves a chalk spiral, and interacting with the spiral within 1 Night shows a ghost of the old state with Restore. Up to 3 arrangements, then it leaves. | after 3 arrangements; it dissolves if lit |
| Whisperer (a soft, faceless knot) | 3 | 3 | stationary | Spawns only in fouled+ cells. When the player is within 8 tiles with Ls < 4, it whispers every 20 s: +1 temporary warp and a statement "X is born of A", true with p = 0.5 + W/200. The statement appears as faint violet handwriting beside it, fades in over 1 s, and is copied to the Ledger as an unverified claim. At most 1 per 30 tiles. | it dissolves if its cell's Ls ≥ 3 |
| Dimmer (moth-like, wings of absence) | 5 | seeks Ls 1–3 | 1.5 t/s | Settles at the edge of a lit area and attaches to the light source contributing most there. Drains that source's level by 1 per 30 s, down to −4. Flame lamps burn fuel at 2× while it's attached. The hearth is immune. | it flees if its cell's Ls ≥ 4 (overlapping lamps) |
The Visitor (post-1.0 layer, §19.1; 1.0 keeps only the A08 deep-shape atmosphere): in a Deep-watch with V ≥ 20, there's a 25% chance; it never happens two Nights in a row. It's telegraphed 60 s ahead: water ripples, hanging lamps sway, Wick hides, and the stars below the island dim one by one. During its 90 s passage a vast shape crosses the void below and blots out stars. Entities move 1.5× faster, unwarded lamps lose 2 radius, and items on the ground in sky-exposed cells with Ls = 0 are taken into the void. It never does anything else.
6.5.3 Fairness rules (hard)
- No entity destroys tiles, machines or golems.
- Every theft goes to a visible midden when one is within reach. The Keeper's Log records it ("Something carried 14 Clay toward the deep."), and the map marks the midden with "?".
- Every arrangement leaves a chalk mark and can be restored for 1 Night.
- Nothing spawns in view, and nothing happens inside the hearth sanctuary.
- Every pressure can be predicted from the light, flux and tide overlays.
6.6 Warp
Warp W = P + T, capped at 100. P (permanent) comes from knowledge. T (temporary) comes from exposure.
Sources:
Source Amount Identify a T3 or T4 compound +2 P Distill a wisp +1 P Read a sealed journal page +2 P (once each) Touch the Heart +5 P (once per Night) Prism scan +1 T Separator +3 T Whisper +1 T Darkness exposure +0.1 T/s (after 10 s with Ls < 2) Eat mutated fruit +2 T Fall into the void +5 T Recovery: in the hearth's light (warm ≥ 10), −0.05 T/s (3 per minute). Sleep −10 T (once per Night). Silverleaf tea −5 T. Petting Wick −1 T (once per Night). P never goes down, except that it resets to 0 in the Mend endless mode.
Gifts (warp is also power):
- W ≥ 20, Sight I: flux haze shows at 2× density without the lens, and the Ledger shows Prism results for compounds you've already Prism-scanned in faint color on hover.
- W ≥ 40, Sight II: hovering a world tile shows its item composition without distilling it.
- W ≥ 60, Sight III: gleaners' intended paths draw as faint lines.
- W ≥ 80, Heart-sense: a faint compass to the Heart, and a preview of tonight's root movements.
Costs (hallucinations):
- W ≥ 20: peripheral flickers, shapes at the screen edge that always vanish when you look.
- W ≥ 40: Echoes, hallucinated entities, one per 3 min. They look identical to real ones.
- W ≥ 60: Echoes act out fake thefts and fake arrangements. Fake UI warnings appear (a fake crack warning, a fake "lamp out" icon), one per 5 min.
- W ≥ 80: false map features, such as a fake tunnel or a fake pipe link, and a second moon in the sky.
- W = 100: you black out and wake at the hearth one Watch later, with T reset to 0.
Telling real from false (a learnable skill). Hallucinations:
- don't occlude light (the lamp glow behind them doesn't darken);
- leave no wake in the flux overlay;
- don't appear in water reflections;
- are ignored by Wick the cat, who hisses and arches at real ones within 10 tiles;
- vanish while seen through the Clarity Lens (Mind + Glass; 10 s per use, costs 1 Glim);
- never appear in the Keeper's Log, which records only real events. The second moon has no reflection in the pond.
6.7 Buoyancy, tide and structure
6.7.1 Lift and mass
- Lift L = Σ (24 × charge) over crystal tiles + 30 per occupied Lift Bladder + 200 per fed Lodestone Keel.
- Mass M = Σ tile masses + machines (2.0 per footprint tile) + pipes (0.3) + golems (1.0)
- full water cells (1.0; partial cells pro rata) + stored items (0.01 each).
- Tile masses: grass/soil 1.0, clay 1.2, shale 1.4, limestone 1.5, stone 1.6, bone 1.2, crystal 2.0, root-wood 1.1, plank 0.4, brick 1.5, glass 0.6, heartstone 0 (it's the anomaly).
- Crystal charge (0–1, starts at 1): drops 1%/min next to air flux ≥ 150 and 0.5%/min per Crystal Tap. It recovers 0.5%/min while cool light ≥ 4 and flux < 50. A crystal tile under 0.5 charge renders violet (tainted).
6.7.2 Altitude
Equilibrium altitude
A_eq = 1000 + H · ln( (L/M) / (L0/M0) )fathoms, withH = 600.L0andM0are measured at world-gen, so every seed starts at exactly 1000.Actual altitude A relaxes toward
A_eqwith time constant τ = 10 real minutes:A += (A_eq − A) · (1 − e^(−dt/τ)).Preview: hovering a crystal with the pick shows "A_eq → value" before the 3 s hold-to-confirm.
Shape of the cost (crystal removed and nothing else changed, [UNSIM: S03]):
Crystal mined A_eq Tide rows 25% 827 0 40% 694 13 50% 584 27 (Heart chamber drowned) 60% 450 44 75% 168 79 (Roots drowned) 90% −382 147 The first quarter is nearly free. After that, every crystal costs more than the last.
Counterweights: jettisoning spoil (1,000 stone tiles ≈ +94 fathoms at mid-game mass); Lift Bladders (+30 each, so 20 wisps ≈ +35 fathoms, which is slow and clean); Crystal Nurseries (+1 crystal per 2 Nights, the Mend path); Lodestone Keels (+200 each while fed with Taint, the Bind path: you float on captured flux, so the factory must keep running).
6.7.3 Crystal Taps and Resonance
A Tap lets you use a crystal without mining it. It gives Glim 1 dram/10 s and Resonance power within 6 tiles (those machines need no Ember). The crystal's charge drains 0.5%/min, so a fresh crystal hits the 0.5 tainted threshold in 100 min and zero in 200 min. An untapped, clean, cool-lit crystal recovers. Rotating taps across crystals is sustainable and is a chore golems can take over. Mining a crystal instead gives 8 shards at once (Glim 24, Lift 16, Breath 8) and loses its 24 lift permanently.
6.7.4 The tide (the dark rising)
T_rows = clamp((800 − A) / 8, 0, ∞). The tide line sitsT_rowsabove the island's lowest tile.- Cells under the tide: light sources there have half radius (floor). Entity spawning
needs only Ls = 0, with no flux requirement. Flux drains into the void at 2%/s, which
raises V through the
T_rowsterm. Visually, a slow indigo fog covers them. - Foundering: at
A ≤ −700the tide covers the island. The run ends as Foundered (§9.4). It's telegraphed for hours by the depth ruler, the tide line, and the Keeper's Log.
6.7.5 Structure and integrity
Integrity (0–100) is computed per solid tile as a max-propagation from anchors: crystal (40 + 60 × charge), root-wood (70), heartstone (100), and placed support beams (100 when standing on a supported tile).
Propagation: a tile's integrity is the max over its neighbors of
neighbor − cost. The cost depends on direction and material, and a tile can't go above its material's maximum:Material Max Resting on (support from below) Horizontal Hanging (support from above) Soil / grass 60 0 12 20 Clay 70 0 10 15 Shale 50 0 16 25 Limestone 80 0 8 12 Stone 100 0 6 10 Root-wood 70 0 4 2 Plank 50 0 8 10 Brick 90 0 6 10 Support beam 100 0 2 2 This gives an unsupported span of about 10 tiles in soil, 6 in shale and 32 in stone.
Integrity ≤ 0: the tile cracks. You get 30 s of visible cracks and falling dust, then it falls as rubble. Rubble drops straight down and settles as a loose rubble tile on the first solid below, or leaves the island (removing its mass).
Detached region (no path to any anchor): the whole chunk shakes for 5 s, a log entry appears, then it falls as one piece. Everything on it is lost to the void, including machines. This is the harshest consequence in the game, and it's always preceded by visible cracks unless the player cut the last connection themselves.
Auger vibration: tiles within 2 tiles of a working Auger lose 5 integrity, which can crack shale.
Integrity is recomputed incrementally within 32 tiles of any change.
6.7.6 Tilt
θ = clamp(30° · (x_M − x_L) / W0, −15°, +15°), wherex_Mis the center of mass andx_Lthe center of lift.- |θ| ≥ 2°: lanterns sway, and water and air flux drift toward the low side
(
floor(f · |θ|/100)per step). - |θ| ≥ 5°: the pond spills over its low rim and the water is lost, rubble slides one tile per 2 s, and golems move 20% slower uphill.
- |θ| ≥ 10°: unanchored furniture and chests slide, loose items fall off the low edge, and you can't sleep.
- Rendering: the island stays grid-aligned and the sky rotates (ART_BIBLE §4.6).
6.8 Water and weather
Water is a cellular fluid with 0–8 levels per cell at 10 Hz. It falls if it can, then equalizes sideways. Water that leaves the hull falls into the void and is lost. It carries dissolved flux in proportion. Pond intakes (Metal 2) put up to 8 water drams/s into a pipe. Rain barrels (plank 4) collect 1 dram per 10 s per rain intensity, up to 64.
Weather states: Clear, Overcast, Rain (intensity 1–3), plus Mist and Gale as a post-1.0 layer (§19.1). Until then, transitions into Mist or Gale become Overcast. Transitions happen at Watch boundaries:
From \ To Clear Overcast Rain Mist Gale Clear 0.50 0.30 0.10 0.10 0.00 Overcast 0.20 0.30 0.35* 0.10 0.05 Rain 0.10 0.40 0.40 0.05 0.05 Mist 0.35 0.30 0.15 0.20 0.00 Gale 0.10 0.40 0.40 0.00 0.10 *During the Grey-watch the Overcast → Rain chance is 0.50, taken from Overcast → Overcast. The Watch rain chances quoted in §4.2 are approximate summaries of this table.
Rain: adds water to the top cells of sky-exposed columns (intensity 2 adds 1 level per column per 30 s). It scrubs air flux down to the ground (§6.3.3 step 10), deposits the reservoir (§6.3.6), and puts out unroofed flames.
Wind: direction ±1 and strength 0–3, re-rolled at each weather change. Gale is always strength 3. Wind moves surface flux, clouds and rain angles, and it can put out candles.
Mist: cool light radius −1 on the surface, and wisps spawn 2× as often.
6.9 Flora and fauna
| Organism | Where | Behavior | Products | Mutation (Turned → Hollowed) |
|---|---|---|---|---|
| Lantern Tree | surface, 1 per island | permanent | Log (chop a branch, regrows in 1 Night, 4 per Night), Leaf, Glowfruit (1/Night, cool 4 while on the tree) | Turned: Hollow Tree, bark with too many knots like eyes; gives Hollow bark. Hollowed: emits flux. |
| Moonwheat | crop | grows in 2 Nights; needs light ≥ 2 | Moonwheat | Whisperwheat (Mind, Hush); harvesting gives +1 T warp |
| Emberpepper | crop | 3 Nights; needs warm ≥ 4 | Emberpepper | Ashpepper: Ash instead of Spark |
| Silverleaf | crop/planter | 2 Nights; eats flux 0.5/s within 2 tiles | Silverleaf (tea: −5 T warp) | none (immune) |
| Nightshade | surface wild | opens only where Ls < 2 | Nightshade | — |
| Moths | surface air | drawn to warm light; harmless | Moth wing (net) | Hush-moths: harmless, but they look like dimmers (a deliberate ambiguity) |
| Frogs (3 at the pond) | pond | 1 frogspawn per frog per Night | Frogspawn | Many-eyed frogs: Many-eyed frogspawn |
| Wisps | pond | §6.9.1 | wisp (bottled) | they don't mutate; they flee |
| Bone moss | fossil layer | grows on bone in the dark; cool 1 glow | — | — |
| Fossil fern | fossil layer | static | Fossil fern | — |
| Glass lichen | crystal layer | grows on charged crystal; cool 2 glow | Glass lichen | dies if the crystal is tainted |
| Root-bloom | roots | opens only in darkness; cool 2 glow | Root-bloom | — |
| Wick the cat | house | §6.9.2 | — | never mutates, never harmed |
Mutation rule: each organism tracks exposure, meaning soil flux at its root cell (plants) or air flux at its body (fauna). Normal → Turned after 4 cumulative minutes at ≥ 150. Turned → Hollowed after 4 more minutes at ≥ 400. Turned organisms give their mutated products, some of them rare (Hollow bark is the earliest source of Echo). Hollowed organisms emit 0.5 flux/s and count in V. Mutation is reversible from Turned (2 Nights at < 50) but not from Hollowed. Cultivating a deliberate "flux garden" is a valid strategy.
6.9.1 Wisps
- They spawn at pond surface cells while the pond's average dissolved flux is < 50 and the pond has ≥ 8 water cells. Rate: 1 per 3 min (1 per 1.5 min in Mist). Cap: 1 per 8 pond cells, max 6.
- They drift within 6 tiles of the pond, flee air flux ≥ 150 (despawn), and like cool light.
- Catching one with the net takes a 1 s hold. Bottled wisps sleep inside Wisp Lanterns and Lift Bladders. A released wisp flies back to the pond.
- Wisp roads: a continuous chain of cells with cool ≥ 4 and flux < 50 from the pond to another body of water of ≥ 8 cells lets wisps migrate and spawn there too. This is how wisps reach the deep, and the Mend ending needs it (§9.1).
6.9.2 Wick
Wick wanders between the hearth and the player inside lit cells only (Ls ≥ 3), and sleeps by the hearth during the Deep-watch. Wick hisses and arches at real entities within 10 tiles and ignores hallucinations. At W ≥ 80, Wick won't leave the hearth. Petting gives −1 T warp once per Night. Wick can't be harmed, taken or mutated. Wick is the game's promise that some warmth is unconditional.
7. System interaction matrix
Read across: how the row system affects the column system.
| ↓ affects → | Flux | Light | Water | Buoyancy/Structure | Life | Entities | Warp | Weather | Automation | Research |
|---|---|---|---|---|---|---|---|---|---|---|
| Flux | sinks, pools, diffuses | strains lamps; thick flux −2 levels; wisps flee lanterns | dissolves in; pond goes dark | taints crystal → lift loss | mutates plants and fauna | attracts; sets spawn cells | — | rides the reservoir into rain | blocks Clay golems; junctions leak | failed tests make flux; Taint is captured from it |
| Light | suppresses (budgeted) | — | — | cool light recharges crystal | crops need it; nightshade needs dark | walls; dissolves whisperers | darkness raises T | — | golems need it | — |
| Water | carries dissolved flux | −2 per tile | flows | adds mass; spills on tilt | wisps and frogs live in it | — | — | — | pond intake; rain barrels | Dew source |
| Buoyancy/Structure | tide drains flux; collapses release absorbed flux | tide halves radius | tilt spills the pond | — | collapses can drop the garden | tide adds spawn cells and V | — | — | collapses drop machines | — |
| Life | silverleaf eats it; hollowed emit it; roots eat it | glowfruit, lichen, blooms glow | — | roots are anchors | — | hollowed add V; Wick detects | mutated fruit +T | — | wisps power lamps and bladders | mutated products are rare essences |
| Entities | real ones leave a wake (tell) | dimmers drain lamps; occlude light | — | — | — | — | whispers +T | — | gleaners steal; arrangers re-wire; golems get borrowed | arrangers and whisperers give clues |
| Warp | Sight I shows it | — | — | — | — | +V; Echoes | — | — | fake warnings waste time | Sight II and truer whispers |
| Weather | rain scrubs air → soil and pond; wind moves it | rain and wind put out flames; mist −1 cool | rain fills the pond | rain adds water mass | rain waters crops; mist doubles wisps | the Visitor rides the Deep-watch | — | — | barrels fill | — |
| Automation | the main source; scrubbers capture | lamps and golems carry light | intakes | augers crack; mass; keels lift | — | containers are targets | — | — | — | Separator, Prism, Alembic |
| Research | tests burst flux | unlocks lamp tiers | — | unlocks keels, nurseries, bladders | unlocks planters | unlocks wards, lures, stakes | T3+ +P | — | unlocks machines | — |
Feedback loops and what the sims showed (S09, docs/sims/S09_emergence.results.md; a
64 × 72 island slice running flux, lamps, the pond and wisps, weather, crops, crystal charge,
vents and scrubbers together; nothing scripted):
- Factory runaway: proven, with a tipping point and hysteresis. Two Wisp Lanterns (12 AE) uphill of the garden hold through 12 AE. At 13 AE they collapse after 43 min. At 14+ AE they collapse in 2–3 min, flux rolls down the slope, the pond fouls in 9–12 min, crops turn, and V jumps from 1.8 to 28–37. Path dependence: a base that ran one Night at 16 AE and was then torn back to 8 AE stays collapsed (pond 1,569 motes, lanterns empty, 4 crops turned), while the same base at 8 AE throughout stays clean. The saturated ground keeps seeping, and re-lit lanterns flee again. Design consequence: a gradual expansion is safe, a sudden one can lock the base in a fouled state, and recovery needs scrubbing or time, not just switching machines off.
- Rain return: proven. With a vent, the workshop stays spotless, but garden soil jumps at exactly minutes 24, 48 and 64, which are the three rain-front starts. The pond fouls at the first front and 2 crops turn by Night 3. Doing nothing fouls the pond more slowly (42 min, via the door and runoff). A scrubber keeps everything clean, which revealed a dominant strategy that i2 fixed (scrubber nerf plus stored Taint counts toward V, §6.2.3, §6.5.1).
- Sinking spiral: partly proven. An over-built factory in the crystal cavern taints the crystal around it: A_eq drops 44 fathoms in 3 Nights without mining a single crystal. The tide feedback awaits S03.
- Clean-pond loop: proven as the stable branch of loop 1. Below capacity, lanterns keep the pond clean, the pond keeps spawning wisps (6 at the end of every stable run), and the player can always refill. A chronic leak still matters: even a healthy 8-AE workshop uphill tinged the pond (66 motes) over 3 Nights.
- Root regulation: not yet modelled. Pending S09-roots (Roots stratum).
Layout decides what fails (S09 E3). The same over-built factory (8 AE on a 6-AE lantern) fails differently by site:
| Site | First failure | Then | Gleaner-eligible cells | Crystal A_eq |
|---|---|---|---|---|
| Uphill of the garden | lantern lost at 26 min | pond fouled at 42 min | 109 | −14 |
| Downhill, next to the pond | pond fouled at 5 min | lantern lost at 15 min | 8 (the pond swallows it) | 0 |
| Deep crystal cavern | lantern lost at 6 min | — | 118 | −44 |
The same machine count hits the wisps, the entities, or the island's buoyancy depending only on where it was built. That's the "factory layout shapes where corruption collects" promise, measured.
Survey (S09 E4). 24 random bases built near their limits gave 11 stable, 7 pond-first and 6 lamp-first failures, at times from 1 to 68 min. Lamp placement (E5): the same two lanterns let between 112 and 277 motes leak out of the door depending on where they hang.
8. Strata
8.1 Surface (d 0–11) — "The Hearth"
- What's there: the house, hearth, shed, garden, pond, Lantern Tree, Wick, moths, frogs, nightshade, and topsoil with clay pockets. Moonlight and weather apply.
- New mechanics: the first research chain (Glass), the Alembic, lamps and fuel, wisps, flux leaking and sinking into soil, gleaners, rain.
- Pacing: 0:00–1:30. Signature moment: lighting the shed so the thing in the dark can't come back in.
- Ends when the first shaft breaks into the fossil layer and you find the first skeleton's hand still holding a lantern.
8.2 Fossil layer (d 12–49) — "The Ossuary"
- What's there: shale (brittle) and limestone, bone inclusions, fossil ferns and bone moss. 3–4 keeper sites: a skeleton, a journal (8 pages), a tool cache (old iron, a bone pick), and a broken machine you can repair. Natural pockets of air are pitch dark, with no moonlight.
- New mechanics: structure (shale spans are short, so beams matter), golems (Animus is the second big puzzle), journals and clues, the Separator, arrangers and whisperers, middens, Hush and Bone essences.
- Pacing: 1:30–4:00. Signature: following a dead keeper's chalk route to their last room.
8.3 Crystal layer (d 50–99) — "The Keel"
- What's there: stone with crystal veins and geodes, 380–460 crystal tiles concentrated toward the center. Glass lichen glows on charged crystal, so this layer has its own cool ambient light where crystal is exposed.
- New mechanics: buoyancy and the depth ruler, taps and Resonance, crystal lamps, augers for bulk digging, lift bladders, spoil jettison, tilt, dimmers, and the Visitor.
- Pacing: 4:00–9:00, the factory boom. Signature: watching the equilibrium needle dip as you hold the pick on your first crystal.
8.4 The Roots (d 100–149) — "The Underlung"
- What's there: root-wood tiles (living, anchors, flux sinks at 0.3 AE per tile in contact), root-blooms, and middens tend to form here.
- Root behavior: during each Deep-watch, every root tip (a root tile with exactly one
root neighbor) takes up to 3 growth steps, one every 2.5 min. Each step picks the
neighboring cell with the best score:
+flux/100 − Ls·2, where a non-root solid scores −5. A step into a cell holding a pipe or a 1×1 machine shoves it one tile along the growth direction. If it can't move, it disconnects and leaks 1 flux/s at the joint. A step into air or soil converts that cell to root-wood. Roots never enter cells with Ls ≥ 6 or within 2 tiles of a Root Stake. - New mechanics: living terrain, root management (stakes, and feeding them flux on purpose), and the Root, Dream and Echo essences.
- Pacing: 9:00–13:00. Signature: coming down after the Deep-watch and finding your pipe run bent into a curve that points at the Heart.
8.5 The Heart (d 150–D) — "The Seed"
- What's there: the Heart chamber, a 22 × 12 pre-carved cavity with a heartstone floor. The Heart sits in the middle: 8 × 8 tiles, an enormous seed that is half crystal, half root. It pulses with an inverse light: a ring of darkness at −3 levels within 6 tiles that breathes on a 12 s cycle. All three ending archetypes have left remains here: a Gardener's dried pool with empty wisp jars, an Engineer's four broken Fetter Pylons, and a Scholar's skeleton curled against the Heart.
- New mechanics: the ending accumulators (§9), heartstone dust (Abyss), and touching the Heart (+5 P).
- Pacing: 13:00–18:00. Signature: the chamber reading your island back to you.
9. Endings (earned through play)
When the player first touches the Heart, its three accumulators become visible through Heart-sense (W ≥ 80) or the Heart's Stethoscope (Mind + Metal), as three slow pulse rhythms. Each accumulator fills only while the world is in a specific sustained state. There is never a menu, a prompt or a dialogue choice. The states exclude each other: Mend needs the chamber lit and clean, Bind fills it with pylon flux, and Become needs it dark.
9.1 Mend — "Dawn"
- Accumulates +1 per minute while all of these hold:
- every Heart-chamber cell has Ls ≥ 6 (Dawn Lamps are the practical way to get there);
- maximum air flux in the chamber is < 50;
- island total flux
F_total < 15,000motes; - a continuous chain of cells with Ls ≥ 3 runs from the hearth to the chamber (the lantern path);
- at least 6 wisps live in the chamber, which needs a Kindred Pool (a ≥ 8-cell water body treated with Kindred 10) and a wisp road down to it.
- Decays −2 per minute when any condition fails. Completes at 180.
- Result: dawn breaks. The sky blends into the dawn range of the palette, the island becomes a living world, and the void entities retreat to the deepest dark.
- Endless mode (Day): sky-exposed cells count as Ls 8. Entities exist only below d = 50. P warp resets to 0. New goals: re-grow crystal and turn tainted ground into gardens.
9.2 Bind — "Unending Night"
- Accumulates +1 per minute while 8 Fetter Pylons surround the Heart (each within 10 tiles of it), and each one is fed Taint ≥ 0.5 dram/min and Ember ≥ 1.25 dram/min (about 4 Taint and 10 Ember per minute in total). Decays −1 per minute per starved pylon. Completes at 240.
- Result: the Heart is harnessed. Heartpower runs every machine on the island without Ember. Night stays.
- Endless mode (Engine): the pylons must be fed forever. If they're starved for 10 minutes, the binding slips (−1 per minute) and V grows by +5 per Night. The factory must grow.
9.3 Become — "The New Heart"
- Triggers when W ≥ 90 with P ≥ 60, and the player stands still for 3 continuous minutes within 2 tiles of the Heart while every chamber cell has Ls = 0. To get there you have to put out every lamp in the chamber yourself.
- Result: the player lies down. The screen holds on the dark, and the cat's silhouette waits at the top of the shaft.
- Endless mode (Succession): a new keeper wakes at the hearth on the same island, a century later. Lamps are out, pipes are cracked (each pipe segment has a 50% chance to be broken), golems are fossilized and repairable, and the player's own skeleton lies at the Heart. The Ledger keeps what you learned, and the essence recipes stay the same. The old keeper's auto-journal (§13.4) is scattered as journal pages.
9.4 Foundered (failure, not an ending choice)
At A ≤ −700, the night takes the island. A Keeper Record is saved: name, Nights survived, the auto-journal, and the layout of one chosen room. It can appear as a fossil-layer keeper site in future new worlds (§12).
9.5 Why it lands
The three keepers you've been reading about all made one of these choices, and their remains are in the chamber. By the time you arrive, your island already leans one way: low flux and wisps (you were careful), a deep Taint economy (you built the engine), or high warp (you wanted to know). The ending you reach is the one you've been living, and then you get to keep living it.
10. Key decisions
| # | Decision | When | Tradeoff | Skill tested |
|---|---|---|---|---|
| K1 | Mine or tap a crystal | crystal layer onward, constantly | mining gives 24 Glim and 16 Lift now and loses lift forever; tapping trickles and is recoverable but leaks flux and needs rotation | resource timing, discounting |
| K2 | Vent or capture flux | from the first Vent | venting is free now, and it comes back with every rain front across the whole surface (S09 E2: garden jumps at each front); scrubbing costs Ember and the captured Taint draws attention until it's spent (Keels, Fetter) | delayed-consequence reasoning |
| K3 | Warm or cool light for an area | every new room | warm keeps entities out but burns fuel and barely suppresses flux; cool scrubs flux but is a weak deterrent and costs wisps or crystal | reading the threat type of an area |
| K4 | Where to site a machine | every build | flux sinks, so machines placed high poison everything below; near the pond kills wisp spawns; near roots feeds them and gets your pipes shoved | spatial planning |
| K5 | Jettison or keep spoil | every dig | jettison raises altitude; keeping gives building stone and mass for later | buoyancy economics |
| K6 | How to research a compound | each unknown | Crucible tests cost flux, the Separator costs warp, whisperers cost warp and might lie, journals cost exploration | information value under cost |
| K7 | Distill a wisp | whenever wisps are caught | cheap Glim and Mind now plus 1 P warp, against a lamp, a bladder, or Mend progress | short- vs long-term, values |
| K8 | Cultivate or purify mutation | from the first fouled soil | flux gardens give rare essences (Echo, Mind, Hunger); purifying keeps V low and protects the pond | managed risk |
| K9 | Sleep or work the Deep-watch | every Night | sleep clears T and skips danger (but the sim runs); working gets root and Visitor windows and whisperer clues, at a warp cost | tempo, risk appetite |
| K10 | Dig fast or dig safe | every shaft | a straight shaft is quick but shale ceilings need beams every 6 tiles; augers are fast but vibrate and crack | structural reading |
| K11 | Mine symmetrically | crystal layer | the closest crystals may be on one side; tilt spills the pond and slides chests | spatial balance |
| K12 | Golem routes vs lamp coverage | logistics | longer, lit routes or more lamps (fuel, wisps, crystal); Bone golems work at Ls 1 but need Hush and Bone, while Glass golems carry their own light but cost Lift | network design |
| K13 | Cut, stake or feed roots | Roots stratum | stakes cost Vigil every Night; feeding roots flux cleans the air but grows them into your factory | managing living systems |
| K14 | Push deep research (T3/T4) | mid-to-late game | permanent warp brings Sight and Heart-sense, plus hallucinations and the Become pull | self-management |
| K15 | Water management | rain events | barrels and cisterns supply water and add mass; the pond needs a clean catchment | resource and flux routing |
| K16 | Respond to a warning or ignore it | W ≥ 60 | checking a fake warning costs time and warp (darkness); ignoring a real one costs items or a collapse | perception, tells |
11. Progression and unlocks
| Stage | Depth gate | Research gate | Unlocks |
|---|---|---|---|
| Start | — | — | Hand Mortar, Research Desk, Chest, Chute, Candle, Lantern, Spoil Chute, Silverleaf planter, ladders, planks, workbench |
| Glass | — | Glass | Alembic repair, Wisp Lantern, Jar, Prism |
| Metal | Old iron or Ore synthesis | Metal | Pipes, Valves, Crucible, Ember Lamp (+Glass), Alembic (new), Vent, Pond intake |
| Animus | — | Animus (+ Motion) | Golem Workshop, Clay Golem |
| Motion + Metal | — | Motion | Auger, Bucket Lift |
| Fossil | d ≥ 12 | — | Bone, keeper journals, old iron caches |
| Bone | fossil | Bone | Bone Golem, Separator (+Metal) |
| Salt | — | Salt | Scrubber (+Metal), Silverleaf tea |
| Vigil | — | Vigil | Ward Stone, Root Stake |
| Mind | — | Mind | Clarity Lens (+Glass), Heart's Stethoscope (+Metal) |
| Hunger | — | Hunger | (essence only: a parent of Dream and Abyss) |
| Crystal | d ≥ 50 | — | crystal shards, Glass lichen |
| Lift | crystal | Lift | Crystal Lamp, Lift Bladder, Crystal Tap (+Spark), Glass Golem, Crystal Bit |
| Roots | d ≥ 100 | — | Root chunk, Root-bloom |
| Root | roots | Root | (essence only: a parent of Echo and Kindred) |
| Memory | — | Memory | sealed journal pages |
| Echo | — | Echo | Echo Bell (shows every real entity on the map for 60 s); Root Golem is post-1.0 |
| Dawn | — | Dawn | Dawn Lamp, Crystal Nursery (+Lift) |
| Fetter | Taint captured | Fetter | Lodestone Keel, Fetter Pylon (+Abyss) |
| Heart | d ≥ 150 | — | heartstone dust, Stethoscope readings |
| Kindred | — | Kindred | Kindred Pool |
| Abyss | — | Abyss | Fetter Pylon |
Hour targets [UNSIM: S06 pacing sim]: Glass by 0:20, Alembic running by 0:25, Metal and pipes by 1:15, Animus and golems by 2:30, first crystal by 4:30, Roots by 9:00, Heart by 13:00, first ending 15–20 h.
12. Replayability and seeds
What differs across seeds, and why it matters:
- The essence recipe graph (§6.1.3). S05: every seed's graph is distinct, two seeds share only 25% of recipes, and the gate compounds' primal needs vary. Each run's research is a fresh deduction puzzle, and your factory's production chains differ. If Vigil is Spark+Glim, wards come early; if it's Spark+Shade, it needs Hush, and wards wait for the dark.
- Island shape: W0, depth, profile noise, crystal distribution (veins vs geodes, centered vs lopsided, which affects tilt), fossil pockets, root seeds, pond size.
- Keeper sites: which lesson keepers appear (2 of the Digger, Wanderer and Miner) and where, plus seeded clue content and which keepers' clues are false.
- Weather bias: wind prevailing direction and rain frequency (±30%).
- Charters (optional modifiers chosen at world creation, inspired by Against the Storm): Heavy Keel (−25% crystal), Old Pond (pond ×2, wisp cap 10), Restless Roots (root steps ×2), Thin Night (V ×1.25, more clues from whisperers), Lost Ledger (no first note; Correspondences stay hidden until a journal page reveals each one, the hard mode S05 shows costs 10–20× more failed tests), Inheritance (start with a Keeper Record site).
- Endings: three structurally different builds (clean wisp roads, a Taint engine, or a warp descent).
- Keeper Records: foundered or Become runs leave the player's own keeper in future worlds.
13. Narrative delivery
No cutscenes. The story is told through:
13.1 Keepers (6 total; the Heart chamber always shows the three ending archetypes)
| Keeper | Archetype | Where | What their pages teach |
|---|---|---|---|
| Ansel | Gardener (Mend) | the first note on the hearth table; the Heart pool | wisps, the pond, light; Glass pool hint |
| Tamsin | Engineer (Bind) | a fossil-layer workshop; the pylon ruins | flux capture, Taint, Metal |
| Ilse | Scholar (Become) | sealed pages (Memory); her skeleton at the Heart | warp, hallucination tells, deep compounds |
| Odo | Digger | under a collapse in shale | structure, beams (some of his clues are false: he was warped) |
| Bram | Wanderer | at the island's edge, under a broken rope ladder | darkness, middens, the Visitor |
| Merrit | Miner | tide marks scratched into the crystal-layer walls | buoyancy, the tide, taps vs mining |
Each seed places Ansel, Tamsin and Ilse plus 2 of Odo, Bram and Merrit.
13.2 Environmental storytelling
Skeleton poses, a dead keeper's chalk routes still on the walls, the broken machines, tide-line scratches, and distant islands whose window lights go out one by one over the Nights (pure storytelling; one goes dark every 3 Nights).
13.3 Clue templates (seeded content)
- "Where {A} lies down with {B}, {X} wakes." → A+B = X (true or false by keeper).
- "{X} remembers {A}." → A is a parent of X.
- "I never got {X} from {A}. Not once." → A is not a parent of X.
13.4 The Keeper's Log (auto-journal)
The game writes short handwritten lines when real events happen: first wisp, first theft, first crack, tide milestones, and so on. It's diegetic feedback and one of the tells (hallucinations are never logged), and it becomes the next keeper's journal.
14. The first hour (systemic, not scripted)
| Time | What happens | System that causes it |
|---|---|---|
| 0:00 | Wake by the hearth at embers. Wick on the rug. A note on the table. | start state |
| 0:01 | Chop a branch, feed the hearth: the house blooms warm (6 → 13). | hearth fuel |
| 0:03 | Step outside. Rain-dark grass, the moon, the shed in shadow, a faint violet shimmer at its door. | broken alembic leaking 0.4/s |
| 0:05 | A wisp rises from the pond. Net it, hang it in the empty lantern by the path: cool light. | wisps |
| 0:08 | Read the note (Glass pool). Grind a log, soil and a glowfruit in the mortar. | research |
| 0:12 | Crucible tests: one fails with a violet puff, the next succeeds and Glass is identified, with a ring of cool light. | research, flux |
| 0:18 | Craft a Glass Bulb and repair the alembic. The leak stops; now it distills from its chest. | first automation |
| 0:25 | Alembic running. Haze collects in the soil under the shed. | flux sinks and absorbs |
| 0:32 | Deep-watch. Wick stares at the dark shed corner and hisses. Next morning a chest is missing 8 Clay, and the Log says "Something carried Clay toward the deep." | gleaner (shed is dark plus flux) |
| 0:38 | Hang a lantern in the shed. The gleaner's path closes. | light as walls |
| 0:45 | Rain front. The haze goes, the soil darkens, a wisp doesn't come back to the pond. | rain scrub, deposit, pond flux |
| 0:50 | Dig under the garden. Clay, roots, then a tool cache with old iron (Metal) and a page. | digging, caches |
| 0:58 | The shaft hits shale. A fossil hand still holds a rusted lantern. | fossil layer hook |
Hook: you have a machine, a mystery, and proof that your choices shape where the dark comes from. [UNSIM: S06 must show this hour's chores and timings are reachable; playtest at M1.]
15. UI/UX and legibility
15.1 HUD (diegetic where possible)
- Hotbar at the bottom: 10 slots, 16 × 16 each.
- Depth ruler on the right edge: a brass gauge showing altitude A, a ghost needle for A_eq, the tide line, and the Founder mark.
- Warp sigil at the top left: an eye that opens in 5 stages, with the P part drawn as a solid iris ring.
- Watch and moon at the top right: the moon phase icon plus a 3-segment watch arc.
- Keeper's Log at the bottom left: three lines of fading handwriting.
15.2 Lenses (hold a key or toggle; all palette-locked overlays)
- Flux lens (F): a heat map in the R4 ramp with contour lines at 50/150/400/800, plus arrows for the net flux direction per 4 × 4 tile block.
- Light lens (L): warm/cool areas outlined, Ls shown as stepped contours, and dark paths: dotted lines along the routes entities could take to each container (they turn red-violet when a path exists).
- Structure lens (S): integrity as stone ramp shades, with cracking tiles blinking.
- Buoyancy lens (B): crystal tiles colored by charge, the tide line, and a preview of the center-of-mass vs center-of-lift.
- Map (M): 1 pixel per tile for the whole island, with any lens overlaid; middens "?", chalk spirals, lamp status.
15.3 Without lenses
Flux shows as haze density, light as the light itself, strain as flicker, integrity as cracks, altitude as the ruler and the sky. The reservoir R shows in the clouds: cloud layers swap R1 shades for R4 shades in proportion to R (one cloud band per 2,000 motes, up to all of them), so the player watches vented flux gather overhead before it rains. When a front deposits, the Keeper's Log writes "The rain tasted of the vent." Every important state has a non-lens signal.
15.4 The Ledger (research UI)
A book with one page per essence, plus a spread-out Correspondence board.
- Essence page: glyph, tier ring, which items contain it, Prism colour bands revealed so
far, and its four candidate pairs. Each candidate shows the facts that touch it:
- ✗ when that pair was tested and makes nothing;
- "✓ is Glass" when that pair is confirmed as another compound's recipe;
- a dimmed swatch when a revealed Prism colour rules it out.
- Player marks: the player crosses out, circles or stars candidates. The Ledger records facts and displays them where they apply, but it never draws a conclusion: it won't strike a candidate just because the facts imply it.
- Correspondence board: all seen compounds as a grid of their candidate pairs, with shared pairs linked by thin ink lines. This is where the overlaps that make the puzzle become visible (Dew+Loam links Growth, Salt and Ore).
- Pair grid (M5, cuttable): a 7 × 7 (primals plus Taint) and, later, a compounds grid of every pair ever tested.
15.5 Machine status (pilot lights; shape and color both encode state)
Steady amber: working. Blinking amber at 1 Hz: starved of input. Steady cyan: output full or blocked. Blinking violet: flux-strained or error. Dark: off.
15.6 Visual-first feedback (hard rule)
No information is ever carried by sound alone. Every warning, tell and telegraph in this document has a visual form: lamp stutter, dust, shaking, handwriting, Wick's pose, the Log. That makes the audio deferral (§16) safe, and it's also an accessibility guarantee.
15.7 Accessibility
Every color code is doubled with shape or blink. Hallucinations can be turned off in options (the game then logs "Echo (hidden)" instead), and turning them off disables the Become ending's Sight bonuses. No flashes faster than 3 Hz. Screen shake is at most 1 px.
16. Audio direction (brief) — DEFERRED
Owner decision (after i1): skip audio for now. Audio is out of scope for M0–M5, no milestone or acceptance test depends on it, and the design loop doesn't spend iterations on it. The game must be fully playable and readable silent (§15.6). The notes below are kept only as future direction. The build should leave a no-op
audioevent hook (sim events likelamp_strain,crack,whisperandvisitor_telegraphalready exist for the Log), so sound can be added later without touching the sim.
- Cozy bed: music box and harmonium motifs, the hearth crackle, rain on the roof, the pond's frogs. Near the hearth the mix is warm and close.
- Machines: soft clockwork, glass bubbling and gentle hisses, tuned to one key (D minor pentatonic) so a factory hums in tune.
- Dread layer: a low drone whose volume follows local flux and whose detune follows warp. Whispers are panned toward their source. Structural creaks are directional. The Visitor is a sub-bass swell with no attack.
- Rules: no stingers or sudden loud sounds; every new sound fades in over at least 300 ms. Under the tide, a low-pass filter makes everything muffled.
- Production: procedural and synthesized sources (oscillators, filtered noise, granular rain), recorded in-house or CC0 only, with each CC0 file justified in DECISIONS.md.
17. Tuning parameters (starting values)
All values are hand-derived for iteration 1. Sim column names the simulation that must confirm them.
| Parameter | Value | Unit | Sim |
|---|---|---|---|
| Sim tick | 20 | Hz | — |
| Night length | 24 | min | S06 |
| Flux step rate | 5 | Hz | S01 ✓ |
| Flux unit | 1/1000 mote (u32) | — | S01 ✓ |
| 1 AE (alembic flat out) | 3 | motes/s | S01 ✓ |
| Flux gravity | 60 | ‰/step | S01 ✓ |
| Flux air diffusion | 100 | ‰/step pairwise | S01 ✓ |
| Flux soil absorb / soil diffusion / seep | 2 / 1 / 5 (above 80% cap) | ‰/step | S01 ✓ |
| Soil caps (soil/clay/shale/lime/stone/root) | 300/150/100/80/50/400 | motes | S01 ✓ |
| Water dissolve / diffusion | 4 / 150 | ‰/step | S01 ✓ (S08 for moving water) |
| Rain scrub / runoff | 6 / 4 | ‰/step | S01 ✓ |
| Reservoir deposit / decay | 60 per front / 5 per Night | % | S09 (E2) |
| Flux thresholds | 50/150/400/800 | motes | S01 ✓ |
| Gleaner / arranger+whisperer spawn flux | 50 / 150 | motes | S01 ✓ (D28) |
| Plant Turned / Hollowed soil flux | 150 / 250 | motes | S09 |
| Lamp strain flicker / gutter | 0.8 / 2 for 60 s | — | S01 ✓ |
| Wisp Lantern suppression | 6 | AE | S01 ✓ (holds 6, fails at 7) |
| Crystal Lamp suppression | 12 | AE | S01 ✓ |
| Alembic flux | 18 | /item | S01 ✓, S06 |
| Failed test burst | 360 | motes | S05 |
| V formula weights | 1/3600, 1/7200, 0.5, 1/10, 2 (flux terms rescaled ×9 with emission) | — | S07 |
| Entity costs (G/A/W/D) | 2/4/3/5 | V points | S07 |
| Crystal lift per tile | 24 | — | S03 |
| Altitude scale H | 600 | fathoms | S03 |
| Altitude τ | 10 | min | S03 |
| Tide threshold / rows per fathom | 800 / 1/8 | — | S03 |
| Founder altitude | −700 | fathoms | S03 |
| Tap drain | 0.5 | %/min | S03 |
| Crystal recharge | 0.5 | %/min | S03 |
| Integrity costs | table §6.7.5 | — | S04 |
| Warp darkness rate | 0.1 | T/s | S07 |
| Hearth recovery | 0.05 | T/s | — |
| Whisper truth | 0.5 + W/200 | p | S05 (not yet modelled) |
| Recipe pool size | 4 | candidates per compound | S05 ✓ |
| Prism | 1 colour per scan, +1 T warp | — | S05 ✓ |
| Crucible test cost | 2+2 drams; success +90 flux; failure +360 | — | S05 ✓ (S06 to price drams) |
| Mend / Bind thresholds | 180 / 240 | accumulator min | S06 |
| Root tip steps per Deep-watch | 3 | steps | S09 |
Planned simulations: S01 flux spread and pooling · S02 lamp budget vs factory size · S03 buoyancy curves and counterweights · S04 structural stability of generated islands · S05 research solver (experiments needed, seed variance, value of clues) · S06 economy and pacing · S07 attention and spawns · S08 water, rain and reservoir · S09 coupled emergence probe.
18. Risks and mitigations
| Risk | Impact | Mitigation |
|---|---|---|
| Too many interlocking systems for one build | scope overrun | §19 cut list; M1 proves the core with 4 systems; strata ship in order |
| Research becomes brute force (test all pairs) | puzzle feels like a chore | S05: with pools shown and a partial Prism, thinking needs 49% fewer failed tests than guessing, and 69% of identifications need no failed test. Remaining risk: the puzzle may feel too easy for veterans, so a 'Lost Ledger' charter hides pools until a journal reveals them. |
| Flux sim is unreadable | players feel punished at random | haze plus a flux lens with arrows; lamp strain flicker; pooled flux follows terrain predictably |
| Entities feel unfair | frustration breaks the cozy | fairness rules §6.5.3; middens; restore; nothing spawns in view |
| Hallucinations frustrate | players distrust everything | 6 consistent tells; the Keeper's Log is ground truth; accessibility toggle |
| Buoyancy is too abstract | the vertical tension doesn't land | sky, tide fog and the depth ruler make it visible; the preview on the pick |
| Palette-locked lighting looks banded | it fights the mood | dithered light levels; LUT tuned against the reference; mockup M02 |
| AI-generated sprites don't match | style breaks | lanternforge cleanup; albedo-only prompts; LUT lighting unifies them; hand-edit budget |
| Endings feel like checklists | the arc falls flat | sustained world states, not counters; the keepers' remains foreshadow them |
| Sim performance in JS | stutter | 128 × 256 grid, fixed 5 Hz flux, incremental light; budgets in §20.2 |
19. Scope
Measured (i4).
docs/sims/S10_scope.pycounts the real asset list and sizes the build with an assumption-labelled effort model. Re-run it whenever ART_BIBLE §10.2 changes.
19.1 Core, layers, and cuts (decided i4)
Core: 1.0 ships these
- Essences: 6 primals, Taint, 24 compounds with seeded Correspondences. These are data, so cheap per compound.
- Research: Ledger, Crucible tests, partial Prism, Separator, journal clues, arranger shelves, whisperer statements.
- Machines (21): Alembic, Crucible, Pipe/Valve, Jar/Cistern, Chest, Chute, Bucket Lift, Golem Workshop, Auger, Spoil Chute, Vent, Scrubber, Ward Stone, Crystal Tap, Assembler, Separator, Lift Bladder, Crystal Nursery, Lodestone Keel, Root Stake, Fetter Pylon.
- Lamps (6): Candle, Lantern, Ember Lamp, Wisp Lantern, Crystal Lamp, Dawn Lamp. Plus the hearth.
- Golems (3): Clay, Bone, Glass.
- Entities (4): Gleaner, Arranger, Whisperer, Dimmer.
- Systems: flux (all passes), two-channel light, warp with all 6 hallucination tells, buoyancy, tide, crystal charge, structure and integrity, tilt (sway plus pond spill at 5° only), cellular water, weather (Clear, Overcast, Rain, with wind), mutation, wisps and wisp roads, roots.
- World: 5 strata, 6 keepers' content, Wick.
- Endings: 3 + Foundered, each with an endless mode.
Layers: post-1.0, designed but not built
- Charters (the Lost Ledger toggle ships as an option because it's trivial).
- Keeper Records across worlds.
- The Visitor as a gameplay event (the deep-shape parallax stays as atmosphere).
- The Root golem.
- Mist and Gale weather.
- Tilt sliding (only sway and spill ship).
- The research pair grid.
- Gamepad.
- Tauri desktop build.
- Audio (deferred by the owner, D25).
Cut from the design outright: the Lure, the Root Graft and the Glowfruit Lamp. Each one duplicates a role a core item already covers: decoys duplicate light placement, grafts duplicate stakes plus flux feeding, and the glowfruit lamp duplicates the candle.
19.2 Milestone sizes (S10)
| Milestone | Adds | kLOC (est.) | Assets: code / procedural / AI |
|---|---|---|---|
| M0 Foundations | sim core, RNG, commands, save; LUT tool; lanternforge v1; test harness | 3.2 | — |
| M1 Surface slice | §19.3 | 12.0 | 36 / 11 / 32 |
| M2 Fossil layer | structure, golems, pipes, journals, arranger, whisperer, warp T, full weather | 6.6 | 32 / 10 / 56 |
| M3 Crystal layer | buoyancy, tide, taps, augers, dimmer, hallucinations, Assembler | 4.8 | 6 / 3 / 23 |
| M4 Roots and Heart | roots, the Heart, endings, endless modes, Foundered | 3.6 | 2 / 3 / 14 |
| M5 Polish | data completeness, balance, accessibility, onboarding | 2.4 | — |
| 1.0 | ≈ 33 | 76 / 27 / 125 assets, 18 hand edits |
A focused 2D tile sim with cellular fluids, lighting, UI and tests usually lands at 25–45 kLOC, so the estimate is within range. M0 + M1 is 46% of the code because it builds every foundation (renderer, sim core, UI kit). Each later milestone is mostly content and rules on top of it.
19.3 The M1 manifest (the smallest slice that proves the promise)
World. The surface island only: the GDD §4.3 starting layout on a 64-wide island with 12 rows of soil and clay over undiggable bedrock (B07a). There are no lower strata and no buoyancy.
In M1, with simplifications:
| System | M1 version |
|---|---|
| Player | walk, jump, climb ladders, dig/place within reach, 30-slot inventory, held lantern |
| Building | planks, glass, roof, ladder, platform, background walls; no structure/integrity (everything holds) |
| Flux | passes 1–5, 8 and rain scrub from fluxcore.py; thresholds and bands; trace haze |
| Light | warm and cool channels, incremental propagation, LUT rendering, flicker |
| Lamps | hearth (fuel: logs; embers floor), candle, lantern (oil), wisp lantern; strain and gutter |
| Water | cellular pond and rain filling it; no pipes, no intake |
| Weather | Clear / Overcast / Rain Markov at Watch boundaries; no wind |
| Research | Ledger essence pages for the 6 primals and Growth, Ash, Salt, Glass (the Correspondence board arrives in M2); Crucible tests at the desk; Glass chain with Ansel's note. No Prism (it needs Glass + Metal). |
| Automation | one machine: the shed Alembic, repaired, distilling from an adjacent chest into adjacent jars (no pipes) |
| Crafting | workbench: planks, glass bulb, candles, lamp oil, net, chest, jar |
| Life | Lantern Tree (logs, leaves, glowfruit), wisps (net, bottle, lantern), silverleaf from the shed's seed packet, nightshade, moths, Wick |
| Entities | gleaners only, with the dark-path flowfield, middens and the fairness rules |
| Time | Nights and Watches, the moon phase, sleep |
| UI | hotbar, inventory, Ledger, Keeper's Log, watch and moon icon, flux and light lenses |
| Art | 79 assets (S10): sky, moon, clouds, rain, parallax, 10 tile types, 16 sprites, 16 icons |
| Data | docs/data/*.json copied verbatim; prefabs authored as JSON tile maps: house (12 × 6), shed (8 × 5) |
Not in M1: strata below topsoil, structure, buoyancy, pipes, golems, warp and hallucinations, arrangers, whisperers, dimmers, wind, runoff, the reservoir, mutation, the Prism, the map view.
M1 is a slice for the 10-minute acceptance test, not the whole first hour: §14's 0:50–0:58 beats (the tool cache, the fossil hand) need the fossil layer, so the full first hour becomes playable at M2.
19.4 M1 internal checkpoints (each one deployed when green)
- M1.1 "Night island":
- renderer with the palette LUT; sky, moon, clouds, rain and parallax;
- procedural tiles; the player walking, digging and placing;
- static lamps lighting the scene;
lanternforge checkpassing on all assets.
- M1.2 "The leak":
- flux core passes with haze and the lenses;
- lamps with fuel, strain and gutter; the hearth;
- the pond and rain; wisps, net and lantern; Wick; the Keeper's Log; Nights and Watches.
- M1.3 "The first machine":
- Ledger and Glass chain; Alembic repair and automation;
- gleaners and middens; the weather Markov;
- all M1 acceptance tests (§20.4).
19.5 AI art is an owner step (D41)
The build agent may have no image model, so AI generation is never a blocking build step.
- Prompts: the build ships
assets/prompts/<id>.txtfor every C-asset, from the ART_BIBLE §10.4 template. - Drop folder: the owner drops generated PNGs into
assets/ai_raw/<id>.png, andlanternforge cleanturns them into game sprites. - Placeholders: until a C-asset arrives, the build uses a code-drawn placeholder from a
small shape spec (
assets/placeholders/<id>.json: rects, ellipses and lines in palette indices, outlined by the same rule). These are marked in the debug overlay. - Pipeline proof: lanternforge is proven end to end on a synthetic "AI-like" input, a high-resolution, anti-aliased, off-palette rendering of the Alembic generated by code. M1 acceptance 4 is then re-run when the real AI Alembic lands.
20. Build handoff
20.1 Recommended stack
- TypeScript (strict), Vite, WebGL2. A thin custom renderer, with twgl.js allowed as a helper. It runs in the browser and can be packaged later with Tauri.
- Why: an agent can build and test it headlessly (Vitest for the sim, Playwright for screenshots); the custom palette-index renderer (ART_BIBLE §3) fits raw WebGL2 better than a scene-graph engine; the 32k-cell grid is cheap in JS with typed arrays.
- Art tools: Python 3.11+ with Pillow and NumPy (
tools/lanternforge), tested with pytest.
20.2 Architecture
/src
/sim pure, deterministic, no DOM, no floats in persisted state
world.ts (grid, typed arrays per field), rng.ts (sfc32 streams per system)
tiles.ts, flux.ts, light.ts, water.ts, structure.ts, buoyancy.ts, weather.ts,
time.ts, entities.ts, warp.ts, research.ts, machines.ts, golems.ts, logistics.ts,
roots.ts, endings.ts, log.ts, commands.ts (player input as serializable commands)
/render reads sim state read-only after each tick; never mutates it
renderer.ts (index buffer → light resolve pass), sky.ts, particles.ts, parallax.ts,
lut.ts, overlays.ts
/ui ledger, HUD, lenses, menus (renders into the same index buffer, unlit)
/data JSON definitions (schemas §20.3), validated at load with zod
/app main loop: fixed 20 Hz sim, rendering at display rate with interpolation
/tools/lanternforge Python art pipeline (ART_BIBLE §10)
/tests vitest (sim), playwright (render), pytest (tools)
- Determinism: the sim uses integers only. Fixed-point is 1/1000 where fractions are
needed, and altitude is an integer in millifathoms. ln() uses a fixed table with 4096
entries and linear interpolation in integers. There's no
Math.random, and no iteration overMaporSetwhere order matters. Each subsystem gets its own seeded RNG stream:worldgen, flux, weather, entities, research, roots, warp. - Commands: all player actions become
Commandobjects stamped with a tick. Replay = seed + command log. Saves are a JSON header plus RLE-compressed typed arrays. - Update order per tick: commands → player → machines/logistics → golems → entities (5 Hz) → flux (5 Hz) → water (10 Hz) → light (dirty, ≤ 10 Hz) → structure (on change) → buoyancy (1 Hz) → weather/time → roots (Deep-watch) → endings (1 Hz) → log.
- Performance budgets (mid laptop): sim tick average ≤ 4 ms; flux step ≤ 3 ms; light recompute ≤ 2 ms per dirty region; render ≤ 6 ms.
20.3 Canonical data and schemas
The data already exists. docs/data/*.json holds:
- 31 essences with their pools, 35 items, 19 recipes, 19 tiles;
- 31 machines, 7 lamps, 3 golems, 11 tools, 4 entities;
- 5 strata, 7 LUT zones, and every tuning parameter.
It's generated by docs/data/make_data.py and checked by docs/data/validate.py (i5: 176
records, 0 problems). The validator checks referential integrity, the pool tier rules, the
synthesis-only set, that every essence has a use, that the flux params match S01, and that the
S05 recipe generator succeeds on 500 seeds. The build copies these files verbatim to /data
and validates them at load with zod schemas mirroring the interfaces below. When a number
changes, change make_data.py, re-run it, then update the GDD text.
type Id = string;
type Ref = `item:${Id}` | `essence:${Id}` | `place:${Id}` | `tool:${Id}`;
interface Essence { id: Id; name: string; tier: 0|1|2|3|4; color: number /*palette idx*/; glyph: Id;
pool: [Id, Id][] | null /*4 pairs; null for primals and taint*/; synthesisOnly: boolean;
captureOnly?: boolean /*taint*/; identifyWarpP: number; }
interface Item { id: Id; name: string; stack: number; mass: number; composition: Record<Id, number>;
sources: string[]; icon: Id; fuel_s?: number; distill_warp_p?: number; per_tile?: number; [k: string]: unknown; }
interface Recipe { id: Id; station: "hand"|"workbench"|"assembler"; inputs: {ref: Ref; qty: number}[];
outputs: {ref: Ref; qty: number}[]; unlock: Id[]; timeS: number; }
interface Tile { id: Id; solid: boolean; mass: number; digS: number /*-1 = unbreakable*/; fluxCap: number;
absorbent: boolean; lightCost: number; drops: {item: Id; qty: number}[]; strata: string[]; procgen: Id;
integrity?: {max: number; rest: number; horiz: number; hang: number; anchor: string | null}; }
interface Machine { id: Id; size: [number, number]; unlock: Id[]; build: {ref: Ref; qty: number}[];
behavior: Id /*key into the behavior registry*/; params: Record<string, unknown>; }
interface Lamp { id: Id; unlock: Id[]; channel: "warm"|"cool"|"both"; level: number; fuel: Ref;
fuelSecondsPerUnit: number | null; suppressionAE: number; [k: string]: unknown; }
interface Golem { id: Id; unlock: Id[]; recipe: {ref: Ref; qty: number}[]; speedTps: number; carryItems: number;
carryDrams: number; minLs: number; fluxAE: number; climbs?: boolean; light?: [string, number]; }
interface Tool { id: Id; unlock: Id[]; recipe: {ref: Ref; qty: number}[]; params: Record<string, unknown>; }
interface Entity { id: Id; cost: number; tolerance: number; speedTps: number; spawnFlux: number; behavior: Id;
params: Record<string, unknown>; }
interface Stratum { id: Id; dMin: number; dMax: number; ambientZone: number; tiles: {id: Id; weight: number}[];
spawnWeights: Record<Id, number>; }
interface Zone { id: Id; ambientColor: number; ambientStrength: number; darkRamp: number; terrainRamps: number[]; }
// params.json: time, flux, light, warp, buoyancy, attention, player, world, research (all GDD tuning values)
Reference implementations (behaviour the build must match):
docs/sims/fluxcore.py: flux passes, proportional suppression, strain, light propagation, runoff drain direction.docs/sims/S05_research.py: generate(): recipe generation (seeded shuffle per tier, backtracking, pair uniqueness).
20.4 Milestones and acceptance criteria
M0 Foundations.
- The repo, CI, and the sim core (grid, ticks, RNG streams, commands, save and load).
- Palette and LUT build (
lanternforge lut) and lanternforge v1 (clean,check). - Accept: the determinism test passes (below), and
lanternforge checkpasses on a fixture set.
M1 Surface slice (proves the promise).
- Contents: exactly the §19.3 manifest, delivered through checkpoints M1.1 → M1.3 (§19.4). The art pipeline runs end to end: procedural tiles, plus the Alembic generated by AI and cleaned with lanternforge. Until the owner supplies it (D41), use the synthetic AI-like stand-in.
- Acceptance (all required):
- Palette compliance: 100% of pixels in 100 sampled frames are palette colors (automated).
- Mood histogram for a reference shot of the default seed, at the house at night, with the hearth lit and one wisp lantern: ≥ 55% of pixels are R0/R1 shades 0–4; 2–10% are R2 shades ≥ 4; 0.5–5% are R3 shades ≥ 4 (automated).
- Reference match: a side-by-side contact sheet (reference image vs a game screenshot at the same framing) is approved by the project owner.
- AI sprite integration (re-run when the owner's real AI Alembic lands, D41): the Alembic, run through lanternforge, renders next to
procedural tiles under 3 lighting setups (hearth only, wisp only, darkness with a
pilot light). It passes
lanternforge check, has the same outline rule as the tiles, and the owner can't single it out as "the odd one" in a blind 5-asset contact sheet. - Research chain: a scripted bot identifies Glass in ≤ 3 tests, and each failure puts 40 motes into the world (automated).
- Automation: the Alembic distills 20 logs from a chest into jars without the player, emitting 40 motes in total (automated).
- Flux behavior: in the test scene, flux from the shed alembic reaches soil under the shed within 2 min; a Wisp Lantern holds a 3-alembic shed below 50 motes; with no lamp it passes 150 within 6 min (automated; values from S01 and S02).
- Gleaner fairness: with the shed dark and flux ≥ 150, a gleaner takes from the shed chest within 2 Nights, never spawns in view, and the stolen stack ends up in a midden that appears on the map (automated).
- Cozy + uneasy in ten minutes: with ≥ 3 first-time playtesters doing 10-minute sessions, the average is cozy ≥ 4/5 and uneasy ≥ 3/5, and at least 2 of 3 mention a specific unsettling observation unprompted.
- Performance: budgets in §20.2 hold on the reference machine.
M2 Depth I (fossil layer). Structure and integrity, shale cave-ins, beams, golems with chalk routes, keeper sites and journals, the Separator and Prism, arrangers and whisperers, the full weather model, and the reservoir. Accept: S04 world-gen stability holds over 1,000 seeds; the golem route test passes; the arranger restore test passes.
M3 Depth II (crystal layer). Buoyancy, the tide, taps and Resonance, augers, jettison, Lift Bladders, Crystal Lamps, tilt, dimmers, warp and hallucinations with all 6 tells, the Clarity Lens, and the Visitor. Accept: the buoyancy regression matches S03; the hallucination tells test passes (a hallucination never affects light, flux or reflections, or the log).
M4 Depth III (Roots and Heart). Root growth and shoving, Root Stakes, the Heart chamber, the three ending accumulators and endless modes, Foundering and Keeper Records. Accept: scripted saves reach each ending, and each accumulator responds only to its own conditions.
M5 Content, balance and polish. All compounds and blueprints, charters, balance passes against the S06 pacing targets, and accessibility.
20.5 Automated tests the build must have
- Sim determinism: for seeds {1, 42, 1337, 2^31−1} and a recorded 10-minute command log, the state hash at ticks 1k, 5k and 12k is identical across runs, and identical between a Node runner and a browser runner.
- Flux conservation: for 10,000 steps with random sources and sinks,
Σflux(t) = Σflux(0) + emitted − (suppressed + absorbed by sinks + vented), exactly. - Flux regression: golden scenes (shed, shaft pooling, rain scrub, lamp strain) match stored per-cell snapshots at fixed steps.
- Buoyancy regression: fixed islands with scripted crystal removal match the A_eq and tide table from S03 (±0 millifathoms).
- Structure regression: golden dig scenarios (soil span 10 OK and 11 cracks; shale span 6/7; detach and fall) match.
- World-gen invariants: over 1,000 seeds: zero cracking tiles; recipe validation (§6.1.3) passes; the pond holds 40–56 water cells; crystal count is 380–460.
- Research solvability: for 1,000 seeds, the S05 solver identifies all compounds.
- Palette compliance: every PNG in
/assetsuses only palette colors with binary alpha; rendered frames in Playwright are 100% palette. - Asset grid compliance: sprite dimensions match their declared sizes, and tiles are 8 × 8 (per frame).
- Save/load round-trip: save, then load, then 1,000 ticks gives the same hash as running 1,000 ticks without the save.
- Hallucination isolation: at W = 100 for 1 Night, the sim state hash matches the same run at W = 0 except for the warp fields and the RNG warp stream.
- Entity fairness: across 100 seeded Nights, no entity spawns inside the camera rect, and none enters a cell with Ls ≥ its tolerance.
- Data validation: at load, every
/datafile passes its zod schema and thedocs/data/validate.pyrules ported to TS (refs, pool tier rules, synthesis-only set, every essence used). CI fails on any problem. - Reference parity: the TS flux step and recipe generator reproduce
fluxcore.pyandS05 generate()golden outputs for 5 fixed scenes and seeds 0–99.
20.6 World generation (RNG stream worldgen; deterministic)
- Seed parameters:
- W0 ∈ [60, 76], depth D ∈ [172, 184], pond cells ∈ [40, 56], crystal tiles ∈ [380, 460];
- keepers: Ansel, Tamsin and Ilse, plus 2 of {Odo, Bram, Merrit};
- weather bias ±30% on the rain transitions.
- Profile: for each rock row d, compute half-width
hw(d)from §4.1, plus 1D value noise (period 12, amplitude 2) to get the solid span. Base tile by stratum band (strata.json). Mixes come from 2D value noise (period 6) thresholds on the weights: clay pockets in d 3–11, limestone lenses in fossil. Bone inclusions are stamped at 10% inside shale. - Surface:
- Ground height is noise ±2 tiles (period 16), except a flat 16-tile house plateau left of centre and a pond basin right of centre (width = pond cells ÷ 2.5, depth 2–3) filled with water.
- The grass layer goes on top.
- Prefabs (tile maps in
data/prefabs/*.json, authored in M1): house 12 × 6 with roof, hearth, bed, table, shelf, door and note; shed 8 × 5 with the broken alembic, chest and silverleaf seeds, placed 10–14 tiles from the house; garden plot 6 × 2; Lantern Tree at least 6 tiles from the house; ladder hatch.
- Fossil caves: a cellular automaton on d 14–48 (45% fill, 4 iterations, born at 5+ and survives at 4+ of 8 neighbours). Keep pockets of 12+ cells. Keeper sites (a 6 × 4 prefab: skeleton, journal, cache, broken machine) go in the largest pockets, one per chosen lesson-keeper, plus Tamsin's workshop.
- Crystal: random-walk veins (6–14 steps) seeded at x ~ Normal(centre, W0/6), d ~ Uniform(52, 98), plus 2–3 geodes (5 × 4 air lined with crystal). Repeat until the count is in [380, 460]. Carve the 18 × 6 crystal cavern at d 58–64.
- Roots: an L-system of 6 primary roots growing up from the Heart chamber (step 1 tile, branch probability 0.15, length 40–60) converts stone to root-wood at d 100–150, plus dangling strands of 3–14 tiles below the bulb.
- The Heart chamber: a 22 × 12 cavity at d 155–167 with a heartstone floor, the Heart object, and the three archetype remains.
- Stability pass (§4.1): no natural tile with integrity < 20.
- Spawns: lit hearth and 2 lanterns (1 lit), Wick on the rug, 2 wisps at the pond, 3 frogs.
- M1 runs steps 1 and 3 and 9 only, on a 64-wide island with 12 soil and clay rows over bedrock.
20.7 Controls (mouse + keyboard; all rebindable; no hover-only information)
| Action | Default |
|---|---|
| Move / climb | A D / W S |
| Jump | Space |
| Use, dig or place (hold to dig) | Left mouse |
| Interact: open, catch, refuel, sleep | Right mouse |
| Hotbar | 1–0, wheel |
| Inventory and crafting | E |
| Ledger | R |
| Flux lens / light lens | F / L |
| Map (M2+) | M |
| Look down | hold Shift |
| Keeper's Log | Tab |
| Drop | Q |
| Pause and options | Esc |
Hovering any world object for 0.4 s shows a tooltip. The same tooltip pins with Right-mouse held for 0.4 s, so it works without hover.
20.8 UI flows
- Title: Continue · New world (seed field with a random default, the Lost Ledger toggle) · Options · Quit.
- In game: the HUD (§15.1).
- E opens the inventory (30 slots plus the essence satchel, which holds up to 64 drams of each essence) and, within 3 tiles of a workbench, its crafting list (only unlocked recipes).
- Right-click a container or machine to open its panel beside the inventory: slots, pilot state in words, rate, flux per minute, fuel.
- The Research Desk panel has two essence pickers (satchel plus jars within 3 tiles), a Test button showing the cost, and a link to the Ledger page.
- R opens the Ledger: essence pages in M1, the Correspondence board from M2.
- Esc pauses: Resume · Options · Save & quit.
- Saving: autosave at every Dusk-watch and on quit. 3 slots in IndexedDB, with export and
import to a
.lanternholdfile. - All panels are 9-slice parchment at 480 × 270 and never cover the player's own tile.
20.9 Entity navigation
- Passable cells per kind:
- Gleaner (many-legged): any non-solid cell with a solid among its 8 neighbours, so it walks walls and ceilings.
- Arranger: non-solid with solid below, or a ladder.
- Dimmer: any non-solid cell.
- Whisperer: never moves.
- For all kinds, the cell's entity Ls must be < tolerance. Ward Stones force Ls 6 within 5 tiles.
- Flow fields: per entity kind and target set, BFS from targets (4-neighbour; 8 for dimmers), uniform cost. Recompute when a light-map change touches the field's bounding box, at most once per 5 s per field.
- Movement: cell to cell at the kind's speed, interpolated for rendering.
- Caught by light: if an entity's cell becomes Ls ≥ tolerance, it retreats back along its own path to the last dark cell. If none is within 3 cells, it dissolves and drops what it carries.
- Middens: the nearest dark air cell ≥ 20 tiles from every light source (tie-break: lowest y, then x). A midden is a 16-slot container marked "?" on the map. It persists until emptied.
20.10 Save format
- JSON header: version, seed, tick, night, RNG stream states, player, inventories, the satchel, machines and lamps (with their state machines), entities, golems, the Ledger (facts plus player marks), the Log, R, Taint.
- Binary chunks (base64 of deflated, run-length-encoded typed arrays): tile kind (u8), flux (u32), water (u8), crystal charge (u16, ×10⁻⁴), root state (u8).
- Light, integrity and flow fields are recomputed on load, never saved.
versionis an integer with pure migration functionsvN → vN+1. A round-trip test is §20.5 #10.
20.11 Player physics (all in params.json › player)
- Collision AABB 6 × 14 px.
- Walk 40 px/s. Gravity 640 px/s². Jump velocity 180 px/s (about a 3-tile jump).
- Terminal fall speed 240 px/s. Coyote time 0.1 s. Climb 24 px/s.
- Automatic step-up onto 1-tile ledges while walking.
- Reach 5 tiles from the player's centre.
- Movement is resolved per axis against solid tiles; platforms are solid from above only.
20.12 M1 object behaviours (state machines)
- Hearth:
- States: lit (warm 13), embers (warm 6).
- Right-click with a log adds 6 min of fuel (store up to 30 min). Lit while fuel > 0.
- Candle and lantern:
- States: lit, out, guttered.
- Right-click with fuel refuels and relights.
- Unroofed (sky-exposed) during rain: a 20%-per-rain-minute chance to go out (RNG stream
weather). - The held lantern uses the player's lamp oil.
- Wisp Lantern: states empty, lit, fled. Right-click with a bottled wisp fills it. It flees per §6.3.6.
- Research Desk: a test consumes 2 + 2 drams from the satchel or nearby jars, resolves instantly, applies the flux burst at the desk's top cell, and records a fact.
- Alembic:
- States: broken (leaks 1.2 AE; right-click with a Glass Bulb to repair), idle, working (6 s cycle), starved (no item or no fuel), blocked (an output tank is full).
- Fuel slot: Ember drams from an adjacent jar, or solid fuel (1 log = 4 Ember-dram equivalents, 1 soot = 1).
- Input: the adjacent chest, left-most slot first.
- Output: per-essence internal tanks (16), which drain 1 dram/s into adjacent jars locked to that essence.
- Chest: 16 slots. A gleaner takes the left-most non-empty stack.
- Jar: 64 drams of one essence. The type locks when the first dram enters and unlocks when empty.
- Gleaner: states spawning (3 s fade) → seeking → taking (1 s) → fleeing to its midden → depositing → dissolving. It obeys §20.9.
- Wisps: spawn per §6.9.1, drift within 6 tiles of the pond with a sine bob, flee air flux ≥ 150. Catching one is a 1 s right-click hold with the net.
- Wick:
- States: wander, sleep, follow, hiss.
- Wanders lit cells within 12 tiles of the hearth and sleeps by the hearth in the Deep-watch.
- Follows the player within 8 tiles while the player is in lit cells.
- Hisses at real entities within 10 tiles.