[ T. A. G. ] [ Tutorium ]

 

Kapitel 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«)

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:

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

hineinlegen --> empfangen
herausnehmen --> freigeben
aufschließen --> aufschl_mit
abschließen --> abschl_mit

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

Zusammenfassung:
Zusätzlich zu den in T.A.G. bereits vorhandenen Befehlen kann man eigene definieren. Die Definition erfolgt wie gewohnt in einem abgeschlossenen Block.

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:
Handbuch, Kapitel 4.1: Befehle
Handbuch, Kapitel 6.6: Neue Befehle einbauen
Befehlsdefinitionen in normal.adv und karn.adv.


Nächstes Kapitel
Voriges Kapitel
nach oben
Inhalt


________
Startseite --> Textadventures --> T.A.G. --> Tutorium --> Kapitel 7
Übersicht
Martin Oehm

[ www.martin-oehm.de - Startseite ]
[ Textadventures ]
[ T. A. G. ]

Inhalt

Einleitung
Spielwelt
Objekte I
Objekte II
Anweisungen
Variablen
Befehle
Klassen
Personen
Diverses

Lösungen