Hintergrund
1. Einleitung
2. Funktionsweise
3. Syntax
3.1 Aktionen
3.2 Bedingungen
4. Lizensierung und Copyright
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.
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.
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.
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.");
|
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.
|
Das Textadventure und der damit verbundene Quelltext steht unter der
GNU General Public License (GPL).
Das Copyright liegt bei Andreas Pietzowski.
Wer den Quelltext haben möchte, der soll mir doch eine
Email schreiben.
|