Companions — Wiki
EN DE
You are reading the frozen wiki for v0.2.0 — it describes that build and is never updated. Go to the current version →

Companions

A top-down survival‑RTS management sim. Command a tiny party of precious, mortal companions across a procedurally generated island — gather, survive, build a settlement, and move on when the land wears out.
Living document · mirrors the in-game F1 help and extends it with developer reference · describes build v0.2.0 · last revised 2026-07-21
The party on the island
For developers
This wiki is the expanded twin of the in-game help (F1, scripts/ui/help_panel.gd). The Player Guide half mirrors that screen; the Developer Reference half maps every mechanic to the files, functions, tunable variables and console commands that drive it. Both F1 and this page must be kept current on every feature change — see Keeping this in sync.

What changed in v0.2.0 short form

Everything this build brought, one line each — so this page says what it is before it says how the game works. The long form, with every reason and number behind them, is CHANGELOG.md in the repository.

v0.2.0 this build 2026-07-21

Boiling, reachable

  • Right-click context ring
  • Two new orders — Scoop water fills the skin and then the pack at a shore; Boil water loads pack and…
  • The waterskin pours — Right-click the tool slot in the character sheet and its contents come into your hand as water…
  • One waterskin per in-game hour
  • Console: boil [<units>], context [fire|water]

Changes

  • Sicknesses that name their cause (ROADMAP 7.8)

Fixes

  • A fire raised from twigs can be fed with twigs (it could only be built with them), and…
  • Wildlife no longer walks through built walls and closed doors

Overview

What the game is, and the shape of a run.

You control a party of three companions (recruiting more, up to ten, is planned) from an RTS-style top-down view: box-select, right-click to command. There is no player avatar — the three are equals. Every one has the full set of survival stats and can die individually; losing one is meant to feel tragic. The hardest difficulty is permadeath. The only threats are nature — food, water, temperature, weather, seasons and distance — plus reactive wildlife that may defend itself. Nothing ever attacks your base.

A run is a cycle of three phases

  1. The manual opening — everything by hand, no automation. Scout for a viable site, live hand-to-mouth off what you find.
  2. The automated base — buildings unlock jobs, each companion's rule program runs the day, the settlement hums.
  3. Exhaustion → migration — the land wears out, the party packs what it can carry, treks, and starts over stronger: skills, equipment and recruits persist, the place does not. Each year winters bite harder.

The 512×512 map is budgeted for roughly 3–5 settlement cycles — that is the designed run length. Phases 1 and 2 exist today; phase 3 (a forced push and a tools/equipment system) is the big open milestone.

Move & look WASD · F · Tab

  • WASD pans the camera (free look). The view stays where you put it — selecting or commanding never yanks the camera.
  • F centres the camera on the selected character and follows it (a group is framed at its centre). Tab does the same while switching companions.
  • Right-click commands every selected character (see Command); a green ping marks the ordered spot. Hold right-click to steer continuously — the selection follows the cursor until you release.
  • Dense forest and loose sand slow walking to 80%.
  • Mouse wheel or +/- zoom; M snaps to the widest zoom. Mouse at a window edge scrolls the view (tune speed/width in Esc → Settings → Gameplay).
  • There is no minimap and no overview map — you never see the whole island at once. Reading and remembering the land is part of the game.
  • The time-warp bar sits top right (pause, 1–10×). Switch on Esc → Settings → Graphics → Show FPS and the frame rate appears directly under it — green above 50, amber above 30, red below. It updates four times a second on real time, so time warp and pause do not change how it reads.

Your party 3 → 10 companions

