Companions

Überblick
Was das Spiel ist und wie ein Durchgang verläuft.
Du steuerst eine Gruppe von drei Gefährten (weitere anwerben, bis zu zehn, ist möglich) aus einer RTS-artigen Draufsicht: Kastenauswahl, Rechtsklick als Befehl. Es gibt keine Spielfigur — die drei sind gleichrangig. Jeder hat den vollen Satz Überlebenswerte und kann einzeln sterben; einen zu verlieren soll tragisch wirken. Der höchste Schwierigkeitsgrad ist Permadeath. Die einzigen Bedrohungen sind Natur — Nahrung, Wasser, Temperatur, Wetter, Jahreszeiten und Entfernung — dazu wehrhaftes Wild, das sich verteidigen darf. Nichts greift jemals deine Basis an.
Ein Durchgang ist ein Kreislauf aus drei Phasen
- Der manuelle Anfang — alles von Hand, keine Automatik. Einen tragfähigen Siedlungsplatz erkunden und von der Hand in den Mund leben.
- Die automatisierte Basis — Gebäude schalten Berufe frei, das Regelprogramm jedes Gefährten bestreitet den Tag, die Siedlung läuft.
- Erschöpfung → Aufbruch — das Land ist ausgezehrt, die Gruppe packt, was sie tragen kann, wandert und fängt stärker von vorn an: Fertigkeiten, Ausrüstung und Gefährten bleiben, der Ort nicht. Jedes Jahr beißt der Winter härter.
Die Karte mit 512×512 Feldern ist auf etwa 3–5 Siedlungszyklen ausgelegt — das ist die geplante Länge eines Durchgangs. Phase 1 und 2 gibt es heute, und die Ausrüstung, die deine Stärke über einen Aufbruch tragen soll, ist angekommen — eine Axt, ein Mantel und ein Hut (siehe Werkzeug & Kleidung). Phase 3 — der Druck, der das Bleiben unmöglich macht — ist der große offene Meilenstein.
Bewegen & umsehen WASD · F · Tab
- WASD schwenkt die Kamera (freier Blick). Die Ansicht bleibt, wo du sie hinstellst — Auswählen oder Befehlen reißt die Kamera nie mit.
- F zentriert die Kamera auf die gewählte Figur und folgt ihr (eine Gruppe wird auf ihren Mittelpunkt gerahmt). Tab tut dasselbe und wechselt dabei den Gefährten.
- Rechtsklick befiehlt allen ausgewählten Figuren (siehe Befehlen); ein grüner Punkt markiert den Zielort, und um das Objekt, auf das du befohlen hast, schnappt kurz ein grüner Kreis eng zusammen. Rechtsklick halten steuert fortlaufend — die Auswahl folgt dem Mauszeiger, bis du loslässt.
- Dichter Wald und loser Sand bremsen das Gehen auf 80 %.
- Mausrad oder +/- zoomen; M springt auf die weiteste Stufe. Die Maus am Fensterrand scrollt die Ansicht (Geschwindigkeit/Randbreite unter Esc → Settings → Gameplay). Über einem Fenster scrollt das Mausrad dieses Fenster — die Karte darunter zoomt es nie.
- Es gibt keine Minikarte und keine Übersichtskarte — du siehst die Insel nie als Ganzes. Das Land zu lesen und zu behalten gehört zum Spiel.
- Die Zeitraffer-Leiste sitzt oben rechts (Pause, 1–10×). Schalte Esc → Settings → Graphics → Show FPS ein, und die Bildrate erscheint direkt darunter — grün über 50, bernstein über 30, rot darunter. Sie aktualisiert sich viermal pro Sekunde in Echtzeit, Zeitraffer und Pause verfälschen sie also nicht.
Deine Gruppe 3 → 10 Gefährten
- Linksklick auf eine Figur wählt sie aus (grün / blau / orange; ein weißer Ring markiert sie). Genau eine ausgewählt heißt „sie ist deine“: E-Sammeln und Bauen benutzen sie, und sie läuft deine Rechtsklicks mit voller Geschwindigkeit.
- Ein Auswahlkasten greift mehrere und befiehlt ihnen gemeinsam.
- Linksklick auf leeren Boden hebt die Auswahl auf — Beobachtermodus; jeder erledigt einfach seine Arbeit.
- Das Infofeld unten links folgt der Maus: Zeige auf ein Feld für Gelände und das, was darauf steht (Baumart & Restholz, Salzgehalt des Wassers, Gebäude, Lagerbelegung, Pflanzenbestand); zeige auf eine Figur für ihre aktuelle Tätigkeit. Der Nebel gilt auch hier.
- Tab übergibt die Kontrolle an den nächsten Gefährten; 1–9, 0 wählen direkt (zweimal tippen zentriert zusätzlich die Kamera). Die Tastenplätze stehen für den ganzen Durchgang fest — die Nummer eines Toten bleibt leer.
- Gefährten lernen durch Tun. Gehen trainiert Running (Tempo), jedes Handwerk seine eigene Fertigkeit, schwere Arbeit und Bauen trainieren Strength (Tragkraft + Bautempo), und durchgestandene Kälte, Nässe und Erschöpfung härten Resilience (wird später krank). Die Veteranen eines Durchgangs sind gemacht, und sie sind das, was du in die nächste Siedlung mitnimmst.
- Fremde klopfen an. Ab und zu kommt ein Wanderer aus der Wildnis und wartet ein paar Tage an der Siedlung. Linksklick auf ihn öffnet sein Panel: Name, Körper, Grundattribute — und sonst nichts, denn ein Neuling kommt ohne Fertigkeiten an. Nimm ihn auf oder schick ihn weiter; wartest du zu lange, zieht er selbst weiter. Die Gruppe ist hart auf zehn begrenzt, und ein zusätzliches Paar Hände isst, bevor es verdient.
- Nicht jeder meint es ernst. Manche Wanderer sind falsche Gefährten: Sie arbeiten langsam, bedienen sich am Lager, und eines Nachts sind sie fort — mit allem, was sie tragen konnten. Das Panel verrät nichts davon — das Ereignisprotokoll schon, über Tage hinweg (jemand nach Einbruch der Dunkelheit am Lager; ein Arbeitstag, der zu wenig einbrachte). Aufmerksame Gefährten (Perception) nennen Namen. Verstoßen kannst du jeden, der beigetreten ist, über sein Charakterblatt (C) — und ein Irrtum kostet dich ein Paar Hände.
Befehlen — Rechtsklick RMT
Der Rechtsklick schickt jede ausgewählte Figur; was passiert, hängt davon ab, worauf du klickst. Dein Wort ist absolut — eine Figur bricht einen Befehl nie ab, nicht einmal, um sich zu retten. Sie setzt bei kritischem Zustand eine rote Warnung ab und macht weiter; brich den Befehl selbst ab, wenn sie überleben soll.
Jeder Klick blitzt einen grünen Punkt am Zielort auf, und wenn der Befehl auf etwas gegeben wurde — einen Baum, einen Strauch, einen Stapel am Boden, ein Tier, ein Feuer, ein Lager, einen anderen Gefährten, einen Höhleneingang — schnappt kurz ein grüner Kreis eng um genau dieses Objekt. Rückmeldung fürs Auge: auf einem vollen Feld siehst du, was die Gruppe als Ziel verstanden hat, nicht bloß, wo der Zeiger war. Ein einfacher Gang auf freien Boden hat nichts zu umkreisen und bekommt nur den Punkt.
| Du klickst auf… | Sie… |
|---|---|
| Freien Boden | gehen dorthin (um tiefes Wasser, Berge und Hauswände herum) |
| Süßwasser / einen Brunnen | Ein Auswahlring: Drink (trinken, bis der Durst voll ist, dann den Wasserschlauch füllen) oder Fill skin (den Wasserschlauch randvoll füllen – und sonst nichts: Füllen ist kein Trinken, wer für den Kessel Wasser holt, schluckt unterwegs keinen Tümpel) |
| Baum / Fels / Pflanze | ernten in die Traglast (Bäume, bis sie fallen) |
| Ein Bett (genau sein Feld) | schlafen, bis sie ausgeruht sind |
| Ein Lagerfeuer 1 ausgewählt | Ein Auswahlring: Tend fire oder Boil water — beide laufen hin und öffnen das Feuer-Tauschfenster beim gewählten Slot. Eingelegt wird nichts von selbst |
| Ein Lagerfeuer Gruppe | Die unbeaufsichtigten Befehle: nachlegen aus der Traglast oder dem nahen Lager (Holz oder Zweige), oder abkochen, was getragen wird |
| Einen liegenden Stapel | heben ihn in die Traglast |
| Ein Lager 1 ausgewählt | gehen hin und öffnen das Transferfenster |
| Ein Lager Gruppe | schaffen ihre Traglast hin und laden sie auf die Felder ab |
| Einen anderen Gefährten 1 ausgewählt | gehen hin und öffnen den Tausch Traglast zu Traglast — man muss den Körper treffen, ein Klick eine Kachel daneben ist ein Laufbefehl |
| Eine blaue Baustelle | helfen beim Bau: holen, liefern, errichten |
Umschalt+Rechtsklick reiht den Befehl als Wegpunkt an. Ein einfacher Rechtsklick ersetzt die ganze Warteschlange. Niemand kümmert sich von selbst um sich — Trinken, Essen, Wärmen und Schlafen geschehen nur auf deinen Befehl oder durch das Regelprogramm (T).
Sammeln — E halten E
Halte E neben einem Ziel; ein Ring füllt sich über die Erntezeit. Gesammeltes wandert in die Traglast dieser Figur, begrenzt durch das Gewicht (~40 kg, durch Strength mehr).
- Bäume → Holz: Jedes Waldfeld ist ein Baum; der gesamte Holzvorrat fällt an, wenn er stürzt (das Feld wird zu Gras). Schläge werden angerechnet — aufhören und später fertig machen ist erlaubt. Vier Arten, an der Färbung erkennbar: Birke (10 Holz), Kiefer (20), Fichte (25), Eiche (35).
- Fels → Stein und Fischen kosten das ~10×fache gewöhnlicher Arbeit — plane ganze Tage ein; Steinmetzhof und Fischerhütte setzen Arbeiter rund um die Uhr daran.
- Kräuter, Beeren, Wurzeln wachsen an Ort und Stelle nach (nicht im Winter). Vogelnester (nur im Frühling, nach dem Ausnehmen endgültig weg), Pilze (Sommer+Herbst, am Waldrand), Haselnüsse (ganzjährig, verderben nie, aber ein abgeernteter Strauch ist erledigt und der nächste wächst außer Sicht), Muschelbänke (Salzküste, ganzjährig, verderben schnell).
- Das Land laugt aus, wo du erntest. Beerensträucher, Kräuterflecken, Wurzelbeete, Hanfbestände und Muschelbänke merken sich, dass sie abgeerntet wurden: Jede entnommene Einheit hinterlässt Sammel-Ermüdung auf diesem Fleck, und ein ausgelaugter Fleck wächst bis zu 4× langsamer nach. Fahre mit der Maus darüber, um den Zustand zu lesen — „picked over (40%, regrows in 3.2 days)“. Kein Würfel: Die Ermüdung klingt von selbst ab, über etwa eine Woche und in jeder Jahreszeit — sie ist eine Bilanz des jüngsten Drucks, keine bleibende Narbe. Sammle im Kreis, nicht an einer Stelle — und je länger eine Basis steht, desto weiter läufst du für ein volles Gepäck.
- Kostenlose Fundstücke (ein halbsekündiges Bücken, danach weg): Zweige und Laubhaufen am Waldrand, lose Steine in der Ebene.
- Wildhanf → Pflanzenfaser — wächst nur auf feuchtem Boden neben Süßwasser (Flussufer und Seeufer; nie an der Salzküste, nie im Landesinneren). Hohe, gefächerte Halme, wächst außerhalb des Winters in ~5 Tagen nach. Faser ist noch keine Schnur: Spinne sie im Crafting-Reiter zu Cordage, und aus Cordage bestehen Bogensehne und Angelschnur. Kein Hanf in Reichweite → kein Bogen und keine Angel — noch ein Grund, warum ein Siedlungsplatz gut oder schlecht ist.
- Jagen braucht einen Bogen (herstellbar, sobald eine Hunting lodge steht). Rehe und Schweine fliehen schneller, als du gehst — du schießt sie: Übernimm einen Jäger, halte H, ein schwankendes Fadenkreuz steigt auf, halte auf das laufende Tier vor und lass zum Schuss los. Ein Treffer ist Zielen, nicht Glück. Ein Schuss schreckt die Beute auf — ein sauberer erster Schuss, dann flieht sie. Die Hunter-Regel schießt genauso von allein, und ohne Wild in Sicht stellt sie sich auf den Ansitz, statt zur nächsten Regel durchzufallen: Sie geht zum nächsten bekannten Waldfeld (ersatzweise irgendwohin ins Freie — nie unter ein Dach) und wartet dort, mit der Meldung „No huntable animals in sight - waiting“. Jagen ist überwiegend Warten.
- Fischen braucht eine Angel (eine Rute plus eine Schnur aus Cordage; herstellbar, sobald eine Fisher's hut steht). Die Hütte verleiht das Fischrecht an ihrem Gewässer, die Angel ist das Gerät: keine Angel im Gepäck → der Gefährte fischt nicht, die Fisher-Regel bleibt blockiert, und die Aufgaben der Hütte bleiben für die liegen, die ausgerüstet sind. Angeln gelten pro Gefährte — drei Fischer brauchen drei Angeln.
Acht Tierarten streifen umher: Rehe und Schweine sind die Herden, von denen du lebst; Tauben und Krähen fliegen dorthin, wo du nicht folgen kannst; Biber bleiben am Süßwasser; Dachse sind langsam genug, um sie zu stellen; Wölfe und Bären weichen nicht (ein Bär ist das meiste Fleisch auf der Karte). Nichts da draußen jagt dich — noch nicht.
Wild verlässt eine Siedlung. Jeder Wanderschritt einer Herde führt auf den ruhigeren Teil des Bodens, den sie überblickt — Rehe und Schweine driften über die Jahreszeiten aus deinem bebauten Umkreis ab. Das ist ein Abwandern, keine Flucht (aufgeschreckt wird nur aus der Nähe durch einen Gefährten), und es gilt nicht für alle gleich: Tauben und Krähen stört eine Siedlung überhaupt nicht. Jagen wird zur Expedition — ein Grund mehr für Wasserschlauch, Schlafrolle und mit der Zeit einen Außenposten.
forage): jeder dauerhafte Bestand eingefärbt
danach, wie stark er abgeerntet wurde — ein ausgelaugter Laufkreis ist es, was die Gruppe nach
außen drängt.Am Leben bleiben
Health, Thirst, Hunger, Tiredness und Temperature (Gesundheit, Durst, Hunger, Müdigkeit, Temperatur) sinken mit der Zeit; Mood (Stimmung) ist ein zweitrangiger, nie tödlicher Wert. Jeder Gefährte ist oben links eine kompakte Zeile; wer mit der Maus darüberfährt, klappt sie zu vollen Balken auf — und nur das öffnet eine Karte, damit sich die Ecke nie umsortiert, wenn die Steuerung wechselt. Buff-/Debuff-Abzeichen neben der Karte zeigen, was auf einem Gefährten liegt — grün = Segen, rot/magenta/violett = Übel. Fällt irgendeine Gesundheit in den roten Bereich, schlägt der ganze Bildschirm Alarm (roter Rand, Herzschlag), damit kein Tod außerhalb des Bildes übersehen wird.
| Gefahr | Was sie anrichtet | Das Gegenmittel |
|---|---|---|
| Durst leer | Tötet in ~einem halben Tag (am schnellsten). Ein Companion braucht 2–3 Liter am Tag — mehr in der Hitze, mehr an einem Tag voller Wege und Arbeit | An Süßwasser/Brunnen trinken oder aus dem getragenen Schlauch (Doppelklick auf den Werkzeug-Slot im Blatt); der Schlauch fasst 5,0 L, rund zwei Tage — ihn voll halten |
| Hunger leer | Verhungern über mehrere Tage | Aus der Traglast essen (Eat-Regel / Doppelklick im Blatt); Überschuss kochen & räuchern. Jede Sorte sättigt anders (Fleisch 60, Beeren 25) — und Beeren löschen auch etwas Durst (+5 je Handvoll), das einzige Essen, das einen Schluck zurückgibt |
| Müdigkeit niedrig | Gehen −25 %, Arbeit −40 %; Schlafschuld zehrt bis zu 60 % schneller | Im Bett schlafen (heilt auch Gesundheit); auf Wanderung die Schlafrolle ausrollen |
| Temperatur | Unter 4 °C oder über 35 °C zehrt an der Gesundheit | Am Feuer/drinnen wärmen; am Wasser/Brunnen abkühlen |
| Nass (Regen/Sumpf) | Fühlt sich bis zu 30 % kälter an, −5 % Tempo, drückt die Stimmung | Trocknet am brennenden Feuer oder unter Dach am schnellsten (~4 h) |
| Fever (Fieber) | Aus Kälte, Nässe und Erschöpfung. −25 % Arbeit, zehrt unbehandelt an der Gesundheit; kann töten | Bettruhe + Kräuter aus der Traglast |
| Dysentery (Ruhr) | Aus unbehandeltem Wasser. −20 % Arbeit — und macht durstiger, die Falle, die sich selbst nährt | Bettruhe + Kräuter; danach nur noch sauberes Wasser |
| Food poisoning (Lebensmittelvergiftung) | Aus rohem oder verdorbenem Essen. −30 % Arbeit, der härteste Schlag der drei, aber schnell vorbei | Bettruhe + Kräuter; Fleisch vorher garen oder räuchern |
| Stehendes Wasser (See/Tümpel) | Jeder unbehandelte Schluck baut die Ruhr-Last auf (~27 je Liter — rund 3,7 L bringen sie zum Ausbruch) | An fließendem Wasser oder am Brunnen trinken; oder es schöpfen und im Pfannenslot eines Feuers abkochen |
| Niedergeschlagen (Stimmungstief) | Verweigert das Regelprogramm UND versorgt sich nicht mehr selbst | Nur noch direkte Befehle — trocken, warm, satt und gesund pflegen |
Was dir schadet, lässt dich nicht heilen: Eine leere Durst-/Hungerleiste oder ein frierender bzw. überhitzter Körper setzt die Regeneration im Schlaf vollständig aus — der Schläfer baut Müdigkeit ab, wacht aber nicht gesünder auf. Der Winter ist die Prüfung: Höfe ruhen, Pflanzen wachsen nicht nach, keine Tiere werden geboren. Lege im Herbst Vorräte an; Nüsse, Fischerei und Muschelbänke tragen das ganze Jahr.
Boni & Mali — die genauen Zahlen
Jeder Zustand, den ein Gefährte tragen kann, was er wirklich kostet und wie er endet.
Zustände erscheinen als Symbole neben der HUD-Karte und unter dem Porträt im Charakterblatt (C). Die Farbe sagt die Art, bevor man irgendetwas liest: grün = ein Bonus, und magenta / blau / violett / rot = etwas stimmt nicht. Alle Verlangsamungen unten multiplizieren sich: durchnässt, erschöpft und krank zugleich ist ein Gefährte, der sich kaum noch bewegt.
| Symbol | Was es auslöst | Was es kostet | Wie es endet |
|---|---|---|---|
| Überladen (Gewicht) | Ein Rucksack über dem Gewichtsbudget (40 kg Basis, ×1,05 je Stärke-Stufe → 60 kg auf Stufe 10). Nur du kannst das verursachen — jeder automatische Weg hält am Budget an. | Das Lauftempo fällt linear von 100% auf 0% zwischen Budget und +50%. 20% drüber = 40% langsamer. Bei +50% wird das Symbol rot und der Gefährte kann sich gar nicht mehr bewegen. Die Arbeit bleibt unberührt. | Etwas aus dem Rucksack nehmen. Sonst nichts. |
| Nass (durchnässt) | Im offenen Regen, Hagel oder Schnee stehen durchnässt in 30 min; ein Sumpf braucht 1,5 h (ein Moor nässt nur, was darin steht). | −5% Laufen und −5% Arbeit bei voller Nässe, und die gefühlte Wärme fällt auf 70% — das ist, was tatsächlich tötet, denn Kälte füttert die Fieber-Belastung. Die Stimmung sinkt mit. | Unter einem Dach oder am brennenden Feuer: 4 h ab durchnässt. Draußen trocknet es auch, aber nur so schnell wie der Himmel erlaubt: 10 h × Wetter (alles, was fällt = gar nichts, bedeckt 35%, klar 100%) × Temperatur (nichts bei 5 °C, voll ab 20 °C, bis 150% in echter Hitze). Aus einem Moor kann man sich nicht heraustrocknen — man muss gehen. |
| Fieber | Die Kälte-und-Nässe-Belastung, die sich füllt (Auskühlung, Durchnässung, Erschöpfung). Die Belastung ist deterministisch — es gibt keine Würfel, und sie fällt von selbst, solange die Ursache fernbleibt. | −25% Arbeit, −10% Laufen bei voller Schwere. Zieht die Stimmung in 18 h von voll auf leer. Über Schwere 0,75 zehrt es an der Gesundheit und tötet aus vollem Stand in 24 h. | 24 h Bettruhe oder 12 h Kräuterbehandlung — beides stapelt sich. Erst trocken und warm werden, sonst kommt es einfach wieder. |
| Ruhr | Stehendes Wasser trinken (See oder Teich — ein Fluss oder ein Brunnen ist sauber). Je Liter kommen 27 auf eine 0–100-Belastung; bei 100 — also nach rund 3,7 Litern, anderthalb Tagen ohne anderes Wasser — bricht sie aus. | −20% Arbeit, −15% Laufen. Stimmung von voll auf leer in 12 h. Über Schwere 0,80 tötet sie aus voller Gesundheit in 30 h. Und sie zieht zusätzlich alle 8 h eine volle Durstleiste — das ist die Falle: schlechtes Wasser macht durstiger, und der Durst schickt dich zurück zum schlechten Wasser. | 30 h Bettruhe oder 15 h Kräuter — und ab dann sauberes Wasser: abkochen, aus einem Fluss trinken oder einen Brunnen graben. |
| Lebensmittelvergiftung | Rohes Fleisch oder verdorbenes Essen. Gefährten tun das nie von selbst; es ist ein von Hand verfütterter Fehler. | Die härteste der drei: −30% Arbeit, −20% Laufen. Über Schwere 0,70 tötet sie aus voller Gesundheit in 18 h und zieht alle 12 h eine Durstleiste. | 12 h Bettruhe oder 6 h Kräuter. Sie geht schnell vorbei, aber sie trifft hart. |
| Ankränkelnd (blass) | Eine Belastung über ihrer Warnlinie — die Krankheit ist noch nicht ausgebrochen. | Noch nichts. Es trägt das eigene Symbol der kommenden Krankheit, ausgewaschen, damit man weiß, welche kommt, und sie noch aufhalten kann. | Die Ursache abstellen. Eine Belastung fällt von selbst, solange die Ursache fernbleibt. |
| Erschöpft | Müdigkeit unter 35%. | Beine und Hände werden linear langsamer bis −25% Laufen und −40% Arbeit bei leerer Leiste. Die Hände versagen vor den Beinen, absichtlich. | Schlafen. Ein Bett ist am besten, eine ausgerollte Schlafrolle bringt 70% der Bett-Erholung, blanker Boden am wenigsten. Eine Schlafrolle im Rucksack zählt gar nicht. |
| Schlaflos (Schlafschuld) | Eine abgebrochene Nacht: der Fehlbetrag wird gemerkt. | Die Müdigkeit sinkt bis zu 60% schneller, bis die Schuld getilgt ist. | Ein Schlaf, der mit voller Müdigkeitsleiste endet. Eine weitere abgebrochene Nacht tilgt sie nicht. |
| Mutlos | Stimmung ganz unten. | Der schwerste Malus, der selbst keinen Schaden macht: der Gefährte verweigert sein Regelprogramm und versorgt sich nicht mehr selbst. Unter Stimmung 35% kostet schlechte Moral schon bis zu −15% Arbeit. | Nur direkte Befehle dringen durch. Von Hand pflegen — Trinken befehlen, Essen reichen, trocken, warm und gesund machen. |
| Behandelt | Eine Kräuterdosis genommen. | Ein Bonus: sie heilt, was auch immer plagt. Eine Dosis behandelt alle Krankheiten zugleich — Medizin ist für den Körper, nicht für eine Diagnose. | Läuft von selbst aus. |
| Behaglichkeit | In einem erkannten Raum stehen. | Ein Bonus: die Raumqualität hebt die Stimmung drinnen und doppelt im Schlaf. Die Qualität ist der Durchschnitt des comfort über die Zellen — Holzboden zahlt 1,0 je Zelle, Möbel zahlen ihr eigenes dazu, gedeckelt bei 100%. |
Den Raum verlassen. |
Arbeit & Handwerke — wie jedes aufgelöst wird
Sammeln, Fällen, Bergbau, Fischen und Jagen sind nicht eine Mechanik — sie kosten unterschiedlich viel Zeit und brauchen Unterschiedliches.
| Handwerk | Wie es funktioniert | Zeit | Braucht |
|---|---|---|---|
| Sammeln | Beeren, Kräuter, Pilze, Wurzeln, Eier, Muscheln, Nüsse — E am Knoten halten oder eine Ernte befehlen. Der Knoten leert sich und wächst je nach Art an Ort und Stelle nach, erscheint anderswo neu oder ist für die Saison weg. | 2,7 s je Einheit (die Basis-Arbeitsuhr) | Nichts |
| Fällen | Jede Waldzelle ist ein Baum mit endlichem Holzvorrat (Birke 10, Kiefer 20, Fichte 25, Eiche 35). Jeder Hieb bucht Fortschritt auf der Zelle — kein Hieb geht je verloren, und die Krone dünnt sichtbar aus. Der ganze Vorrat fällt mit dem letzten Hieb, der die Zelle zu Ebene macht. | 5,4 s je Hieb; ein Baum braucht 2 Hiebe je Holz, eine Eiche also 70 Hiebe | Nichts — aber eine Axt macht es ×1,5 (ein Holzfällerlager schaltet den Automatik-Beruf frei und repariert die Axt) |
| Bergbau | Von einer Zelle neben der Felswand aus. Endlos, bis umgelenkt. | 27 s je Stein — 10× die gewöhnliche Arbeit, mit Absicht | Ein Steinmetzhof schaltet den Beruf frei |
| Fischen | Eine Fischerhütte ist ein Fischereirecht auf dem einen Gewässer, an dem sie liegt — keine Lizenz, überall zu fischen. Ein Fischer geht am näheren Teich vorbei zum See seiner eigenen Hütte. Ein anderes Gewässer befischen? Bau eine Hütte daran. | 27 s je Fisch — ebenfalls 10× | Eine Angelrute (Schnur aus Pflanzenfaser) und für den Beruf eine Fischerhütte an dem Gewässer |
| Jagen | Zwei verschiedene Dinge. Von Hand (H): ein echter Zielschuss — das Fadenkreuz schwankt, man löst aus, wenn es sich beruhigt, und der Treffer ist geometrisch (Pfeil 420 px/s, trifft innerhalb 12 px, Reichweite 12 Zellen). Automatisiert: ein gewürfelter Schuss alle 2 s, Aufgabe nach 8 s Verfolgung, 6 s Abklingzeit. Ohne Bogen stattdessen E neben dem Tier halten. | Je Schuss, nicht je Einheit | Einen Bogen im Rucksack für den Fernkampf; eine Jagdhütte schaltet den Beruf frei |
| Wasser schöpfen | Den Wasserschlauch am Ufer oder Brunnen füllen. Wasser reist nie lose — eine Schlauchfüllung (5,0 L) ist, was ein Gang trägt. | 2,7 s je Liter | Trinkbares Wasser in Reichweite |
| Abkochen | Abgestandenes Wasser im Pfannen-Slot eines Feuers wird sauberes Wasser. Die ganze Ladung wird gemeinsam fertig — nie in Tranchen. In die Pfanne passt genau eine Schlauchfüllung, und diese 5,0 Liter brauchen eine Spielstunde am Lagerfeuer, ein Drittel davon am Steinherd. Abkochen ist unbeaufsichtigt: mittendrin weggehen kostet nichts. | 1 h je Schlauchfüllung (Lagerfeuer) | Ein brennendes Feuer, das kochen kann |
Jedes Handwerk trainiert seine eigene Fertigkeit durchs Tun, und die Fertigkeit multipliziert das Tempo zurück. Schwere Handwerke und Bauen trainieren Stärke (mehr Traglast und schnelleres Bauen), Laufen trainiert Rennen, und Kälte, Regen oder Erschöpfung auszuhalten härtet Widerstandskraft (wird später krank).
Werkzeug & Kleidung getragen, nicht angelegt
Ausrüstung ist das, was einen Aufbruch überlebt. Bisher gibt es drei Stücke — eine Axt (axe), einen Mantel (coat) und einen Hut (hat) — und alle drei entstehen an der Handwerksbank (K).
| Stück | Kostet | Was es tut |
|---|---|---|
| Axt (axe) | 2 Holz + 2 Stein — braucht ein stehendes Holzfällerlager | Hacken geht ×1,5. Der Bonus multipliziert sich mit deiner Holzfäller-Fertigkeit, statt sie zu ersetzen, und dieselbe Erschöpfung, Nässe und Krankheit ziehen ihn herunter wie alles andere — es gibt immer nur ein Arbeitstempo. |
| Mantel (coat) | 2 Cordage + 10 Pflanzenfasern — keine Werkstatt nötig | +6 °C Isolierung (Brust). |
| Hut (hat) | 1 Cordage + 4 Pflanzenfasern — keine Werkstatt nötig | +2 °C Isolierung (Kopf). |
Kleidung isoliert — sie heizt nicht
Getragene Wärme wird auf die gefühlte Temperatur addiert, aber nur bis 20 °C: sie kann einen frierenden Gefährten Richtung Behaglichkeit heben und einen warmen nie darüber hinaus schieben. Ein Mantel ist deshalb nie eine Last, die du nicht loswirst — in einer Sommerwüste tut er schlicht nichts, und ein loderndes Feuer schlägt ihn ohnehin. Beides zusammen sind +8 °C, also ungefähr der Unterschied zwischen einer klaren Herbstnacht und einer überlebbaren. Ein zweiter Mantel im Gepäck verdoppelt nichts: je Körperstelle zählt nur das wärmste Stück.
Eine Axt nutzt sich ab und wird dort geflickt, wo sie entstand
Hacken nutzt die Axt ab — deterministisch, nie per Würfelwurf: sie hält 400 Sekunden echtes Hacken, das sind rund neun Spielstunden davon, ein voller Arbeitstag an den Bäumen. Der Trageplatz im Charakterblatt zeigt den Zustand als Prozentwert von grün nach rot, und der Bruch selbst schreibt eine Zeile ins Ereignisprotokoll. Eine kaputte Axt hilft einfach nicht mehr — du hackst von Hand im gewöhnlichen Tempo weiter, bis sie geflickt ist; nichts geht verloren, nichts wird zerstört.
Zum Reparieren: Rechtsklick auf das Holzfällerlager, mit der abgenutzten Axt im Rucksack. Der Gefährte läuft hin, zahlt 1 Holz — aus dem eigenen Rucksack oder aus den Lagern geholt wie das Material eines Bauarbeiters — und die Axt ist wieder voll. Reparieren ist bewusst viel billiger als eine neue zu fertigen: das ist der Lohn dafür, die Werkstatt stehen zu lassen.
Bogen und Angelrute sind weiterhin reine Schranken statt Ausrüstung: eine davon zu tragen erlaubt überhaupt erst das Schießen bzw. Fischen, aber keine von beiden beschleunigt etwas oder nutzt sich ab.
Waren bewegen — die eine Hand
Es gibt genau eine Hand im Spiel, und jedes Fenster füllt sie auf dieselbe Weise.
Hebe einen Stapel im Traggitter des Charakterblatts auf, im Transferfenster oder direkt von einem Lagerfeld auf der Karte (Shift+Rechtsklick) — es ist immer dieselbe Hand, ein Stapel kann also nie an zwei Orten sein. Ein Fenster zu schließen behält den Stapel in der Hand, und genau so kommt er hinaus auf die Karte: trag ihn zu einer Baustelle, an den Herd eines Feuers, auf einen Stapel oder zu einem Gefährten und setz ihn mit Linksklick ab. Esc bei leerem Bildschirm legt ihn dorthin zurück, wo er herkam.
Abgelegt wird in Armlänge — lauf den Gefährten also erst hin. Ein Feuer ist die eine Ausnahme: mit Brennstoff, rohem Essen oder unbehandeltem Wasser in der Hand genügt ein Linksklick auf ein Feuer irgendwo auf der Karte, und der Gefährte trägt es hin — angekommen öffnet sich das Feuer-Tauschfenster mit deinem Stapel weiterhin in der Hand, ein Klick auf einen Slot legt ihn hinein. Nur der Weg wird dir abgenommen. Eine Kochstelle, die es gar nicht nehmen würde (eine Pfanne, die schon eine andere Sorte gart), sagt das schon beim Klick statt erst nach dem Weg; und das Fenster öffnet sich, egal wohin du gerade schaust — auch wenn du den Gefährten unterwegs abgewählt hast.
| Geste | Im Charakterblatt | Im Transferfenster |
|---|---|---|
| Rechtsklick auf ein Feld | Diese Charge in die Hand nehmen | Diese Charge (bzw. den Stapel dieses Lagerfelds) in die Hand nehmen |
| Shift+Rechtsklick | Fragt, wie viele in die Hand kommen | Fragt, wie viele auf die andere Seite gehen |
| Doppelklick | Eine Einheit essen | Eine Einheit hinüberschieben |
| Doppelklick auf den Werkzeug-Slot | Trinken aus dem Wasserschlauch, bis der Durst voll ist | Einen Liter aus dem Schlauch in das Gefäß gegenüber gießen (Shift: alles darin, bis auf den letzten Zehntelliter) |
| Shift+Doppelklick | Den ganzen Stapel in die Hand nehmen — jede Alters-Charge dieser Art, nicht nur das angeklickte Feld | Den ganzen Stapel hinüberschieben |
| Linksklick mit vollem Hand | Absetzen oder mit der angeklickten Charge tauschen | Auf dieser Seite absetzen |
| Klick außerhalb des Fensters | Fällt zu Boden, zu Füßen des Gefährten — jeder kann ihn per Rechtsklick wieder aufheben. Ein Getränk wird stattdessen ausgeschüttet: eine Flüssigkeit liegt nicht als Haufen herum. | |
Das Feuer-Tauschfenster
Rechtsklick auf ein Feuer mit einem ausgewählten Companion und Tend fire oder Boil water wählen: der Companion läuft hin und ein Fenster öffnet sich — links seine Traglast und sein Wasserschlauch, rechts die Slots Fuel, Pan und Ready der Feuerstelle. Eingelegt wird nichts für dich: der gewählte Befehl benennt nur den Slot, auf den es geht (Brennstoff in die Flamme, der Wasserschlauch in die Pfanne) — hineinlegen musst du selbst, mit einem Klick, und du bestimmst wie viel. Trägt er nichts Passendes, läuft er trotzdem hin und das Fenster sagt es in Rot, denn „ich habe nichts zu verbrennen“ ist genau das, was du dort herausfinden wolltest.
Alles bewegt sich mit denselben Gesten wie im Tauschfenster, und die Reichweite des Feuers ist sein Hitzeradius — überall in seiner Wärme gilt als „am Feuer stehend“, man muss also nicht direkt auf der Feuerstelle kleben. Abgekochtes Wasser aus dem Ready-Slot geht in den Wasserschlauch, nie in die Traglast.
Bauen — Leertaste drücken Leertaste
Du beginnst mit nichts. Leertaste öffnet den Bauring (Radialmenü, 2026-07-20): ein innerer Ring aus Kategorien — Workshops, Structure, Supply, Demolish —, wobei ein Linksklick auf eine Kategorie sie im zweiten, äußeren Ring öffnet. Beim Überfahren erklärt das Infofeld unter dem Kreis den Eintrag samt Kosten je Material (grün = jetzt bezahlbar, rot = nicht). Platziere ihn, und jede ausgewählte Figur geht ihn bauen (die nächstgelegene, wenn keine ausgewählt ist). R dreht den Geisterbau vor dem Setzen.
Die Mitte geht immer einen Ring zurück und schließt das Menü auf der obersten Ebene — dasselbe, was Rechtsklick und Esc tun, damit es eine einzige Regel für den Ausgang gibt. Leertaste schließt aus jeder Tiefe. Es werden immer nur zwei Ringe gezeichnet: Eine geöffnete Kategorie ersetzt den äußeren Ring, statt einen dritten hinzuzufügen, deshalb ist Verschachtelung gratis und der Kreis wächst nie. Ausgegraute Einträge gibt es in zwei Sorten, die man nicht verwechseln darf — ein Schloss ist ein Spielerziel (die Werkstatt, die es freischaltet, steht noch nicht), eine gestrichelte Umrandung ist ein geplanter Platzhalter, den es im Spiel noch nicht gibt.
Es gibt kein fertiges Haus. Das ziehbare Fertighaus wurde dem Spieler aus der Hand genommen (2026-07-20): Jedes Haus wird jetzt aus Wänden, Türen und Böden entworfen und hat genau die Form, die du umschließt. Berufsgebäude werden weiterhin einfach gesetzt und der Hof bleibt ziehbar — eine Werkstatt ist Ausrüstung, keine Architektur; nur das Zuhause ist der Entwurf des Spielers.
| Gebäude | Was es tut | Anmerkung |
|---|---|---|
| Campfire (Lagerfeuer) | Wärme + Feuerstelle (Brennstoff / Kochen) | 9 Zweige oder 3 Holz (siehe unten); Wirkbereich 20; körperlicher Wärmeradius 3,5 |
| Well (Brunnen) | Trinken, Schläuche füllen, abkühlen | Die einzige Trinkquelle, die Arbeiter von selbst nutzen — sprudelt weiter, wenn das Wasser gefriert |
| Bed / Stone hearth (Bett / Steinherd) | Möbel | Gar nicht im Bauring — wird über das Raum-Panel gesetzt |
| Straw bed / Bedroll (Strohbett / Schlafrolle) | Möbel, die auch als Lager taugen | Die zwei Stücke in beiden Listen: im Raum-Panel und im Supply-Ring, damit sie schon vor jedem Raum neben dem Lagerfeuer hingeworfen werden können (secondary_category) |
| Wall / Door (Wand / Tür) | Umschließen einen warmen, überdachten Raum | Wände werden als gerade, verkettete Züge gezogen; die Tür ist begehbar |
| Bridge (Brücke) | Der einzige Weg über einen Fluss | Ein Deck von Ufer zu Ufer ziehen; macht Wasser begehbar |
| Wooden Floor (Holzboden) | Hebt die Stimmung im Raum | Boden, kein Möbel — Betten/Feuer stehen darauf |
| Road (Straße) | Darauf läuft man ~35 % schneller | Boden wie ein Fußboden; 1 Werkstein oder 1 roher Stein pro Feld — der Preis, nicht das Tempo, hält die Platzwahl ehrlich |
| Stockpile zone / Storage box (Lagerzone / Kiste) | Siedlungslager (1 Sorte je Feld, 20 Einheiten) | Die Zone ist kostenlos; auf freiem Boden aufziehen |
| Water barrel (Wasserfass) | Lagert Wasser (20 Liter, sauber oder abgestanden) | Reserve für Winter/Dürre; DRAW + HAUL füllen es; es reicht zuerst das saubere Wasser aus |
| Smokehouse (Räucherhaus) | Macht frische Nahrung haltbar | Dient zugleich als Lager |
| Lumber camp / Fisher's hut / Mason's yard / Hunting lodge | Werkstätten | Jede schaltet ihr Handwerk für die Regeln frei (Fischen und Jagen brauchen zusätzlich Angel bzw. Bogen im Gepäck). Holzfällerlager, Steinmetzhof und Räucherhaus führen außerdem eine Fertigungsliste — siehe unten |
| Farm (Hof) | Gemüse (der Farmer bestellt ihn) | Ruht im Winter |
| Planning table (Planungstisch) | +6 Regelblöcke; Programme kopieren; öffnet das Aufgabenbrett | — |
Die Fertigungsliste der Werkstatt 19.1
Eine Werkstatt war bisher nur eine Marke: sie schaltete ein Handwerk frei und stellte eine Aufgabe ein, aber niemand stand jemals an ihr. Seit 19.1 führen Holzfällerlager, Steinmetzhof und Räucherhaus eine Fertigungsliste — per Linksklick sagst du ihnen, was sie herstellen sollen.
Der Handwerker holt die Zutaten selbst (erst aus dem eigenen Gepäck, sonst mit einem Gang zum Lager — genau das, was ein Bauarbeiter für sein Material tut), arbeitet an der Werkbank und steckt das Ergebnis ein. Der Fortschritt gehört dem Auftrag, nicht dem Arbeiter: zwei Gefährten an einer Bank addieren ihre Arbeit, und wer mittendrin abgezogen wird, verliert die angesammelten Sekunden — niemals das Material. Der Bastelplatz (das 1×1-Feld, das du über den Handwerks-Reiter K irgendwo absteckst) bleibt unangetastet — Axt, Bogen, Angel, Schlafrolle, Schnur, Mantel und Hut entstehen weiter dort.
| Rezept | Hergestellt in | Kostet | Was es bringt |
|---|---|---|---|
| Planks (Bretter) | Holzfällerlager | 2 Holz → 3 Bretter | Wände, Türen, Böden, Betten und Kisten für ein Drittel weniger Holz — und leichter zu schleppen |
| Cut stone (Werkstein) | Steinmetzhof | 2 Stein → 3 Werksteine | Straßen, Brunnen und Steinherd für ein Drittel weniger Stein — erst das macht eine lange Straße bezahlbar |
| Charcoal (Holzkohle) | Räucherhaus | 4 Holz → 2 Holzkohle | Brennt 3× so lange wie ihr Scheit bei einem Drittel des Gewichts — der Brennstoff für unterwegs |
Zwei Preise für ein Gebäude. Ein Bauwerk darf alternative Kosten führen — beim Lagerfeuer 9 Zweige oder 3 Holz (2026-07-21). Zweige liegen überall herum, deshalb muss das erste Feuer eines Durchgangs nie auf einen gefällten Baum warten. Der Bauring zeigt beide an, jedes Material nach dem Besitz der Siedlung eingefärbt, mit einem or dazwischen; ein Grundriss legt sich auf eine Variante fest (die, die er decken kann, primär zuerst) und zeigt nur diese an. Solange noch nichts geliefert wurde, entscheidet er sich selbst neu, sodass ein Grundriss, der Holz wollte, nach Zweigen fragt, sobald Zweige in Reichweite sind; sobald das erste Material eintrifft, ist die Rechnung darin festgeschrieben. Abriss erstattet die Hälfte dessen, was wirklich bezahlt wurde — ein aus Reisig errichtetes Feuer gibt Reisig zurück.
Und zwei Brennstoffe für ein Feuer. Dieselbe Überlegung trägt über den Bau hinaus: Ein Feuer, das man aus Zweigen errichten kann, kann man auch mit ihnen füttern (2026-07-21). Ein Lagerfeuer brennt Holz oder Zweige, 3 Zweige je Scheit, der Stone hearth (Steinherd) genauso. Scheite werden immer bevorzugt, solange es welche gibt — jeder Brennstoff-Gang arbeitet die Liste der Reihe nach ab, die Gruppe greift also erst zum Reisig, wenn der Holzstapel leer ist. Alles, was ein Feuer versorgt, geht durch diese eine Liste: der Rechtsklick-Befehl, die REFUEL-Regel, eine übernommene Aufgabe, gehaltenes E am Feuer, die Welt-Hand und der FUEL-Slot des Panels (der in Scheiten zählt, aber beides annimmt).
Einen Raum möblieren — Linksklick hinein
Ein selbst entworfenes Haus ist kein Objekt, das man anklicken kann, deshalb hängt das Möbel-Panel am Raum: Linksklick auf ein beliebiges Feld eines umschlossenen Raums öffnet es, liest den Raum aus (Felder, Schutzwärme, Wohnlichkeit) und listet die Möbel auf, die hineindürfen. Wählst du ein Stück, nimmt der Geisterbau nur Felder innerhalb dieser Wände an — ansonsten ist es eine ganz gewöhnliche Baustelle: Bauleute holen das Material und errichten es. Ein weiterer Klick in denselben Raum oder Esc schließt es. Es wird zuletzt von allen Kartenklicks aufgelöst, alles mit einem eigenen Panel (ein Lager, ein Feuer, eine Baustelle) behält den Klick also.
| Stück | Kosten | Arbeit | Was es ist |
|---|---|---|---|
| Bedroll (Schlafrolle) | 1 getragene Schlafrolle | keine (ausrollen) | Die unterste Stufe: 70 % der Bett-Erholung, kein Schutz vor Kälte. Im Crafting-Tab (K) gefertigt und aus dem Supply-Ring oder der Möbelliste eines Raums ausgelegt. Sie liegt 1×2 (R dreht sie). Rechtsklick: Sleep oder Pick up — beim Aufnehmen wandert die ganze Rolle zurück in den Rucksack, sie übersteht also jeden Umzug |
| Straw bed (Strohbett) | 6 Laub | keine (sofort) | Eine schlechte Nacht — und das einzige Stück, das keinen Raum braucht: Es steht auch im Supply-Ring und kann so schon am ersten Abend neben dem Lagerfeuer entstehen. Nur abreißbar (halbe Rückgabe): ein Stück, das man zurücklässt |
| Bed (Bett) | 6 Laub + 1 Holz | 14,4 s/Feld = 28,8 s | Das richtige: erholt schneller und heilt im Schlaf. Es liegt 1×2 — R vor dem Setzen dreht es quer |
| Stone hearth (Steinherd) | Stein + Holz, braucht einen Mason's yard | 10,8 s/Feld | Das Feuer für drinnen: Wärme wie ein Lagerfeuer, ~3× so lange Brenndauer je Scheit und größere Reichweite. Ein Herd trägt ein Haus durch eine Winternacht, und er kocht wie jedes Feuer |
Die beiden Betten unterscheidet ihre ARBEIT, nicht ihr Preis (2026-07-21): Ihr
Material ist fast identisch, also trennt sie die Arbeit. Ein Strohbett setzt
build_seconds_per_cell = 0 — sofort: total_build_seconds()
hat 0,001 als Untergrenze, deshalb vollendet es der erste Arbeitsframe eines Bauenden. Das Material
muss trotzdem zur Baustelle getragen werden; nur die Arbeit ist null. Das Bett kostet doppelt so
viel Arbeit wie früher (7,2 → 14,4 s je Feld). Der Tooltip des Eintrags nennt die Arbeit in
Spielzeit für einen Bauenden (BuildEntry.labour_line); Helfer addieren ihre Anteile und
verkürzen sie.
Ein Raum ist noch kein Zuhause. Seine Wohnlichkeit ist der Durchschnitt über seine Felder aus dem darauf verlegten Boden und den darin stehenden Möbeln, und diese Wohnlichkeit hebt die Stimmung, solange ein Gefährte drinnen ist — im Schlaf doppelt. Übermöblieren macht den Raum lediglich fertig; es ist gedeckelt und nie ein Exploit.
Automatisieren — T drücken T
Automatik wird gebaut, nicht eingeschaltet. Schreibe jedem Gefährten ein Programm — eine geordnete Liste aus Regeln der Form WHEN Bedingung(en) → DO Aktion UNTIL Abbruch. Die Reihenfolge ist die Priorität.
- WHEN — Sensoren: die Körperleisten (auch Health & Mood), Nässe, Krankheit, die Uhr, die Jahreszeit, Niederschlag, das Siedlungslager, die eigene Traglast, der Wasserschlauch, Brennstoff im Feuer, eine wartende Baustelle. Bedingungen werden mit UND verknüpft.
- DO — Aktionen: die Handwerke (fällen, fischen, ackern, brechen, jagen), trinken, essen, schlafen, wärmen/abkühlen, Feuer versorgen, bauen, Wasser schöpfen, Wasser abkochen (das Teichwasser im Schlauch zu einem Feuer tragen und sauber kochen), die Traglast ins Lager schaffen, Gegenstände in die Traglast holen und eine Aufgabe nehmen vom Aufgabenbrett.
- UNTIL — die Verriegelung: „Holz fällen UNTIL Lager ≥ 60“ hält eine Regel über ihren Auslöser hinaus am Laufen, damit Gefährten nicht an der Schwelle hin- und herspringen.
- Nichts geschieht, worum niemand gebeten hat (11.7): Kein Gefährte trägt seine Last von allein heim. Eine volle Traglast stoppt die Arbeit, die sie weiter füllen würde (in ein volles Gepäck zu ernten zerstört die Quelle für nichts), und der Rest des Programms läuft weiter. Bring sie herein: per Rechtsklick auf ein Lager, mit einer Regel WHEN Carry full → Haul oder über das Aufgabenbrett — das Ziel einer Aufgabe steht im Siedlungslager, also ist das Abliefern ihr letzter Schritt. Jeder Transport behält eine Ration jeder Nahrungssorte und Trinkwasser zurück: Die Last geht, das Mittagessen bleibt.
- Blöcke sind budgetiert: Eine Regel kostet 1 Block, +1 je zusätzlichem WHEN, +1 für ein UNTIL; die ganze Siedlung teilt sich ein Budget (Basis 12, +6 durch einen Planning table). Regeln jenseits des Budgets laufen nicht — die oberen Regeln werden zuerst bezahlt.
Das Aufgabenbrett (braucht einen Planning table): Gebäude beobachten ihren eigenen Bedarf und schreiben Aufgaben aus — eine Fischerhütte ruft nach einem Fischer, solange das Lager unter 20 Fisch hält, ein heruntergebranntes Feuer ruft nach Brennstoff, ein Feuer ruft nach Abkochen, solange das Lager unter 10 Liter sauberem Wasser hält (ein Nehmer schöpft Teichwasser, kocht es ab und füllt es ins Fass), offene Baustellen melden sich selbst. Eine einzige Regel Take a task für 1 Block greift die nächstgelegene Ausschreibung, ein neuer Gefährte ist also einfach ein weiterer Abnehmer. Handwerke werden verdient: Jede Arbeitsaktion bleibt gesperrt, bis ihre Werkstatt steht. Arbeiter suchen nur, was die Gruppe bereits entdeckt hat.
Zeit & Welt
Tag/Nacht und Jahreszeiten vergehen; Uhr, Temperatur (°C) und Wetter stehen oben in der Mitte. Die Geschwindigkeitsregler (oder -/.) schalten Pause / 1× / 2× / 5× / 10×.
Das Wetter folgt den Jahreszeiten — Sonne, Wolken, Regen, Hagel, Sommerdürre, Winterschnee. Hagel tut weh (zehrt im Freien an der Gesundheit; nur ein Dach oder das Blätterdach halten ihn ab). Regen durchnässt (nass = bis zu 30 % kälter). Nasse Kleidung trocknet am Lagerfeuer oder unter einem Dach am schnellsten (~4 Spielstunden von völlig durchnässt) — und im Freien so schnell, wie der Himmel es zulässt: ~10 h bei warmem Sonnenschein, etwa ein Drittel dieses Tempos bei bedecktem Himmel und überhaupt nicht in kalter Luft oder während Regen, Schnee oder Hagel fällt. Eine sommerliche Durchnässung trocknet sich während der Arbeit von selbst; eine winterliche wartet auf ein Feuer. Im tiefen Winter frieren Flüsse und Seen zu (Brunnen sprudeln weiter); eine Sommerdürre trocknet kleine Tümpel aus, bis der nächste Regen fällt.
Wasser hat neben dem Salzgehalt auch eine Güte. Ein Süßwasser, das nie das Meer erreicht — ein See, ein Tümpel — ist stehendes Wasser: trinkbar, und jeder Schluck baut die Ruhr-Last des Trinkenden auf — für sich genommen nichts, aber der Tümpel, zu dem du immer wieder gehst, bricht als Krankheit aus. Flüsse entwässern ins Meer und gelten auf ihrer ganzen Länge als fließend, ebenso Brunnen und heiße Quellen. Ein am See gefüllter Wasserschlauch trägt Tümpelwasser mit sich, bis er leergetrunken ist. Die Wahl zwischen einem Platz am See und einem am Fluss (oder an einem Brunnen) ist genau der Punkt.
Das Gegenmittel ist ein Feuer. Rechtsklick darauf und Boil water wählen: mit einem ausgewählten Companion läuft er hin und das Feuer-Tauschfenster öffnet sich an der Kochstelle — den Wasserschlauch gießt du selbst in die Pan, das saubere Wasser holst du dir aus dem Ready-Slot zurück, es geht in den Schlauch. Mit einer Gruppe läuft stattdessen der alte unbeaufsichtigte Befehl, der von allein eingießt, wartet und einsammelt. Von Hand geht es ebenso: mit Rechtsklick auf den Werkzeugslot im Charakterblatt (C) den Schlauch in die Hand gießen und ihn auf ein Feuer setzen (der ganze Schlauch geht hinein), auf ein Fass, oder auf einen anderen Companion, um dessen Schlauch zu füllen.
Abkochen kostet Zeit, und das ist Absicht. Ein voller Wasserschlauch — 5,0 Liter, und genau so viel fasst die Pfanne — braucht am Lagerfeuer eine Ingame-Stunde; eine Steinfeuerstelle ist bei allem, was sie kocht, dreimal so schnell. Die Pfanne kocht unbeaufsichtigt weiter, solange das Feuer brennt — man belädt sie also und geht. Ein Companion trinkt 2–3 Liter am Tag, ein Feuer versorgt damit eine kleine Gruppe und nicht mehr — und während es kocht, brät es keinen Fisch. Abkochen ist der Notbehelf am Tümpel; die Antwort ist ein Fluss oder ein Brunnen.
Das Land selbst hat ein Klima. Der größte Teil der Insel ist gemäßigt, drei Landstriche aber nicht: Tundra (−10 °C) am hohen Nordsaum, Wüste (+8 °C) im trockenen Süden und Sumpf (durchnässt wie Regen, und kein Feuer trocknet dich, solange du darin stehst). Die Jahreszeiten drehen beide Extreme um — zu wissen, in welcher Jahreshälfte ein Landstrich überlebbar ist, ist mehr wert, als ihn zu meiden.
Höhlen nimm Licht mit
Berge sind nicht länger nur eine Wand, um die man herumläuft: Suche an einer Bergflanke nach einem Höhlenmund. Du suchst ein dunkles Loch mit einer hellen Lippe aus gebrochenem Stein auf der Sonnenseite und einem Fächer Geröll davor — herausgezoomt ist dieser helle Rand das, was ins Auge fällt, und jeder Mund auf der Karte ist ein wenig anders aufgebrochen. Dieses Loch ist alles, was die Weltkarte von einer Höhle zeigt — klicke ihn mit rechts an oder führe einen Gefährten darauf, und er geht hinein — ein Rechtsklick schickt alle Ausgewählten auf einmal hinein, und jede Felszelle, die den Eingang berührt, zählt als Eingang — auch die Ecken —, du musst die eine Zelle also nicht genau treffen, und ein knapper Fehlklick lässt die Gruppe nicht mehr am Türrahmen hacken —: die Weltkarte weicht der eigenen Karte dieser Höhle, mit Kammern und Gängen in einem Maßstab, der nichts mit der Insel zu tun hat. Von innen ist dieselbe Tür ein Bogen aus Tageslicht in der Höhlenwand, mit den Felszähnen als Silhouette davor — das einzige Warme dort unten, und daran findest du im Dunkeln zurück. Klickst du diesen Ausgang mit rechts an (oder läufst darauf), stehst du wieder im Tageslicht am Höhlenmund. Die Welt draußen läuft die ganze Zeit weiter — Uhr, Wetter, Tiere und jeder Gefährte, den du oben gelassen hast —, ein Späher kann also unter Tage gehen, während der Rest der Gruppe arbeitet. Drei Dinge gelten für jede Höhle:
| Was eine Höhle ist | Was das bedeutet |
|---|---|
| Stockdunkel | Dort unten siehst du kaum zwei Schritte weit (gegen zwanzig im Freien). Fertige vorher eine Fackel (torch) — Crafting-Tab (K), 1 Holz + 2 Pflanzenfaser —, getragen gibt sie sieben Zellen zurück. Ohne sie erkundest du blind. |
| Überdacht | Der Fels deckt dich: Regen, Schnee und Hagel erreichen dich nicht, und nasse Kleidung trocknet wie unter jedem Dach. |
| Konstante 8 °C | Unter Tage ersetzt den Himmel — keine Jahreszeit, kein Wetter, keine Nacht. Ein Zufluchtsort vor einer −15 °C-Winternacht und vor einem 42 °C-Wüstennachmittag. |
| Baugrund | Seit dem 26.07.2026 nimmt ein Höhlenboden ein Lagerfeuer (campfire), eine Steinfeuerstelle (stone hearth), eine Fackel (torch), ein Bett (bed), ein Strohbett (straw bed), eine Schlafrolle (bedroll), eine Truhe (storage box), ein Wasserfass (water barrel), einen Plantisch (planning table), Dielen (plank floor) und Weg (road) auf — und Lagerplätze (stockpiles), womit eine Höhle zu einer echten Basis wird und nicht nur zum Schlafplatz. Fallen gelassene Stapel bleiben dort ebenfalls liegen. Nicht unter Tage gehen die Dinge, die der Fels überflüssig macht: Häuser, Felder und Mauerzüge. Der Ausgang wird nie überbaut. |
Der Berg verrät dir, wie groß die Höhle ist. Keine gleicht der anderen, und die Größe des Massivs, in das sich der Mund öffnet, ist ein echtes Versprechen: Ein einzelner Felsbuckel birgt eine Spalte — einen Riss, den du in ein paar Dutzend Schritten durchquerst —, ein richtiges Massiv dagegen einen Bau zum Verirren, eine lange Galerie oder eine große Halle mit Felssäulen darin. Es lohnt sich also, einen Berg von außen abzuschätzen, bevor du eine Fackel an ihn verschwendest. Der Name der Höhle sagt, was es geworden ist: ein Frost Rift, ein Moss Warren, ein Black Vault — die erste Hälfte kommt vom Land, in dem der Mund liegt, die zweite von der Gestalt der Höhle.
Es gibt einen Grund hineinzugehen, der über das Unterstellen hinausgeht: Pilze und Stein warten tief im Fels, immer ein gutes Stück vom Eingang entfernt — eine Höhle zahlt sich also nur für die Gruppe aus, die sie wirklich erkundet. Dort unten lebt nichts; die Gefahr sind die Dunkelheit und der Weg zurück.
Manche Höhlen führen Wasser. Tief drinnen findest du vielleicht einen stillen Tümpel — Schmelzwasser, das durch den Berg gesickert ist, dunkel, mit hellem Saum am Fels. Trink vom Ufer oder füll dort einen Schlauch, genau wie an einem Fluss. Und weil Fels kein Wetter kennt, friert ein Höhlentümpel nie zu und fällt nie trocken: Eine bekannte Höhle kann genau in den Jahreszeiten die verlässlichste Wasserquelle der Karte sein, in denen alles andere schließt. Es ist stehendes Wasser — also abkochen, sonst zehrt jeder Schluck an der Immunreserve wie bei jedem Tümpel. Feuchter Boden darüber heißt mehr davon: Sumpfberge sind am nassesten, Wüstenhöhlen knochentrocken.
Regelprogramme laufen unter Tage weiter. Ein Gefährte, den du in eine Höhle schickst, folgt weiter seinem Plan — und wenn eine Regel etwas will, das die Höhle nicht hat (einen Schluck Wasser, eine Mahlzeit, das Lager), geht er von selbst durch den Höhlenmund nach draußen, erledigt es oben und kann danach wieder hinuntergeschickt werden. Du musst niemanden von Hand herausholen.
Und eine Höhle gehört zu der Siedlung, in die sie sich öffnet. Was du hineinträgst, bleibt von draußen erreichbar: Ein Bauarbeiter am Höhlenmund holt sich Holz von einem Lagerplatz, den du in der Höhle angelegt hast, ein müder Gefährte beansprucht ein Bett, das du dort unten ausgerollt hast, und ein durstiger geht zu einem Tümpel, den er bereits gesehen hat, statt zum Fluss zu laufen. Die Regel lautet schlicht: Eine Höhle ist so weit weg wie der Weg in sie hinein — der Mund, plus so viele Schritte, wie die Sache tief drinnen liegt. Ein Stapel gleich hinter dem Eingang ist also praktisch nebenan, einer am Ende eines weitläufigen Baus dagegen ein echter Marsch, den niemand von allein auf sich nimmt. Leg deine Vorräte in Mundnähe ab, wenn das Lager draußen sie nutzen soll. Es zählt nur, was die Gruppe wirklich gesehen hat: Eine unerforschte Höhle bietet gar nichts, und ein Tümpel in einer Ecke, die du nie ausgeleuchtet hast, ebenso wenig.
Oberfläche & Tasten
Das Gefährtenfenster fasst alles zusammen, was du mit einem Gefährten tust, in drei Reitern — jede Taste öffnet ihren eigenen Reiter (nochmal drücken schließt; Strg+Tab wandert durch die Reiter). Alle drei gelten dem Gefährten, den du gerade steuerst.
| Taste | Aktion | Taste | Aktion |
|---|---|---|---|
| C | Reiter Character (Werte, Fertigkeiten, Traglast) | Leertaste | Bauring (Radialmenü) |
| T | Reiter Automation (Regeln) | Tab | Nächster Gefährte (+Kamera) |
| K | Reiter Crafting (Schlafrolle, Cordage, Bogen, Angel, Axt, Mantel, Hut) | 1–0 | Gefährten wählen (zweimal = Kamera) |
| E | Sammeln (halten) | H | Zielen & schießen (Bogen, halten) |
| F | Kamera auf die Auswahl zentrieren | M | Weitester Zoom |
| G | Nebel umschalten (Debug) | - / . | Spieltempo hoch / runter |
| J | Chronik (gespeicherte Historie) | F1 | Hilfe |
| F5 / F9 | Speicherplatz sichern / laden | Esc | Offenes Fenster schließen, sonst Pause/Einstellungen |
| F12 | Dev-Konsole (Debug-Builds) | Alles neu belegbar unter Esc → Settings | |
Es ist immer nur ein Fenster offen. Wer eines öffnet — das Companion-Fenster, ein Gebäude-, Lager-, Baustellen- oder Raum-Panel, das Transfer-Fenster, den Bau-Ring, die Hilfe, die Chronik — schließt damit das vorherige; nichts überlappt sich mehr. Ein Stapel in der Hand überlebt den Wechsel: er wird nur dort abgelegt, wo du ihn ablegst.
Architektur & Konventionen
Engine, Aufbau und die Grundregeln, an die sich die Codebasis hält.
- Engine: Godot 4.x, 2D-Draufsicht. Nur GDScript (kein C#).
- Sprache: alle Bezeichner, Kommentare, Node-/Szenennamen auf Englisch — kein Deutsch im Code oder im Szenenbaum.
- Benennung:
snake_casefür Variablen/Funktionen/Signale/Dateien;PascalCasefür Klassen/Nodes/Szenen;class_namefür wiederverwendbare Skripte. - Datengetrieben: Stellschrauben leben in
.tres-Resources (resources_data/) und@export-Variablen — keine magischen Zahlen. Zahlen sollen ohne Codeänderung justierbar sein. - Entkopplung: übergreifender Zustand liegt in Autoload-Singletons; Systeme reden über Signale, wo das entkoppelt.
- Ein freigegebenes Objekt vergleicht sich mit
== nullals TRUE.node != nullgreift also zu kurz und erwischt ein freigegebenes nie —is_instance_valid()ist der einzige sichere Test. Jede Registry, die einen Szenen-Abbau überlebt (Zelle → Node, Caches), muss veraltete Einträge damit aussortieren oder überspringen.
| Pfad | Enthält |
|---|---|
| scripts/autoload/ | Singletons (Manager, Welt- & Speicherzustand) |
| scripts/player/ | Gefährten-Rig: Werte, Fertigkeiten, Controller, Jobs, Automatik |
| scripts/world/ | Weltgenerierung, Gelände/Biom/Landmarke, Renderer, Kamera, Wetter, Nebel |
| scripts/resources/ | Ressourcen-Nodes, Tiere, Erntezyklus |
| scripts/buildings/ | Buildable, Build-Controller, Baustellen, Lagerinventar |
| scripts/items/ | Item-Katalog, Item-Grafik, liegende Gegenstände |
| scripts/ui/ | HUD, Panels, Dev-Konsole, Einstellungen, Screens |
| resources_data/ | Alle .tres-Konfigurationen: Gebäude, Tiere, Ressourcen, Werte, Fertigkeiten, Palette, Theme |
| tests/ | Headless-Suite + Benches + Screenshot-Harness |
Autoload-Übersicht
Die Singletons, die jedes System erreicht. Persistente Autoloads müssen sich
in WorldGenerator._ready zurücksetzen (ein Neuladen erzeugt sie
nicht neu).
| Autoload | Besitzt | Datei |
|---|---|---|
GridManager | Zelle↔Welt-Mathematik, Belegungsgitter | autoload/grid_manager.gd |
TerrainManager | Gelände-/Biom-/Landmarken-Ebenen je Zelle, Begehbarkeit, Wasserkörper, Klima | autoload/terrain_manager.gd |
TimeManager | time_of_day, Tag, Jahreszeit; Umgebungstemperatur; Wechselsignale | autoload/time_manager.gd |
TimeWarpManager | Pause / 1–10× über Engine.time_scale | autoload/time_warp_manager.gd |
WeatherManager | Jahreszeitlich gewichtete Wetterphasen, Schneedecke | autoload/weather_manager.gd |
FogManager | Dreistufige Sichtbarkeit je Zelle | autoload/fog_manager.gd |
PartyManager | Mitglieder, Auswahl, Verkörperung. Der Auswahl-Rahmen wird von world/tile_inspector.gd mit z_index 110 gezeichnet — über dem Höhlenboden (z 2), dem Nebel und der Dunkelheit (z 100). Bis zum 26.07.2026 lag er auf der Vorgabe 0 und war in jeder Höhle unsichtbar, während der Treffertest, rein geometrisch, weiter auswählte. | autoload/party_manager.gd |
BuildingManager | Platzierung, Baustellen, Räume, Wirkbereichs-Versorgung, Wasserkörper | autoload/building_manager.gd |
CityInventory | Aggregierende Fassade über alle Lagerfelder | autoload/city_inventory.gd |
AnimalManager | Laufende Bestandszählung, Kapazitäten | autoload/animal_manager.gd |
TaskBoard | Von Gebäuden ausgeschriebene Aufgaben (11.6) | autoload/task_board.gd |
SaveManager | Benannte Speicherplätze, Migrationsnahtstellen | autoload/save_manager.gd |
EventLog / Chronicle | Laufender Feed / gespeicherte Historie | autoload/event_log.gd, chronicle.gd |
SoundManager | Zoomabhängiger, positionsbezogener Ton, UI-Klicks | autoload/sound_manager.gd |
KeybindManager / GraphicsManager / GameState / ResourceManager / GroundItemManager | Eingabe, Grafikeinstellungen, Laufzustand, Ressourcenregister, liegende Stapel | autoload/… |
Weltgenerierung & Gelände
WorldGenerator.generate() baut die Welt.
TerrainManager.is_walkable(cell) ist DIE Begehbarkeits-Nahtstelle (Nav-Bake, Kollision,
Standfähigkeit und Räume lesen sie alle — das set_walkable_override einer Brücke
öffnet die Querung für sie alle). TerrainManager.climate_offset_at(cell) ist DIE
Klima-Nahtstelle. TerrainManager.is_drinkable_water() ist DIE Trink-Nahtstelle;
is_fresh_water() ist reiner Salzgehalt; is_still_water() ist DIE
Güte-Nahtstelle (7.5 — ein Gewässer, das kein Meer erreicht), und
IllnessController.wear_bad_water() ist die eine Stelle, an der ein unbehandelter
Schluck abgerechnet wird.Eine Zelle hat vier orthogonale Ebenen: Gelände (was sie physisch ist — world/terrain_types.gd: PLAINS/WATER/FOREST/MOUNTAIN/SAND/SHALLOW), Biom (ihr Klima — world/biome_types.gd: gemäßigt/Tundra/ Sumpf/Wüste, je als eine gewachsene Region), Landmarke (world/landmark_types.gd: Kratersee / heiße Quellen / Steinkreis) und Höhle (world/cave_types.gd: wo eine Höhle sich öffnet — ihr Mundloch (mouth); die Räume dahinter sind eine eigene Karte).
CellGrid-Basis (scripts/world/): TerrainGrid
(Typ, Holz/Art/Hiebe, Begehbarkeit), BiomeLayer (Biomgitter,
climate_offset, soaks), LandmarkLayer (Landmarken, Orte,
warmth_at, der NO_WARMTH-Sentinel) und WaterBodies
(Salzmaske, faule Gewässer-Etikettierung, süß/salzig/stehend/Tümpel).
Die öffentliche API ist eingefroren — jede TerrainManager.X-Nahtstelle
behielt ihre exakte Signatur, kein Aufrufer musste sich ändern. Die Fassade behält nur, was
Schichten kreuzt oder den Baum berührt: die Fäll-Signale, das Verwerfen von Salz-/Gewässerdaten in
set_terrain, die zusammengesetzten Trink-Nahtstellen
(is_drinkable_water/is_still_water) und den saisongetriebenen
Frost-/Dürre-Zustand. Die Schichten selbst sind RefCounted — nie im Baum, nie mit
Kenntnis von TimeManager oder EventLog.Höhlen
Eine Höhle ist eine Zelle auf der Weltkarte — ihr Mundloch — und dahinter eine
eigene Karte (world/cave_interior.gd, erzeugt von
cave_interior_generator.gd, verwaltet vom Autoload CaveManager).
Die Mundloch-Zelle behält ihr MOUNTAIN-Gelände, also bleiben Geländerenderer, Spawn-Regeln und die
Begehbarkeits-Zählung — und damit jede Spawn-Dichte — unangetastet.
Wie viele: cave_count (seit dem 26.07.2026 18, vorher 7) ist eine
Anfrage, keine Stückzahl — _carve_caves öffnet höchstens ein Mundloch
pro Bergmassiv, eine Welt bekommt also so viele, wie Massive
cave_min_massif_cells (70) und cave_min_spacing (55) erfüllen: über fünf
Seeds auf der 512²-Karte gemessen 13–17. Die Leistung ist nicht die Grenze,
und die Zahl wurde gesetzt, um das Land auszuschöpfen: eine betretene Höhle kostet ~40
Navmesh-Polygone (+0,5 %) und ~1 MB. Früher kamen noch ~4,5 ms Mauerbau-Ruckler dazu;
seit dieser Ruckler auf die Free-Edge-Verschmelzung der Navigationskarte zurückgeführt und
abgeschaltet wurde (26.07.2026), kostet eine Mauer ~21 ms — mit jeder Höhle der Welt
offen, vorher 1278 ms (tests/cave_scale_probe.gd,
tests/nav_edge_probe.gd).
Jeder Innenraum liegt in einem reservierten Band von Weltkoordinaten östlich der
Insel statt in einer eigenen Szene. Das ist der ganze Kniff: eine World2D, eine
Navigationskarte, ein Physikraum — nichts wird entladen, die Oberflächensimulation läuft
weiter, während die Gruppe unter Tage ist, und Auswahl, Rechtsklick-Befehle, Kamera und jeder
Autoload funktionieren dort unten unverändert. TerrainManager bleibt die eine
Karten-Nahtstelle: is_walkable, is_underground, is_cave_dark,
is_buildable und cave_sight_radius leiten Zellen außerhalb des Gitters an
CaveManager weiter. Ein Innenraum entsteht deterministisch aus Welt-Seed und
Mundloch-Zelle — eine nie betretene Höhle kostet nichts und kommt trotzdem identisch wieder.
Die eine wiederkehrende Falle des Bandes (zweimal bezahlt, 26.07.2026):
GridManager deckt nur die 512²-Oberfläche ab und antwortet für jede Band-Zelle
„weder leer noch Boden“, weshalb jedes darauf gebaute Prädikat den gesamten Untergrund
stillschweigend ablehnt. Genau das machte das Bauen dort unten unmöglich und vernichtete
einen in der Höhle fallen gelassenen Stapel (GroundItemManager._find_drop_cell fand
keine Zelle, und der Aufrufer warf den Gegenstand weg). Beide verzweigen jetzt über
is_underground und lesen die Gebäude-/Baustellen-Dictionaries, die nach Weltzelle
geschlüsselt sind und gar keine Grenzen kennen. Buildable.stands_underground() ist die
davon getrennte Frage, was dort stehen darf: interior_placeable or stockpile.
Das Layout (neu gehauen am 26.07.2026). Der Innenraum wird am Bergmassiv
hinter dem Mundloch skaliert — CaveManager._massif_cells füllt es beim ersten Betreten
träge aus — und zwar über die Quadratwurzel der Zellzahl: 70 Fels-Zellen ergeben ~80 Bodenzellen und
~29 Schritte Tiefe, 290 ergeben ~275 und ~51 (tests/cave_layout_probe.gd, je
200 Seeds). Dasselbe Gewicht zieht die Form der Höhle (Spalte / Bau / Galerie / große
Halle), die Proportionen, Kammerzahl, Gangbreite und Namen bestimmt; beide Achsen werden weiterhin
unabhängig gezogen, das Seitenverhältnis hat also nach wie vor bewusst nichts mit dem der Welt zu tun.
Kammern sind wabernde Ellipsen, Gänge mäandern, zwei zelluläre Durchläufe glätten das Ergebnis,
Sackgassen führen mit Absicht ins Nichts, einzelne Felssäulen bleiben in den Hallen
stehen, und zum Schluss wird der Innenraum auf das Ausgehauene zurechtgestutzt. Tümpel
(CaveInterior.Tile.WATER) liegen tief in der Höhle und weichen zurück, wo sie einen Gang
zerschneiden würden; TerrainManager leitet is_fresh_water /
is_still_water / is_drinkable_water über CaveManager.is_water,
Wasser unter Tage ist also echtes Wasser für Trinkbefehl, Wasserschlauch und HUD — stehend, aber nie
gefroren und nie ausgetrocknet. Funde liegen mindestens 8 Schritte Laufweg vom Ausgang entfernt
(CaveInterior.depth_at, eine Breitensuche), und der Renderer schattiert den Boden mit
demselben Maß.
Die Tür ist eine Form, von beiden Seiten gezeichnet
(world/cave_doorway.gd, 26.07.2026). CaveRenderer schlägt sie in
die Bergflanke, CaveInteriorRenderer zeichnet dieselbe Öffnung von innen voller
Tageslicht — wer hineingeht und zurückschaut, sieht dieselbe Tür. Dazu gehören ein Geröllfächer, eine
Steinlippe, die von fast schwarz bis fast weiß aufhellt, je nachdem wie sie sich zu
GamePalette.mountain_light dreht, zwei oder drei Ausbrüche im Rand, eine unregelmäßige
Türschwelle und ein dunklerer Schlund hinter der Öffnung — alles aus der Mundloch-Zelle
gehasht, also hat keine Höhle dieselbe Tür wie eine andere, und nichts davon wird gespeichert oder
geseedet. Abgestimmt wurde an Screenshots, und die Konstanten tragen, was diese ausgeschlossen haben:
zu viel Randgezacktheit liest sich nicht mehr als Tür, zu weit hineinreichende Ausbrüche werden zu
Reißzähnen, und ein heller Strich über die Lichtseite ist ein Farbklecks (daher ein schattiertes
Band).
| Was eine Höhle bietet | Detail |
|---|---|
| Stockdunkel | Die Sicht bricht unter Tage auf 2 Zellen ein (gegenüber
20 im Freien), je Innenraum eigens verwaltet (CaveInterior._seen), weil das Nebelgitter auf
die Oberfläche zugeschnitten ist. Eine getragene Fackel (torch)
gibt 7 zurück — herstellbar im Crafting-Tab (K) aus 1 Holz + 2 Pflanzenfaser. Ohne Licht erkundet
man blind. |
| Schutz | Fels überdacht: Regen, Schnee und Hagel erreichen einen nicht, und nasse Kleidung trocknet wie unter jedem Dach. |
| Konstante 8 °C | Unter Tage ersetzt den Himmel vollständig — keine Jahreszeit, kein Wetter, kein Tag. Ein Refugium vor einer −15 °C kalten Winternacht und vor einem 42 °C heißen Wüstennachmittag. (Unter Tage lässt sich noch nicht bauen, es gibt dort also kein Feuer, das zusätzlich wärmt.) |
| Funde | 2–5 Fundstellen je Höhle (Pilze, Fels, lose Steine), mindestens 7 Zellen vom Ausgang entfernt gesät — eine Höhle zahlt also die Gruppe aus, die sie erkundet, nicht die, die nur hineinschaut. |
| Hindurchgehen | Auf dem Höhlenmund (oder auf der Ausgangskachel) zu
stehen bringt eine Figur hindurch — und seit dem 25.07.2026 löst ein Rechtsklick auf
beides Command.ENTER_CAVE für die gesamte Auswahl aus. Das musste sein: ein Mundloch ist
ein Loch in einer BERG-Zelle, der Klick fiel also auf „Fels abbauen“ durch. Ein Mundloch ist zudem nur
eine Zelle mit Fels ringsum, deshalb zieht CommandController._mouth_click_cell
einen Klick auf diesen Fels (innerhalb von MOUTH_CLICK_CELLS) auf das Mundloch selbst —
die Zelle, nicht bloß das Verb, denn der Befehl trägt die geklickte Zelle mit sich. Begehbarer Boden
neben einer Höhle bleibt unangetastet. |
| Die Schwelle überschreiten | Ein Inneres hat keine begehbare
Verbindung zur Oberfläche, deshalb ist CaveManager.route die Portal-Nahtstelle, die jeder
Läufer befragt: ein Weg über die Schwelle sind in Wahrheit zwei Wege, der erste zur Ausgangskachel
(bzw. zum Mundloch). Genau darum laufen Regelprogramme unter Tage weiter — ein
durstiger Gefährte verlässt die Höhle von selbst, weil der Weg hinaus die erste Etappe ist. Suchen in
der Welt zentrieren drinnen auf das Mundloch (CaveManager.search_center);
Reichweitenprüfungen nutzen weiter die echte Zelle. |
Wichtige Stellschrauben — scripts/world/world_generator.gd
| Gruppe | Exports (am WorldGenerator-Node in Main.tscn) |
|---|---|
| Form | world_seed, noise_frequency, island_falloff[_power], sea_level, mountain_level, forest_moisture, sand_share |
| Flüsse | river_count (2), river_max_half_width (1.7), river_meander_strength (2.2, Obergrenze ~2.4), river_meander_wavelength, river_source_flank, river_bias_* |
| Wald | wood_per_forest_cell (20), birch_/spruce_/oak_share |
| Biome | tundra_share, desert_share, swamp_share, swamp_bog_count, biome_terrain_affinity |
| Landmarken | crater_lake_count/radius, hot_springs_count/radius, standing_stones_count/radius, landmark_min_spacing |
| Startpunkt | spawn_water_min_walk/max_walk (60/90), spawn_open_land_share |
chunk_cells 64, ~0,1 s bei
512², eine Wand bäckt nur ihren Chunk neu, ~5 ms), die Navigationskarte überspringt Godots
quadratische Free-Edge-Verschmelzung (genau das war der Mauerbau-Ruckler:
983 ms → 21 ms je Wand, ohne dass sich ein einziger Weg ändert — bündig getrimmte
Chunk-Nähte treffen sich exakt und brauchten sie nie), und jede Spawn-Zahl ist eine
Dichte über TerrainManager.area_scale() (begehbares Land gegen
REFERENCE_WALKABLE_CELLS ≈203000). 512 ist eine Design-Entscheidung
(3–5 Zyklen je Durchgang), keine Performance-Frage.Rendering: world/terrain_renderer.gd (Textur je Zelle),
terrain_snow.gdshader, tree_canopies.gd (Kronen zeichnen
über Läufern auf z 4; _apply_walkers speist den Shader für Durchsicht und
Schwanken), room_floor_renderer.gd, fog_overlay.gd.
Alle Weltfarben liegen in resources_data/palette.tres über
GamePalette. Navigation: walkable_navigation_region.gd;
Kollision: terrain_collision.gd.
Ressourcen & Tiere
.tres
(resources/resource_type.gd); ein Tier ist eine .tres
(resources/animal_species.gd) — ein neues Tier braucht keinen Code-Zweig.
ResourceType.restock entscheidet, wo eine Quelle zurückkommt, und
ResourceType.tires(), ob sie unter Sammeldruck auslaugt (8.3);
HarvestCycle.work_node ist die eine Ernte-Nahtstelle; Animal._can_enter
ist die Bewegungs-Nahtstelle (flies); ItemCatalog hält Nährwert und
Haltbarkeit je Sorte.| Belang | Datei / Konfiguration | Bemerkenswerte Felder |
|---|---|---|
| Ressourcendefinitionen | resources_data/resources/*.tres | spawn_terrain, spawn_biome, yield_item, harvest_time, work_scale (Fels/Fisch 10), restock, spawn_seasons, regrow_days, spawn_abundance, fatigue_per_unit, fatigue_recover_days, fatigue_regrow_penalty |
| Spawn & Nachschub | world/resource_spawner.gd | count_per_type (120, eine Dichte), _target_count, _pick_restock_cell |
| Das Land laugt aus (8.3) | resources/resource_node.gd, world/forage_overlay.gd | forage_fatigue (0..MAX_FATIGUE 3), regrow_days_now(), fatigue_share(); gespeichert als additiver Schlüssel fatigue; BuildingManager.settlement_pressure() ist das, was das Wild liest |
| Tierarten | resources_data/animals/*.tres | flies, flee_radius_cells (0 = flieht nie), settlement_shyness, speed_variance, carrying_capacity, initial_population, food_yield, spawn_near_fresh_water_cells |
| Tierverhalten | resources/animal.gd, world/animal_spawner.gd | Parametrisches _draw; breed_check_days (kein Registerscan je Frame); _can_enter |
| Ernte & Fällen | resources/harvest_cycle.gd | chop_tree → TerrainManager.chop_wood; HARVEST_TIME_SCALE 1.8 |
AnimalManager.count_of() ist eine laufende Zählung, deshalb ruft _spawn()
setup() vor add_child(). Und „jedes Tier steht auf begehbarem
Gelände“ ist falsch — Flieger kennen nur den Kartenrand.Gefährten
Das Gefährten-Rig ist scenes/player/Player.tscn /
class_name Player, dreimal instanziiert als Nodes Character1/2/3 (ein
Node-Name ist ein Speicherschlüssel — umbenennen über
SaveManager.RENAMED_CHARACTER_NODES). Das Verhalten verteilt sich auf kleine Controller
am Rig.
| Controller / Datei | Besitzt | Wichtige Nahtstellen / Stellschrauben |
|---|---|---|
| player/player_stats.gd (+ player_stats_config.gd) | Die sechs Werte, Verfall, sleep_debt | Signal stat_changed; Konfiguration in resources_data/stats/*.tres |
| player/vitals_controller.gd | Anwenden von Essen/Trinken, Heilungssperre | heals_at_rest(), begin_meal/drink_if_below (die EINZIGEN Einstiege in den Verbrauch) |
| player/temperature_controller.gd | Drift zur gefühlten Wärme | _target_warmth() (Klimaversatz, danach das maxf des Lagerfeuers); in_danger_band() |
| player/wetness_controller.gd / comfort_controller.gd | Nässe-Debuff, Stimmung aus Raumkomfort | _standing_in_swamp; room_quality_at |
| player/illness_controller.gd | Ausbruch/Heilung von Krankheiten | führt aus, was player/ailments.gd deklariert |
| player/ailments.gd | Was eine Krankheit IST | Ursache, Verlauf, Heilung — eine neue ist ein Eintrag |
| player/loadout.gd | Womit ein Gefährte arbeitet und was er trägt | has_tool(), work_multiplier(activity, worked), worn(slot)/warmth_bonus(), vessel_of() (statisch) |
| player/character_skills.gd (+ skill_set_config.gd) | Lernen durch Tun | practice() = XP-Eingang, multiplier() = Wirkung; resources_data/skills_config.tres |
| player/job_runner.gd | Führt Jobs/Bedürfnisse aus; das Herz der Balance | siehe unten |
| player/command_controller.gd / worker_commands.gd / worker_needs.gd | Auflösung des Rechtsklicks, Befehlsausführung, Bedürfnis-Handler | Halte-/Zieh-Schwellen; _fetch_from_stores |
| player/character_profile.gd / nordic_name_generator.gd | Identität | display_name() = die Namens-Nahtstelle; disposition (verborgen), recruited, joined_day |
| player/renegade_controller.gd | Falsche Gefährten (5.4b) | work_factor() (über die EINE Arbeits-Nahtstelle), desert_day (einmal gezogen, gespeichert), _tell() |
| world/wanderer_controller.gd | Ein Rig, das NICHT in der Gruppe ist (5.4) | seine ANWESENHEIT ist das Kennzeichen (Player.is_wanderer()); Phase, wanderer_at() |
Anwerben — scripts/world/wanderer_spawner.gd
Ein Wanderer ist ein Gefährten-Rig (Player.tscn), das
noch nicht beigetreten ist — keine zweite Art Mensch. Das ist der ganze Entwurf: Identität,
Traglast, Zeichnung und Speichereintrag sind dieselben, die jeder Gefährte ohnehin hat,
deshalb ist Anwerben PartyManager.recruit() → Umbenennen auf ein freies
Character<N> (ein Node-Name ist ein Speicherschlüssel) +
Player.join_party(). Ein Fremder ist eingefroren, solange er wartet
(Player._halt_survival), und deckt keinen Nebel auf. Das Weggehen läuft rückwärts durch
dieselbe Tür: Player.leave_party() hängt einen frischen Controller in
LEAVING an, das Rig läuft von der Karte und gibt sich selbst frei — Verstoßen und
Desertieren teilen sich diesen einen Weg.
Stellschrauben des Spawners: first_possible_day (6), min_days_between (6),
arrival_chance (0.22/Tag), linger_days (3), renegade_chance (0.3),
approach_cells (45). Immer nur ein Fremder unterwegs; einer vollen Gruppe wird niemand
geschickt. Konsole wanderer [spawn [renegade]|here|panel|recruit|send|desert].
SaveManager._collect_characters läuft den BAUM ab, keine Namensliste
— die Gruppe wächst jetzt, CHARACTER_NODES wäre also in dem Moment gelogen, in
dem jemand beitritt. Ein Restore baut Rigs, die die frische Welt nicht hat
(_rebuild_character), und gibt Player frei, die der Speicherstand nicht kennt. Der
WandererController muss angehängt werden, bevor das Rig in den Baum kommt,
sonst belegt es einen Tastenplatz, der ihm nicht zusteht.Ausrüstung — scripts/player/loadout.gd (17.1)
Loadout ist ein Komponenten-Node auf jedem Rig und die
EINE Antwort darauf, womit ein Gefährte arbeitet, worin er Wasser trägt und was er anhat. Seine Wirkung
fließt durch JobRunner.work_delta() → Player.work_speed_multiplier() —
dieselbe einzelne Arbeits-Nahtstelle, auf der Fertigkeiten, Erschöpfung, Nässe und Krankheit sich schon
stapeln. Nie ein zweiter Bonus-Pfad.items/equipment_def.gd (.tres in
resources_data/equipment/) ist die Daten-Nahtstelle: id,
slot (TOOL/VESSEL/HEAD/CHEST/HANDS/LEGS/FEET — nur anhängen, ein Slot ist ein
Speicherschlüssel), applies_to (die gleichen StringNames wie die
Fertigkeiten), work_multiplier, max_durability/wear_per_work_second,
repair_workshop/repair_cost, warmth und defense
(inert ausgeliefert für 4.6). EquipmentCatalog registriert sie.
Ein neues Werkzeug ist eine .tres plus eine Preload-Zeile — dieselbe Regel
wie bei Tieren und Buildables. Heute: axe (×1,5 Holzfällen, 400 Haltbarkeit, im
Holzfällerlager für 1 Holz geflickt), coat (+6°) und hat (+2°).
Getragen = angelegt (eine Anlege-Geste gibt es noch nicht), also liest
has_tool() den Rucksack, und getragene Kleidung sind schlicht getragene Gegenstände mit
tool: true im ItemCatalog — genau das hindert einen Transport daran, jemandem den Mantel
abzulegen. Die Wärme trägt TemperatureController direkt nach dem Biom-Offset als
Isolierung ein (clothing_comfort_cap 20°): sie hebt einen kalten Körper
Richtung Behaglichkeit, nie darüber hinaus — getragene Ausrüstung ist so nie eine Last, die man nicht
loswird. Die Abnutzung reitet auf dem rohen Delta desselben Ticks, der den Bonus liest, ist also
deterministisch — keine Würfel, das Prinzip der Kontaminationslast. Repariert wird über
Command.REPAIR (Rechtsklick auf die passende Werkstatt). Konsole equip,
durability, warmth.
Die große Tuning-Fläche — scripts/player/job_runner.gd
Bewegung/Arbeit: move_speed, work_seconds, mine_seconds,
fish_seconds. Bedürfnisse/Schwellen: need_trigger_ratio/recover_ratio,
emergency_ratio, warm_seek_below/cool_seek_above,
despondent_below. Automatik: base_rule_slots (12),
dev_self_care (reaktiviert die schlafenden Selbstversorgungsstufen — Tests / ein
künftiger leichterer Schwierigkeitsgrad). Jagd: hunt_range_cells,
hunt_base/min/max_hit, hunt_giveup_seconds. Die Erschöpfungsstrafen liegen
in player/player.gd (fatigue_walk_penalty,
fatigue_work_penalty, mood_work_penalty).
dev_self_care. Keine Sicherheitsnetze klammheimlich
wieder einbauen.Die Schlafrolle ist ein Bett, kein Talisman 26.07.2026
bedroll.tres, yields_item) bleiben unverändert. Die Schlafqualität hängt
am neuen Buildable.sleep_rest_factor (hier 0,7, 1,0 bei jedem gebauten
Bett), gelesen in JobRunner._rest_in_bed.Bis zum 26.07.2026 war JobRunner.has_bedroll() die Mechanik: Tragen allein
verbesserte eine Nacht im Freien, aus dem Rucksack heraus. Auf Entscheidung des Nutzers muss sie
zuerst gelegt werden, also lesen rough_rest_factor() und
rough_metabolism_scale() den Rucksack gar nicht mehr, und has_bedroll()
bedeutet nur noch „hier ist eine zum Ausrollen“. Alles Übrige läuft über den normalen
Bett-Pfad — sie wird von reserve_free_bed beansprucht, angelaufen, beschlafen,
gespeichert und abgerissen wie jedes Bett.
Legen und Aufnehmen. BuildingManager.unroll_bedroll(character,
container) legt sie auf die nächste freie Zelle im Umkreis 4 (beide Ausrichtungen werden
probiert, sie ist ja 1×2), bezahlt direkt aus dem Rucksack (payable_from_carry)
und gestempelt mit BuildingNode.unrolled_by — dem Knotennamen des Gefährten,
denn danach schlüsselt die Speicherdatei Charaktere ohnehin. JobRunner._release_bed()
ist die eine Stelle, an der eine Nacht endet, dort hängt daher das Aufnehmen:
self_unrolled_bed() ist die Schranke, ein Gefährte rollt also nur zusammen, was er
selbst ausgelegt hat — eine vom Spieler platzierte Schlafrolle bleibt liegen, und
genau so sagt man einem automatisierten Gefährten, wo er schlafen soll. pack_up() ruft
remove_building(node, false): keine halbe Rückgabe, denn die Hälfte einer
Ein-Stück-Schlafrolle ist nichts. Spielerseitig ist es
JobRunner.Command.PACK_UP im Rechtsklick-Ring neben Sleep. Konsole
bedroll.
Automatik-Interna
AutomationProgram (eine
geordnete AutomationRule-Liste); AutomationInterpreter wertet es von oben
nach unten aus (die erste durchführbare ausgelöste Regel gewinnt; UNTIL verriegelt). Aktionen sind
bestehende Verhaltensweisen — Regeln wählen nur, welche läuft.| Datei | Rolle |
|---|---|
| player/automation_program.gd | Die Regelliste + Verrechnung des Blockbudgets |
| player/automation_rule.gd / automation_condition.gd | Eine WHEN→DO-UNTIL-Regel; eine Sensorbedingung |
| player/automation_interpreter.gd | Auswertung von oben nach unten, Verriegelung, Live-Diagnose (ACTIVE/blockiert/wartend) |
| player/work_actions.gd | WorkAction + je eine Unterklasse pro Handwerk (Holzfäller / Fischer / Bauer / Steinmetz / Jäger / Schlaf): feasible(), tick(), label() |
| ui/automation_panel.gd | Der Regeleditor (Reiter Automation) |
| autoload/task_board.gd + buildings/building_task_rule.gd | Gebäude schreiben bedarfsgetriebene Aufgaben aus; der Block „Take a task“ greift die nächstgelegene |
WorkAction-Objekt statt eines
_do_*-Zweigs: JobRunner.run_job tickt die passende Aktion, und
job_action(job) reicht sie heraus. Der Gewinn ist die Zusammenführung: der
Beruf-für-Beruf-Schalter für Machbarkeit im AutomationInterpreter ist weg — eine
WORK-Regel fragt job_action(job).feasible(), also lesen die WORK-Regel, der Weg über das
Aufgabenbrett und die Tick-Wache der Aktion dieselbe Antwort. Bewusst eine dünne
Strategie: der Runner behält die geteilten Handler, die Maschinerie, die Befehle und Suite aufrufen,
und den einen Arbeits-Akkumulator.Arbeitsaktionen sind durch stehende Werkstätten gesperrt (Gebäude). Alte
Speicherstände überführen beim Laden einen gemalten Tagesplan in Zeitfenster-Regeln. Konsole:
rules, prog, tasks, auto.
Gebäude & Bau
Buildable-.tres
(buildings/buildable.gd) — ein neues Gebäude ist Daten, kein Code.
BuildingManager._serves ist die Wirkbereichs-Nahtstelle (jedes
find_*_near läuft hindurch). Buildable.paint (CHAIN/AREA/einzeln) steuert
die Platzierung. makes_walkable + TerrainManager.set_walkable_override
ist die Brücken-Nahtstelle. _stand_by = von welcher Zelle aus ein Gebäude benutzt
wird. Buildable.cost_alternatives + pick_cost = die Nahtstelle für
„9 Zweige oder 3 Holz“: Ein Grundriss legt sich auf EINE Variante fest, damit alles Nachgelagerte
(Lieferung, Holgang, Panel, Speicherstand) weiterhin ein schlichtes Kosten-Dictionary sieht.
RecipeCatalog.is_station(id) macht ein Gebäude zur WERKSTATT MIT FERTIGUNGSLISTE
(19.1) — abgeleitet aus den Rezepten, nie ein Schalter; JobRunner._do_craft ist der
EINE Handler, den CRAFT-Befehl und CRAFT-Aufgabe teilen.| Belang | Datei | Anmerkungen |
|---|---|---|
| Fertigungsrezepte | items/craft_recipe.gd / items/recipe_catalog.gd | Ein Rezept ist kein Buildable: inputs → output, work_seconds, skill, station. Neues Rezept = eine .tres + eine Preload-Zeile. Die Liste liegt als schlichte Dicts auf BuildingNode.craft_queue (gespeichert); Sensor.CRAFT_QUEUE stellt sie ein |
| Gebäudedefinitionen | resources_data/buildings/*.tres | cost, 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 |
| Platzierung / Geisterbau / Malen | buildings/build_controller.gd | request_build_path; CHAIN-Wände, AREA-Böden; Konsole ghost |
| Platzierungsregeln, Räume, Versorgung | autoload/building_manager.gd | cell_placeable, _room_id_at (Flutfüllung ≤400 Zellen), warmth_at/sheltered_at, adjoining_water_body, Böden in _floor_cells |
| Baustellen | buildings/construction_site.gd | Holen/Liefern/Bauen; gespeichert (inkl. der festgelegten Kostenvariante); reconsider_cost wählt neu, solange nichts geliefert ist; cancel_site lässt Material fallen |
| Gebäude-Node & Panels | buildings/building_node.gd, ui/building_panel.gd, construction_site_panel.gd | stack_at = „was liegt auf dieser Zelle“ |
SaveManager._restore_rank): Ein Boden lässt sich nicht auf eine belegte Zelle legen,
ein vor seinen Dielen wiederhergestelltes Bett verliert den Boden also stillschweigend.Gegenstände, Inventar & Lager
ItemCatalog
(items/item_catalog.gd) ist die EINE Datennahtstelle für Gewicht,
Nährwert und Haltbarkeit — es gibt kein generisches „food“-Item, jede Quelle liefert ihre Sorte.
ItemGraphics.draw() ist DAS Aussehen im Inventar. Inventory rechnet in
Gewicht (capacity_kg, space_for) mit FIFO-Alterschargen.
StockpileInventory.tile_layout() = eine Sorte je Feld, 20 Einheiten;
CityInventory aggregiert.| Datei | Rolle |
|---|---|
| items/item_catalog.gd | Gewicht / Nährwert / moisture (Durst beim Essen) / shelf_days / rest_factor je Gegenstand |
| items/item_graphics.gd / ui/item_icon.gd | Prozedurale Item-Zeichnung (Welt + Inventar) |
| player/inventory.gd | Die Traglast: kg-Budget, take_amount/take_all_of, Alterschargen |
| buildings/stockpile_inventory.gd | Physisches Feldlager, Lagerregeln |
| items/ground_item.gd + autoload/ground_item_manager.gd | Liegende Stapel (altern, während sie liegen) |
| player/world_hand.gd + ui/character_sheet_panel.gd | EINE Hand (gehört dem Charakterblatt, Gruppe character_sheet); Auflösungsreihenfolge Baustelle>Lager>Feuerstelle>Gefährte>Boden |
| ui/transfer_panel.gd | Tauschfenster Traglast↔Lager und Traglast↔Traglast |
Zeit, Wetter & Temperatur
TimeManager verfolgt und sendet nur
(time_changed/day_changed/season_changed) — er weiß nichts
über Spielmechanik. WeatherManager.get_effective_temperature() ist die eine
Wetter-Temperatur-Nahtstelle. Die Umgebungstemperatur speist
TemperatureController._target_warmth().| Datei | Exports / Nahtstellen |
|---|---|
| autoload/time_manager.gd | day_length_seconds (18 min), days_per_season (7), start_time_of_day, *_temp je Jahreszeit, day_night_swing; get_ambient_temperature(), jump_to_day() |
| autoload/weather_manager.gd | min_/max_spell_hours, temperature_jitter, snow_accumulate_/melt_per_hour |
| world/day_night_cycle.gd | Interpolation der CanvasModulate-Tönung |
| world/weather_particles.gd / weather_hazard.gd / cloud_shadows.gd | Regen-/Schnee-/Hagelpartikel, Hagelschaden an der Gesundheit, Wolkenschatten |
Temperaturschaden: Kälte unter 4 °C / Hitze über 35 °C
(temperature_controller.gd). Taktung: der 18-Minuten-Tag und die
×1,8-Aufgabendauern; HARVEST_TIME_SCALE ist die Ernte-Nahtstelle.
UI & Panels
StatVisuals
= Glyphe+Stufe+Farbe; StatusEffects.list(character) = „was liegt gerade auf diesem
Gefährten“. Das Gefährtenfenster ist ein gerahmter
TabContainer mit drei Reitern (C/T/K) — das visible eines Reiters ist
nicht dasselbe wie ein stehendes Fenster, also is_visible_in_tree() lesen.| Datei | Rolle |
|---|---|
| ui/hud.gd | Wurzel-HUD; bindet das Gefährtenfenster beim Steuerungswechsel |
| ui/companion_window.gd + companion_header.gd | Der 3-Reiter-Rahmen; subject()/bind_character(); host_of() |
| ui/character_sheet_panel.gd / automation_panel.gd / crafting_panel.gd | Die drei Reiter (Character / Automation / Crafting) |
| ui/character_status_panel.gd / stat_bar.gd / stat_visuals.gd / status_effects.gd / stat_icon.gd | Gruppenkarten, Balken, Abzeichen |
| ui/alert_screen.gd | Herzschlag bei Todesgefahr (löst auf der Stufe EMERGENCY der Gesundheit aus; health_alert.gdshader) |
| ui/build_radial_menu.gd | Der Bauring: ein _draw, Trefferprüfung über Winkel+Radius (kein Node je Sektor); die Geometrie wird aus der Sektorzahl BERECHNET |
| ui/build_categories.gd | Der Baum als DATEN. Kategorien werden hier deklariert; Einträge werden aus dem lebenden Katalog nach Buildable.category GRUPPIERT — nie eine Liste von Ids. PLANNED = die ausgegrauten Platzhalter (seit 16.3 leer, als Mechanismus behalten). FURNITURE ist eine echte Kategorie-Id, die bewusst NICHT in CATEGORIES steht und daher keinen Sektor bekommt — das Raum-Panel fragt sie direkt ab. entries_for prüft category oder secondary_category, ein Stück in zwei Listen sagt das also selbst (das Strohbett: Möbel und Supply) |
| ui/room_panel.gd | Möbel hängen am RAUM, nicht an einem Gebäude (16.3). Bindet an eine Zelle, nie an eine Raum-Id (Ids werden bei jeder Platzierung neu erzeugt). Treibt das gewöhnliche BuildController.select_buildable(buildable, fence) an — nie eine zweite Platzierungspipeline. Konsole room panel |
| ui/building_icons.gd | BuildingIcons.draw() = die Nahtstelle für Gebäudesymbole (der Zwilling von ItemGraphics.draw); monochrom, Einheitsquadrat, eine Zeichnung je Buildable.id — unbekannte Id → stiller Ersatzfleck. Konsole icons prüft, welche Einträge ihn noch tragen |
| ui/build_icon.gd | BuildIcon = das Control, das die Nahtstelle WÄHLT: Ein Bausatz (yields_item) zeichnet sich als sein Item über ItemGraphics, alles andere als sein Gebäude. Genutzt vom gemeinsamen Eintragsbutton und vom Baustellen-Panel |
| ui/build_entry.gd | BuildEntry.cost_labels_for() / tooltip_for() speisen das Infofeld des Rings UND den Crafting-Reiter — eine Quelle dafür, was etwas kostet |
| ui/loading_screen.gd | Gepushte Phasen; alles über den RenderingServer geschaltet (force_draw()) |
| ui/event_log_panel.gd / chronicle_panel.gd / task_board_panel.gd | Feed / Historie / Aufgabenbrett |
| ui/wanderer_panel.gd | Die Anwerbe-Entscheidung (5.4): Identität + Attribute, aufnehmen / weiterschicken. Darf die verborgene disposition niemals lesen |
| ui/pause_menu.gd | Die Esc-Leiter (schließt die Gruppe ui_windows, bevor pausiert wird) |
| ui/ui_windows.gd | UiWindows.register(self) = die eine Fenster-Naht: tritt der Gruppe ui_windows bei und macht das Fenster exklusiv — wer aufgeht, schließt alle anderen, Fenster können sich also nie überlappen. Ein neues Fenster braucht genau diese Zeile (und ein close(), das nichts öffnet) |
| ui/settings_panel.gd + gameplay/graphics/audio/keybindings_settings.gd | Einstellungen; Neubelegen schreibt .cfg je Bereich |
Speichern / Laden
_ready der Gruppe saveable beitritt und
save_key() / save_state() / load_state() implementiert — seit
17.4 läuft SaveManager._collect diese Gruppe ab statt einer handgeschriebenen Liste, ein
neues System wird also gespeichert, sobald es beitritt, und Vergessen ist strukturell unmöglich.
Speicherstände sind benannte Plätze auf der Platte
(user://saves/<name>.save). brutal_testing_saves ist true,
solange der Prototyp getestet wird (Brutal speichert/lädt frei) — umlegen, um die Permadeath-Säule
wiederherzustellen.Die Ladereihenfolge zählt weiterhin und wird ausdrücklich gehalten:
_apply_saveable(key) setzt die reihenfolgeempfindlichen Mitglieder von Hand (Gelände vor
Gebäuden, das Aufgabenbrett danach, Wetter zuletzt), und ein reihenfolgefreier
Schlussdurchlauf fängt jedes weitere Mitglied ein — beide Hälften sind so gegen einen
Neuzugang gesichert, an den niemand gedacht hat. Die Mitglieder tragen den Gruppennamen wörtlich ein,
weil SaveManager zuletzt autoloadet, nach ihnen allen. Sitzungs-Metadaten,
CityInventory und die Baum-Sammler bleiben mit Absicht handgeschrieben.
Node-Namen sind Speicherschlüssel (siehe Gefährten). Seit dem
Anwerben (5.4) läuft _collect_characters den Baum ab, keine feste
Namensliste, und _rebuild_character baut die Rigs, die eine frische Welt nicht hat. Die
Wiederherstellung folgt einer Rangordnung (Boden → Struktur → Einrichtung). Ein Speicherplatz,
der kürzer ist als der 4 Byte lange Kopf einer gespeicherten Variant (MIN_VARIANT_BYTES,
geprüft in _open_for_read), wird übersprungen, ohne gelesen zu werden: ein
mitten im Schreiben abgebrochenes Speichern hinterlässt eine 0-Byte-Datei, und get_var()
darauf gibt einen Engine-Fehler aus, den GDScript nicht abfangen kann. Der
Schwierigkeitsgrad (Hard = freies Speichern/Laden, Brutal = nur Unterbrechen + Löschen des Platzes)
wird im Titelbildschirm gewählt. Konsole: saves, save, load,
delsave, difficulty.
Konsolenbefehle
Jeder Befehl der Entwicklerkonsole, was er tut und je ein Beispiel.
F12 öffnet die Konsole (nur in Debug-Builds); Esc oder
F12 schließt sie, und das Spiel pausiert, solange sie offen ist. Die
Handler liegen in scripts/ui/dev_console.gd — help in der
Konsole ist die maßgebliche Liste, und jede neue Mechanik bringt hier einen Befehl mit.
Die meisten Befehle wirken auf die Auswahl: die gerade ausgewählten Gefährten, oder die ganze
Gruppe, wenn niemand ausgewählt ist. select 2 ist deshalb meist das Erste, was man tippt.
Gefährten & Werte
| Befehl | Was er tut | Beispiel |
|---|---|---|
select [<n>|none] | Wählt den n-ten Gefährten aus und übernimmt ihn (1-basiert). Alles unten, was „die Auswahl“ sagt, meint diese. | select 2 |
who [reroll] | Identität der Auswahl: Name, Alter, Körper, die fünf Basis-Attribute. reroll würfelt neu. | who reroll |
stat <name> <value> | Setzt health / thirst / hunger / tiredness / temperature — auch sleep_debt in Prozent. | stat thirst 8 |
fill | Füllt alle Überlebenswerte wieder auf Maximum. | fill |
skill [<id> <level>] | Listet die Fertigkeiten der Auswahl oder setzt eine direkt (Stufen 0–10). | skill lumberjacking 5 |
equip [<id>] | Gibt der Auswahl ein Werkzeug (equip axe); ohne id listet es, was jedes bekannte Werkzeug beschleunigt. | equip axe |
durability [wear <s>|repair] | Liest die Werkzeugabnutzung der Auswahl; wear <s> altert sie um so viele Arbeitssekunden (um den Balken fallen und die Axt brechen zu sehen), repair flickt alles auf voll. | durability wear 400 |
warmth [<id>] | Die getragene Ausrüstung der Auswahl und die Grad, die sie isoliert; nennt man ein Stück (coat, hat), wird es vorher gewährt. | warmth coat |
fatigue | Der Erschöpfungszug: Müdigkeitsquote, das aktuelle Lauf-/Arbeitstempo und die Schlafschuld. | fatigue |
weight [<kg>] | Zeigt die getragene Last gegen das Gewichtsbudget oder setzt das Budget selbst. | weight 60 |
carry [<kg>|clear] | Die Last und ihre Überladung: wie weit über dem Budget, was sie die Beine kostet, ob unbeweglich. Eine Zahl lädt Stein auf, bis der Rucksack so viel wiegt. | carry 50 |
wet [<0-100>] | Regennässe und wie schnell sie dort trocknet, wo der Gefährte steht — oder setzt sie. | wet 100 |
sick [<kind>] [<0-100>] | Krankheiten und die Belastungen, die darauf zulaufen — oder erzwingt eine. Arten: fever, dysentery, food_poisoning — sie stapeln sich. sick load <kind> <n> setzt eine Belastung direkt. | sick dysentery 50 |
effects | Alle Boni und Mali auf der Auswahl — dieselbe Liste, die das HUD als Symbole zeigt, mit ihrer Wirkung. | effects |
skin [<Liter>|stale|clean|drink|pour [<Liter>]] | Trinkschlauch-Füllstände in Litern und ihr Inhalt; setzt die Füllung (skin 0 = leer, skin 5 = voll), markiert den Inhalt als stehend (schmutzig) bzw. sauber, lässt den Companion trinken oder gießt den Schlauch in das Fass bzw. die Pfanne, an der er steht (angebrochener Liter inklusive). | skin pour 0.4 |
alert [on|off|auto] | Der Todesgefahr-Alarm (roter Rand + Herzschlag): erzwingen für einen Blick oder wieder an die Gesundheit übergeben. | alert on |
face n|s|e|w | Richtet die stehenden Kartenfiguren nach einer Himmelsrichtung aus — Hilfsmittel für Screenshots. | face s |
figures [iso|top] | Stil der Kartenfiguren: aufrechte 3/4-Ansicht oder die alte Vogelperspektive. | figures iso |
wanderer [<action>] | Rekrutierung: listet, wer unterwegs ist; spawn [renegade|loyal], here, panel, recruit, send, desert. | wanderer spawn renegade |
Fenster, Gegenstände & die Hand
| Befehl | Was er tut | Beispiel |
|---|---|---|
sheet [<n>] | Schaltet das Charakterblatt um (C) oder öffnet es beim n-ten Gefährten. | sheet 2 |
rules | Schaltet den Automatik-Regeleditor um (T). | rules |
craft [<Rezept> [<n>]] | Die Fertigungslisten der Werkstätten (19.1): ohne Argument jede stehende Werkstatt mit ihren Aufträgen sowie alle bekannten Rezepte; mit einer Rezept-ID legt der Befehl diesen Auftrag auf die nächstgelegene passende Werkstatt. craft clear leert alle Listen. | craft planks 4 |
crafting | Schaltet die Werkbank um (K) — dort entstehen tragbare Ausrüstung wie die Schlafmatte. | crafting |
windows [close] | Die exklusiven Fenster: jedes registrierte Fenster und welches gerade steht — es steht immer höchstens eines, denn ein neues schließt die übrigen. close räumt den Bildschirm (die Sprosse der Esc-Leiter). | windows close |
transfer [mate] | Öffnet den Austausch Rucksack↔Lager (setzt einen Gefährten an den nächsten Stapel); transfer mate öffnet ihn zwischen zwei Gefährten. | transfer mate |
hearth [<logs>] | Öffnet das Panel des nächsten Feuers und richtet es her: Scheite in der Flamme (0–4) und roher Fisch in der Pfanne, damit Brennstoff-Slot und Kochpfeil etwas zeigen. | hearth 3 |
boil [hand] | Führt die ganze Kochkette aus: füllt den Schlauch mit Teichwasser, schürt das nächste Feuer und erteilt den echten Befehl. boil hand öffnet stattdessen das Feuer-Tauschfenster. | boil hand |
cook [<units>] | Kocht getragenen rohen Fisch bzw. Fleisch in die gegarte Form. | cook 3 |
hand [grab|drop] | Die Welt-Hand: meldet, was gehalten wird; grab setzt den einen ausgewählten Gefährten an den nächsten Stapel und hebt den ersten Stapel auf, drop legt ihn zurück. | hand grab |
give <item> <n> [carry] | Legt Gegenstände in die Siedlungslager oder mit carry direkt in die Rucksäcke der Auswahl. | give berries 20 carry |
drop <item> [n] | Legt einen Stapel am ersten ausgewählten Gefährten auf den Boden (im Spiel per Rechtsklick aufheben). | drop wood 5 |
spoil <days> | Altert alle verderblichen Lebensmittel (Lager und Rucksäcke) um n Tage und verrottet, was abläuft. | spoil 4 |
fish | Gibt der Auswahl eine Angelrute — das Gerät, das der Fischer-Beruf braucht. | fish |
chronicle [<text>] | Schaltet die Chronik des Durchgangs um (J); mit Text schreibt es diese Zeile mit dem heutigen Tag hinein. | chronicle A hard winter began |
context [fire|water] | Öffnet den Rechtsklick-Kontextring am nächsten Feuer oder Wasser — dieselben Einträge wie ein Rechtsklick. | context water |
Welt & Gelände
| Befehl | Was er tut | Beispiel |
|---|---|---|
world | Kartengröße, begehbares Land und die Dichte-Skala, die daraus jede Spawn-Zahl ableitet (1,0 = die ausgelieferte 512×512-Insel), samt aktuellen Populationen. | world |
biome [<name>|<x> <y>] | Biom-Zählung als Anteil des begehbaren Landes; ein Name teleportiert die Gruppe hinein, eine Zelle liest sie aus. | biome tundra |
cave [<n>|walk <n>|in <n>|out|<x> <y>] | Höhlen: alle Mundlöcher samt bekanntem Inneren auflisten, neben eines teleportieren, die Auswahl per Befehl hineinlaufen lassen („walk“), die Gruppe hinein („in“) oder heraus („out“) schicken, oder eine Zelle auslesen. | cave in 0 |
landmark [<n>|<x> <y>] | Gestaltete Landmarken (Kratersee, heiße Quellen, Steinkreis): auflisten, hinteleportieren oder eine Zelle auslesen. | landmark 2 |
rivers [<n>] | Die beiden Flüsse und ihre Quellen am zentralen Berg; ein Index teleportiert die Gruppe dorthin. | rivers 1 |
water [<x> <y>] | Gewässer. Mit einer Zelle auch ihre Qualität — stehendes Wasser baut Ruhr-Belastung auf, fließendes ist sauber. | water 120 84 |
salt [on|off] | Salzgehalt des Meeres — off macht alles Wasser wieder trinkbar (Testschalter). | salt off |
freeze [on|off] | Mittwinter-Eis: Zustand und Zeitfenster; off verhindert das Zufrieren. | freeze off |
tree [<species> <x> <y>] | Baumarten-Zählung oder pflanzt Kiefer/Birke/Fichte/Eiche auf eine Zelle. | tree oak 100 100 |
chop <x> <y> [strikes] | Bucht Hiebe auf einen Baum; ohne Zahl alle bis auf den letzten — der nächste Hieb fällt ihn. | chop 100 100 |
canopy [reveal|sway <n>] | Der Live-Feed des Walddachs (wer die Kronen ausdünnt und schwingen lässt) oder justiert Transparenz / Schwungweite. | canopy sway 2 |
relief [<knob> <v>] | Die Regler für Bergschattierung und Schneekappen — freq, amp, ambient, snowline, snowsoft, light x y. | relief snowline 0.7 |
sites [on|off] | Die Heatmap der Siedlungsqualität (rot schlecht, grün gut) und wie selten ein guter Platz ist. | sites on |
forage [on|off|clear|wear <0-3>|<x> <y>] | Die Sammel-Ermüdungs-Linse (grün erholt, rot abgeerntet) plus Verschleiß-Statistik; eine Zelle liest einen Fleck aus, wear/clear setzen die ganze Karte. | forage on |
navmesh [rebake] | Navmesh-Chunks: Aufbau, Polygonzahl und Bake-Zeiten (was eine Wand kostet). rebake backt die Welt neu und misst. | navmesh rebake |
room [panel] [<x> <y>] | Raumerkennung: liegt die Zelle in einem geschlossenen Raum, wie groß, wie warm, wie wohnlich. room panel öffnet das Möblierungsfenster. | room panel |
reveal | Deckt die ganze Karte auf (Nebel fällt auf „erkundet“). | reveal |
fog on|off | Nebel des Krieges an oder aus. | fog off |
tp <x> <y> | Teleportiert die Auswahl (oder alle) auf diese Rasterzelle. | tp 100 100 |
Zeit & Wetter
| Befehl | Was er tut | Beispiel |
|---|---|---|
time <hour> | Setzt die Uhr, 0–24. | time 22.5 |
day <n> | Springt auf Tag n; die Jahreszeit folgt dem Kalender und die Wechsel-Signale feuern wirklich. | day 20 |
season <name> | Springt auf den ersten Tag des nächsten Frühlings / Sommers / Herbstes / Winters. | season winter |
tint [<season>] | Die jahreszeitliche Bodenfärbung; mit Namen zur Mitte der Jahreszeit, wo sie am stärksten ist. | tint autumn |
weather <name> [hours] | Erzwingt sunshine / cloudy / rain / snow / hail / drought für einige Spielstunden. | weather rain 6 |
clouds [<0..1>|auto] | Wolkenschatten-Deckung: eine Zahl erzwingt sie sofort, auto folgt wieder dem Wetter. | clouds 0.8 |
speed <x> | Zeitraffer: 0 pausiert, dann 1 / 2 / 5 / 10 … | speed 5 |
Ressourcen & Tiere
| Befehl | Was er tut | Beispiel |
|---|---|---|
res [<id>] | Zählung der Ressourcenknoten oder teleportiert zum ersten Knoten dieser Art. Ids: berry_bush, herbs, rock, mushrooms, hazel_bush, mussel_bed, bird_nest, wild_roots, twigs, loose_stones, leaf_pile, cactus, wild_hemp. | res mussel_bed |
animal [<species> [n]] | Populationszählung oder setzt n erwachsene Tiere im Ring um die Gruppe. Arten: deer, pig, pigeon, crow, wolf, bear, badger, beaver. | animal wolf 3 |
hunt | Bereitet eine Jagd für die Auswahl vor (der Fernschuss und sein Zielen). | hunt |
regrow | Füllt alle Bestandsressourcen (Beerensträucher usw.) sofort wieder auf. | regrow |
restock | Führt den saisonalen Spawn-Durchlauf sofort aus — sät und räumt Pilze, Nester und Nüsse. | restock |
Bauen & Automatik
| Befehl | Was er tut | Beispiel |
|---|---|---|
build <id> [<x> <y>] [site [<pct>]] | Zaubert ein fertiges Gebäude kostenlos hin oder legt mit site seine Baustelle — wahlweise teilgebaut. | build smokehouse site 50 |
cost [<id>] | Baukosten: jeder Eintrag mit seinen Kostenvarianten („9 Zweige oder 3 Holz“), dem jeweiligen Arbeitsaufwand, dem Siedlungsbestand und dem, worauf stehende Baupläne festgelegt sind. | cost campfire |
radial [<cat> [<n>]] | Das radiale Baumenü: umschalten oder auf einer Kategorie offen halten und auflisten, was der Ring enthält, samt Zustand. Ein angehängter Index hebt einen Eintrag hervor und öffnet sein Info-Panel. | radial workshops 3 |
icons | Prüft die Gebäude-Symbole: welche Katalogeinträge eine eigene Zeichnung haben und welche auf den Platzhalter zurückfallen. | icons |
bedroll [unroll|packup|list] | Schlafrollen: listet jede auf der Karte liegende samt dem, der sie ausgerollt hat, legt die eigene jedes gewählten Gefährten aus oder rollt zusammen, worauf sie stehen. | bedroll unroll |
ghost <id> <x> <y> [<w> <h>] [<rot>] | Fixiert den Platzierungs-Geist auf einer Zelle ohne Maus — w h simuliert ein Ziehen; bei der Wand fixiert es einen Kettenanker, sodass der offene Zug vorschaut. ghost off löst. | ghost wall 40 40 6 1 |
cancelsite [<x> <y>] | Bricht die Baustelle auf dieser Zelle ab — gelieferte Materialien fallen zu Boden. | cancelsite |
area [<id> [<cells>]] | Wirkbereiche: jedes stehende Gebäude mit einem, seine Reichweite und wer darin steht. Mit Id und Zahl wird die Reichweite live verstellt (0 = unbegrenzt). | area campfire 25 |
pilerule [<x> <y>] <rule> | Die Lagerregel eines Stapels: everything, nothing, food, materials oder eine Liste von Item-Ids. | pilerule wood stone |
auto on|off | Startet oder stoppt das Regelprogramm der Auswahl. | auto on |
prog [basic|off] | Gibt das Regelprogramm der Auswahl und den Live-Zustand aus; basic weist das eingebaute Grundversorgungs-Programm zu, off entfernt es. | prog basic |
tasks | Gibt das Aufgabenbrett aus: jede Aufgabe, die stehende Gebäude ausschreiben, mit ihrem Vergabestand. | tasks |
unlockjobs [on|off] | Behandelt jeden Beruf der Arbeitsregeln als freigeschaltet, Werkstatt hin oder her. | unlockjobs on |
freebuild [on|off] | Gebäude kosten nichts und stehen sofort. | freebuild on |
Speicher, Meta & Inszenierung
| Befehl | Was er tut | Beispiel |
|---|---|---|
saves | Listet die Speicherplätze auf der Platte (user://saves). | saves |
save [<name>] | Schreibt einen Speicherplatz; ohne Namen den eigenen des Durchgangs, wie F5. | save winter-test |
load [<name>] | Lädt einen Speicherplatz; ohne Namen den eigenen des Durchgangs, sonst den neuesten. | load winter-test |
delsave <name> | Löscht einen Speicherplatz von der Platte. | delsave winter-test |
difficulty [hard|brutal] | Zeigt oder wechselt den Schwierigkeitsgrad (normalerweise im Titelbildschirm gewählt). | difficulty brutal |
god [on|off] | Friert alle Überlebenswerte ein — kein Verfall, kein Tod. | god on |
scenario <name> | Startet einen Testzustand: startbase (die alte freie Siedlung), base20 (versorgte Basis an Tag 20), broke (alle Vorräte weg). | scenario base20 |
shot [file.png] | Speichert einen Screenshot der Spielansicht ohne Konsole und gibt den vollen Pfad aus. | shot look.png |
float [<item> [<n>]] | Erzeugt einen schwebenden „+n Item“-Text in der Gruppenmitte. | float wood 3 |
music [next|stop|start] | Hintergrund-Playlist: überspringen, verstummen lassen oder neu starten. | music next |
fps [on|off] | Die FPS-Anzeige unter der Zeitraffer-Leiste; ohne Argument meldet sie Bildrate, Bildzeit und Draw-Calls. | fps on |
version | Die Version des Builds, die Engine darunter und die Speicherformat-Version. | version |
clear | Leert die Ausgabe der Konsole. | clear |
help | Die vollständige Kommandoliste in der Konsole — immer die maßgebliche. | help |
Tests & Werkzeuge
| Werkzeug | Befehl | Zweck |
|---|---|---|
| Headless-Suite | godot --headless --script res://tests/run_tests.gd | Rauch- & Regressionstests (~3,3k Prüfungen über 118 Abschnitte) |
| Screenshot-Harness | godot --path . --script res://tests/screenshot.gd -- out=… seed=… grid=… cmd="…" | Startet das echte Spiel mit Rendering, stellt den Zustand über die Konsole her und speichert ein PNG (braucht ein Display — DISPLAY=:1, nicht --headless). Die Screenshots in diesem Wiki sind damit entstanden. |
| Soak-Test | tests/soak_test.gd | Balance-Netz über N Tage Basisbetrieb (nicht Teil der Suite) |
| Benches / Sonden | tests/animal_bench.gd, grid_benchmark.gd, river_probe.gd, water_probe.gd, sim_night.gd, nav_edge_probe.gd | Gezielte Performance-/Verhaltenssonden |
RefCounted, kein SceneTree) ist
der Werkzeugkasten — jede Konstante, jeder Autoload-Zugriff, jeder Weltbauer und jede
Prüfhilfe liegt dort einmal, damit die Module in einem Prozess zusammenspielen; die
Baum-APIs, die die Tests brauchen, werden als Variablen wieder herausgereicht, gesetzt von
bind(tree). Elf Domänen-Module erweitern ihn
(test_core / terrain / resources / water / survival / equipment / jobs / automation /
building / ui / meta.gd) und enthalten nur ihre _test_*-Funktionen —
jede Hilfsfunktion gehört in die Basis, keine in eine Domäne.
run_tests.gd bleibt dünn: einmal aufsetzen, die Module binden, dann in der
ursprünglichen Reihenfolge ausführen — die Gruppierung ist reine Ordnung, die
Ausführungsreihenfolge ist Byte-identisch, und genau das macht die Aufteilung sicher gegen verborgene
Reihenfolge-Abhängigkeiten zwischen Tests. Ein neuer Test kommt in sein Domänen-Modul und in
die Dispatch-Liste.get_first_node_in_group geht über den Wrapper der Basis, und
current_scene/paused/all(self)/close_all(self)
nehmen tree, nicht self. Und ein async-Test muss
awaited werden — ein abgekoppelter läuft weiter und setzt mitten in einem späteren Test die
Autoloads zurück.Godot-Binary in dieser Umgebung: ~/Downloads/Godot_v4.7-stable_linux.x86_64. Nach dem
Hinzufügen eines class_name den Klassencache neu bauen, bevor Headless-Tests laufen.
Claude sieht den laufenden Viewport nicht — visuelle Arbeit wird über den Screenshot-Harness oder vom
Entwickler geprüft.
screenshot.gd mit derselben out=-,
seed=- und cmd=-Zeile erneut laufen lassen und das PNG zurücklegen.Versionierung
Eine Nummer, eine Quelle — und die zwei Dinge, die sie bewusst nicht ist.
Die Version des Spiels liegt an genau einer Stelle:
application/config/version in project.godot — dem eigenen Feld
der Engine, damit ein exportierter Build sie gratis im PCK mitträgt. Alles im Spiel liest sie über
GameVersion (scripts/main/game_version.gd), eine statische
Klasse wie BuildCategories: GameVersion.string() liefert
"0.5.0", GameVersion.label() liefert "v0.5.0" — die eine
Schreibweise, die jeder Bildschirm benutzt, damit keine Beschriftung das „v“ selbst tippt.
Eine Ausgabe ist kein Build. Die Nummer bewegt sich nur, wenn eine Ausgabe
geschnürt wird — zwischen zwei Ausgaben trägt also jeder Build dieselbe. Dreiundzwanzig Commits und
drei Funktionspakete meldeten sich einmal alle als 0.5.0. Seit dem 26.07.2026 beantwortet
die Klasse beide Fragen: GameVersion.string() ist die Ausgabe,
build_id() ist dieser Build — <Commits>.g<SHA>, dazu
.dirty bei nicht eingecheckten Änderungen, und leer, wenn der Build die Ausgabe
ist. build_string() setzt beides zu 0.5.0+23.gb81e6d1 zusammen. Sie
wird aus git abgeleitet, nie getippt, und ist nie eine Sperre — reine Herkunft.
build_id() git describe (einmal pro Prozess, danach gepuffert), und für
einen Export backt tools/stamp_build.sh vorher
build_stamp.txt — per include_filter ins PCK getragen. Die
Datei steht mit Absicht in .gitignore: eingecheckt würde sie sich mit jedem Commit ändern
und könnte immer nur den Commit vor dem benennen, in dem sie ausgeliefert wird. Im Editor
gewinnt git, ein veralteter Stempel ist also harmlos.tools/export.sh erledigt beide Hälften: es stempelt und benennt die Datei dann aus
der Naht (build/survival_0.5.0+27.g8331277.exe) — der Pfad auf der
Kommandozeile sticht den des Presets, das dadurch allgemein bleiben kann. Das muss es auch: der
Export-Dialog des Editors schreibt jeden gewählten Dateinamen in
export_presets.cfg, weshalb dort zwei Ausgaben später noch ein von Hand
getipptes survival_0.3.0.exe stand. Die Suite schlägt jetzt bei jedem
Preset fehl, dessen Ausgabepfad eine Version enthält.Schema: schlichtes SemVer. Solange der Prototyp bei 0.x läuft, steigt
MINOR je abgeschlossenem Funktionspaket und PATCH bei Korrekturen; 1.0.0 ist für die
Ausgabe reserviert, die den Spielbogen schließt (ROADMAP-Meilenstein 10, der Wanderzyklus). Eine
meilensteinbasierte Nummerierung wurde verworfen — Meilensteine werden außer der Reihe fertig, die
Version wäre also rückwärts gelaufen.
SaveManager.SAVE_VERSION ist das FORMAT der Speicherdatei — die einzige Zahl,
die je das Laden verweigern darf. GameVersion ist der Build, der sie
geschrieben hat, im Kopf jedes Speicherstands als game_version eingestempelt und im
Tooltip des Speicherbrowsers sichtbar. Ein Speicherstand eines älteren Builds lädt immer; der
Stempel ist Herkunft, nie eine Sperre.Wo sie auftaucht: unten rechts im Titelbildschirm, im Pausenmenü, im Kopf jedes Speicherstands, im
Konsolenbefehl version (der auch den Engine-Build und das Speicherformat ausgibt), in
der Windows-Programmdatei (gespiegelt in export_presets.cfg) und in der
Zeile oben auf dieser Seite. Die ersten vier zeigen den Build — ein Speicherstand trägt
build_id neben game_version, damit zwei Läufe, die eine Woche auseinander
unter derselben Ausgabennummer gespeichert wurden, nicht mehr wie dasselbe Spiel aussehen.
Eine Ausgabe schnüren (die vollständigen Schritte stehen in
CHANGELOG.md): project.godot erhöhen, die Nummer
nach export_presets.cfg und auf diese Seite spiegeln, den
Changelog-Abschnitt schreiben, die Headless-Suite laufen lassen, committen, dann
git tag -a v<version>. Die Suite schlägt fehl, wenn die drei Kopien
auseinanderlaufen — diese Prüfung hält die Spiegel ehrlich.
Eine MINOR-Ausgabe kostet mehr als ein PATCH. Nur x.y.0 friert ein
eigenes Wiki-Archiv ein — beide Sprachen plus eine neu geschossene Kopie jedes Screenshots, rund
10 MB pro Ausgabe. Diesen Preis für eine einzeilige Korrektur zu zahlen, hat aus jedem Sprung
ein Ritual gemacht, und ein so teures Ritual wird nicht vollzogen — so kam ein ganzer Arbeitstag
dazu, sich eine Nummer zu teilen. Eine Patch-Ausgabe stützt sich deshalb auf das Archiv ihrer
Minor-Linie: needs_wiki_archive() und release_line() sind die Naht, die
Suite prüft einen Patch gegen v<major>.<minor>.0, und
wiki/snapshot.sh friert einen Patch nicht ein, schreibt aber den
Versionswähler trotzdem neu.
tools/cut_release.sh <version|patch|minor|major> erledigt jeden
mechanischen Schritt: prüfen (SemVer, streng vorwärts, kein solcher Tag, sauberer Baum, ein
## Unreleased-Abschnitt, der wirklich etwas sagt), project.godot
und alle drei Spiegel erhöhen samt „zuletzt überarbeitet“-Datum auf beiden Seiten, dem
Unreleased-Abschnitt seine Nummer geben, wiki/snapshot.sh und die
Suite laufen lassen, mit --commit committen und taggen. --dry-run
zeigt jede Änderung und schreibt nichts; --shots schießt das Wiki vorher neu.
Jede Spiegel-Änderung bricht ab, wenn ihr Muster nicht passt — ein still nicht
erhöhter Spiegel ist genau der Fehler, den das Skript verhindern soll — und eine
MINOR-Ausgabe verweigert den Start ohne --shots oder --skip-shots,
denn das Archiv friert für immer ein, was gerade auf der Platte liegt. Es pusht nie und
merged nie.Wer sie schneidet: Ein PATCH wird ohne Rückfrage am Ende eines reinen Korrektur- Auftrags mit grüner Suite geschnitten; eine MINOR-Ausgabe wird vorgeschlagen und wartet auf ein menschliches Go — sechzehn neu geschossene Screenshots wollen ein Augenpaar, bevor sie eingefroren werden.
Das Wiki-Archiv — eine eingefrorene Seite je Release
Diese Seite ist ein lebendes Dokument: sie beschreibt immer den Build in Entwicklung. Damit sie auch sagen kann, was ein älterer Build tat, friert jedes Release eine vollständige Kopie ein unter wiki/v<version>/ — beide Sprachen und eine eigene Kopie der Screenshots, denn eine archivierte Seite mit den heutigen Bildern würde den Sinn des Archivierens aufheben. Der Wähler in der Seitenleiste erreicht jeden eingefrorenen Build; eine eingefrorene Seite trägt ein oranges Banner und verlinkt hierher zurück.
| Skript | Was es tut |
|---|---|
| wiki/shots.sh | Schießt jeden Wiki-Screenshot neu aus dem echten Spiel, eine Liste, jedes Mal derselbe
Seed, damit die Bilder zweier Builds vergleichbar sind. DISPLAY=:1 wiki/shots.sh für
alle oder einzelne benennen: wiki/shots.sh hero party. Braucht ein Display — die
Vorrichtung startet das Spiel mit Rendering, --headless kann das nicht. |
| wiki/snapshot.sh | Friert die lebenden Seiten + Screenshots als wiki/v<version>/ ein, stempelt das Archiv-Banner in die Kopien und schreibt den Versionswähler der lebenden Seiten neu. Liest die Version aus project.godot, läuft also nach dem Bump. Idempotent. |
| wiki/deploy.sh | Lädt die lebenden Seiten, jede Übersetzung und jedes Archivverzeichnis hoch. Warnt, wenn
die <style>- oder <script>-Blöcke der beiden Sprachen
auseinandergelaufen sind. |
Reihenfolge beim Release, und sie ist wichtig: beide Seiten für das Release
bearbeiten → wiki/shots.sh (damit der eingefrorene Satz zu diesem Build
gehört) → project.godot, export_presets.cfg
und beide Seiten hochziehen → wiki/snapshot.sh → Changelog, Testsuite, Commit,
Tag.
Aktuell halten wichtig
Wenn sich eine spielerseitige Mechanik ändert (eine Steuerung, ein Gebäude, ein Sammelziel, eine Überlebensregel):
HelpPanel.HELP_TEXTin scripts/ui/help_panel.gd bearbeiten — die einzige Quelle der Spielerhilfe auf dem Bildschirm (ihre Navigation leitet sich aus den Abschnittsüberschriften ab, also das Kopfformat[font_size=17][color=#9ec1ff][b]…[/b]beibehalten).- Den passenden Abschnitt im Spielerhandbuch hier aktualisieren.
- Betrifft die Änderung die Codestruktur (eine neue Datei, Nahtstelle, Stellschraube oder ein Konsolenbefehl), den passenden Abschnitt der Entwicklerreferenz aktualisieren und gegebenenfalls den Screenshot neu aufnehmen.
- Jede Änderung nach wiki/index.html spiegeln, den englischen Zwilling, im selben Commit.
#anchor mitnimmt, ein Abschnitt darf also nie nur in einer der beiden existieren. Ihre
<style>- und <script>-Blöcke sind absichtlich
bytegleich: das Aussehen in einer Datei ändern und den Block in die andere kopieren —
wiki/deploy.sh vergleicht beide und warnt, wenn sie auseinanderlaufen.
Der Deploy lädt beide Dateien hoch (und der Hook feuert für jede von beiden).Die Entwicklerreferenz leitet sich aus dem Nahtstellen-Katalog im Projektgedächtnis ab (memory/MEMORY.md), wo jedes System seine eine Nahtstelle nennt — die schnellste Stelle, um nachzusehen, wo eine Mechanik tatsächlich wohnt.
Companions — Entwickler-Wiki des Prototyps. Das Spielerhandbuch spiegelt die F1-Hilfe im Spiel; die Entwicklerreferenz bildet Mechaniken auf Dateien, Nahtstellen, Stellschrauben und Konsolenbefehle ab. Screenshots erstellt mit tests/screenshot.gd (Seed 12345).