________________________________________________________________________
[<<] [Inhalt] [>>] II. Definitionen und Anweisungen

7. Erstellen der Texte

7.1.   Textblöcke
7.2.   Anweisungen im Text

7.1. Textblöcke

Neben der Möglichkeit, Ausgabetexte direkt in einem Anweisungsblock mit dem Text-Befehl anzugeben, kann man Texte auch auf gesonderten Blöcken definieren. Sie können dann mit der Angabe ihres Blocks und der Position im Block ange- sprochen werden. Dies ist noch ein Überbleibsel aus den frühen Tagen von TAG. Diese Möglichkeit wurde trotzdem nicht abgeschafft, da sie in manchen Situa- tionen nützlich ist, da man sich auf die Texte aus einem Textblock auch mit Variablen beziehen kann.

Die Texte werden am Schluß der Adventure-Datei gespeichert, genau wie die Texte der Raum- und Objektbeschreibungen und die Standardantworten.

Die Texte werden in Blöcke unterteilt. Es können bis zu 251 Textblöcke #angegeben werden. Jeder Block kann 255 Texte enthalten. Die Definition eines Textblocks sieht folgendermaßen aus:

Block Block
nr1 'Text1'
nr2 'Text2'
...
nrx 'Textx'

Hierbei sind:

BlockBlockkennziffer von 0 bis 255. Textblöcke können in beliebiger Reihenfolge definiert werden.

nrNummer des Texts. Textnummern müssen innerhalb eines Blocks in aufsteigender Reihenfolge aufgegeben werden, da sie se- quentiell abgespeichert werden. Dabei müssen die Nummern nicht unbedingt aufeinanderfolgen. Man kann z.B. Text 7 nach Text 2 definieren, die Datei wird dann mit 4 leeren Strings anstelle der Texte 3-6 aufgefüllt.

TextDer zur Nummer gehörende Text wird in einfache Anführungs- striche eingeschlossen und beginnt hinter der Nummer. Er kann über beliebig viele Zeilen gehen und außer Steuerzeichen und dem Hochkomma beliebige Zeichen enthalten.

Ein Textblock endet mit dem Beginn des nächsten Blocks (der nicht unbedingt ein Textblock sein muß). Es gibt zwei Textblöcke, die eine besondere Bedeutung haben:

Standard (Block 0)

Auf diesem Block werden die Standardantworten abgelegt, die vom Parser und den bereits definierten Befehlen verwendet werden. Wird dieser Block nicht angegeben, so werden diese Texte von der Datei TAG.STD bzw. der bei #STD angegebenen Datei gelesen. Mit Text 0 kann also der Standardtext ausgegeben werden.

Fußnoten (Block 255)

Wenn im Spiel Fußnoten benutzt werden, dann müssen sie in diesem Block abgelegt werden. Der Programmierer muß darauf achten, daß der Text zu einer Fußnote auch angegeben wird.

Diese Blöcke können mit der Notation Block x oder mit den Schlüsselwörtern Standard und Fußnoten angegeben werden.

7.2. Anweisungen im Text

