Fragen und Antworten

Diese Fragen sind irgendwann einmal von T.A.G.-Benutzern gestellt worden und werden hier kurz beantwortet:

Allgemeines

Probleme beim Kompilieren mit T.A.G.

Besonderheiten in der Spielwelt

Parser und Grammatik

* * *

Ich kann T.A.M. unter Windows nicht starten. Wenn ich im Explorer auf diese Programme doppelklicke, kommt nur ein DOS-Fenster und ich kann nichts weiter machen.

Der Interpreter T.A.M. muss mit einem Parameter aufgerufen werden: Er muss wissen, welches Spiel gespielt werden soll. Dazu gibt es mehrere Möglichkeiten, die bei der Starthilfe beschrieben werden.

* * *

Ich benutze Linux. Gibt es eine Version von T.A.M. und T.A.G. für Linux?

Es gibt eine Linux-Version der T.A.M.. Mit dem Emulator xdos, der z.B. der SuSe-Distribution beiliegt, laufen T.A.G. und T.A.M. aber auch unter Linux. Mehr dazu steht bei der Starthilfe.

* * *

In meinem Arbeitsverzeichnis befinden sich plötzlich Dateien mit eigenartigen Namen wie TEXTE~A.TMP. Was bedeutet das? Kann ich die Dateien löschen?

T.A.G. legt drei dieser temporären Dateien während des Kompilierens an. Sie enthalten die Texte und werden am Ende des T.A.G.-Laufs wieder gelöscht. Wenn T.A.G. vorzeitig abbricht, bleiben sie aber bestehen. Beim nächsten erfolgreichen Kompileren werden sie wieder gelöscht. Man kann sie auch von Hand löschen, ohne Schaden anzurichten.

* * *

Ich benutze beim Kompilieren die Fehlerkumulation und den pingeligen Modus. Dabei werden die Meldungen oft aus dem Bildschirm hersugescrollt, auch, wenn sie einzeilig sind. Kann ich das verhindern?

Mit der Option -l wird ein Logbuch *.log geschrieben, das den gesamten Output der T.A.G. enthält und in dem man später die Fehlermeldungen nachlesen kann.

* * *

Wenn ich ein Spiel kompilere und dann spiele, sind die Texte teilweise unvollständig. Woran liegt das?

Beim Schreiben der Texte muss man folgendes beachten:

Im Quelltext darf der signifikante Teil einer Textzeile höchstens achtzig Zeichen lang sein, was darüber hinausgeht, wird abgeschnitten. Insgesamt darf eine Zeile 255 Zeichen lang sein, und ein Text darf auch über die 80. Spalte hinausgehen, wenn er weit genug hinten auf der Zeile beginnt. Textbefehle in eckigen Klammern dürfen nicht über mehrere Zeilen gehen.

Ein weiterer Stolperstein sind Schrägstriche (/) im Text. Sie werden von T.A.M. als Escape-Zeichen interpretiert. Deshalb müssen einfache Schrägstriche immer doppelt geschrieben werden: 'Ein 08//15-Text'.

* * *

Ich erhalte beim Kompilieren die Fehlermeldung »›sonst‹ ohne ›wenn‹«. Ich habe aber ein wenn angegeben.

Hier fehlt wahrscheinlich ein dann. wenn kann nur dann eine Erweiterung mit sonst haben, wenn nach der Bedingung ein dann steht. Fehlt dieses dann, dann kann man nur eine Anweisung nach der Bedingung angeben. Die Syntax ist

wenn (Bedingung) dann
    
Anweisungen
sonst
    
andere Anweisungen
Ende

Der sonst-Teil ist optional. Die vereinfachte Schreibweise ohne dann hat die Form:

wenn (Bedingung) eine Anweisung

* * *

Ich möchte eine lokale Variable innerhalb eines Texts ausgeben lassen, aber es funktuoniert nicht. Weshalb?

Es gibt Probleme, wenn eine Variable einen Bezeichner mit nur einem Buchstaben hat, der bereits als Textbefehl eine Bedeutung hat, wie z.B. [f], [n] oder [x]. Am besten verwendet man hier einen anderen Bezeichner.

