7  Befehle

7.1 Eigene Befehle definieren

T.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

Erzeuge einen Befehl, der den Spieler, wenn er das magische Wort »XYZZY« sagt, auf magische Weise ins Haus teleportiert.

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
demObj Objekt im Dativ
nachRitg Richtungsangabe (»nach Norden«)

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‹

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.

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:

> GIB DEM MANN DAS BUCH
aObj = Mann, aObj2 = Buch

> GIB ES IHM
aObj = ihm (Mann), aObj2 = es (Buch)

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 * *

Um Fehler und Ungereimtheiten in Spielen zu überprüfen, baut man während des Schreibens oft sogenannte Debug-Verben ein. Definiere das Verb »Status [Objekt]«, das zu jedem Objekt, ob es sichtbar ist, oder nicht, eine Liste von Informationen ausspuckt, wie z.B. Aufenthaltsort, Gewicht, ob bereits benutzt oder nicht. (Tip: Für den Aufenthaltsort beim Befehl Räume ganz unten in normal.adv schauen. Man muss eventuell schon einmal ins Kapitel 8.3 schauen.)

7.2 Vokabular von Befehlen

Fü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:

hier

Das Objekt ist im Raum und für den Spieler zugänglich. Wird kein Ort angegeben, so muss das Objekt hier sein.

beiMir

Das Objekt ist beim Spieler.

nichtBeiMir

Das Objekt ist im Raum, aber nicht beim Spieler.

inSicht

Das Objekt ist sichtbar im Raum, aber nicht unbedingt für den Spieler zugänglich, wie z.B. etwas, das in einem transparenten Behälter eingeschlossen ist.

mobil

Das Objekt ist im Raum und kann aufgehoben werden.

Inhalt

Das Objekt ist in einem anderen enthalten. Inhalt kann nur für aObj verwendet werden, und es bezieht sich immer auf aObj2.

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:

> SETZ DICH
(auf den Louis-XV-Sessel)

Du lässt dich etwas unelegant auf dem filigranen Sessel nieder.

Wenn man ein Verb in ein anderes umleitet, sollte man aufpassen, dass man für jedes Objekt die passenden Zusatzangaben macht.

7.3 Befehle erweitern=

In 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 Pseudobefehle

Eine 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:

(werfen)

Der Befehl ist werfen, das Objekt, das überprüft wird, ist aObj, also die Scheibe.

(getroffen)

Der Befehl ist ebenfalls werfen, aber das Objekt, das überprüft wird, ist aObj2, also der Dartpfeil.

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:

hineinlegenempfangen
herausnehmenfreigeben
aufschließenaufschl_mit
abschließenabschl_mit

Aufgabe 21 *

Modifiziere den Tisch so, dass man nur die Vase daraufstellen kann. Bei allen anderen Objekten gibt es eine negative Antwort.

Das achte Kapitel widmet sich den Objektklassen, zu denen man ähnliche Objekte zusammenfassen kann.

Zusammenfassung

Verweise