The three companions close up
The party lands at a random walkable spot — 60–90 cells from the nearest fresh water. Nobody is selected at first; everyone follows its own program.
  • Left-click a character to select it (green / blue / orange; a white ring marks it). Exactly one selected = it is "yours": E-gather and build use it, and it walks your right-clicks at full speed.
  • Drag a box to select several and command them together.
  • Left-click empty ground deselects — observer mode; everyone just runs its jobs.
  • The bottom-left info panel follows the mouse: hover any tile for terrain + what stands on it (tree species & wood left, water salinity, buildings, stockpile usage, plant stock); hover a character for its current activity. Fog applies.
  • Tab switches control to the next companion; 19, 0 select directly (tap twice to also centre the camera). Hotkeys are fixed for the run — a dead companion's number stays vacant.
  • Companions learn by doing. Walking trains Running (speed), each trade trains its own skill, heavy trades & building train Strength (carry + build speed), and enduring cold/rain/exhaustion hardens Resilience (falls ill later). A run's veterans are made, and they are what you carry to the next settlement.
  • Strangers come knocking. Every so often a wanderer walks in out of the wild and waits a few days at the settlement. Left-click them for their panel: name, body, base attributes — and nothing else, because a recruit arrives unskilled. Take them in or send them on; wait too long and they leave. The party is hard-capped at ten, and a new pair of hands eats before it earns.
  • Not everyone means it. Some wanderers are false companions: they work slowly, help themselves to the stores, and one night they are gone with whatever they could lift. Nothing on the panel gives it away — the event log does, over days (someone at the stores after dark; a day's work that came up short). Sharp companions (Perception) name names. Expel anyone who joined from their character sheet (C) — and be wrong at your own cost.

Command — right-click RMB

Right-click sends every selected character; what happens depends on what you click. Your word is absolute — a character never breaks off an order, even to save itself. It posts a red warning when critical and carries on; abort the order yourself if you want it to live.

You click…They…
Open groundWalk there (paths around deep water, mountains, house walls)
Fresh water / a wellA ring of choices: Drink (until thirst is full, then top up the waterskin) or Scoop water (fill the skin, then load units into the pack)
Tree / rock / plantHarvest into the carry (trees until felled)
A bed (its exact cell)Sleep until fully rested
A campfireA ring of choices: Tend fire (refuel from the carry or nearby stores — wood or twigs) or Boil water
A dropped stackPick it up into the carry
A stockpile 1 selectedWalk there and open the transfer window
A stockpile groupHaul carries there and unload onto the tiles
Another companion 1 selectedWalk over and open the carry-to-carry transfer window
A blue construction siteJoin the build: fetch, deliver, raise it

Shift+right-click queues the order as a waypoint. A plain right-click replaces the whole queue. Nobody looks after themselves at all — drinking, eating, warming and sleeping happen only on your order or through the rule program (T).

Gather — hold E E

Hold E next to a target; a ring fills over its harvest time. Gathered items go into that character's carry, limited by weight (~40 kg, raised by Strength).

  • Trees → wood: each forest tile is one tree; the whole wood stock drops when it falls (the tile turns to grass). Strikes are banked — stop and finish later. Four species by shade: birch (10 wood), pine (20), spruce (25), oak (35).
  • Rocks → stone and fishing take ~10× ordinary work — plan whole days; a mason's yard / fisher's hut put workers on them around the clock.
  • Herbs, berries, roots regrow in place (not in winter). Bird nests (spring only, gone for good when robbed), mushrooms (summer+autumn, forest edge), hazel nuts (all year, never rot, but a cleared bush is finished and the next grows out of sight), mussel beds (salt coast, year-round, spoil fast).
  • Free ground pickups (a half-second stoop, gone once taken): twigs & leaf piles at the forest edge, loose stones on the plains.
  • Wild hemp → plant fibre — grows only on damp ground beside fresh water (river banks and lake shores; never the salt coast, never inland). Tall fanned stalks, regrows in ~5 days outside winter. Fibre is not string: spin it into cordage on the Crafting tab, and cordage is what a bowstring and a fishing line are made of. No hemp in reach → no bow and no rod, so it is one more thing that makes a settling site good or bad.
  • Hunting takes a bow (craft one once a Hunting lodge stands). Deer & pigs flee faster than you walk — you shoot them: embody a hunter, hold H, a swaying reticle rises, lead the moving animal, release to loose. A hit is aim, not luck. A shot spooks the prey — one clean opening shot, then it bolts. The Hunter rule shoots the same way on its own, and with nothing in sight it takes a stand instead of falling through to the next rule: it walks to the nearest known forest cell (failing that, anywhere outdoors — never under a roof) and waits there, reading "No huntable animals in sight - waiting". Hunting is mostly waiting.
  • Fishing takes a rod (a pole plus a line of cordage; craft one once a Fisher's hut stands). The hut grants the fishing right to its water, the rod is the tackle: no rod in the pack → the companion will not fish, the Fisher rule stays blocked, and the hut's task postings are left for whoever is equipped. Rods are per companion — three fishers need three rods.

Eight creatures roam: deer & pigs are the herds you live off; pigeons & crows fly where you cannot follow; beavers keep to fresh water; badgers are slow enough to corner; wolves and bears hold their ground (a bear is the biggest meat on the map). Nothing out there hunts you — yet.

Cooking
Raw meat is not a meal — companions never eat it on their own, and eating it by hand builds toward food poisoning. Cook it on a campfire's hearth (left-click the fire → PAN / COOKED slots) or cure it in a smokehouse into preserved food. Raw fish is safe; cooking it is just better.

Stay alive

Health, Thirst, Hunger, Tiredness and Temperature drain over time; Mood is a secondary, non-lethal stat. Every companion is a compact row top-left; the controlled one unfolds to full bars. Buff/debuff badges beside the card say what is on a companion — green = boon, red/magenta/violet = malus. When any Health falls into the red, the whole screen sounds the alarm (red rim, heartbeat) so an off-screen death can't be missed.

DangerWhat it doesThe fix
Thirst emptyKills in ~half a day (fastest)Drink at fresh water / well; keep a waterskin full
Hunger emptyStarves over several daysEat from carry (Eat rule / sheet double-click); cook & smoke a surplus
Tiredness lowWalk −25%, work −40%; sleep debt drains it up to 60% fasterSleep in a bed (heals Health too); bedroll on a trek
TemperatureBelow 4°C or above 35°C drains HealthWarm at a fire/indoors; cool at water/well
Wet (rain/swamp)Feels up to 30% colder, −5% speed, sinks MoodDries only at a burning fire or under a roof (~4h)
FeverFrom cold, wet and exhaustion. −25% work, drains Health if untreated; can killBed rest + herbs from the carry
DysenteryFrom untreated water. −20% work — and it makes you thirstier, the trap that feeds itselfBed rest + herbs; then clean water only
Food poisoningFrom raw or spoiled food. −30% work, the hardest hitter of the three, but it passes fastBed rest + herbs; cook or smoke meat first
Still water (lake/pond)Every untreated gulp builds the dysentery load (~12 per full thirst bar)Drink at running water or a well; or draw it and boil it in a fire's pan
Despondent (Mood floor)Refuses its rule program AND stops feeding itselfDirect orders only — nurse it dry, warm, fed, healthy

What hurts you doesn't let you heal: an empty Thirst/Hunger bar, or a freezing/ overheating body, suspends rest regeneration entirely — the sleeper rests off tiredness but wakes no healthier. Winter is the exam: farms lie dormant, plants stop regrowing, no animals are born. Stockpile in autumn; nuts, fishing and mussel beds work year-round.

Build — press Space Space

A construction site (Grundriss)
Committing a ghost lays a blue Grundriss. Builders physically fetch the materials, deliver them, then raise it from beside the footprint. Materials never gate the ghost — an amber ghost just waits for deliveries.

You start with nothing. Space opens the build ring (radial menu, 2026-07-20): an inner ring of categories — Workshops, Structure, Supply, Demolish — where left-clicking a category opens it in a second, outer ring. Hovering any entry spells it out in the info panel below the circle, cost per material included (green = affordable now, red = not). Place it, and every selected character goes to build it (nearest one if none selected). R rotates the ghost before placing.

The centre always goes back one ring, and closes the menu on the top level — the same thing right-click and Esc do, so there is one rule for the way out. Space closes it from any depth. Only two rings are ever drawn: opening a category replaces the outer ring rather than adding a third, so nesting is free and the circle never grows. Greyed entries come in two kinds that must not be confused — a padlock is a player goal (the workshop that unlocks it does not stand yet), a dashed outline is a planned placeholder that does not exist in the game yet.

There is no ready-made house. The drag-to-size prefab was retired from the player's hands (2026-07-20): every house is now designed out of walls, doors and floors, and is whatever shape you enclose. Job buildings stay simply placed and the farm stays drag-to-size — a workshop is equipment, not architecture; only the home is the player's design.

BuildingWhat it doesNote
CampfireWarmth + hearth (fuel / cook)9 twigs or 3 wood (see below); action area 20; physical heat radius 3.5
WellDrink, refill skins, cool offThe only drink source workers use on their own — keeps flowing when water freezes
Bed / Stone hearthFurnitureNot in the build ring at all — placed from the room panel
Straw bedFurniture that also campsThe one piece in both lists: the room panel and the Supply ring, so it can be thrown down beside the campfire before any room exists (secondary_category)
Wall / DoorEnclose a warm, roofed roomWalls drawn as straight chained runs; door is walkable
BridgeThe only way across a riverDrag a deck bank-to-bank; turns water walkable
Wooden FloorRaises Mood inside a roomGround, not furniture — beds/fires stand on it
RoadWalk ~35% faster along itGround like a floor; stone per tile — the price, not the speed, is what keeps siting honest
Stockpile zone / Storage boxCity stores (1 type/tile, 20 units)Zone is free; drag out on open ground
Water barrelStores water (20 units, clean or stale)Winter/drought reserve; DRAW + HAUL fill it; serves the clean water first
SmokehouseCures fresh food → preservedDoubles as a stockpile
Lumber camp / Fisher's hut / Mason's yard / Hunting lodgeWorkshopsEach unlocks its trade for the rules (fishing and hunting also need the rod / bow in the pack)
FarmVegetables (Farmer tends it)Dormant in winter
Planning table+6 rule blocks; copy programs; opens the task board

Two prices for one building. A buildable may list alternative costs — the campfire's 9 twigs or 3 wood (2026-07-21). Twigs lie on the ground everywhere, so the first fire of a run never has to wait for a felled tree. The build ring lists both, each material coloured by what the settlement holds, with an or between them; a blueprint commits to one of them (whichever it can cover, primary first) and shows only that on the site. As long as nothing has been delivered yet it re-picks by itself, so a site that asked for wood asks for twigs the moment twigs are within reach; once the first material lands, the bill is settled in it. Demolishing refunds half of what the building was really paid for — a fire raised from kindling salvages kindling.

And two fuels for one fire. The same reasoning carries past the build: a fire that can be raised from twigs can be fed with them (2026-07-21). A campfire burns wood or twigs, 3 twigs to the log, and the stone hearth the same way. Logs are always preferred where there are any — every fuel run shops the list in order, so the party falls back on kindling only when the woodpile is empty. Everything that feeds a fire goes through the one list: the right-click order, the REFUEL rule, a claimed task, holding E at it, the world hand and the panel's FUEL slot (which counts in logs but takes either).

A small base with a house, well and campfire
A house takes real labour (3× per-tile build time) — bring helpers. Enclose any shape with walls + a door and the inside becomes a warm, roofed room; board it with wooden floor to lift Mood.

Furnish a room — left-click inside it

A self-designed house is not an object you can click, so the furniture panel hangs on the room: left-click any cell of an enclosed room and it opens, reading the room out (cells, shelter warmth, how homely it is) and listing the furniture that may go in it. Pick a piece and the ghost only accepts cells inside those walls — otherwise it is an ordinary construction site: builders fetch the materials and raise it. Click inside the same room again, or press Esc, to close. It resolves last of all map clicks, so anything with a panel of its own (a pile, a fire, a construction site) keeps the click.

PieceCostLabourWhat it is
Straw bed6 leavesnone (instant)A poor night's sleep — and the one piece that needs no room: it is in the Supply ring too, so it can go down beside the campfire on the first evening
Bed6 leaves + 1 wood14.4 s/cell = 28.8 sThe proper one: rests faster and heals while you sleep. It lies 1×2 — press R before placing to turn it across
Stone hearthStone + wood, needs a mason's yard10.8 s/cellThe indoor fire: a campfire's warmth, ~3× the burn per log and a wider reach. One hearth holds a house through a winter night, and it cooks like any fire

The two beds are told apart by their LABOUR, not by their price (2026-07-21): their materials are nearly identical, so what separates them is the work. A straw bed sets build_seconds_per_cell = 0instant: total_build_seconds() floors at 0.001, so the first frame of a builder's work finishes it. The materials still have to be carried to the site; only the labour is nil. The bed costs twice what it used to (7.2 → 14.4 s per cell). The entry tooltip quotes the labour in in-game time for one builder (BuildEntry.labour_line); helpers stack their deltas and shorten it.

A room is not yet a home. Its comfort is the average over its cells of the floor laid on them and the furniture standing in them, and that comfort lifts Mood while a companion is inside — doubled while asleep. Over-furnishing simply finishes the room; it is capped, never an exploit.

Automate — press T T

The rule editor
The rule editor: an ordered WHEN → DO UNTIL program per companion, checked top-to-bottom (first feasible rule wins). Runs only when you tick Auto.

Automation is built, not switched on. Write each companion a program — an ordered list of rules reading WHEN condition(s) → DO action UNTIL release. Order is priority.

There is no built-in self-care — at all
Nobody drinks, eats, warms up or sleeps on their own — not even from the waterskin or packed food. Everything happens only through your orders or your rules (the Basic supply template is a safe start). A forgotten drink rule is a death sentence. On Brutal the game cannot pause while the editor is open.
  • WHEN — sensors: the body's bars (Health & Mood too), Wetness, Sickness, the clock, the season, precipitation, city stores, the own carry, the waterskin, fire fuel, a waiting site. Conditions AND together.
  • DO — actions: the trades (fell, fish, farm, quarry, hunt), drink, eat, sleep, warm/cool, tend fires, build, haul the carry to stores, fetch items into the carry, and take a task off the task board.
  • UNTIL — the latch: "fell wood UNTIL stores ≥ 60" keeps a rule going past its trigger so companions don't ping-pong at the threshold.
  • Nothing happens that nobody asked for (11.7): no companion carries its load home on its own. A full pack stops the work that would fill it further (harvesting into a full pack destroys the node for nothing) and the rest of the program runs on. Bring it in by right-clicking a stockpile, with a WHEN Carry full → Haul rule, or via the task board — a task's goal sits in the city stores, so delivering is the last leg of it. Any haul keeps a ration of every food kind and of drinking water: the load goes, the lunch stays.
  • Blocks are budgeted: a rule costs 1 block, +1 per extra WHEN, +1 for an UNTIL; the whole settlement shares one budget (base 12, +6 from a Planning table). Rules past the budget don't run — top rules are paid first.

The task board (needs a Planning table): buildings watch their own needs and post tasks — a fisher's hut calls for a fisher while stores hold under 20 fish, a burnt-down fire calls for tending, open sites post themselves. One 1-block Take a task rule claims the nearest posting, so a new recruit is just one more taker. Trades are earned: each work action stays locked until its workshop stands. Workers only seek what the party has already discovered.

Time & world

Day/night and seasons pass; the clock, temperature (°C) and weather sit top-centre. Speed controls (or -/.) run pause / 1× / 2× / 5× / 10×.

Rain
Rain soaks anyone in the open (a fire or roof dries fastest; warm sun does it slowly).
Winter snow
Winter snow blankets the world; waters freeze over.

Weather follows the seasons — sunshine, cloud, rain, hail, summer drought, winter snow. Hail hurts (bleeds Health in the open; only a roof or forest canopy stops it). Rain soaks (wet = up to 30% colder). Wet clothes dry fastest at a campfire or under a roof (~4 in-game hours from soaked through) — and out in the open as fast as the sky allows: ~10 h under warm sunshine, about a third of that pace when overcast, and nothing at all in cold air or while rain, snow or hail falls. A summer soaking dries itself while the work goes on; a winter one waits for a fire. In deep winter rivers and lakes freeze (wells keep serving); a summer drought dries small ponds until the next rain.

Water has a quality as well as a salinity. A body of fresh water that never reaches the sea — a lake, a pond — is still water: drinkable, and every gulp builds the drinker's dysentery load — nothing on its own, but the pond you keep going back to breaks out as the illness. Rivers drain to the sea and count as running along their whole length, and so do wells and hot springs. A waterskin filled at a lake carries pond water with it until it is drunk dry. Choosing between a lakeside site and a river (or a well) is the point.

The cure is a fire. Right-click one and pick Boil water: the companion pours everything untreated it carries — the pack first, then its waterskin — into the hearth's pan, waits for it, and takes the clean water back (skin first, the rest into the pack). Empty-handed the same order simply collects what is already boiling. By hand it works too: right-click the tool slot in the character sheet (C) to pour the skin into your hand, then set it down on a fire (the whole skinful goes in), on a barrel, or on another companion to fill their skin.

Boiling costs time, and that is deliberate. A full waterskin takes one in-game hour on a campfire; a stone hearth is three times faster at everything it cooks. The pan holds 20 units and boils unattended while the fire burns, so you load it and walk away — but one pan cannot water a whole party, and it cannot sear fish while it boils. Boiling is the stopgap at a pond; a river or a well is the answer.

Tundra
Tundra (northern fringe): 10°C colder than the day says.
Desert
Desert (dry south): 8°C hotter — but the warmest ground in winter.

The land itself has a climate. Most of the island is temperate, but three kinds of country are not: tundra (−10°C) on the high northern fringe, desert (+8°C) in the dry south, and swamp (soaks you like rain, and a fire can't dry you while you stand in it). The seasons turn both extremes inside out — knowing which half of the year a country is survivable in is worth more than avoiding it.

A river from the central mountain
Two narrow, deep rivers spring from the island's central mountain — crossed only by a bridge.
A crater lake landmark
Landmarks worth remembering: a crater lake, steaming hot springs, standing stones.
Fog of war
Fog of war hides unexplored ground; explored ground out of sight is a memory (terrain & buildings, but not live activity). There is no minimap — scout and remember.

Interface & keys

The companion window holds everything you do to one companion, as three tabs — each key opens its own tab (press again to close; Ctrl+Tab walks the tabs). All three are about the companion you're steering.

KeyActionKeyAction
CCharacter tab (stats, skills, carry)SpaceBuild ring (radial menu)
TAutomation tab (rules)TabNext companion (+camera)
KCrafting tab (bedroll, cordage, bow, rod)10Select companion (twice = camera)
EGather (hold)HAim & shoot (bow, hold)
FCentre camera on selectionMWidest zoom
GToggle fog (debug)- / .Game speed up / down
JChronicle (saved history)F1Help
F5 / F9Save / load slotEscClose open window, else pause/settings
F12Dev console (debug builds)Rebind everything in Esc → Settings
— Developer Reference —

Architecture & conventions

Engine, layout, and the ground rules the codebase holds itself to.

  • Engine: Godot 4.x, 2D top-down. GDScript only (no C#).
  • Language: all identifiers, comments, node/scene names in English — no German anywhere in code or the scene tree.
  • Naming: snake_case for vars/funcs/signals/files; PascalCase for classes/nodes/scenes; class_name for reusable scripts.
  • Data-driven: tunables live in .tres Resources (resources_data/) and @export vars — not magic numbers. Numbers should be tunable without touching code.
  • Decoupling: cross-cutting state lives in autoload singletons; systems talk through signals where it decouples them.
PathHolds
scripts/autoload/Singletons (managers, world & save state)
scripts/player/Companion rig: stats, skills, controllers, jobs, automation
scripts/world/Worldgen, terrain/biome/landmark, renderers, camera, weather, fog
scripts/resources/Resource nodes, animals, harvest cycle
scripts/buildings/Buildable, build controller, sites, stockpile inventory
scripts/items/Item catalog, item graphics, ground items
scripts/ui/HUD, panels, dev console, settings, screens
resources_data/All .tres configs: buildings, animals, resources, stats, skills, palette, theme
tests/Headless suite + benches + the screenshot harness

Autoload map

The singletons every system reaches. Persistent autoloads must reset in WorldGenerator._ready (a reload doesn't re-instantiate them).

AutoloadOwnsFile
GridManagerCell↔world math, occupancy gridautoload/grid_manager.gd
TerrainManagerPer-cell terrain / biome / landmark layers, walkability, water bodies, climateautoload/terrain_manager.gd
TimeManagertime_of_day, day, season; ambient temperature; rollover signalsautoload/time_manager.gd
TimeWarpManagerPause / 1–10× via Engine.time_scaleautoload/time_warp_manager.gd
WeatherManagerSeason-weighted weather spells, snow coverautoload/weather_manager.gd
FogManagerThree-state per-cell visibilityautoload/fog_manager.gd
PartyManagerMembers, selection, embodimentautoload/party_manager.gd
BuildingManagerPlacement, sites, rooms, action-area serving, water bodiesautoload/building_manager.gd
CityInventoryAggregate facade over all stockpile tilesautoload/city_inventory.gd
AnimalManagerRunning population tallies, capacitiesautoload/animal_manager.gd
TaskBoardBuilding-posted tasks (11.6)autoload/task_board.gd
SaveManagerNamed save slots, migration seamsautoload/save_manager.gd
EventLog / ChronicleLive feed / saved historyautoload/event_log.gd, chronicle.gd
SoundManagerZoom-gated positional audio, UI clicksautoload/sound_manager.gd
KeybindManager / GraphicsManager / GameState / ResourceManager / GroundItemManagerInput, graphics prefs, run state, resource registry, dropped stacksautoload/…

World generation & terrain

Seams. WorldGenerator.generate() builds the world. TerrainManager.is_walkable(cell) is THE passability seam (nav bake, collision, standability, rooms all read it — a bridge's set_walkable_override opens a crossing for all of them). TerrainManager.climate_offset_at(cell) is THE climate seam. TerrainManager.is_drinkable_water() is THE drink seam; is_fresh_water() is salinity only; is_still_water() is THE quality seam (7.5 — a body that reaches no sea), and IllnessController.wear_bad_water() is the one place an untreated drink is billed.

A cell has three orthogonal per-cell layers: terrain (what it physically is — world/terrain_types.gd: PLAINS/WATER/FOREST/MOUNTAIN/SAND/SHALLOW), biome (its climate — world/biome_types.gd: temperate/ tundra/swamp/desert, grown as one region each), and landmark (world/landmark_types.gd: crater lake / hot springs / standing stones).

Key tunables — scripts/world/world_generator.gd

GroupExports (on the WorldGenerator node in Main.tscn)
Shapeworld_seed, noise_frequency, island_falloff[_power], sea_level, mountain_level, forest_moisture, sand_share
Riversriver_count (2), river_max_half_width (1.7), river_meander_strength (2.2, ceiling ~2.4), river_meander_wavelength, river_source_flank, river_bias_*
Forestwood_per_forest_cell (20), birch_/spruce_/oak_share
Biomestundra_share, desert_share, swamp_share, swamp_bog_count, biome_terrain_affinity
Landmarkscrater_lake_count/radius, hot_springs_count/radius, standing_stones_count/radius, landmark_min_spacing
Spawnspawn_water_min_walk/max_walk (60/90), spawn_open_land_share
Map size & density
Grid size lives solely on the GridRenderer node (512×512). Nothing technical caps it — the nav bake is chunked (chunk_cells 64, ~0.1s at 512², one wall re-bakes only its chunk ~5ms) and every spawn count is a density via TerrainManager.area_scale() (walkable land over REFERENCE_WALKABLE_CELLS ≈203000). 512 is a design choice (3–5 cycles/run), not a performance one.

Rendering: world/terrain_renderer.gd (per-cell texture), terrain_snow.gdshader, tree_canopies.gd (crowns draw over walkers at z 4; _apply_walkers feeds the reveal+sway shader), room_floor_renderer.gd, fog_overlay.gd. All world colours live in resources_data/palette.tres via GamePalette. Nav: walkable_navigation_region.gd; collision: terrain_collision.gd.

Resources & animals

Seams. A resource type is a .tres (resources/resource_type.gd); a creature is a .tres (resources/animal_species.gd) — a new creature needs no code branch. ResourceType.restock decides where a source comes back; HarvestCycle.work_node is the one harvest seam; Animal._can_enter is the movement seam (flies); ItemCatalog holds per-kind nutrition/shelf life.
ConcernFile / configNotable fields
Resource definitionsresources_data/resources/*.tresspawn_terrain, spawn_biome, yield_item, harvest_time, work_scale (rock/fish 10), restock, spawn_seasons, regrow_days, spawn_abundance
Spawning & restockworld/resource_spawner.gdcount_per_type (120, a density), _target_count, _pick_restock_cell
Animal speciesresources_data/animals/*.tresflies, flee_radius_cells (0 = never flees), speed_variance, carrying_capacity, initial_population, food_yield, spawn_near_fresh_water_cells
Animal behaviourresources/animal.gd, world/animal_spawner.gdParametric _draw; breed_check_days (no per-frame registry scan); _can_enter
Harvest & fellingresources/harvest_cycle.gdchop_treeTerrainManager.chop_wood; HARVEST_TIME_SCALE 1.8
Trap
The herd is hundreds of animals — nothing in the tick may scan the whole registry (a naïve mate search cost 47 ms/frame vs 1.4 ms). AnimalManager.count_of() is a running tally, so _spawn() calls setup() before add_child(). And "every animal stands on walkable terrain" is false — fliers only obey the map edge.

Companions

The companion rig is scenes/player/Player.tscn / class_name Player, instanced three times as nodes Character1/2/3 (a node name is a save key — rename via SaveManager.RENAMED_CHARACTER_NODES). Behaviour is split across small controllers on the rig.

Controller / fileOwnsKey seams / tunables
player/player_stats.gd (+ player_stats_config.gd)The six stats, decay, sleep_debtstat_changed signal; config in resources_data/stats/*.tres
player/vitals_controller.gdEating/drinking application, healing gateheals_at_rest(), begin_meal/drink_if_below (the ONLY consumption entries)
player/temperature_controller.gdDrift toward felt warmth_target_warmth() (climate offset, then campfire maxf); in_danger_band()
player/wetness_controller.gd / comfort_controller.gdWet debuff, room-comfort Mood_standing_in_swamp; room_quality_at
player/illness_controller.gdAilment onset/cureruns whatever player/ailments.gd declares
player/ailments.gdWhat each sickness IScause, course, cure — a new one is one entry
player/character_skills.gd (+ skill_set_config.gd)Learning by doingpractice() = XP entry, multiplier() = effect; resources_data/skills_config.tres
player/job_runner.gdExecutes jobs/needs; the tuning heartsee below
player/command_controller.gd / worker_commands.gd / worker_needs.gdRight-click resolution, order execution, need handlershold/drag thresholds; _fetch_from_stores
player/character_profile.gd / nordic_name_generator.gdIdentitydisplay_name() = the name seam; disposition (hidden), recruited, joined_day
player/renegade_controller.gdFalse companions (5.4b)work_factor() (via the ONE work seam), desert_day (drawn once, saved), _tell()
world/wanderer_controller.gdA rig that is NOT in the party (5.4)its PRESENCE is the flag (Player.is_wanderer()); Phase, wanderer_at()

Recruiting — scripts/world/wanderer_spawner.gd

A wanderer is a companion rig (Player.tscn) that has not joined — not a second kind of person. That is the whole design: its identity, carry, drawing and save entry are the ones every companion already has, so recruiting is PartyManager.recruit() → rename onto a free Character<N> (a node name is a save key) + Player.join_party(). A stranger is frozen while it waits (Player._halt_survival) and reveals no fog. Leaving runs the other way: Player.leave_party() attaches a fresh controller in LEAVING and the rig walks off the map and frees itself — expulsion and desertion share that one door.

Spawner knobs: first_possible_day (6), min_days_between (6), arrival_chance (0.22/day), linger_days (3), renegade_chance (0.3), approach_cells (45). One stranger on the road at a time; a full party is sent nobody. Console wanderer [spawn [renegade]|here|panel|recruit|send|desert].

Save trap
SaveManager._collect_characters walks the TREE, not a name list — the party grows now, so CHARACTER_NODES would be a lie the moment somebody joined. A restore builds rigs the fresh world doesn't have (_rebuild_character) and frees Players the save doesn't know. The WandererController must be attached before the rig enters the tree, or it registers a hotkey slot it isn't entitled to.

The big tuning surface — scripts/player/job_runner.gd

Movement/work: move_speed, work_seconds, mine_seconds, fish_seconds. Needs/thresholds: need_trigger_ratio/recover_ratio, emergency_ratio, warm_seek_below/cool_seek_above, despondent_below. Automation: base_rule_slots (12), dev_self_care (re-enables the dormant self-care tiers — tests / a future easier difficulty). Hunting: hunt_range_cells, hunt_base/min/max_hit, hunt_giveup_seconds. Fatigue penalties live on player/player.gd (fatigue_walk_penalty, fatigue_work_penalty, mood_work_penalty).

Design invariant
There is no built-in self-care on any current difficulty — companions act only on orders and rules; passive consumption is gone. The comfort/emergency tiers are dormant behind dev_self_care. Don't silently re-add safety nets.

Automation internals

Seams. A program is AutomationProgram (an ordered AutomationRule list); AutomationInterpreter evaluates it top-down (first feasible triggered rule wins; UNTIL latches). Actions are existing behaviours — rules only choose which runs.
FileRole
player/automation_program.gdThe rule list + block budget accounting
player/automation_rule.gd / automation_condition.gdOne WHEN→DO UNTIL rule; a sensor condition
player/automation_interpreter.gdTop-down evaluation, latch, live diagnosis (ACTIVE/blocked/waiting)
ui/automation_panel.gdThe rule editor (Automation tab)
autoload/task_board.gd + buildings/building_task_rule.gdBuildings post need-driven tasks; the "Take a task" block claims the nearest

Work actions are gated by standing workshops (Buildings). Old saves migrate a painted schedule into time-window rules on load. Console: rules, prog, tasks, auto.

Buildings & construction

Seams. Every building is a Buildable .tres (buildings/buildable.gd) — a new building is data, not code. BuildingManager._serves is the action-area seam (every find_*_near passes through it). Buildable.paint (CHAIN/AREA/single) drives placement. makes_walkable + TerrainManager.set_walkable_override is the bridge seam. _stand_by = which cell to use a building from. Buildable.cost_alternatives + pick_cost = the "9 twigs or 3 wood" seam: a site commits to ONE variant, so everything downstream (delivery, the fetch trip, the panel, the save) still sees a plain cost dictionary.
ConcernFileNotes
Building definitionsresources_data/buildings/*.trescost, cost_alternatives, size, category/secondary_category, action_radius, build_seconds_per_cell, room_warmth, comfort, speed_factor, heat_output/radius, burn_seconds, yields_item, task_rules
Placement / ghost / paintbuildings/build_controller.gdrequest_build_path; CHAIN walls, AREA floors; ghost console
Placement rules, rooms, servingautoload/building_manager.gdcell_placeable, _room_id_at (≤400-cell flood), warmth_at/sheltered_at, adjoining_water_body, floors in _floor_cells
Construction sitesbuildings/construction_site.gdFetch/deliver/build; saved (incl. its committed cost variant); reconsider_cost re-picks while nothing is delivered; cancel_site drops materials
Building node & panelsbuildings/building_node.gd, ui/building_panel.gd, construction_site_panel.gdstack_at = "what lies on this cell"
Save trap
Restore order is ground → structures → interior fixtures (SaveManager._restore_rank): a floor can't be laid on an occupied cell, so restoring a bed before its planks loses the floor silently.

Items, inventory & storage

Seams. ItemCatalog (items/item_catalog.gd) is the ONE data seam for weight, nutrition and shelf life — there is no generic "food" item, every source yields its kind. ItemGraphics.draw() is THE inventory look. Inventory is weight-based (capacity_kg, space_for) with FIFO age batches. StockpileInventory.tile_layout() = one type/tile, 20 units; CityInventory aggregates.
FileRole
items/item_catalog.gdPer-item weight / nutrition / shelf_days / rest_factor
items/item_graphics.gd / ui/item_icon.gdProcedural item drawing (world + inventory)
player/inventory.gdThe carry: kg budget, take_amount/take_all_of, age batches
buildings/stockpile_inventory.gdPhysical tile store, storage rules
items/ground_item.gd + autoload/ground_item_manager.gdDropped stacks (age as they lie)
player/world_hand.gd + ui/character_sheet_panel.gdONE hand (owned by the sheet, character_sheet group); resolve order site>stockpile>hearth>companion>ground
ui/transfer_panel.gdCarry↔pile and carry↔carry exchange window

Time, weather & temperature

Seams. TimeManager only tracks & broadcasts (time_changed/day_changed/season_changed) — it knows nothing about gameplay. WeatherManager.get_effective_temperature() is the one weather-temp seam. Ambient feeds TemperatureController._target_warmth().
FileExports / seams
autoload/time_manager.gdday_length_seconds (18 min), days_per_season (7), start_time_of_day, per-season *_temp, day_night_swing; get_ambient_temperature(), jump_to_day()
autoload/weather_manager.gdmin_/max_spell_hours, temperature_jitter, snow_accumulate_/melt_per_hour
world/day_night_cycle.gdCanvasModulate tint interpolation
world/weather_particles.gd / weather_hazard.gd / cloud_shadows.gdRain/snow/hail particles, hail Health damage, cloud shadows

Temperature damage: cold below 4°C / heat above 35°C (temperature_controller.gd). Pacing: the 18-minute day and ×1.8 task lengths; HARVEST_TIME_SCALE is the harvest seam.

UI & panels

Seams. resources_data/ui_theme.tres is THE UI look seam (panels must not restyle themselves). StatVisuals = glyph+tier+colour; StatusEffects.list(character) = "what is on this companion right now". The companion window is one framed TabContainer with three tabs (C/T/K) — a tab's visible ≠ the window standing, so read is_visible_in_tree().
FileRole
ui/hud.gdRoot HUD; binds the companion window on control switch
ui/companion_window.gd + companion_header.gdThe 3-tab frame; subject()/bind_character(); host_of()
ui/character_sheet_panel.gd / automation_panel.gd / crafting_panel.gdThe three tabs (Character / Automation / Crafting)
ui/character_status_panel.gd / stat_bar.gd / stat_visuals.gd / status_effects.gd / stat_icon.gdParty cards, bars, badges
ui/alert_screen.gdMortal-danger heartbeat (fires at EMERGENCY health tier; health_alert.gdshader)
ui/build_radial_menu.gdThe build ring: one _draw, hit-testing by angle+radius (no node per sector); geometry COMPUTED from the sector count
ui/build_categories.gdThe tree as DATA. Categories declared here; entries GROUPED from the live catalog by Buildable.category — never a list of ids. PLANNED = the greyed placeholders (empty since 16.3, kept as the mechanism). FURNITURE is a real category id deliberately NOT in CATEGORIES, so it gets no sector — the room panel asks for it directly. entries_for matches category or secondary_category, so a piece that belongs in two lists says so itself (the straw bed: furniture and Supply)
ui/room_panel.gdFurniture hangs on the ROOM, not a building (16.3). Binds to a cell, never a room id (ids regenerate on every placement). Drives the ordinary BuildController.select_buildable(buildable, fence) — never a second placement pipeline. Console room panel
ui/building_icons.gdBuildingIcons.draw() = the building icon seam (the twin of ItemGraphics.draw); monochrome, unit-square, one drawing per Buildable.id — unknown id → silent fallback swatch. Console icons audits which entries still wear it
ui/build_icon.gdBuildIcon = the Control that PICKS the seam: a kit (yields_item) draws as its item via ItemGraphics, everything else as its building. Used by the shared entry button and the construction-site panel
ui/build_entry.gdBuildEntry.cost_labels_for() / tooltip_for() feed the ring's info panel AND the crafting tab — one source for what a thing costs
ui/loading_screen.gdPushed phases; everything switched via RenderingServer (force_draw())
ui/event_log_panel.gd / chronicle_panel.gd / task_board_panel.gdFeed / history / task board
ui/wanderer_panel.gdThe recruiting decision (5.4): identity + attributes, take in / send on. Must never read the hidden disposition
ui/pause_menu.gdThe Esc ladder (closes ui_windows group before pausing)
ui/settings_panel.gd + gameplay/graphics/audio/keybindings_settings.gdSettings; rebinding writes per-domain .cfg

Save / load

Seam. New stateful systems must join SaveManager._collect_state / _apply_state. Saves are named slots on disk (user://saves/<name>.save). brutal_testing_saves is true while the prototype is tested (Brutal saves/loads freely) — flip it to restore the permadeath pillar.

Node names are save keys (see Companions). Since recruiting (5.4) _collect_characters walks the tree, not a fixed name list, and _rebuild_character builds the rigs a fresh world doesn't have. Restore obeys a rank order (ground → structures → fixtures). Difficulty (Hard = free save/load, Brutal = suspend-only + slot wipe) is picked on the title screen. Console: saves, save, load, delsave, difficulty.

Console commands

F12 opens the dev console (debug builds only). Handlers live in scripts/ui/dev_console.gd. Every new mechanic should ship a console command.

AreaCommands
Companions / statsselect, who, stat, fill, skill, fatigue, weight, wet, sick, effects, alert, face, figures, wanderer
Windows / itemssheet, rules, crafting, transfer, hearth, hand, skin, give, drop, cook
World / terrainworld, biome, landmark, rivers, salt, freeze, water, tree, chop, canopy, relief, navmesh, sites, room [panel], tp, reveal, fog
Time / weathertime, day, season, speed, weather, clouds, tint
Resources / animalsres, animal, hunt, regrow, restock, spoil
Building / automationbuild, radial, ghost, cancelsite, area, pilerule, freebuild, unlockjobs, auto, prog, tasks
Save / metasave, load, saves, delsave, difficulty, god, chronicle, music, shot, scenario, float, version, help, clear

Testing & tools

ToolCommandPurpose
Headless suitegodot --headless --script res://tests/run_tests.gdSmoke & regression tests
Screenshot harnessgodot --path . --script res://tests/screenshot.gd -- out=… seed=… grid=… cmd="…"Boots the real game with rendering, stages state via console, saves a PNG (needs a display — DISPLAY=:1, not --headless). These wiki screenshots were made with it.
Soak testtests/soak_test.gdN-day base-balance net (not in the suite)
Benches / probestests/animal_bench.gd, grid_benchmark.gd, river_probe.gd, water_probe.gd, sim_night.gdTargeted performance / behaviour probes

Godot binary for this environment: ~/Downloads/Godot_v4.7-stable_linux.x86_64. After adding a class_name, rebuild the class cache before headless tests. Claude cannot see the running viewport — visual work is verified through the screenshot harness or by the developer.

Re-shoot the wiki screenshots
All screenshots regenerate from one script: wiki/screenshots/ is produced by the batch used to build this page (seed 12345, grid 256, res 1360×760). To refresh a shot, re-run screenshot.gd with the same out=, seed= and cmd= line and drop the PNG back in place.

Versioning

One number, one source, and the two things it is deliberately not.

The game's version lives in exactly one place: application/config/version in project.godot — the engine's own field, so an exported build carries it in the PCK for free. Everything in the game reads it through GameVersion (scripts/main/game_version.gd), a static class like BuildCategories: GameVersion.string() gives "0.2.0", GameVersion.label() gives "v0.2.0" — the one spelling every screen uses, so no label re-types the "v".

Scheme: plain semver. While the prototype runs at 0.x, MINOR goes up per completed feature batch and PATCH for fixes; 1.0.0 is reserved for the release that closes the run arc (ROADMAP Milestone 10, the migration cycle). Milestone-derived numbering was rejected — milestones complete out of order, so the version would have run backwards.

Two versions that must not be confused
SaveManager.SAVE_VERSION is the save file FORMAT — the only number that may ever refuse to load a file. GameVersion is the build that wrote it, stamped into each save's header as game_version and shown in the save browser's tooltip. A save from an older build always loads; the stamp is provenance, never a gate.

Where it shows: the title screen's bottom-right corner, the pause menu, every save's header, the console command version (which also prints the engine build and the save format), the Windows executable (mirrored into export_presets.cfg), and the line at the top of this page.

Cutting a release (full steps in CHANGELOG.md): bump project.godot, mirror the number into export_presets.cfg and this page, write the changelog section, run the headless suite, commit, then git tag -a v<version>. The suite fails if the three copies drift apart — that check is what keeps the mirrors honest.

Keeping this in sync important

Standing directive
F1 and this wiki must both be kept permanently up to date — and the wiki in both languages. A feature is not done until all three reflect it.

When a player-facing mechanic changes (a control, a building, a gather target, a survival rule):

  1. Edit HelpPanel.HELP_TEXT in scripts/ui/help_panel.gd — the single on-screen source of player help (its nav is derived from the section headers, so keep the [font_size=17][color=#9ec1ff][b]…[/b] header format).
  2. Update the matching Player Guide section here.
  3. If the change touches code structure (a new file, seam, tunable or console command), update the matching Developer Reference section and, if relevant, re-shoot the screenshot.
  4. Mirror every edit into wiki/index.de.html, the German twin, in the same commit.
Two language versions, one layout
wiki/index.html (English) and wiki/index.de.html (German) are standalone pages with identical structure, ids and anchors — the EN / DE switch is a plain link that carries the current #anchor across, so a section must never exist in only one of them. Their <style> and <script> blocks are byte-identical on purpose: edit the look in one and copy the block into the other — wiki/deploy.sh compares the two and warns when they drift. The deploy uploads both files (and the hook fires for either).

The developer reference is derived from the seam catalogue in the project memory index (memory/MEMORY.md), where each system names its one seam — the fastest place to confirm where a mechanic actually lives.


Companions — prototype developer wiki. Player Guide mirrors the in-game F1 help; Developer Reference maps mechanics to files, seams, tunables and console commands. Screenshots made with tests/screenshot.gd (seed 12345).