Hintergrund

1. Einleitung
2. Funktionsweise
3. Syntax
    3.1 Aktionen
    3.2 Bedingungen
4. Lizensierung und Copyright

1. Einleitung

Bis zur Fertigstellung dieses Adventures hat es nun insgesamt über zwei Jahre gedauert. Eine Domain zu reservieren war der einfachste Teil der ganzen Anstrengung. Die Adventure-Engine zu programmieren ist zwar eine aufwendige Arbeit, macht aber im Grunde sehr viel Spaß. Die große Hürde an diesem Adventure war die Story und im Anschluss die Realisierung der Story im Textadventure.

Es ist klar, dass die Story dieses Adventures keinen MonkeyIslandTM-Fan vom Hocker reißen wird, aber in erster Linie soll dieses Textadventure zeigen, dass man auch ohne Java, JavaScript oder Flash ein webbasiertes und interaktives Spiel programmieren kann.
Das Textadventure ist komplett in PHP geschrieben und nutzt zur Verwaltung der Räume, der User und deren Inventar eine MySQL-Datenbank.

2. Funktionsweise

Das Textadventure besteht im großen und ganzen fast nur aus verschiedenen Parsern:

Eingabeparser:
Der Eingabeparser nimmt den vom Spieler eingetippten String und vergleicht die darin vorkommenden Wörter mit den gültigen Wörtern im aktuellen Raum. Dabei werden auch eventuelle Tippfehler automatisch behoben.

Ausgabeparser:
Der Ausgabeparser holt den kompletten Text des gewünschten Raums aus der Datenbank und entfernt die Textpassagen, die nicht mehr oder noch nicht angezeigt werden dürfen, da der Spieler einen bestimmten Status erreicht oder noch nicht erreicht hat.

Linkparser:
Der Linkparser durchsucht den vom Ausgabeparser erzeugten String nach eventuellen Raumverknüpfungen und ersetzt diese durch passende Hyperlinks, die alle Informationen für die nächste Aktion enthalten.

Das Textadventure besteht nur aus Räumen. Aber nicht nur jeder offensichtliche Raum ist ein Raum, sondern ein Gespräch ist auch als Raum realisiert. Jeder Klick wechselt in einen anderen Raum oder in einen anderen Zustand. Es gibt für jeden Raum einen Text und darin enthaltene Links zu weiterführenden Räumen. Bei einem Gespräch sind die Links zu den nächsten Räumen zum Beispiel die Antworten auf eine Frage.

3. Syntax

Es ist sehr wichtig, dass man ein Textadventure nicht komplett in einer existierenden Programmiersprache realisiert, sondern dass man sich eine eigene Meta-Sprache überlegt, die speziell auf die Bedürfnisse des Spiels angepasst ist. Diese Meta-Sprache vereinfacht viele Dinge, die man sonst viel zu oft explizit programmieren müsste.

3.1 Aktionen

Der Eigabeparser überprüft, ob die Eingabe im aktuellen Raum eine Aktion auslösen soll und führt diese Aktion dann aus. Zur Zeit sind folgende Aktionen in der Engine implementiert:

add_inv(string element)Fügt ein Element zum Inventar hinzu
sub_inv(string element)Entfernt ein Element aus dem Inventar
set_var(string key, string value)Setzt die Variable "key" auf den Wert "value"
inc_var(string key)Erhöht die Variable "key" um eins
dec_var(string key)Erniedrigt die Variable "key" um eins
output(string text)Gibt einen die Meldung "text" aus

Beispiel:
Angenommen der Spieler gibt "benutze batterie mit taschenlampe" ein, dann könnte eine Aktion auf diese Eingabe folgendermaßen aussehen:

sub_inv("Batterie");
set_var("Taschenlampe","hatsaft");
output("Ich habe die Batterien in die Taschenlampe gesteckt.");

3.2 Bedingungen

Wie bereits erwähnt düfen bei gleichen Eingaben zu verschiedenen Spielständen nicht die selben Aktionen ausgeführt oder die selben Texte ausgegeben werden. Deshalb gibt es in der Engine die Möglichkeit, Aktionen oder Ausgabetexte zu unterdrücken. Im Endeffekt handelt es sich um verschachtelte if-Abfragen, die ein Parser rekursiv ermittelt. Folgende Bedingungen sind implementiert:

[i_element:string]Der String wird nur dann genommen, wenn sich das Element im Inventar befindet
[i!element:string]Der String wird nur dann genommen, wenn sich das Element nicht im Inventar befindet
[v_key=value:string]Der String wird nur dann genommen, wenn die Variable "key" den Wert "value" hat
[v!key=value:string]Der String wird nur dann genommen, wenn die Variable "key" einen anderen Wert als "value" hat

Diese Bedingungen können beliebig verschachtelt werden, was einer logischen UND-Verknüpfung entspricht. Eine logische ODER-Verknüpfung ist mit dem "|"-Zeichen möglich. Die bedingungen können sowohl im Textbereich eingesetzt werden (siehe Besispiel) oder im Aktionsbereich, um auf Eingaben zu unterschiedlichen Spielständen dem entsprechend reagieren zu können.

Beispiel:
Angenommen der Text hat folgende Bedingung:

Du befindest dich in einem [v_Taschenlampe=aus:dunklen Raum[i_Taschenlampe: und deine Taschenlampe könnte hier nützlich sein].][v_Taschenlampe=an:Raum, an der Wand hängen Bilder.]
  • Falls der Spieler nun eine Taschenlampe hat, sie aber noch nicht angeschaltet hat, bekommt er folgenen Text zu lesen:
    Du befindest dich in einem dunklen Raum und deine Taschenlampe könnte hier nützlich sein.
  • Falls der Spieler nun eine eingeschaltete Taschenlampe hat, bekommt er folgenen Text zu lesen:
    Du befindest dich in einem Raum, an der Wand hängen Bilder.
  • Falls der Spieler keine Taschenlampe hat, bekommt er folgenen Text zu lesen:
    Du befindest dich in einem dunklen Raum.

4. Lizensierung und Copyright

Das Textadventure und der damit verbundene Quelltext steht unter der GNU General Public License (GPL).
Das Copyright liegt bei Andreas Pietzowski. © 2002
Wer den Quelltext haben möchte, der soll mir doch eine Email schreiben.

Kontakt
Hintergrund
zum Spiel