* * *

Mein Spiel benutzt kein Punktesystem. Daher habe ich die Standardantwort des Befehls »Punkte« einfach abgeändert. Dieser Text wird jedoch immer ausgegeben, wenn der Spieler stirbt oder das Spiel gewinnt, was ziemlich unpassend ist. Wie kann ich das ändern?

Bevor der Spieler gefragt wird, ob er aufhören, neu beginnen oder einen Spielstand läden will, wird immer der Befehl #punkte aufgerufen. Anstatt nur die Antwort abzuändern, muss man diesen T.A.G.-Befehl abändern:

Bef #punkte
VorAusf
    Wenn (#gestorben = 0)
        Text 'Im richtigen Leben gibt es
            keine Punkte.'
    Stop
EndeAusf

#gestorben ist eine Variable, die wähernd des Spiels den Wert Null hat. Sirbt der Spieler, ist sie gleich eins, gewinnt er, ist #gestorben zwei.

* * *

Ich habe in meinem Spiel eine Deko. Wenn man diese berührt, zerspringt sie in tausend Teile und wird aus dem Raum entfernt. Wenn ich das Spiel abspeichere und dann wieder lade, ist die Deko wieder da. Wieso?

Dekos sind per definitionem Dinge, die sich während des Spiels nicht ändern können. Sie müssen ihren Zustand, ihren Ort und ihre Attribute beibehalten.

Die Dekos werden also nicht mit abgespeichert, da sie immer ihren Anfangszustand haben. Das macht die (extern oder intern für das Rückgängigmachen) gespeicherten Spielstände klein. T.A.M. lässt es zu, Deko-Objekte zu ändern, aber sie stellt ihren tatsächlichen Zustand beim Laden nicht wieder her.

Wenn ein Objekt nur Dekoration, aber veränderlich sein soll, benutzt man am besten ein Obj mit dem Attribut fest.

* * *

Ich schreibe ein Kriminaladventure, bei dem nicht die Punktzahl und die Züge, sondern die Uhrzeit angegeben werden soll. Geht das?

T.A.G. hat einen Mechanismus für die Uhrzeit, die in den Variablen Stunden und Minuten gespeichert wird. Wenn nichts anderes angegeben wird, verstreicht nach jedem Zug eine Minute. Das kann durch Setzen der Variable Minutentakt geändert werden.

Um in der Statuszeile rechts die Uhrzeit einzublenden, muss man die Variable #rechts auf fünf setzen:

Aktion Anfang
Ausf
    sei Stunden 20
    sei Minuten 15	

   ! Ein Zug dauert fünf Minuten
    sei Minutentakt 5	

   ! Zeit in der Statuszeile
    sei #rechts 5
    ...
EndeAusf

* * *

Ich habe in Vorher einen Aufruf einer anderen Aktion eingebaut. Seitdem kann ich keinen Befehl mehr ausführen. Wieso?

Wenn NullAkt nach Aufruf von Vorher nicht Null ist, wird der Zug abgebrochen. Das geschieht normalerweise mit Stop. Wenn in Vorher eine Aktion ausgeführt wird, die mit Stop abbricht, so ist NullAkt nicht Null, obwohl das nicht offensichtlich ist. Der letzte Befehl in Vorher sollte dann explizit lösche NullAkt lauten.

* * *

Seit ich eine neue Aktion mit Sternchen eingebaut habe, sagt mir der Parser, dass er bestimmte Gegenstände, die im selben Raum sind wie ich, nicht mehr sieht. Wenn ich »Lage« eingebe, wird die Beschreibung eines anderen Raums angezeigt. Was ist passiert?

Wahrscheinlich wird in der neu hinzugefügten Aktion die Variable aRaum geändert, die den momentanen Aufenthaltsort des Spielers angibt. Das ist erlaubt, sollte aber nie von Hand gemacht werden.

Zum Ändern des Aufenthaltsorts (und damit auch von aRaum) sollte immer geheZu verwendet werden. Wenn aRaum in der Aktion nur als temporärer Platzhalter verwendet wurde, empfiehlt es sich, stattdessen eine lokale Raumvariable zu definieren.

* * *

Ich möchte, dass der Spieler zu Beginn des Spiels im Bett liegt. Wie mache ich das?

Bei der Anweisung geheZu können nicht nur Räume, sondern auch Sitze oder Liegen angegeben werden, zum Beispiel geheZu in Bett. Was allerdings nicht von geheZu berücksichtigt wird, ist die Sitzposition bSitz, die angibt, ob der Spieler sitzt, liegt oder steht. Diese Variable muss von Hand gesetzt werden, und zwar vor geheZu – diese Anweisung gibt die Raumbeschreibung aus und dort wird das Auf-dem_Bett-Liegen beschrieben.

Aktion Anfang
Ausf
    ...
    sei bSitz %liegen
    geheZu in Bett
EndeAusf

(geheZu prüft allerdings nicht, ob das Zielobjekt eine gültige Liege ist – das muss der Autor machen.)

* * *

Ich habe in meinem Spiel eine Truhe, auf die der Spieler sich setzen kann, wenn sie geschlossen ist. Wenn sie auf ist, kann man Dinge hineintun, die Truhe ist also Behälter und Sitz. Wenn ich mich auf die geschlossene Truhe setze, sehe ich die Dinge darin, kann sie aber nicht ansprechen. Aufstehen kann ich auch nicht mehr. Was ist passiert?

T.A.G. behandelt Objekte, die Behälter und Sitz (oder Liege oder Standfläche) sind wie Käfige: Wenn der Spieler sich hineinsetzt, ist er darin gefangen. Für die Truhe muss man also das Attribut Behälter anpassen:

NachAusf
    (sitzen_auf)  AttrWeg selbst Behälter
    (steigen_von) AttrHin selbst Behälter
EndeAusf

* * *

Ich möchte ein Objekt mit einem variablen Namen implementieren. Wie geht das?

Anstelle eines Namens in Hochkommas kann nach dem Wort Name ein Ausführungsblock zwischen Ausf und EndeAusf angegeben werden:

Name Ausf
    wenn (Clarissa_vorgestellt) dann
        Text 'Clarissa/'
        ObjGenus selbst f %eigenname
    sonst
        Text 'jung^ Mädchen/'
        ObjGenus selbst n
    Ende
EndeAusf

Hier kann sich sogar der Genus des Namens ändern, er kann mit ObjGenus modifiziert werden. Der Schrägstrich in den beiden Texten bewirkt, dass dem Namen kein Leerzeichen angehängt wird. Die Sonderzeichen Dach und Tilde werden wie gewohnt berücksichtigt.

Eine Ausführung kann auch für Besch, Plural, lName, Darin, Darauf, Daran, Dabei, InBesch und Text angegeben werden. Bei Namen und Beschreibungen von Räumen gilt diese Möglichkeit ebenfalls.

* * *

Ich habe eine Taschenlampe definiert, die unter anderem das Adjektiv 'batteriebetrieben' hat. Wenn ich im Spiel nun sage »untersuche die batteriebetriebene Lampe«, dann sagt T.A.M., es gäbe hier eine Ungereimtheit. Wieso?

Die Vokabeln in T.A.G. können bis zu zwölf Zeichen lang sein, alles, was darüber hinausgeht, wird abgeschnitten. Das Adjektiv heißt also tatsächlich nur 'batteriebetr'. Die T.A.M. hat nun Probleme beim Erkennen der Adjektivendungen. Bei Substantiven gibt es keine Probleme, lange Adjektive werden am besten vermieden.

* * *

Ich habe ein Objekt, das »hoher Turm« heißt. Das Adjektiv ›hoch‹ wird allerdings nicht erkannt. Wiseo?

Wenn das Adjektiv gebeugt wird, wird aus »hoch« der Stamm »hoh«: der hoh-e Turm, des hoh-en Turms, usw. Da T.A.M. diese Unregelmäßigkeiten nicht kennt (und da die Adjektiv-Vokabeln in der Regel nicht prädikativ – »Der Turm ist hoch« – verwendet werden), muss man hier diesen neuen Stamm als Adjektiv angeben.

Weitere häufige Beispiele, die häufig auftreten, sind Positionsangaben (linke, rechte, obere, untere, mittlere), die als 'link' usw. angegeben werden müssen, oder nicht gebeugte Farben (rosa, lila, orange), bei denen man am besten die Farbe als zusätzliches Substantiv angibt:

Obj rosa_Bonbon
Name 'rosa Bonbon'
Adj 'rosafarben' 'rosafarbig' 'rosan'
Subst 'rosa' n, 'bonbon' n
...

* * *

In der neuen Rechtschreibung werden Kombinationen aus Substantiven und Partizipien auseinander geschrieben, zum Beispiel »Furcht erregend«. Wie mache ich das in T.A.G.?

In T.A.G. werden pro Substantiv bis zu zwei Adjektive verstanden, dabei kann das erste auch ein Adverb, also ungebeugt, sein, wie in »grün angelaufen«. Dies kann man sich zunutze machen und das zum Partizip gehörende Substantiv einfach als Adjektiv deklarieren:

Adj 'furcht' 'erregend'

('furchterregend' würde hier allerdings Probleme machen – siehe den Punkt »

zu lange Adjektive«)

* * *

Ich habe in meinem Adventure ein Objekt namens 'Regale', die mit p als Pluralwort definiert wurden. Wenn ich etwas darauf lege, kommt die Meldung, es liege jetzt »auf den Regale«. Kann man das beheben?

T.A.G. kann Beugungen nicht selbständig vornehmen, deshalb muss man ihm sagen, wenn es Unregelmäßigkeiten gibt. Bei Plural-Substantiven, denen im Dativ ein n angefügt wird, muss man an die passende Stelle eine Tilde einfügen:

Name 'Regale~' p %einige

Dann wird korrekt »die Regale« und »auf den Regalen« ausgegeben. (Vgl. die Zwerge in den Höhlen von Karn)

* * *

Ich erhalte eine Meldung, die mir sagt, ich hätte das Maximum der Verben ausgeschöpft. Ich möchte aber nicht auf Verben verzichten. Was kann ich machen?

T.A.G. hat ein Maximum von 255 Verben. Dabei zählen Definitionen wie 'mache zu', 'mache an' und 'mache kaputt' als ein Verb, 'mache', mit drei verschiedenen Verbklammen, die als Präpositionen abgelegt werden.

T.A.G. kann gebeugte Formen der Verben verstehen. Wenn man also 'springe' definiert, werden auch die Formen »spring«, »springt« und »springen Sie« verstanden. Wenn das Limit erreicht ist, sollte man nach doppelten Definitionen wie 'springe', 'spring' suchen: Die erste Definition reicht aus. Die zweite verbraucht nur ein Verb, ohne etwas zu bewirken.

Um Verben zu sparen, kann man auch mit Synonymen arbeiten:

Synonym 'hopse' 'springe'
Synonym 'hüpfe' 'springe'

Letztlich gibt es noch die Aktion VerbParser, mit der man unbekannte Verben auf bekannte zurückführen kann:

Aktion VerbParser
Ausf
    wenn (Wort = 'hopse' 'hüpfe')
        sei aVerb 'springe'
EndeAusf

* * *

Ich möchte in einem Spiel »ich« und »du« unterscheiden. Wie geht das?

»Ich« und »du« werden nur unterschieden, wenn der Akteur nicht Null ist, wenn also eine andere Person im Spiel ausdrücklich angesprochen wird, wie in »Dolores, gib mir einen Drink.«

Wenn man »ich« und »du« auch ohne Akteur unterscheiden möchte, kann man das mit einem kleinen Trick:

Deko    Spieler
Name    'Spieler' m
Ort     BeiMir	

Aktion Verbparser
Ausf
    wenn (Akteur = 0) sei Akteur Spieler
EndeAusf	

Aktion Nachparser
Ausf
    wenn (Akteur = Spieler) sei Akteur 0
EndeAusf

»Ich« ist nun das Objekt du und »du« ist das Hilfsobjekt Spieler.