6 Variablen
6.1 Vorhandene Variablen
Variablen sind Merker für Werte. In T.A.G. können Variablen auch Merker für Objekte, Räume und Befehle sein. Einige Variablen haben wir schon kennengelernt, nämlich die Inventar-Daten und aRaum
. Es gibt aber noch weitere Variablen, die bereits vordefiniert sind.
Die wichtigsten sind wahrscheinlich die Objektvariablen. Die Variablen aObj
und aObj2
stehen für die Objekte, die im Befehl des Spielers erwähnt werden. Manche Befehle verlangen kein Objekt, und oft ist aObj2
Null, d.h. nicht vorhanden. (Es gibt auch noch ein aObj3
, aber es wird so gut wie nie verwendet.)
Die wichtigste Raumvariable ist aRaum
, die immer angibt, wo sich der Spieler befindet. Ihr sollte nie explizit ein Wert zugwiesen werden, sondern sie sollte mit GeheZu
automatisch angepasst werden.
Zwei weitere Flaggen, Minuten
und Stunden
, geben die Zeit im Spiel an. Jeder Zug dauert eine Minute, und es wird still mitgezählt. Die meisten Adventures benutzen keine Zeitangeben, dies wird aber manchmal in Krimi-Adventures verwendet.
Die meisten Variablen stehen nur für Zahlen, in T.A.G. können dies die Zahlen von 0 bis 255 sein. Diese Variablen heißen in T.A.G. (nicht ganz korrekt) Flaggen. Eine Flagge kann normalerweise nur zwei Zustände annehmen, nämlich gesetzt und nach gesetzt. In T.A.G. gilt eine Flagge als gesetzt, wenn ihr Wert größer als Null ist. Bereits benutzte Flaggen sind die bereits erwähnten maxInv
, maxGew
, maxVol
, Inv
, InvGew
und InvVol
.
Ein weiterer Integer, Nummer
, wird verwendet, wenn in der Angabe des Spielersanstelle eines Objekts eine Zahl angegeben wird, wie z.B. in »Wähle 112 auf Telefon«. aObj
wäre in diesem Fall ein besonderes Objekt mit dem Namen Zahl
.
Manchmal muss man negative Zahlen oder Zahlen, die größer sind als 255, speichern. Dazu gibt es ein besonderes Zahlenformat, Integer. Integer-Zahlen können Werte von −2 Mrd. bis 2 Mrd. annehmen. Bereits definierte Integerwerte sind Züge
, in dem angegeben wird, wieviele Züge der Spieler bereits gemacht hat, und Pktzahl
, ein Integer, der nur gelesen werden kann, und der die Gesamtpunktzahl des Spielers enthält (s. Kap. 10.2).
6.2 Variablen definieren und ändern
Man kann sich natürlich weitere Variablen definieren. Dazu muss außerhalb eines Definitionsblocks eine der Anweisungen
ObjVar
[ID] [Anfangswert]
RaumVar
[ID] [Anfangswert]
Flagge
[ID] [Anfangswert]
Integer
[ID] [Anfangswert]
stehen. Die ID muss natürlich, wie immer, eindeutig sein. Der Anfangswert kann weggelassen werden, dann ist er automatisch Null (bzw. kein Raum oder kein Objekt, was auch mit Null gekennzeichnet wird).
Wie der Name schon sagt, sind Variablen genau das, nämlich variabel. Man kann eine Variable z.B. auf einen bestimmten Wert ändern, indem man in einem Ausführungsblock die Anweisung
sei
[Variable] [Wert]
benutzt. Wert kann hier ebenfalls eine Variable sein, dann haben die Variablen den selben Wert, nämlich den der zweiten Variable. Man muss nur aufpassen, dass man hier nicht Äpfel mit Birnen verwechselt: Objektvariablen können nur Werte haben, die ein Objekt sind. Raumvariablen können nur Räume speichern, und Flaggen und Integer nur Zahlen. Alle Variablentypen können jedoch den Wert 0 annehmen.
Es gibt einige weitere Anweisungen, die eine Variable relativ zu ihrem jetzigen Wert ändern:
inkr
[Variable] [Wert]Erhöhung um [Wert]
dekr
[Variable] [Wert]Erniedrigung um [Wert]
mult
[Variable] [Wert]Multiplikation mit [Wert]
div
[Variable] [Wert]Division durch [Wert]
mod
[Variable] [Wert]Rest der Division durch [Wert]
Diese braucht man nicht so häufig, außer inkr
und dekr
vielleicht. Bei inkr
und dekr
kann man den Wert auch weglassen, er ist dann eins.
Wenn man Flaggen nur als Schalter benutzt, kann man auch folgende Abkürzungen benutzen:
setze
[Flagge]gibt der Flagge den Wert 1
lösche
[Flagge]gibt der Flagge den Wert 0
Natürlich kann man Variablen auch vergleichen. Dazu gibt es die Bedingung
(
[Variable] =
[Wert])
die dann erfüllt ist, wenn der Wert der Variable und der abgegebene Wert gleich sind. Wert kann auch hier eine andere Variable sein, aber man muss wieder aufpassen, dass man nicht »Äpfel mit Birnen vergleicht«.
Für Zahlenwerte gibt es auch die beiden Bedingungen (x < y)
und (x > y)
, die prüfen, ob x
kleiner oder größer als y
ist. Diese Bedingung kann man auch für Objekte und Räume verwenden, auch wenn sie keinen großen Sinn macht: Sie vergleicht dann ob Objekt/Raum x
vor Objekt/Raum y
definiert wurde, was aber im allgemeinen egal ist.
- Aufgabe 18 *
Erweitere die Vase so, dass man sie nirgendwo abstellen kann, außer auf dem Tisch.
T.A.G. bietet außerdem die Möglichkeit, Variablen »zufällig« zu belegen. Um zum Beispiel den Wurf eines Würfels zu simulieren, kann man
Zufall Augen 1 6
benutzen, was die Variable Augen
mit einem Wert von eins bis sechs inklusive belegt. Jeder der sechs möglichen Werte ist gleich wahrscheinlich. Eine Variante der Zufall
-Anweisung ist, anstatt einen Start- und Endwert eine Liste der möglichen Werte in Klammern anzugeben:
Zufall xObj (Messer Gabel Schere)
Auch hier treten alle möglichen Werte mit der gleichen Wahrscheinlichkeit auf.
6.3 Sachverhalte merken mit Variablen
Dazu ein Anwendungsbeispiel: Wir erzeugen jetzt einen Safe, der ein Rädchen hat, das immer auf eine Nummer von 0 bis 99 gestellt ist:
Flagge code 66
Obj Safe
Name 'Safe' m
vor 'stahl' 'geld' 'panzer'
subst 'safe' m 'tresor' m 'schrank' m
Ort Keller
Zust abgeschlossen
Attr immobil Behälter
Besch 'Der Safe ist sehr stabil und hat ein
kleines Rädchen an der Tür, das momentan
auf [code] gestellt ist.'
Erst 'Ein schwach metallisch schimmernder
Panzerschrank steht in einer Ecke des
Kellers.'
Obj Rädchen
Name 'Rädchen am Safe' n
vor 'stell'
subst 'rad' n 'rädchen' n
Ort an Safe
Attr Fest
Besch 'Das Stellrädchen ist momentan auf
[code] eingestellt.'
So, wir haben eine Variable code
definiert, die die Position des Stellrädchens angibt. Im Moment ist sie immer 66. Das wird auch mit [code]
ausgegeben, wenn man den Safe oder das Rädchen untersucht. Das soll sich ändern:
Obj Rädchen
...
VorAusf
(drehen)
Bed (Safe abgeschlossen)
'Wieso? Der Safe ist bereits auf.'
Zufall code 0 99
Stop 'Du drehst das Rädchen auf [code].'
EndeAusf
Aktion *
Ausf
Wenn (code = 23) und (Safe abgeschlossen) dann
Text '[#]Vom Safe hörst du ein leises
"Klick!"'
ObjZust Safe geschlossen
Ende
EndeAusf
So, nun gibt es eine Möglichkeit, das Rad zu verdrehen. Allerdings nur zufällig. Immerhin wird jetzt mit [code]
der momentan eingestellte Code ausgegeben. Diese Eigenschaft des Rädchens merken wir uns mit der Flagge code
.
In einer Aktion, die nach jedem Zug ausgeführt wird, wird nun gecheckt, ob der Code 23 ist und der Safe noch zu ist. Dann nämlich soll der Safe sich mit einem »Klick« entriegeln. Das hätte man natürlich auch direkt in die VorAusf
packen können. Aber im nächsten Kapitel wollen wir noch eine andere Möglichkeit, das Rädchen zu verstellen, vorstellen, da ist diese Vorgehensweise wahrscheinlich besser.
Übrigens: Aktionen, die mit einem Sternchen definiert werden, d.h., die in jedem Zug ausgeführt werden, benötigen keine ID.
6.4 Zeitabhängige Eregnisse
Man kann Variablen auch dazu benutzen, um zeitabhängige Ereignisse zu beschreiben. Nehmen wir dazu einmal an, unsere Taschenlampe hätte nur eine Brenndauer von 100 Zügen. Diese Brenndauer wird in der Variable Brenndauer
gespeichert. Also:
Obj Lampe
...
VorAusf
(anmachen)
Bed (Brenndauer > 0)
'Du schaltest die Lampe ein, aber die
Batterien sind leer, und so machst du sie
wieder aus.'
(öffnen)
Stop 'Wozu? Die Batterien tun es noch, und es
gibt nichts, wozu man sie sonst gebrauchen
könnte.'
EndeAusf
Damit haben wir verhindert, dass der Spieler die Lampe einschaltet, wenn die Batterien leer sind. Nun müssen wir nur noch dafür sorgen, dass die Lampe in jedem Zug ihre Batterie etwas entlädt. Dazu kann man eine Aktion mit einem Sternchen definieren. Das Sternchen heißt »Führe diese Aktion nach jedem Zug aus, und zwar unabhängig davon, ob der Befehl ausgeführt wurde«. Das heißt, wenn der Spieler versucht, das Haus zu nehmen oder den Tisch zu essen, verliert die Lampe ebenfalls Leuchtkraft.
Man kann mehrere Bedingungen desselben Typs zu einer abkürzen. So bedeutet (x = 1 3 5)
dasselbe wie (x = 1)
oder (x = 3)
oder (x = 5)
.
Bei verneinten Bedinungen wird mit und
verknüpft: /(aObj fest immobil)
heißt /(aObj fest)
und /(aObj immobil)
.
Also definieren wir die Aktion:
Aktion Batterieverbrauch *
Ausf
Wenn (Lampe ein) dann
Dekr Brenndauer
wenn (Brenndauer = 1 2 3 5 10)
Text 'Die Lampe wird zunehmend
schwächer.'
wenn (Brenndauer = 0) dann
Text 'Mit einem letzen Flackern gibt
die Taschenlampe endgültig ihren
Geist auf.'
ObjZust Lampe aus
Ende
Ende
EndeAusf
6.5 Textbefehle
Nun wird unser Adventure immer variabler, und das bringt es mit sich, dass die Ausgabe der Texte darauf angepasst wird. Wir haben die sogenannten Textbefehle einmal ganz kurz kennengelernt. Nun wollen wir sie uns einmal genauer anschauen.
Textbefehle sind Sequenzen, die innerhalb eines Ausgabetextes in eckigen Klammern stehen. [x]
, [#]
, [f]
und [n]
kennen wir bereits.
Am häufigsten verwendet werden wohl die Befehle zur Ausgabe von Objekten:
T.A.G. verzichtet auf den Genitiv, da er komplizierte Regeln zur Bildung benötigt, und gibt sich mit der korrekten Ausgabe von Dativ und Akkusativ zufrieden, die sowieso häufiger vorkommen.
[der
[Objekt]]
[den
[Objekt]]
[dem
[Objekt]]
Ausgabe mit bestimmtem Artikel. Der Fall wird durch
der
,den
unddem
bereits festgelegt. Das ist auch der Grund, warum es hier »der« und nicht »das« Objekt heißt: nur für das Maskulinum sind die drei Artikel verschieden.[ein
[Objekt]]
[einen
[Objekt]]
[einem
[Objekt]]
Ausgabe mit unbestimmtem Artikel. Namen im Plural haben keinen unbestimmten Artikel.
[kein
[Objekt]]
[keinen
[Objekt]]
[keinem
[Objekt]]
Ausgabe als Verneinung.
[
[Objekt]]
Ausgabe des Objekts im Nominativ und ohne Artikel.
Damit kann man nun Sätze ausgeben, wie
Text '[Der aObj] verschwindet hinter [dem aObj2].'
und T.A.M. setzt dann die passenden Objekte ein:
Der schokoladenbraune Teddybär verschwindet hinter der Bettdecke.
Etwas unschön ist es allerdings, wenn bei solchen allgemeinen Antworten Objekte eingesetzt werden, die im Plural stehen, und die im Nominativ (»der«) ausgegeben werden sollen:
Die sechs Murmeln verschwindet hinter der Mauer.
So etwas hätte unser Deutschlehrer gar nicht gern gesehen, deshalb gibt es auch Textbefehle zur Ausgabe von Verben:
[ist
[Objekt]]
ist »ist«, wenn Objekt im Singular ist, ansonsten »sind«.
[hat
[Objekt]]
gibt »hat« oder »haben« aus.
[wird
[Objekt]]
gibt »wird« oder »werden« aus.
[t
[Objekt]]
gibt »(e)t« oder »en« aus. Dies ist die Endung für schwache Verben.
[
[xxx]/
[yyy] [Objekt]]
Gibt [xxx] im Singular und [yyy] im Plural aus. Dies kann für unregelmäßige Verben benutzt werden:
[gibt/geben aObj]
.
Nun ist es etwas unschön, auch bei der Endung das Objekt angeben zu müssen. Daher gilt als Vereinfachung: Wenn das Objekt fehlt, wird das aus dem vorherigen Befehl eingesetzt.
Damit ändern wir den Text
Text '[Der aObj] verschwinde[t] hinter [dem aObj2].'
und erhalten immer einen korrekt konjugierten Satz. Etwas Aufwand vielleicht, aber bestimmt die Sache wert. Außerdem habe ich versucht, die Befehle so zu halten, dass der Satz nicht zerrissen wird. Denkt man sich im Satz oben die Klammern weg, bleibt ein ganz normaler Satz über.
Weitere wichtige Textbefehle sind:
[
[Flagge]]
gibt den Zahlenwert der Flagge aus.
[num
[Flagge]]
gibt den Zahlenwert der Flagge aus, aber benutzt Zahlwörter für die Zahlen bis hundert.
[
[Zeit]]
gibt die Uhrzeit im Spiel im Format hh:mm aus.
[
[Aktion]]
ruft die Aktion aus dem Text heraus auf.
Es gibt eine weitere Art von Textbefehlen, die aus zwei Zeichen in eckigen Klammern bestehen, und die Sonderzeichen darstellen. [ss]
ist das deutsche scharfe s, [^e]
ein e mit Zirkumflex, [a"]
ein ä, [<<]
spitze Anführungszeichen links usw. Diese Textbefehle sind nur dann nützlich, wenn man die passenden Zeichen nicht auf seiner Tastatur hat, denn anstatt [a"]
kann selbstverständlich auch einfach »ä« geschrieben werden. (Mehr dazu im Handbuch)
Ist der erste Buchstabe in der Klammer groß, so ist auch der erste Buchstabe der Ausgabe des Textbefehls groß. [Der aObj]
und [der aObj]
sind also verschieden. Bei allen weiteren Buchstaben ist, wie allgemein bei T.A.G., die Groß- und Kleinschreibung egal.
6.6 Schleifen
Eine weitere wichtige Steuerstruktur sind Schleifen. Dabei werden bestimmte Ausführungen öfters wiederholt. Wie oft, das wird im allgemeinen mit einer Bedingung festgelegt. Die einfachsten Schleifen sind:
solange (
[Bedingung])
[Anweisungen]
Ende
wiederhole
[Anweisungen]
bis (
[Bedingung])
Bei Schleifen ist ein wenig Vorsicht geboten: Wenn die Bedingung immer wahr ist, wird die Anweisung immer wiederholt. Man nennt dies eine Endlos-Schleife. Ein Beispiel wäre:
solange (1 < 5)
Text '*'
Ende
Diese Schleifen sind sehr ähnlich. Die Anweisung wird sooft wiederholt, bis die Bedingung wahr ist. Dabei muss natürlich in den Anweisungen etwas passieren, damit die Bedingung irgendwann wahr werden kann. Der Unterschied zwischen den beiden Schleifen ist, dass die Ausführung bei wiederhole
-bis
mindestens einmal abgearbeitet wird, bei solange
nicht. (Wenn die Bedingung zu Beginn falsch ist, wird der Anweisungsblock bei solange
direkt übersprungen.)
Weitere Schleifen lassen eine Variable von einem Anfangs- zu einem Endwert laufen:
Schleife
[Variable] [Anfang] [Ende]
[Anweisungen]
Ende
Diese Schleifen heißen in den meisten Programmiersprachen for
-Schleife. Sie sind ein einfaches Hochzählen einer Variable:
Schleife x 1 10
Text '[num x]...[x]'
Ende
Anstatt einer Flagge kann eine Schleife auch eine Objekt- oder Raumvariable sein. Dann werden alle Objekte oder Räume abgearbeitet, [Anfang] und [Ende] müssen nicht angegeben werden:
Sei x 0
Schleife xObj
Inkr x
Ende
Text 'Es gibt [x] Objekte in diesem Adventure.'
Eine nützliche Sache ist das Verbinden einer Schleife mit einer Bedingung, die an die Variable in runden Klammern angehängt wird:
Sei x 0
Schleife xRaum (xRaum dunkel)
Inkr x
Ende
Text 'Es gibt [num x] dunkle Räume in diesem
Adventure.'
Im siebten Kapitel wird erklärt, wie man eigene Befehle definieren kann und wie man bestehende Befehle erweitert.
Zusammenfassung
Variablen sind Merker für bestimmte Sachverhalte. Variablen in T.A.G. sind global, d.h. der Wert einer Variable ist von überall aus abrufbar.
Es gibt Variablen für Zahlen, Objekte, Räume, Zustände, Richtungen und Befehle, also quasi zu jedem Element von T.A.G..
Mit den Anweisungen
sei
,inkr
,dekr
usw. kann der Wert einer Variable verändert werden.Aktionen, die mit einem Sternchen
*
definiert werden, werden nach jedem Zug ausgeführt.Zur flexiblen Ausgabe von Variablen und Objekten stehen in T.A.G. eine Reihe von Textbefehlen zur Verfügung.
Verweise
- Handbuch, Kapitel 4.2: Flaggen und Variablen
- Handbuch, Kapitel 5.1.2: Variablenzuweisungen
- Handbuch, Kapitel 6.2: Ablauf eines Zuges
- Handbuch, Kapitel 7.2: Anweisungen im Text
- Variablendefinitionen in
karn.adv