Inform: Quelltext

So sieht der Quelltext des kleinen Jade-Adventures in Inform aus. Wenn man mit der Maus über die rot markierten Details fährt, oder sich mit der Tabulatortaste durch den Quelltext bewegt, werden nährere Informationen angezeigt.

Alles, was auf einer Zeile nach einem Ausrufezeichen steht, ist ein Kommentar und wird von Inform ignoriert.

Mit der Direktive Constant wird eine Konstante definiert, die ein Zahlenwert oder ein String sein kann.

Die Konstante Story definiert einen Namen für das Spiel, der dann zu Beginn des Spiels ausgegeben wird.

Die Textkonstante Headline muss definiert werden. Sie enthält informationen über den Autor und Copyright und wird im Spielbanner angezeigt.

Texte, die ausgegeben werden sollen, stehen in Inform in Gänsefüßchen, doppelten Anführungsstrichen. Sie können über mehrere Zeilen gehen.

Ein Dach in einem Text bewirkt einen Zeilenumbruch an dieser Stelle.

Die Release ist die laufende Nummer der Veröffentlichung, die eins ist, wenn diese Zeile weggelassen wird.

Die Seriennummer ist ein String, der das Veröffentlichungsdatum im Format Jahr-Monat-Tag enthält.

Mit Include können andere Dateien eingebunden werden. Der Quelltext wird dann so behandelt, als stünde der Inhalt diese Datei an dieser Stelle.

Die Datei Parser aus der Inform-Bibliothek enthält den Parser, der die Eingabe des Spielers analysiert.

Die Datei VerbLib enthält die in der Bibliothek definierten Befehle.

Inform liest den Quelltext nach syntaktischen Zeilen ein. Syntaktische Zeilen werden mit einem Semikolon beendet.

Routinen beginnen und enden mit eckigen Klammern. Die erste Zeile der Routine ist ihr Bezeichner, eventuell gefolgt von lokalen Variablen. Dann folgen Anweisungen.

Initialise ist ein *Entry Point*, eine Routine, die von der Bibliothek aufgerufen wird. Initialise wird zu Beginn des Spiels aufgerufen, meist, um einen Begrüßungstext auszugeben und den Ort des Spielers festzulegen.

location ist eine globale Variable aus der Bibliothek, die den Aufenthaltsort des Spielers angibt.

In Inform können Variablen mit = Werte zugewiesen werden.

Die Anweisung print gibt den nachfolgenden Text aus.

Mit der Direktive Object wird ein Objekt definiert. Räume, Gegenstände (und andere Konzepte) werden in Inform durch Objekten dargestellt.

Dies ist der Bezeichner, mit dem andere Objekte sich auf dieses Objekt beziehen können. Bezeichner in Inform beachten Groß- und Kleinschreibung nicht und können Buchstaben, Ziffern und den Unterstrich, aber keine Umlaute enthalten.

Der Name des Objekts wird direkt im Kopf der Objektdefinition als Text angegeben.

Nach with können zu jedem Objekt Eigenschaften definiert werden in der Form *Eigenschaft* *Werteliste*.

cant_go ist ein Text, der ausgegeben wird, wenn es in diese Richtung keinen Ausgang gibt.

Die Eigenschaft n_to gibt an, was passiert, wenn man nach Norden geht. In diesem Fall gelangt man zu Im_Schrein. Analog zu n_to gibt es für jede Richtung eine ähnliche Eigenschaft.

Eigenschaften können auch Routinen sein. In diesem Fall steht die eckige Klammer nach dem Namen der Eigenschaft, die erste Zeile der Routine enthält nur die lokalen Variablen.

Mit if können Anweisungen bedingt ausgeführt werden. Die Bedingung folgt dem Wort if in runden Klammern.

Mit in und notin kann man prüfen, ob ein Objekt ein anderes enthält oder nicht. Hier wird geprüft, ob der Spieler die Jadestatue bei sich hat.

Ein Text ohne vorangehende Anweisung bedeutet: Gib den Text mit anschließendem Zeilenumbruch aus, dann beende die Routine mit dem Ergebnis true, d.h. eins. Dies ist äquivalent zu:

