Kapitel 7 Befehle7.1 Eigene Befehle definierenT.A.G. bringt die häufigsten Befehle wie nehmen, gehen, legen, öffnen usw. bereits mit. Die Datei normal.adv enthält weitere Befehlsdefinitionen wie drücken, ziehen, schlagen. Trotzdem benötigt man für ein eigenes Adventure eigene Befehle, die man in T.A.G. definieren kann. Am einfachsten sind wohl Befehle, die nur aus einem Wort bestehen, wie zum Beispiel Lage oder Inventar. Die Definition eines solchen Befehls sieht folgendermaßen aus: Bef Diagnose Name 'mich diagnostizieren' Verb 'diagnose' 'd' Ausf Jenach Gesundheit (1) Text 'Du stehst mit einem Bein im Grab.' (2) Text 'Du bist stark angeschlagen.' (3) Text 'Du bist leicht angeschlagen.' (4) Text 'Du bist relativ fit.' (5) Text 'Du bist gesund und munter.' Ende EndeAusf Ein Befehl hat also eine ID, einen Namen, verschiedene Verben und einen Ausführungsblock. Der Name wird zum Beispiel beim Rückgängigmachen eines Zugs benutzt. Mit den Verben können die Befehle aufgerufen werden. »Diagnose« oder »D« sind zwar keine Verben im eigentlichen Sinne, werden von T.A.G. aber so behandelt. Da Diagnose ein Befehl ohne Objekte ist, muss hier nichts weiteres angegeben werden. Der Ausführungsblock enthält ein Konstrukt, das mit jenach beginnt und mit Ende aufhört. Dazwischen stehen Zahlen in Klammern und Text-Anweisungen. Dieses Konstrukt ist eine Vereinfachung von: wenn (Gesundheit = 1) Text 'Du stehst mit einem Bein im Grab.' wenn (Gesundheit = 2) Text 'Du bist stark angeschlagen.' ... In den Klammern können auch mehrere Angaben stehen. Außerdem können statt Zahlenwerten auch Objekte oder Räume verglichen werden. Diese Schreibweise ist ähnlich wie die Schreibweise in den Vor- und NachAusf-Blöcken. Aufgabe 19 Die meisten Befehle verlangen allerdings Objekte. Welche Objekte das sind, muss dann in dem Befehl angegeben werden. Definieren wir also einmal den Befehl »drehe x auf y«, der auf unseren Safe gemünzt ist. Bef drehen_auf Name 'drehen' Verb 'drehe' Syntax dasObj auf dasObj (Allg) Ausf Bed (aObj = Rädchen Safe) 'Das kannst du nicht drehen.' Bed (aObj2 = Zahl) 'Du kannst das Rädchen nur auf eine Nummer drehen.' Bed (Nummer > -1) und (Nummer < 100) 'Das Rädchen kann nur auf Zahlen von 0 bis 99 gedreht werden.' Sei Code Nummer Text 'Du hast das Rädchen auf [code] gedreht.' EndeAusf Dieser Befehl hat eine Syntax-Angabe, in der die benötigten Objekte angegeben werden. In dieser Zeile können folgende Angaben gemacht werden:
dasObj Objekt im Akkusativ Direkt nach den Objekten können Zusatzangaben in Klammern gemacht werden, wie hier (Allg). Jedes Wort, was nicht in Klammern steht und kein Schlüsselwort ist, wird als Präposition behandelt. In unserem Beispiel ist das auf. Nach einer Präposition muss ein Objekt folgen, da T.A.G. bei Präpositionen unterscheidet, ob sie zu einem Objekt oder zu einem Verb gehören. Präpositionen, die Bestandteil des Verbs sind, müssen in der Verb-Zeile deklariert werden, z.B. 'mache auf' Die Objekte heißen nach der Reihenfolge ihres Auftretens in der Syntax-Zeile aObj, aObj2 und aObj3. Die Richtung heißt aRitg und ist eine Richtungsvariable. Die Reihenfolge, in der der Spieler die Objekte eingibt, ist egal:
Zahl ist ein besonderes Objekt. Es bedeutet, dass der Spieler anstelle eines Objekts im Spiel eine Zahl eigegeben hat. Der Wert der Zahl wird in der Variable Nummer gespeichert. Dieser Befehl kann offensichtlich nur auf das Rädchen angewandt werden. Deshalb wird alles im Ausführungsblock des Befehls definiert. Ein Befehl, der allgemeingültiger ist, hätte dort nur eine allgemeine Antwort. Die speziellen Geschehnisse würden dann bei den Objekten in einer VorAusf definiert. Aufgabe 20 ** 7.2 Vokabular von BefehlenFür Text-Adventures ist es wichtig, dass der Spieler seine Gedanken dem Computer in richtiger Sprache mitteilen kann. Natürlich gibt es Einschränkungen: Der Satz muss ein Befehlssatz sein, der möglichst einfach aufgebaut ist. Damit der Spieler aber seine Idee umsetzen kann, sollte man sich also bei neuen Befehlen überlegen, wie diese heißen. Das Dumme ist nur, dass man denselben Befehl auf verschiedene Weise ausdrücken kann, insbesondere bei Befehlen, die zwei Objekte benötigen, ist das so. Dem Spieler wird aber meist nur eine Möglichkeit einfallen, und wenn es nicht klappt, wird er vielleicht seine Idee aufgeben, weil er denkt, der Parser verstünde das Verb nicht. Synonyme zu Befehlen, die eine andere Satzstruktur haben, können in T.A.G. abgegeben werden, indem die Ausführung umgeleitet wird. Dabei gibt man keinen Ausführungsblock an, sondern nur das Wort Ausf, gefolgt von dem Befehl, zu dem umgeleitet wird. Dazu ein Beispiel: Der Spieler kann sagen »Fülle Wasser ins Glas« oder »Fülle das Glas mit Wasser«. Der Code sieht dann so aus: Befehl füllen Name 'füllen' Verb 'fülle' Syntax dasObj mit demObj Ausf Text 'Dort kannst du nichts einfüllen.' EndeAusf Befehl füllen_in Name 'füllen' Verb 'fülle' Syntax in dasObj dasObj Ausf füllen Mit der Zeile Ausf füllen wird der Befehl füllen_in umgeleitet zu füllen. Dabei müssen die Objekte in der selben Reihenfolge definiert werden, und das ist auch der Grund, warum die Syntax-Zeile von füllen_in etwas komisch aussieht: Der Behälter kommt an erster Stelle, der Inhalt an zweiter. (T.A.G. erlaubt die Eingabe der Objekte in beliebiger Reihenfolge, der Fall und die Präposition legen dann fest, was gemeint ist.) Eben haben wir gesehen, dass man nach dasObj oder demObj zusätzliche Angaben in Klammern machen kann. Diese Angaben sind der Ort und ein Attribut, dass ein Objekt besitzen muss. Die Ortsangabe muss erfüllt sein. Ist das Objekt am falschen Ort, so bricht der Zug vorzeitig mit einer Meldung des Parsers ab. Die Orte sind:
Die Attributangabe erfolgt wahlweise. Sie muss nicht erfüllt sein. Sie dient nur dazu, eventuell vom Spieler weggelassene Objekte zu raten. Wenn es ein Objekt, das das angegebene Attribut besitzt, am Ort gibt, so wird es automatisch angenommen und dem Spieler in runden Klammern mitgeteilt:
Wenn man ein Verb in ein anderes umleitet, sollte man aufpassen, dass man für jedes Objekt die passenden Zusatzangaben macht. 7.3 Befehle erweiternIn T.A.G. sind die häufigsten Befehle bereits implementiert. Sie funktionieren in der Regel, wie man es gerne hätte, aber trotzdem möchte man sie manchmal ändern. Deshalb kann man jeden der bereits vordefinierten Befehle noch einmal definieren, und ihn so erweitern. Wenn zum Beispiel eine Blume im Spiel vorkommt, so möchte sie der Spieler automatisch »pflücken« anstatt sie aufzuheben oder einfach zu nehmen (obwohl es eigentlich dasselbe ist). Also erweitern wir den Befehl nehmen: Bef nehmen Verb 'pflücke' Das war's, und schon erkennt T.A.G. das Verb »pflücken« als »nehmen«. Man kann den Befehlen auch Ausführungsblöcke vor- oder nachschalten. Zum Beispiel unser neues Verb »drehe Rädchen auf Nummer«. Ein gutes Synonym hierfür wäre »stelle« oder »setzte Rädchen auf Nummer«. Dieses Vokabular gehört aber bereits zum Befehl hineinlegen. Also erweitern wir den Befehl: Bef hineinlegen VorAusf wenn (aObj2 = Zahl) dann Ausf drehen_auf aObj aObj2 Stop Ende EndeAusf Damit checken wir, ob das zweite Objekt eine Zahl ist. Wenn ja, wird drehen_auf ausgeführt, und der Befehl hineinlegen wird mit Stop abgebrochen. 7.4 PseudobefehleEine Sache, die den Code für Objekte vereinfacht, aber auf Anhieb nicht immer leicht zu verstehen ist, sind Pseudobefehle. Zu jedem Befehl kann ein Pseudobefehl definiert werden, z.B. mit Pseudo getroffen werfen wobei werfen ein bereits definierter Befehl ist. Obwohl zu jedem Befehl ein Pseudobefehl erzeugt werden kann, machen Pseudobefehle nur Sinn, wenn ein Befehl zwei Objekte benötigt. Der Sinn des Pseudobefehls ist es nämlich nur, Aktionen in der Vor- oder NachAusf von Objekten abzufangen, wenn dieses Objekt das zweite erwähnte Objekt ist, also aObj2. Es gibt eine Variable, aBef, die den durchzuführenden Befehl enthält. Dies ist die Variable, die in den Vor- und NachAusf in runden Klammern abgefragt wird. Sie kann nie einen Befehl enthalten, der auf einen anderen umgeleitet wurde, der Wert von aBef ist den der umgeleitete Befehl. Wenn der Befehl zwei Objekte benötigt, wird diese Variable vorübergehend auf den Pseudobefehl gesetzt. Der Pseudobefehl hat nur in Vor- und NachAusf-Blöcken eine Bedeutung. Leutet der Befehl »Wirf Dart auf Scheibe«, so bedeuten:
Der Pseudobefehl ist also nur eine Krücke, um das Objekt auch in der runden Klammer ansprechen zu können. Für einige T.A.G.-Befehle gibt es vordefinierte Pseudobefehle:
Aufgabe 21 * Zusammenfassung: Zu jedem Befehl müssen Verben und ein Ausführungsblock definiert werden. Wenn ein Befehl Objekte verlangt, so muss eine Syntax-Angabe gemacht werden, die den Satzbau beschreibt. Nach ihrer Reihenfolge in der Syntax-Angabe heißen die angegebenen Objekte aObj, aObj2 und aObj3. Sätze mit verschiedenen Strukturen, die dasselbe bewirken können auf einen Befehl umgeleitet werden. DieStandard-T.A.G.-Befehle können erweitert werden. Pseudobefehle können benutzt werden, um Befehlsdurchführungen bei den Ausführungsblöcken von aObj2 abzufangen. Verweise:
|
Einleitung |