Fragen und Antworten
Diese Fragen sind irgendwann einmal von T.A.G.-Benutzern gestellt worden und werden hier kurz beantwortet:
Allgemeines
- Wie starte ich unter Windows?
- Gibt es eine Linux-Version?
- T.A.G. erstellt mysteriöse Dateien. Wieso?
- Wie kann ich Meldungen lesen, die wegscrollen?
Probleme beim Kompilieren mit T.A.G.
- Wieso erscheint Text in T.A.M. nur unvollständig?
- Wieso meckert T.A.G. »sonst ohne wenn«?
- Warum wird manchmal eine Variable nicht ausgegeben?
Besonderheiten in der Spielwelt
- Kann ich die Ausgabe der Punkte am Spielende unterdrücken?
- Wieso ist eine zerstörte Deko nach dem Laden wieder da?
- Wie kann ich verstreichende Zeit implementieren?
- Ich kann plötzlich keinen Befehl mehr ausführen. Wieso?
- Warum ändert der Spieler ab und zu ohne Grund den Raum?
- Wie kann ich den Spieler zu Beginn ins Bett legen?
- Wenn ich mich auf die Truhe setze, bin ich darin gefangen!
Parser und Grammatik
- Kann ich einen Objektnamen variabel machen?
- Wieso haben einige Adjektive »Ungereimtheiten«?
- Wieso erkennt T.A.M. einige Adjektive nicht?
- Wie implementiere ich etwas »Furcht Erregendes«?
- Warum sagt T.A.M. trotz Pluraldefinition »auf den Regale«?
- Was kann ich tun, wenn das Maximum der Verben erreicht ist?
- Wie kann ich »ich« und »du« unterscheiden
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 »
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
.