print "Nicht ohne ...";
rtrue;

deadflag ist eine globale Variable, die während des Spiels den Wert Null hat. Wird sie auf Eins gesetzt, stirbt der Spieler. Ist sie Zwei, so hat er gewonnen.

Die description ist bei Räumen der Text, der in der Raumbeschreibung vor der Liste der Gegenstände im Raum ausgegeben wird.

Nach dem Schlüsselwort has kann eine Liste von Attributen für das Objekt angegeben werden. Die Attribute werden nicht mit einem Komma voneinander getrennt.

Das Attribut light macht den Raum hell, so dass man hier keine Lichtquelle benötigt.

Die Definition eines Objekts muss mit einem Semikolon abgeschlossen werden. Die Definitionen von Eigenschaften werden dagegen nur von einem Komma begrenzt.

Mit Pfeilen -> kann man die Hierarchie von Objekten festlegen. Ein Objekt mit einem Pfeil befindet sich im zuletzt ohne Pfeil definierten Objekt. Das heißt der Stein ist auf der Lichtung.

Für die offizielle deutsche Bibliothek muss zu jedem Objekt, dessen Name gebeugt ausgegeben wird, dekl definiert werden. Es gibt zehn verschiedene Deklinationstypen, die der Autor aus einer beiliegenden Tabelle auswählen muss. (Raumnamen werden nie gebeugt.)

Mit adj definierte Adjektive werden bei der Ausgabe passend gebeugt vor den Namen gesetzt. Der Stein heißt also »faustgroßer Stein&laqio;

Die Vokabeln für den Parser werden in Inform mit der Eigenschaft name festgelegt. Es wird nicht zwischen Adjektiven und Substantiven unterschieden. Adjektive werden ungebeugt angegeben.

Vokabeln für den Parser stehen in Inform in Hochkommas und müssen wie im Kreuzworträtsel angegeben werden: ss statt ß, ae statt ä usw.

Bei Objekten wird die description ausgegeben, wenn der Spieler es untersucht.

Objekte, die noch nicht bewegt worden sind, können mit initial in der Raumbeschreibung eine eigene Zeile bekommen.

Um die Objekte richtig deklinieren zu können, muss jedes Objekt eine Angabe zum Genus haben. dazu besitzt jedes Objekt eines der Attribute male, female, neuter oder pluralname. (Räume benötigen diese Angabe nicht.)

Mit der Eigenschaft before, die fast immer eine Routine ist, kann man das übliche Verhalten eines Befehls abfangen, indem man true zurückgibt.

Alles, was nach einem Doppelpunkt steht, wird nur für die Befehle vor dem Doppelpunkt ausgeführt, in diesem Fall, wenn der Spieler den Befehl "betritt Schrein", also Enter eingegeben hat.

Mit doppelten spitzen Klammern kann man einen Befehl umlenken. Hier wird »betritt den Schrein« behandelt wie »gehe nach Norden«.

Das Attribut scenery kennzeichnet Objekte, die sich nicht verändern. Sie können nicht mitgenommen werden.

n_obj ist ein Objekt und verschieden von der Eigenschaft n_to. Wenn der Spieler eingibt raquo;gehe nach Norden« ist noun gleich n_obj.

Ein supporter ist ein Objekt, auf dem andere abgelegt werden können.

Das Attribut static kennzeichnet ein Objekt als unbeweglich.

Mit concealed unterdrückt man die Ausgabe des Objekts in der Liste der Gegenstände. Die Säule wurde ja bereits in der Raumbeschreibung erwähnt.

Mit Pfeilen -> kann man die Hierarchie von Objekten festlegen. Ein Objekt mit zwei Pfeilen befindet sich im zuletzt mit einem Pfeil definierten Objekt. Das heißt die Statue steht auf der Säule, die ein supporter, also eine Ablagefläche ist.

self ist eine Variable, die das gerade betrachtete Objekt meint.

Mit && (und) und || (oder) können Bedingungen logisch verknüpft werden.

