Vom Spielbuch zum Gamebook Parser in PHP

Und es begab sich im Jahre 1994, dass ich, angetrieben von einem wachsenden Interesse an High-Fantasy-Literatur und Pen&Paper-Rollenspielen, ein paar so genannte Spielbücher in die Finger bekam. Fasziniert vom Artwork der Analand Saga, die mein Bruder im Regal stehen hatte, probierte ich diese Art des Lesens und Spielens aus. Wem das Thema „Spielbücher“ so gar nichts sagt, dem gebe ich hier einen kurzen Einblick, bevor ich mich dann später dem Programmierteil des Beitrags widme.

Analand Saga Bd. 3

Analand Saga Bd. 3

Ein Spielbuch sieht auf den ersten Blick aus wie ein ganz normales Buch. Der offensichtlichste Unterschied besteht darin, dass es in kurze Abschnitte, selten so lang wie eine ganze Seite, unterteilt und durchnummeriert ist. Wie jedes normale Buch beginnt man ganz vorne mit einer Einleitung, die einem den Beginn er Geschichte erzählt. Bereits dieser erste Abschnitt mündet in einer Multiple-Choice-Frage. Das könnte wie gefolgt aussehen:

 

Du bist ein namenloser Held und stehst am Eingang eines großen Labyrinths. Du gehst ein Stück den Weg entlang, bis sich dieser gabelt. Möchtest du links entlang gehen, lies weiter bei 191. Willst du stattdessen dem rechten Weg entlang folgen, lies weiter bei 34.

Man springt also von Abschnitt zu Abschnitt und darf wählen, wie man die Geschichte fortsetzen will. Dazu kommen i.d.R. noch ein paar einfach Kämpfe bei denen man würfelt. Außerdem kann man an bestimmten Stellen gerne mal Dinge aufsammeln oder erledigen, die an späterer Stelle bei einer Multiple-Choice-Frage weiterhelfen. Alles in allem nicht mega-spektakulär, aber dennoch recht unterhaltsam. Die Autoren von Das Schwarze Auge haben sich das Spielprinzip später auch zu Nutze gemacht und es „Solo-Abenteuer“ genannt. Eine gewisse Renaissance widerfährt dem Genre gerade auf den Mobilgeräten, so gibt es z.B. eine App zur Buchreihe „Die Zwerge“, die genau das Spielbuch-Prinzip aufgreift.

Um jetzt mal zum Thema Programmieren zurückzukommen und dem Blog-Thema gerecht zu werden, erzähle ich nun, warum ich überhaupt damit angefangen habe von den Spielbüchern zu berichten. Bereits auf dem C64 begann ich damit kleine Textadventures mit Multiple-Choice-Prinzip in Basic zu schreiben und mir somit meine ersten Programmiererfahrungen anzueignen. Diese Spiele waren nicht besonders lang und aufregend, aber ich lernte dadurch immer neue Dinge. Später auf dem PC habe ich diese Sache dann mit Visual Basic und Windows Forms wiederholt und mir damit, mehr zusammengeklickt als programmiert, auch ein bis zwei kleine Spiele gebastelt.

Später, als ich endlich richtig programmieren konnte, hatte ich immer wieder das unterschwellige Verlangen so ein Adventure bzw. die Technik dafür mit richtigen Programmierkenntnissen selber zu schreiben. Nun, kurz vor meinem 34. Geburtstag, bin ich diesem kindlichen Verlangen endlich nachgekommen, und ich habe ein paar Tage Zeit aufgewendet und einen PHP-Parser erstellt, der ein selbst entworfenes JSON-Format einliest und ein Spielbuch-Szenario abbilden kann. Abgerundet habe ich das mit Unit Tests, Composer- und Packagist-Unterstützung sowie einer Travis-Buildüberwachung.

Was genau ist dabei rausgekommen?

Um es knallhart zu sagen: Im Prinzip nichts was man sofort effektreich einsetzen kann. Das war aber auch nicht unbedingt das Ziel. Herausgekommen ist ein PHP-Parser, der die JSON-Datei einliest, die aktuellen Spielvariablen auswertet und einen entsprechenden Spielabschnitt „verwendungsfertig“ zurückgibt. D.h. beispielsweise, dass der aktuelle Abschnitt fünf definierte Multiple-Choice-Möglichkeiten hat, aber nur drei davon benutzt werden können, weil die anderen beiden auf Grund fehlender Inventargegenstände oder sonstiger Gegebenheiten gesperrt sind. Der Parser liefert einem also nur die Elemente zurück, die auch „aktiv“ sind. Wer auch immer den Parser verwendet, kann das Ergebnis dann z.B. als HTML ausgeben oder in einem CLI-Programm oder womit auch immer darstellen. Dem Paket liegt eine winzige (und hässliche) HTML-Demo bei, damit man wenigstens irgendwas sehen kann. ;)

Wie sieht das JSON-Format aus?

Das folgende Beispiel ist ein sehr einfaches, das ohne Conditions oder das Setzen von Variablen auskommt. Detaillierte Beispiele findet man in der README auf Github.

{
 "id": "door_2",
 "contents": [
 {
 "text": "You're standing in an empty room with nothing but a key in the center of the room."
 }
 ],
 "options": [
 {
 "text": "Take the key.",
 "jumpTo": "door_2_key_taken"
 },
 {
 "text": "Leave the key alone and return to the previous room.",
 "jumpTo": "beginning"
 }
 ]

}

 

Ist es fertig?

Jein. Das was ich in erster Linie erreichen wollte, habe ich umgesetzt. Natürlich schwirrten mir beim Erstellen (und auch jetzt noch) diverse Erweiterungsmöglichkeiten im Kopf rum. Es gibt noch keinen Kampfmodus, es fehlen Zufallsereignisse (werden in den Büchern gewürfelt) und einiges mehr. Damit man eine Geschichte in dem JSON-Format komfortabel schreiben kann, braucht man einen Editor – den gibt’s auch nicht. Ob ich das alles jemals umsetzen werde, kann ich nicht genau sagen. Ich denke nicht, dass ich in näherer Zeit daran weiterarbeiten werde. Aber mal schauen, wann mich die Lust packt. :)

Wo kann man sich das ansehen?

Die Quellen des Gamebook Parsers liegen unter GPL-Lizenz auf Github. Installieren kann man es auch via Composer mit

composer require rvilbrandt/gamebook

Die (hässliche) Mini-HTML-Demo kann man auch hier sehen.

War dieser Artikel hilfreich für Sie?
[Gesamt: 0 Durchschnitt: 0]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *