Wie programmiere ich ein Textadventure? Making of Ghuum-Planeten!

Ich habe mich vor ein paar Monaten an einem Textadventure probiert, auf der Basis von meinem Science-Fiction-Buchanfang. Da ich bereits die groben Umrisse hatte, musste ich darauf eine entsprechende Geschichte mit Räumen und Wegen erstellen.

Trotzdem habe ich schon das zweite Wort in der Einleitung vergessen oder gelöscht. Siehe Screenshot. xD Es war alles BETA! (Gute Ausrede!)

Klassische Textadventures

Textadventure sind schon alt (oder besser retro), aber es gibt immer noch eine Community von Spielern, die spätestens seit dem Internet nun auch zu potentiellen Spieldesigner geworden sind.

Irgendeine absurde Geschichte hat jeder im Kopf. Da reicht auch schon eine kleine Idee. Als ersten Schritt müssen wir uns überlegen bzw. prüfen, was überhaupt möglich ist.

  • Welche Bedingungen gibt es?
  • Wie soll es aussehen?
  • Was soll entschieden werden?
  • Was soll danach passieren?
  • Welche Konsequenz hat es für die Geschichte?
  • Welche Möglichkeiten geben wir zur Auswahl?

Ich rate euch mit einfachen Sachen anzufangen und nicht gleich von der komplexen Story zu träumen. Das wird vielleicht etwas beim zweiten Adventure, aber das erste Spiel sollte zum Lernen für euch sein.

Unterschätzt den Aufwand einer guten Story und vielen Möglichkeiten nicht!

Es ist sehr schwierig viele Handlungsstränge wieder zusammen zu führen, deshalb gibt es auch in vielen anderen Grafikspielen eine lineare Handlung oder nur leichte, kosmetische Abweichungen.

Wenn ihr wirklich eine harte Abweichung macht, entwickelt ihr danach zwei Spiele!

Moralische Entscheidungen, die sich auf den Charakter auswirken, sind einfacher zu entwickeln. Es gibt eine Entscheidung, die sich eigentlich nicht auf den Verlauf des Spieles auswirkt, aber als eine Art Status an eurer Figur gespeichert wird.

Ich hatte so einen Bereich und habe mit mood = 0 angefangen. Schlechte Stimmung -1 und gute Stimmung +1.

Wenn die Figur nun an einen Ort kommt, wo darauf Bezug genommen wird, prüfen wir einfach, ob z.B. mood > 3 oder mood < 3 ist.

Räume und Entscheidungen

Viele Adventures basieren auf dem „Raumsystem“. Ich nenne es einfach mal so. Ähnlich wie Exit-Games. Es gibt einen Ort, um ihn zu verlassen oder etwas zu bekommen, müssen wir vorher etwas anderes erfüllen. Eine einfache Bedingung.

Trotzdem kann sich der Charakter frei bewegen und Informationen über den Ort sammeln, um dann langsam zu erfahren, was er tun muss. In einfacheren Geschichten, sagt dir die Figur das direkt ins Gesicht.

Die Tür ist versperrt. Du brauchst einen Schlüssel.

Ich kann Sie nicht durchlassen. Sie haben keinen Ausweis.

Woher bekomme ich nun einen Schlüssel? Gibt es nur einen Weg, um an den Schlüssel zu gelangen oder mehrere? Gibt es vielleicht eine weitere Voraussetzung, um überhaupt in die Nähe des Schlüssels zu kommen?

Jetzt wisst ihr auch warum viele „Rollenspiele“ entweder linear oder auf ständige Wiederholung „Farming“ ausgelegt sind.

Es ist kompliziert!

Links oder Text?

Es gibt zwei verschiedene Stile der Eingaben. Der Textbuch-Stil ist ähnlich wie eine Webseite. Das heißt: Entscheidungen und Aktionen werden per Klick auf einen Link gesteuert.

Der klassische Text-Parser verlangt Tastatureingaben. Hier müssen dem Spieler die gängigsten Befehle bekannt sein, damit er sich in seiner Welt orientieren kann. Im Netz findet sich entsprechende Hilfe! In den meisten Fällen ist es einfaches Englisch.

ZORK

