Nebelreiche: wie ein Browser-Strategiespiel mit zwei KI-Werkzeugen entstand
Ich wollte das Gefühl alter Aufbaustrategiespiele zurück – aus wenig Vorrat wird langsam ein Reich – und ich wollte wissen, wie weit man damit heute mit KI-Werkzeugen kommt. Das Ergebnis ist eine spielbare Alpha. Das Interessantere ist, was unterwegs passiert ist.
Nebelreiche läuft im Browser, ohne Installation. Römer, Wikinger, Pikten und Germanen siedeln auf einem zufällig erzeugten Archipel von 104 × 104 Feldern. Ein Holzfäller erzeugt kein Holz in einer unsichtbaren Tabelle – er läuft zum Baum, arbeitet, trägt die Ladung zum Lager und kommt zurück. Wird der Wald gerodet, verschwindet er von der Karte, und der nächste Weg ist länger. Jede Insel hat ihr eigenes Lager, Schiffe verbinden sie, Weltbosse tauchen an wechselnden Orten auf und müssen erst gefunden werden. Alleine gegen die KI, zu zweit im Koop oder im Duell.
So weit das Spiel. Gebaut habe ich es nicht allein, und auch nicht mit einem einzigen Werkzeug.
Zwei Werkzeuge, eine Übergabedatei
Die Spiellogik – Simulation, Warenwege, Seefahrt, Kolonien – ist überwiegend mit Codex entstanden. Zwischendurch habe ich den Stand in eine Review-Sitzung mit Claude Code gegeben: härten, aufräumen, testen, und dann zurück. Zwei Werkzeuge mit unterschiedlichen Stärken, die sich abwechseln.
Das Entscheidende dabei war nicht eines der beiden, sondern eine Datei namens
HANDOFF.md. Jede Sitzung endet damit, dass das Werkzeug hineinschreibt,
was es geändert hat, welche Konventionen jetzt gelten, was es bewusst
nicht angefasst hat und was als Nächstes ansteht. Die nächste Sitzung –
egal mit welchem Werkzeug – beginnt mit dem Lesen dieser Datei.
Erst Git, dann formatieren – und erst dann Funktionen
Der Prototyp war kein Git-Repository. Der erste Schritt der Review-Sitzung war deshalb kein neues Feature, sondern ein Baseline-Commit: der Zustand vor allen Änderungen, damit jeder Schritt danach ein eigener, rückgängig machbarer Commit ist.
Der zweite Schritt war Prettier. Der Code wuchs dabei von 1.745 auf 5.576 Zeilen –
keine Zeile Logik mehr, aber jede Zeile jetzt einzeln diffbar. Das klingt nach
Kosmetik. Es ist die Voraussetzung dafür, dass man einem Werkzeug, das Code ändert,
überhaupt nachsehen kann, was es geändert hat. Seither steht in den Arbeitsregeln:
npm run format && npm run lint && npm test vor jedem Commit.
Ausnahmslos.
Tests sind das Geländer, nicht die Bremse
Nebelreiche hat 71 automatisierte Tests. Vierzig davon erzeugen zufällige Archipele und prüfen, ob jede Karte einen bebaubaren Hafen hat, ob die Startplätze sicher sind, ob die Bosse zu Fuß erreichbar sind und ob die Seerouten durchgehen. Dazu kommt ein Rauchtest, der in einem echten Browser eine Welt anlegt, ein Gebäude baut, Krieger befehligt und auf JavaScript-Fehler achtet.
Diese Tests sind nicht da, weil ich Testen mag. Sie sind da, weil ein Werkzeug, das
in Minuten hunderte Zeilen ändert, ein hartes Kriterium braucht, ob es etwas
kaputtgemacht hat. Ohne die Tests müsste ich jede Änderung selbst durchspielen.
Mit ihnen lese ich 71/71 und weiß, dass die Karte noch funktioniert.
Balancing mit einem Duell-Skript
Ein Spieler meldete: Legionäre kosten viel Eisen, sind aber nicht stärker. Statt an Zahlen zu drehen, bis es sich richtig anfühlt, haben wir ein Skript geschrieben: zwei Heere mit gleichem Materialbudget marschieren aufeinander zu, und wir zählen, wer übrig bleibt. Ergebnis: Römer verloren gegen Pikten und Germanen restlos, weil die für dasselbe Material 17 statt 10 Krieger stellen konnten.
Daraus wurde eine Regel statt einer Zahl: Eisen kauft Kampfkraft. Die eisenlastigen Völker bekommen stärkere Einzelkämpfer, die holzlastigen mehr Krieger. Römer erhielten eine passive Eisenrüstung – 15 Prozent weniger Schaden –, Legionäre mehr Leben und Angriff bei weniger Eisen. Danach: Römer ungefähr gleichauf mit Germanen, leicht vor Wikingern. Und ehrlich dokumentiert: Pikten gewinnen in dieser Simulation weiterhin gegen alle, weil Reichweite drei Freischüsse beim Anmarsch bedeutet. Das steht als offener Punkt in der Übergabedatei, mit zwei konkreten Kandidaten für die Lösung.
Der eigentliche Auftraggeber sind die Spieler
Die zweite Runde Rückmeldungen war unspektakulär und wertvoll: Die KI baut alles an einer Stelle ineinander. Einheiten schweben über dem Boden. Es gibt keinen Hinweis, dass ein Lagerhaus fehlt. Der Gegner startet zu nah.
Jeder Punkt wurde zu einer konkreten Änderung. Ein Mindestabstand von einem Feld zwischen Gebäuden, für alle Spieler. Eine Bauplatzbewertung für die KI statt „nächster freier Platz". Eine Lagerwarnung ab 85 Prozent Füllstand. Und die Einheiten: Die gerenderten Bilder hatten unten 16 Prozent transparenten Rand, die Fußzeile lag bei 84 Prozent der Bildhöhe – der Sprite wurde drei Pixel zu hoch gesetzt. Beim Zoomen sichtbar, in keinem Test messbar. Das findet nur ein Mensch, der spielt.
Was die Werkzeuge nicht entschieden haben
Es gab Vorschläge, die ich bewusst nicht angenommen habe, und die stehen genauso in der Übergabedatei wie das Umgesetzte. Der Server hört weiterhin auf allen Adressen, weil Spielen im eigenen WLAN der dokumentierte Hauptfall ist. Alle Welten liegen in einer Speicherdatei, weil Dateien pro Welt erst dann sinnvoll sind, wenn mehr als eine Handvoll gleichzeitig aktiv sind. Das sind Produktentscheidungen. Ein Werkzeug kann sie vorschlagen und begründen. Treffen muss sie jemand, der weiß, wofür das Spiel gedacht ist.
Blender aus dem Skript
Die Figuren und Gebäude sind keine Zeichnungen, sondern aus Blender gerenderte Bilder: 64 für die vier Grundvölker – acht Blickrichtungen mal zwei Schrittphasen – und 62 für Gebäude, Schiffe, Bosse, Bäume und Felsen. Erzeugt werden sie von Python-Skripten, die in Blender laufen; das Modell wird beschrieben, nicht geklickt.
Auch das lief nicht glatt. Der Start von Blender im Hintergrund stürzte ab, mit einem Backtrace in der Grafik-Erkennung. Die naheliegende Deutung war eine kaputte Installation. Die richtige: Das Skript in der geöffneten Anwendung ausführen, in einer getrennten Szene, und danach die ursprüngliche wieder aktivieren. Dafür gibt es jetzt einen kleinen Wrapper. Auch das steht in der Übergabe, damit es beim nächsten Mal niemand erneut herausfinden muss.
Was ich mitnehme
Die Werkzeuge waren schnell, und sie waren gut. Was das Projekt getragen hat, waren trotzdem drei unspektakuläre Dinge: ein Git-Repository mit sauberer Historie, Tests, die eine Änderung in Sekunden beurteilen, und eine Datei, in der jede Sitzung aufschreibt, was sie getan und was sie gelassen hat. Nichts davon ist neu. Mit KI-Werkzeugen wird es nur von einer guten Gewohnheit zur Bedingung.
Spielen und zurückmelden
Nebelreiche ist eine Alpha: spielbar, nicht fertig, nicht ausbalanciert. Es läuft unter nebelreiche.winxit.at, ohne Anmeldung. Für die nächsten Schritte interessieren mich vor allem drei Dinge:
- War in den ersten zehn Minuten klar, was als Nächstes zu tun ist?
- Konntest du deine Krieger ohne Erklärung bewegen und angreifen lassen?
- Wo wurde es langsam, unübersichtlich oder unfair?
Rückmeldungen gern an office@winxit.at. Die nächsten Notizen zeigen, wie die zufälligen Archipele entstehen und wie die Blender-Modelle für ein schnelles Browserspiel aufbereitet werden.