By the numbers
Architecture
Nineteen autoload singletons own the persistent state, each registering itself with a central save manager rather than the save manager knowing about them. Adding a system that needs to persist is one registration call and two methods — no save-format surgery.
| System | Owns |
|---|---|
| Save manager | Slots, registration, and a guard that refuses to write during automated runs |
| Game time | Calendar, seasons, day/night, the day tick everything hangs off |
| Spell binding | The four spells, what each cast targets, and progression |
| Quest milestones | One-shot facts about the playthrough; a missing key reads false |
| Land state | Per-scene vitality on a single signed scale |
| Prop state | Which world props have been revived or burned, and when |
| Inventory, player stats, village state | The player and the valley's opinion of them |
| NPC travel, companions, monster roster | Ten villagers on schedules, tamed monsters, farm helpers |
| Scene transition | Movement between 65 scenes, plus per-scene state caching |
Content as data
Crops, forageables, monsters and the cave trials each live in a definition table. The systems that consume them walk the table and know nothing about any individual entry — the trial runner has no idea what a "Bloom chamber" is, it just reads the next row.
The same principle drives the cave seals: a seal is one scene with a manifest keyed by id, so a new sealed door is a data entry, not a new script. One of those manifests accepts a category rather than an item — "any twelve harvested crops" — because different playthroughs have access to different seeds.
Verification without a screen
Most of this project is verified headlessly, because a solo developer can't manually re-test 65 scenes. Three checks do the heavy lifting:
- Boot every touched scene and fail on any error, parse failure or invalid reference in the output
- Reachability flooding — walk the player's actual collision box across a lattice through the physics engine, proving no room has a pocket you can enter and not leave, and no door is buried in a wall
- Behaviour harnesses that drive systems directly: grow a crop through its lifecycle, pay a seal, save and reload, and assert on the results
Rendering checks need a real window, so anything about how the game looks is still checked by eye. Everything about whether it works is checked by machine.
Decisions worth explaining
Progression is gated inverted
Spells could be locked "until you learn them" — but that would strip spells from every save made before the trials existed, and from anyone who skipped the intro. So the gate is backwards: everything is unlocked unless this playthrough explicitly opted into progression. Old saves behave exactly as they always did, and nobody gets dropped into the world unable to cast anything with no idea why.
State lives in milestones, not scenes
A sealed door that's been opened, a room that's been cleared, a prop that's been burned — none of that is stored in the scene. It's a milestone in an autoload that already round-trips through the save system, which means nothing can re-lock itself by being walked out of and back into.
Days are absolute
Every timer that spans days stores an absolute day key rather than a countdown. Sleeping, travelling and loading a save from another day all become the same subtraction, so nothing can silently lose a day by being in an unloaded scene when it ticks.
Bugs that taught something
Written up properly in the dev blog — including tinting the world without accidentally tinting the farmer.