
Lanternhold
A cozy-dread automation game: every machine you build brings the dark a little closer.
Design in progress — iteration 5. This page is the living design dossier, redeployed at each milestone.
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.
Read
Game Design Document
docs/GDD.md
Art Bible
docs/ART_BIBLE.md
State & Scores
docs/STATE.md
Iteration Log
docs/ITERATIONS.md
Decisions
docs/DECISIONS.md
Open Questions
docs/OPEN_QUESTIONS.md
Simulations
4 sims with results
Mockups
1 code-generated visual tests
Rubric scores (iteration 5)
| # | Rubric item | Score | Evidence (one line) | Last touched |
|---|---|---|---|---|
| 1 | First hour cozy, clear, hooky | 3 | Flux timings now support §14 (broken shed tinged at 6.5 min, so the first-Deep-watch gleaner is reachable); no pacing sim or playtest proxy yet | i1 |
| 2 | Automation satisfying, clear progression | 3 | AE unit makes factory sizing legible ("this lamp keeps 6 alembics clean", S01 §3b); unlock timing (S06) unproven | i1 |
| 3 | Emergence is real, with sim evidence | 4 | S09: tipping point at 13 AE with hysteresis; rain return at each front; the same factory fails three different ways by site; flux sinks the island 44 fathoms without mining; roots loop and acting entities not yet modelled | i2 |
| 4 | Vertical tension drives decisions | 3 | New: deep factories cost buoyancy via crystal taint (S09 E3); the log buoyancy curve and tide are still unsimulated (S03) | i1 |
| 5 | 10+ recurring decisions with real tradeoffs | 3 | 16 decisions; K2 (vent/scrub/none) and K4 (siting) now shown real with costs and the dominant scrubber fixed (D35); others unchecked | i1 |
| 6 | Dread without combat, systemic and fair | 3 | Gleaner-eligible territory is now a measured function of layout (S09); the V formula is rescaled but entity behavior is unsimulated (S07) | i1 |
| 7 | Research is a satisfying puzzle that replays | 4 | S05: with pools shown and a partial Prism, thinking needs 49% fewer failed tests than guessing; 69% aha; a 3-currency frontier (flux, warp, clues); stable difficulty (p90 16 vs median 12); worked example; whisperer and arranger clues not modelled, no playtest | i3 |
| 8 | Endings earned; the arc lands | 3 | Three mutually exclusive sustained-state accumulators; thresholds untested | i1 |
| 9 | Replay value across seeds | 3 | S05: 400/400 distinct recipe graphs, 25% overlap between seeds, gate ancestry varies (Metal needs Hush in 15% of seeds, Breath in 14%); island shape, keeper and charter variety still unmeasured | i3 |
| 10 | Art bible cohesive, matches reference, readable | 3 | m01 palette; new trace-haze band and poisoned-cloud signal; LUT untested (m02) | i2 |
| 11 | Art production plan realistic, no purchases | 3 | Asset list now split per milestone (S10: 76 code / 27 procedural / 125 AI, 18 hand); D41 removes the dependency on an image model with placeholders and an owner drop folder; still no lanternforge prototype | i4 |
| 12 | Scope realistic, first slice small | 4 | S10 audit (228 assets, about 33 kLOC, within the 25–45 kLOC band); 1.0 core vs layers vs cuts decided; exact M1 manifest (79 assets, about 12 kLOC) with a not-in list; 3 deployable checkpoints, the first tiny | i4 |
| 13 | Build-ready, no questions needed | 4 | docs/data/ canonical JSON (176 records, validator: 0 problems, S01 and S05 parity); GDD §20.6–20.12 specify worldgen, controls, UI flows, entity navigation, save format, physics and M1 state machines; M2+ machine behaviours are still table prose |
i5 |
Latest iteration
Iteration 5: #13 Build-ready
Focus: remove the questions a developer would ask before starting M0/M1.
Evidence: canonical data + validator.
docs/data/make_data.pyemits 13 JSON files: 31 essences (with pools and palette colours), 35 items, 19 recipes, 19 tiles, 31 machines, 7 lamps, 3 golems, 11 tools, 4 entities, 5 strata, 7 LUT zones, and all tuning params.validate.pychecks:- referential integrity and the pool tier rules (Taint only in Fetter and Abyss);
- the synthesis-only set matches GDD §6.1.2;
- every essence has a use;
- flux params equal the S01 tuned set and AE = escale/3;
- the S05 generator succeeds on 500 seeds with these pools.
- Result: 176 records, 0 problems.
- Building the data surfaced:
- 5 malformed recipe refs (fixed);
- missing homes for the Clarity Lens, Stethoscope and Echo Bell (a new
tools.json); - Kindred had no use (added the Kindred Font, which blesses a water body for the Mend ending);
- a stale Hand Mortar flux value (1 → 9);
- jump velocity 196 → 180 (3 tiles, not 3.75).
Changes
- GDD §20.3 rewritten: the data exists; TS interfaces match the JSON exactly; reference implementations named.
- New GDD §20.6–20.12:
- 20.6 world generation in 10 deterministic steps (M1 subset named);
- 20.7 controls;
- 20.8 UI flows (adding the essence satchel and the desk panel);
- 20.9 entity navigation (passability per kind, flow fields, retreat, middens);
- 20.10 save format (header plus RLE/deflate typed arrays, recomputed fields, migrations);
- 20.11 player physics;
- 20.12 M1 object state machines (hearth, lamps, wisp lantern, desk, alembic with fuel rules, chest, jar, gleaner, wisps, Wick).
- Tests 13 (data validation) and 14 (TS ↔ reference parity) added. The M1 manifest now lists data and prefabs.
Critique
- Systems designer: M2+ machine behaviours are parameters plus table prose, not state machines. Acceptable, since M1's are complete and each later milestone can add its own §20.12 block. Recorded as the main remaining gap.
- New player: the controls follow genre convention (Terraria-like), with right-click to interact and tooltips that don't need hover.
- Optimizer: solid fuel (log = 4 Ember-equivalents) vs distilling (2 Ember + Growth 2 + Loam 1) gives a small fuel-or-research choice. Fine.
- Art director: prefabs are tile maps, so the house is built from the same procedural tiles as everything else and stays cohesive.
- Scope critic: hidden M1 work surfaced (prefab authoring, the satchel UI) and added to the manifest.
Scores: 1:3 · 2:3 · 3:4 · 4:3 · 5:3 · 6:3 · 7:4 · 8:3 · 9:3 · 10:3 · 11:3 · 12:4 · 13:4
Next focus: #1 First hour (S06 pacing).