Eine doppelte Tilde ~~ verneint die nachfolgende Bedingung.

~~(a in b) und a notin b sind äquivalent.

Die Datei GermanG der deutschen Bibliothek enthält die Definition der möglichen Befehlssätze. Sie muss zum Schluss eingebunden werden, vor eventuellen eigenen grammatischen Definitionen.

In der deutschen Lib dürfen Vokabeln keine Umlaute haben, sie müssen mit ae, oe und ue, das Eszett mit ss umschrieben werden.

!==========================================================
!    Die Jadestatue
!    Eine interaktives Exempel, Martin Oehm, 15.02.2003
!
!    Die Inform-Version des Jadestatuen-Beispiels.
!==========================================================

Constant Story "DIE JADESTATUE";
Constant Headline "^^Ein interaktives Exempel^
             Copyright (c) 2003 Martin Oehm^^";

Release 1;
Serial "030215";

Include "Parser";
Include "VerbLib";

[ Initialise;
    location = Lichtung;
    print "Endlich! Nach tagelangem Suchen im Dschungel
        stößt du auf eine Lichtung. Und auf etwas mehr.
        Vielleicht ist dies der Ort, an dem sich die
        Jadestatue befindet?^^";
];

Object Lichtung "Lichtung im Dschungel"
   with cant_go "Dort ist der Dschungel zu dicht, es gibt
            keinen Pfad in diese Richtung.",
        n_to Im_Schrein,
        in_to Im_Schrein,
        s_to [;
            if (Jadestatue notin player)
                "Nicht ohne die Statue!";
            deadflag = 2;
            "Du schaffst es, mit der Statue wieder zurück
                in die Zivilisation zu gelangen.";
        ],
        description "Du stehst auf einer Lichtung im
            dichten Dschungel. Im Norden steht ein alter,
            von Ranken überzogener Schrein. Im Süden führt
            ein schmaler Pfad zurück in die Zivilisation."
    has light;

Object -> Stein "Stein"
   with dekl 3,
        adj "faustgroß",
        name 'faustgross' 'gross' 'rund' 'glatt' 'stein',
        description "Der Stein ist so groß wie eine Faust
            und außergewöhnlich glatt und rund.",
        initial "^In der Nähe des Schreins liegt ein
            glatter, runder Stein im Gras."
    has male;

Object -> Schrein "Schrein"
   with dekl 1,
        adj "alt",
        name 'alt' 'toltekisch' 'schrein' 'efeu' 'ranken',
        description "Der alte Toltekenschrein ist fast
            komplett mit Efeu überwuchert.",
        before [;
            Enter: <<Go n_obj>>;
        ]
    has male scenery;

Object Im_Schrein "Im Schrein"
   with s_to Lichtung,
        out_to Lichtung,
        description "In dem kleinen Schrein ist es
            dunkel, nur wenig Licht fällt durch das halb
            verfallene Dach. Ein großer Lichtstrahl fällt
            auf eine Steinsäule in der Mitte des Schreins.
            ^^Die Lichtung liegt im Süden."
    has light;

Object -> Saeule "Steinsäule"
   with dekl 9,
        name 'steinsaeule' 'saeule' 'steinpodest' 'podest',
        description "Die Säule ist aus glattem Stein
            gehauen, etwas mehr als einen Meter hoch und
            oben flach, wie ein Podest."
    has female supporter static concealed;

Object -> -> Jadestatue "Jadestatue"
   with dekl 9,
        name 'gruen' 'klein' 'statue' 'figur'
           'jadestatue' 'jadefigur',
        description "Es ist die Statue einer toltekischen
            Gottheit, komplett aus grüner Jade geschnitzt.
            Sie glänzt und sieht sehr wertvoll aus.",
        before [;
            Take, Remove:
                if (self in Saeule && ~~(Stein in Saeule))
                {
                    deadflag = true;
                    "Als du das Gewicht der Statue von der
                    Säule nimmst, hörst Du ein klickendes
                    Geräusch. Kurz darauf wirst du von
                    Giftpfeilen durchbohrt.";
                }
        ]
    has female;

Include "GermanG";

end;