Für alle Texte, egal ob gesondert in Textblöcken oder direkt im Ausführungsblock definbiert, gelten die folgenden Regeln:

  • Die Texte werden nacheinander geschrieben. Ein Text fängt dort an, wo der letzte aufgehört hat. Hört ein Text nicht mit einem Leerzeichen auf, so wird automatisch ein Leerzeichen gesetzt (außer nach einem Absatz).

  • Ein Zeilenumbruch innerhalb des Textes wird wie ein Leerzeichen betrachtet. Leerzeichen, die sich vor oder nach dem Text befinden, werden nicht beachtet. Der signifikante Bereich einer Zeile darf nicht länger als 80 Zeichen sein.

  • Ist das letzte Zeichen einer Zeile ein Schrägstrich, so wird die nächste Zeile direkt ohne Leerzeichen an die vorhergehende angefügt. Das geht auch am Ende eines Textes: Der nächste Text, der ausgegeben wird 'klebt' dann ohne trennendes Leerzeichen am vorherigen.

  • Ein doppelter Zeilenumbruch innerhalb eines Textes, d.h. eine leere Zeile zwischen zwei Textabschnitten, bewirkt einen Absatz zwischen diesen beiden Abschnitten. Dasselbe kann mit der Sequenz '[#]' im Text erreicht werden.

  • Da das Hochkomma zum Abtrennen der Strings benötigt wird, können Apostrophe durch das Prozentzeichen oder durch die Textbefehle '/"' oder '/,' ersetzt werden:

            'Thomas% Buch'                    Thomas' Buch
            '/,s ist gar schaurig.'           's ist gar schaurig.
            '"Die Parole ist /"Rot/"."'       "Die Parole ist 'Rot'."
        
  • Es gibt verschiedene Sonderbefehle, die in eckige Klammern eingeschlossen werden. Diese Befehle werden intern als Sequenzen, die mit einem Schrägstrich beginnen, gehandhabt. Einige Befehle können auch als /-Sequenz angegeben werden. Die Textbefehle sind:

    [Absatz], [#] bewirkt einen formatierten Zeilenumbruch, d.h. ein neuer Absatz beginnt. Das Format des Umbruchs kann mit dem Befehl Absatz in der Umgebungsdefinition festgelegt werden. (Dies entspricht /#)

    [/] schreibt einen Schrägstrich. (Entspricht //)

    [%] schreibt ein Prozentzeichen. (Entspricht /%)

    [,], ["] schreiben ein Apostroph. (Dies entspricht /" oder /,)

    [[, ]] schreiben die eckigen Klammern. (Entspricht /( und /) )

    [-] ist ein bedingter Trennstrich. Wenn dort umgebrochen wird, wird ein Bindestrich geschrieben, ansonsten gar nichts. (/-)

    [_], [] schreiben ein geschütztes Leerzeichen. Das bedeutet, daß an dieser Stelle nicht umgebrochen werden darf. (/_)

    [^] schreibt die Endung eines Adjektivs. Das ist nur möglich, wenn es in einem Objektnamen auftaucht, z.B., wenn der Objektname mit einer Aktion ausgegeben wird. Im Objektnamen ist es dasselbe wie ein Dach. (Entspricht /^)

    [~] schreibt 'n' oder 'en' bei Plural-Objekten im Dativ und bei maskulinen Objekten im Akkusativ und Dativ. Das ist wie bei [^] auch nur für die Objektausgabe möglich. (Entspricht /~)

    [Umbr] oder [x] bewirkt einen unformatierten Zeilenumbruch, d.h. der Cursor geht an den Anfang der nächsten Zeile, es gibt weder Leerzeile noch Einrückung. (Entspricht /x)

    [Aufz] oder [:] schreibt das Aufzählungszeichen, wie es z.B. bei der Inventarliste verwendet wird.

    [Fett] oder [f] Fettdruck ein. (Fett bedeutet, daß eine andere Farbe benutzt wird.) (/f)

    [Norm] oder [n] Fettdruck aus, die normale Textfarbe wird verwendet. (/f)

    [Tab] schreibt einen Tab, d.h. rückt zur nächsten Tabstop-Position (ganzzahliges Vielfaches der Tabulatorweite) vor.

    [TTab] schreibt einen Tab mit doppelter Tabulatorweite.

    [@]

    wird häufig in den Standard-Aussagen in TAG.STD verwendet. Es ist ein Überbleibsel aus den Zeiten von 'Das Amulett', wo komplizierte Texte in die Puffervariable Aussage geschrie- ben wurden. Dieser Befehl schreibt diesen Puffer. Er wird aber nur noch sehr selten benutzt.

    In der Datei tag.std wird die Bedeutung der Puffervariable kurz beschrieben, falls man die Datei ändern möchte.


    [: x] bewegt den Cursor in die Spalte , wenn er nicht bereits über diese Position hinaus ist.

    [+ x] bewegt den Cursor an die Stelle x, wenn er nicht schon über diese Stelle hinaus ist und setzt den Einzug am linken Rand für den momentanen Textabsatz auf x. Der Absatz wird also hängend geschrieben.

    [- x] setzt den Einzug am rechten Textrand auf x. Das heißt, es wird nun x Zeichen früher umgebrochen.

    [= x] setzt den Einzug auf beiden Rändern auf x. Dies entspricht den beiden Anweisungen [+ x] und [- x] nacheinander.

  • Die Zeichen, die nicht im 7-Bit-ASCII-Zeichensatz enthalten sind, d.h. die Zeichen mit Akzenten und Umlauten, können durch zwei andere Zeichen in eckigen Klammern ausgedrückt werden:

    [.a] Accent aigu auf a, e, i, o, u, y
    [`a] Accent grave auf a, e, i, o, u
    [^a] Zirkumflex (Dach) auf a, e, i, o, u
    ["a] Umlaut auf a, e, i, o, u, y
    [~a] Tilde auf a, n, o
    [,c] Cedille an c
    [/o] skaninavisches durchgestrichenes o
    [oa] schwedisches a mit Ring
    [ae] skandinavische ae-Ligatur
    [sz] scharfes s (Es-Zett)
    [dt] isländisches Eth
    [th] isländisches Thorn
    [my] griechisches My
    [CO] Copyright
    [RO] Registriertes Warenzeichen
    [SS] Paragraph
    [=L] Pfund Sterling
    [c/] Cent
    [xo] Währungs-Zeichen
    [xx] Multiplikationszeichen
    [oo] Grad-Zeichen
    [<], [>] französische Anführungszeichen
    [!!], [??] spanische Ausrufe- und Fragezeichen (auf dem Kopf)
    [=≫], [<=] Größergleich und Kleinergleich
    [+-] Plusminus
    [_o], [_a] spanische/italienische Ordinalzeichen
    [12], [14], [34] ein halb, ein Viertel bzw. drei Viertel
    [^1], [^2], [^3] hochgestellte Eins, Zwei bzw. Drei
    [||] gebrochener Strich

    Die Buchstaben nach den Akzenten können auch groß sein, dann wird der Ak- zent natürlich auf den Großbuchstaben gesetzt. In welcher Reihenfolge die beiden Zeichen angegeben werden, spielt keine Rolle. So sind z.B. [^e] und [e^] dasselbe, aber verschieden von [^E].

    Diese Option ist nur nützlich, wenn diese Zeichen nicht auf der Tastatur sind. Dieselben Zeichen können auch wie üblich generiert werden, da sie von TAG automatisch in den Zeichensatz nach ISO-8859-1 übertragen werden.

  • Weiterhin gibt es Befehle, die zur Ausgabe von variablen Objekten in Textstrings dienen. Auch diese Befehle stehen in eckigen Klammern:

    [dasObj Obj Fall]

    gibt das Objekt Obj mit bestimmtem Artikel im grammatikalischen Fall Fall aus. ('der Ball')

    Da dieser Befehl sehr häufig vorkommt, kann man ihn abkürzen mit den folgenden Befehlen:

    [der Obj], Fall = 0 (%Nom, Nominativ)
    [den Obj], Fall = 1 (%Akk, Akkusativ)
    [dem Obj], Fall = 2 (%Dat, Dativ)

    Der Fall wird hier aus dem Artikel bestimmt. Der Artikel muß hier männlich sein, da dies der einzige Genus ist, bei dem die Arikel für die drei Fälle verschieden sind. (Am besten man denkt dann nicht an ein 'Objekt' sondern an einen 'Gegenstand'.)


    [einObj Obj Fall]

    gibt das Objekt Obj mit unbestimmtem Artikel im Fall Fall aus ('ein Ball'). Auch hier gibt es die Abkürzungen:

    [ein Obj], [einen Obj], [einem Obj]


    [keinObj Obj Fall

    gibt das Objekt Obj verneint im Fall Fall aus ('kein Ball'). Die Abkürzungen sind:

    [kein Obj], [keinen Obj], [keinem Obj]


    [obj Obj Fall]

    gibt das Objekt Obj ohne Artikel im FallFall aus. ('Ball')


    [Obj]

    gibt das Objekt ohne Artikel im Nominativ aus.


    [es Obj Fall]

    gibt das passende Pronomen (Fürwort) für Obj im Fall Fall aus.


    [präp] oder [p]

    gibt die Präposition aus dem eingegebenen Befehl aus.


    [ist Obj]

    gibt das Verb 'sein' an das Objekt Obj angepaßt aus, d.h. gibt 'ist' aus, wenn Obj im Singular ist, und 'sind', wenn Obj im Plural steht. Dies dient dazu, Aussagen wie 'Die Zwerge ist müde.' zu umgehen.


    [hat Obj]

    gibt das Verb 'haben' an Obj angepaßt aus, d.h. je nachdem, ob Obj im Singular oder Plural steht, wird 'hat' oder 'haben' ausgegeben.


    [wird Obj]

    gibt das Verb 'werden' an Obj angepaßt aus, d.h. je nachdem, ob Obj im Singular oder Plural steht, wird 'wird' oder 'werden' ausgegeben.


    [t Obj]

    gibt die Endung eines schwachen Verbs an Obj ange- paßt aus, d.h. 't' oder 'en'. Für die meisten Verben gilt diese Beugung. Zum Beispiel gibt 'komm[t Obj]' je nach Anzahl 'kommt' oder 'kommen'.


    [sing/plur Obj]

    gibt das komplette gebeugte Verb an. Steht das Objekt in der Einzahl, so wird sing ausgegeben, andernfalls plur, z.B. '[muß/müssen xObj]'. Die gesamteSequenz muß dabei in einer Zeile stehen!

    Diese Option kann auch für verschiedene Zeiten benutzt werden, z.B. '[ging/gingen xObj]'.


    [liste Fall]

    gibt die zuvor mit 'ObjListe' erstellte Liste im Fall Fall aus. Für den Nominativ, d.h. den Fall 0, kann dann das Verb mit der Objektangabe 0 benutzt werden: 'Hier [ist 0] [liste 0].'


    [sitz]

    Gibt abhängig von bSitz den Stamm des passenden Ruheverbs aus: 'sitz', 'steh' oder 'lieg'. Es wird nur der Stamm ausgegeben, damit das Verb angepaßt werden kann, wenn der Spieler in verschiedenen Per- sonen agesprochen wird. Zum Beispiel: 'Ich [sitz]e...', 'Du [sitz]st...' oder 'Sie [sitz]en...' (Die 'zs'- Kombination wird dabei erkannt und in ein 's' umge- wandelt.)


    [setz]

    Gibt abhängig von bSitz den Stamm des passenden Bewegungsverbs aus: 'setz', 'stell' oder 'leg'. So können auch allgemeine Satzkombinationen wie 'Ich habe mich hinge[setz]t.' verwirklicht werden. (Zum Glück sind es schwache Verben.)


    [in]

    Befindet sich der Spieler in einem InObjekt, so wird 'in' ausgegeben, ansonsten 'auf'.

    Die letzten drei Befehle funktionieren natürlich nur, wenn der Spieler auf einem anderen Objekt sitzt, steht oder liegt. Das sollte vom Programmierer zuerst überprüft werden. Sie werden auch häufig bei den Standardantworten benutzt.


    [Flg]

    gibt den Zahlenwert einer Flagge aus.


    [num Flg]

    gibt den Zahlenwert einer Flagge aus, aber benutzt (kardinale) Zahlwörter für die Zahlen bis hundert.


    [ord Flg]

    gibt den Zahlenwert einer Flagge aus, aber benutzt ordinale Zahlwörter (erste, zweite, ...) für die Zahlen bis hundert und schreibt sonst einen Punkt hinter die Zahl (145.).


    [rom Flg]

    gibt den Zahlenwert einer Flagge als römische Zahl aus. Achtung! Die Zahl kann nur im Bereich von 1 bis 3999 liegen.


    [Buchst Flg]

    gibt den Buchstaben aus, der im Alphabet an der Stelle Flg steht. Ist Flg kleiner als 1 oder größer als 26, so wird ein Fragezeichen ausgegeben.


    []

    gibt den Zustand aus (wenn er angegeben wurde).


    [Zust Obj]

    gibt den Zustand des Objekts als Satz aus, wenn der Zustand einen Namen hat ('Sie ist offen.'). Ansonsten wird nichts ausgegeben.


    []

    gibt den Namen des Befehls aus.


    [Befsatz]

    gibt den aktuellen Befehlssatz aus, wie er vom Parser erkannt wurde, z.B. 'den Zwerg mit dem Hämmerchen erschlagen.' oder 'nach Süden gehen.'


    [Zeit]

    gibt die Uhrzeit im Spiel (Stunden:Minuten) aus.


    [Strg]

    gibt den String Strg aus. Dieser String kann natür- lich wieder Textbefehle in eckigen Klammern enthalten. Man sollte nur aufpassen, daß sich ein String nicht selbst 'aufruft'.


    [Text Bl Nr]

    gibt den Text Nr aus dem Textblock Bl aus. Auch hier sollte aufgepaßt werden, daß der Text sich nicht selbst aufruft.


    []

    setzt die Fußnote . ist dabei die in- terne Nummer, extern werden die Fußnoten nach der Reihenfolge ihres Auftretens numeriert. Die externe Fußnotennummer erscheint dann in der Form [x] im Text. Mit der Eingabe 'FUSSNOTE x' oder 'FN x' kann der Spieler dann die Fußnote lesen. Der Fußnotentext ist der Text mit der Nummer im Block 255. Es sollte sichergestellt sein, daß es ihn gibt. Es können die Fußnoten 1 bis 255 definiert werden.


    []

    ruft die Aktion auf, die der Textausgabe dienen soll. (Mit diesem Befehl kann man reine Textgrößen wie z.B. Raum- und Objektbeschreibungen und -namen variabel machen.)


    Die Argumente der Textbefehle sind:

    Obj

    ist ein Objekt oder ein Platzhalter für ein Objekt. Die Objektangabe kann auch weggelassen werden, dann wird das Objekt aus dem letzten Textbefehl benutzt. So sind etwa

        '[Der aObj] [ist aObj] dagegen und [er aObj]
        streik[t aObj].'
                    

    und

        '[Der aObj] [ist] dagegen und [er] streik[t].'
                    

    gleichwertig, wobei die zweite Variante besser zu lesen ist. Vorsicht bei Sätzen, die nicht mit einem Subjekt anfangen! Dort muß die Objektangabe beim Verb stehen:

        'Langsam [wird aObj] [der] von den Flammen
        verzehrt.'
                    
    Fall   

    kann folgende Werte annehmen:

    0, %Nom    Nominativ (1. Fall)
    1, %Akk    Akkusativ (4. Fall)
    2, %Dat    Dativ (3. Fall)

    Es empfiehlt sich, die Abkürzungen mit impliziter Fallerkennung zu benutzen.

    Wenn der erste Buchstabe eines Textbefehls zur Textausgabe ein Großbuchstabe ist, so wird die auszugebende Zeichenkette mit einem großen Buchstaben am Anfang ausgegeben, ansonsten bleibt der String unverändert. Mit dieser Ausnahme können Textbefehle - genau wie die anderen Anweisungen in TAG - in Groß- oder Kleinbuchstaben angegeben werden. So sind

    [der aObj] und [Der aObj]

    verschieden,

    [DER AOBJ], [Der aObj] und [ Der aObj ]

    aber nicht. (Es gilt das erste signifikante Zeichen.)

    Mit dieser Ausnahme können Textbefehle - genau wie die sonstigen Anweisungen in TAG - in Groß- oder Kleinbuchstaben angegeben werden.

Wenn die TAG-Datei erstellt ist, könnt Ihr Euch diese Datei ja einmal im Editor ansehen. Es erscheinen lauter eigenartige Zeichen. Um zu vermeiden, daß irgendwelche Leute die Texte lesen, bevor sie das Spiel spielen und so Hinweise auf die Lösung der Rätsel bekommen, habe ich die Texte chiffriert. Der Code ist simpel, aber erfüllt hoffentlich seinen Zweck.

Martin Oehm, 04.02.2000 Vorheriges KapitelInhaltsverzeichnisNächstes Kapitel