Hier ist ein Beispiel aus Zork 1. Viele der Spiele gibt es heute im Browser. Textadventures ist eine gute Anlaufstelle. Dort ist es auch möglich eigene Spiele zu erstellen. Quest ist eine Engine mit Text-Parser, während Squiffy den Textbuch-Stil nutzt.

Die Tools sind Open Source.

Mit einem Kommandozeilentool lässt sich das Spiel generieren. Du kannst es aber auch direkt im Browser erstellen. Es gibt eine eigene Syntax für die Geschichte.

Der Code liegt auf Github.

„Textbook-Style“

Die Entscheidung fiel recht schnell, weil ich die Parserspiele nicht unbedingt mag. Es sollte einsteigerfreundlich werden und wer sich dann erst die Standardbefehle durchlesen muss, der hat vielleicht schon keinen Bock mehr. Außerdem siehst du auf einen Blick, was du machen kannst. Also benutzte ich Squiffy.

Die Dokumentation enthält nur einfache Beispiele während ich eigentlich komplexere Sachen machen wollte, also musste ich hier selbst testen.

Leider hat (oder hatte) das Online-Tool auch ein paar Bugs z.B. dürfen bei Operatoren keine Leerzeichen stehen benutzt werden, sonst rechnet er nicht. Wenn man sich nur die JS-Datei herunterlädt funktioniert die Reset-Funktion (um das Spiel neu zu starten) nicht, deshalb habe ich mir eine eigene Funktion geschrieben, die den Local Storage leert und die Seite neu lädt. Wenn man sich das ZIP lädt, ist das Encoding falsch usw.

Die Engine ist nicht fehlerfrei, deshalb musste ich neben meiner Geschichte auch noch an grundsätzlichen Lösungen, Experimenten und Bugfixes arbeiten.

Also noch mehr Arbeit…

Sound, Effekte, Grafiken?

Nachdem ich schon Wochen mit Experimenten verbracht habe, wollte ich natürlich (übertrieben!) noch weitere Features einbauen, damit die Geschichte RICHTIG angenehm zu spielen wird. Ich brauchte Atmosphäre.

Ich wollte Sounds!

Da es nur eine Engine ist, lässt sich Javascript ganz normal benutzen. Damit habe ich Soundeffekte nach Aktionen eingebaut und ich kann auch verschiedene Schadensberechnungen vornehmen, wenn ich denn jemals bis zu einem Kampf gekommen wäre. Der Aufwand stieg allerdings immer weiter.

Grafiken lassen sich normal als HTML einbinden.

Ghuum Adventure

Es lassen sich die Klassen für Sections und Passages umbauen, sodass man Unterschiede direkt sieht oder geklickte Links grau darstellen kann.

Lizenzen für Soundeffekte?

Nun konnte ich nicht einfach alles benutzen, worauf ich Bock hatte, weil es eben nicht von mir war. Ich wollte es schon sauber machen. Ich bin dabei über die YouTube Audio Library gestolpert.

Ich bin mir immer noch nicht sicher, wie das mit den Lizenzen dort ist, ob alles nur auf YouTube benutzt werden darf?! Denn dort steht, dass die Musik oder Effekte bei Videocontent und eigenem Material integriert werden darf. Die Ausnahme: Die MP3s dürfen nicht isoliert zum Download angeboten werden.

Als Erstes habe ich mir die MP3s geladen und sie via Javascript abgespielt, aber eigentlich dürfte ich die, laut Lizenz, nicht auf den Server legen, sondern sie müssten irgendwo integriert sein. Das Web besteht aber aus gemischten Ressourcen, die wiederum auch isoliert aufrufbar sind. Eigentlich nicht ganz sauber.

Dann bin ich hin gegangen und habe mir einfach die URLs kopiert. Das heißt: Der Sound wird von YouTube geladen und abgespielt.

Ich baute eine Geschichte

Eine Geschichte, die mehrere komplexe Wege hatte, die sich trennen und wieder zusammen finden, mit Aktionen, die Soundeffekte haben und es sollte KONSISTENT sein.

Ich wollte unbedingt, dass die Geschichte in sich geschlossen logisch wirkt, damit nicht jemand sagen kann: Hey, hier hatte er doch X, warum hat er das nicht benutzt um Y zu machen?

