Die Konstante Story
definiert einen Namen für das Spiel, der dann zu Beginn des Spiels ausgegeben wird.
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 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;