Tobias Reithmeier

Spielbücher

Die Sprache hinter den Büchern

Story Weaver ist eine kleine Sprache für Abenteuerspielbücher, die ich selbst entworfen und geschrieben habe: Markdown als Syntax, die Semantik an ink angelehnt, die Regeln an die Spielbücher der 1980er mit Geschick, Ausdauer und Glück. Sie ist entstanden, weil ein solches Buch vor allem aus Text besteht und deshalb auch wie Text geschrieben werden sollte, nicht in einem Werkzeug mit eigenem Dateiformat. Ein Buch bleibt eine lesbare Textdatei, die sich in jedem Editor öffnen, versionieren und vergleichen lässt. Wie es am Bildschirm aussieht, steht nicht im Buch: Gestaltung und Bedienung liefert die Umgebung, die es abspielt.

Drei Bücher sind damit geschrieben, ein viertes importiert, und alle vier sind hier spielbar: Die Gruft unter dem Weißdorn als Einstieg, Das Haus hinter dem Moor als das größere, Brüder dunklen Rufes als das längste, nach einer Idee aus dem Podcast Over the Hills nacherzählt und als einziges nur auf Deutsch, und The Intercept, inkles eigenes ink-Demospiel, per story-weaver import übernommen: ohne Regelschicht, als Nachweis, dass die erzählende Hälfte der Sprache auch fremden Text trägt.

Knoten und Wahlen

Eine Überschrift beginnt einen Knoten und gibt ihm eine Kennung, eine Wahl ist ein Listenpunkt mit einem Link auf einen Knoten. Ein Pluszeichen steht für eine Wahl, die man mehrfach treffen darf, geschweifte Klammern für eine Bedingung.

# Am Waldrand {#begin}

Der Pfad teilt sich vor einer Weißdornhecke.

* [Nach links, ins Dickicht](#thicket)
+ [Zurück zur Hecke](#begin)
* {has("lantern")} [In den Spalt unter der Hecke](#crypt.crypt)

Alles im Buchkopf

Jedes Buch beginnt mit einem Kopf in YAML: Titel, Startknoten, die Werte mit ihren Würfelformeln, die Gegenstände samt Wirkung, die Gegner, die Kampfregeln und die Bedingung, wann eine Figur stirbt. Der Fließtext ruft das nur noch auf. Selbst die Frage, womit man reist, steht hier.

stats:
  skill: { name: Geschick, start: "roll(1,6) + 6", max: start }
  fear:  { name: Angst, start: 0, max: 15 }

enemies:
  hound: { name: Kettenhund, skill: 7, stamina: 6, flee_after: 2 }

death:
  when: "stamina <= 0 or fear >= fear_max"

Würfel, Werte, Kampf

Geschick, Ausdauer und Glück werden am Anfang ausgewürfelt, Proben und Kämpfe würfeln dagegen. Der Kampf nennt nur Gegner und Ausgänge, die Regeln dazu stehen im Buchkopf; eine Tilde ändert einen Wert oder das Gepäck.

!combat goblin
  win  -> chamber
  lose -> death
  flee [Zurück durch den Spalt](#start.thicket)

~ take("silver-key")
~ stamina -= 2

Text mit Gedächtnis

Absätze verändern sich mit dem Spielstand: Werte lassen sich einsetzen, und geschweifte Varianten zeigen beim ersten Besuch etwas anderes als danach, wählen der Reihe nach, zufällig oder nach einer Bedingung wie einem Gegenstand im Gepäck. Mit remember merkt sich ein Buch außerdem Stichworte, auf die spätere Wahlen zugreifen.

{!Kalte Luft schlägt dir entgegen.|Du kennst den Weg jetzt.}
{&Ein Krachen|Ein Knirschen|Stille} im Unterholz.
{has("lantern"): Das Licht reicht weit.|Es ist stockdunkel.}

Du hast noch {gold} Goldstücke und ein Glück von {luck}.

~ remember("KRAKEN")

Zwei Sprachen, eine Struktur

Übersetzungen tragen nur Text: Die Struktur steht in der Standardsprache, die zweite Sprache ist ein Katalog der Absätze in derselben Reihenfolge. Knoten, Wahlen und Regeln gibt es nur einmal, und Ziele stehen nur in der Standardsprache.

de/start.md
# Am Waldrand {#begin}
* [Nach links, ins Dickicht](#thicket)

en/start.md
# At the Forest Edge {#begin}
* Left, into the thicket

Prüfen und Durchspielen

Ein Werkzeug prüft jedes Buch vor der Veröffentlichung auf unerreichbare Knoten, tote Verweise und Sackgassen. Es spielt außerdem viele Partien automatisch durch und meldet, wie sie ausgingen. Dabei fiel im langen Buch auf, dass der Angst-Wert jeden zweiten Besuch desselben Raums bestraft.

story-weaver lint examples/house/book.yaml --strict
story-weaver simulate examples/house/book.yaml --runs 300
# Das eiserne Tor {#gate}

Das Tor schließt die Gruft nach Norden ab.

{ has("silver-key") and knows("KRAKEN") }
  Der Schlüssel dreht sich, als hätte er auf dich gewartet.
  ~ heal(2)
{ else }
  Ohne Schlüssel und ohne das Wort bleibt das Tor, was es ist.
  -> chamber

* [Hinaus ins Licht](#daylight)
So sieht ein Knoten mit seinen Wahlen im Quelltext aus.

Story Weaver ist mein Projekt, offen unter MPL-2.0; diese Seite liefert einen fest eingefrorenen Build-Stand der Bücher aus, übersetzt, mitgeliefert und im Betrieb ohne Abhängigkeit.

Weiter im Spielbuch-Regal