Was will der Spieler überhaupt tun? Wenn jede Aktion vordefiniert wird, musst du dir ALLE Möglichkeiten ausdenken und Konsequenzen entwickeln.

Das lässt sich vereinfachen, wenn Konsequenzen aus bleiben oder sogenannte Sackgassen werden, um den Spielverlauf nicht zu stören. Ratet mal, wer überall noch Konsequenzen einbauen wollte? Ja, ich…

Während man in 3D-Spielen auch mal doof in den Himmel gucken kann, gibt es das bei Textadventures eher nicht. Neben der Story und den Nebenstory wären geschlossene Fun-Aufgaben auch noch witzig gewesen. Habe ich schon vom Aufwand erzählt?

Die Entwicklung an sich!

Wer im Online-Editor entwickelt, der wird merken, dass die Javascript-Aktionen ohne deine Funktionen nicht laufen, aber damit das ganze Spiel crashen. Also musste ich jeden Sound auskommentieren. Zum Testen wurde dann alles wieder aktiviert und das Spiel generiert, was bei den Experimenten auch noch mehr Zeit beanspruchte, durch Kopieren, „Huch ein Bug“, Testen und Fehler suchen.

Hier würde ich mich auch eher auf die einfacheren Methoden konzentrieren, statt gleich alles zum Laufen zu bewegen.

Erst die Geschichte, erste die einfache Logik und lineare Story. Danach lässt sich das Adventure noch, je nach Laune und Zeit, erweitern.

Damit man sich nicht immer durch das Spiel klicken muss, verändert man am Besten den Startzeitpunkt mit @start Passage Doof nur, wenn man hier wieder auf Werte angewiesen ist, die erst im Laufe des Spiels gesetzt werden, weil ich es komplex machen wollte! Also hing ich an dieser Stelle auch wieder, um Testwerte zu setzen oder mich durch alles durch zu klicken.

Sehr frustrierend.

Die Logik

Es lassen sich Werte setzen, Passagen abgrenzen, Einbahnstraßen bauen, Werte addieren, Zufallszahlen ermitteln, Bedingungen setzen und Gegenstände bestimmen.

Richtungsweisende Befehle lassen sich mit der externen Syntax machen. Wer etwas anspruchsvoller sein möchte und z.B. Zufallselemente einbauen möchte, der muss sich mit der Javascript-Integration beschäftigen.

Es ist damit möglich sehr komplexe Spiele zu bauen, die in der Entwicklung leider schnell unübersichtlich werden, je nachdem welche Sprünge gemacht werden oder wie groß die Abschnitte sind.

Hier sollte man sich von Anfang an ein Konzept überlegen, welche Teile in sich geschlossen sind und diese sichtbar von anderen trennen!

Spielestatistik

Manche Sachen gingen auch einfach! Es lässt sich eine Statistik der Klicks erstellen. Die eckigen Klammern sorgen dafür, dass dieser Bereich nach jedem Klick ausgeführt wird. Dann wird die Variable clicks immer um eins erhöht.

[[]]: @inc clicks

Am Ende reicht es aus, wenn wir uns die Klicks anzeigen lassen, mit {clicks}. Das war zur Abwechselung sehr nett als Ergebnis und wirklich einfach.

Fazit

Ich fand das Prinzip witzig, aber irgendwie bin ich doch nicht so der Science-Fiction-Typ wie ich dachte. Da hat es mir echt an der Motivation zur eigenen Geschichte gefehlt. Trotzdem konnte sich meine ausgedachte Welt sehen lassen.

Leider wollte ich es zu komplex machen und irgendwann hat mich die Lust verloren, weil — alles zusammen — sehr aufwendig (und dabei leider frustrierend) war.

Vielleicht ist das Tool auch nicht die geeignete Wahl? Wer bessere Tools kennt, kann es in die Kommentare schreiben.

Andererseits kenne ich jetzt die Fallstricke, Workarounds, Komplexitätsprobleme und Mechanismen. Vielleicht findet sich nochmal die Motivation an einem anderen Projekt oder ich schreibe ein ganz andere Geschichte. Vorerst bin ich aber bedient.

Stand 2017: 
Zwei Textadventures. Der erste kleine Test. Der zweite größere Test.


Originally published at www.1337core.de on October 9, 2015.

Show your support

Clapping shows how much you appreciated Alex’s story.