Auswendig ist nicht allzu schwer:
with short_name "Heft",
adj "klein",
dekl 1,
description "Es ist ein kleines Heft mit nicht allzuvielen Seiten. Auf
dem Titel steht: ~Der Abentteuerliche Informissimus
Teutsch - Eine Einführung in die Programmierung mit
Inform und der deutschen Library.~ Irgendwie macht es
einen unfertigen Eindruck.",
name 'heft' 'informissimus' 'klein' 'handbuch' 'info',
before [;
open, search: "In dem kleinen Heft findest du Informationen über das
Spiel."
close: "Du schließt das kleine Heft.";
],
has neuter;
Die Library löst für solche Befehle die Aktion ##Consult aus und übergibt als noun das Objekt, in dem gelesen werden soll (hier: Heft). Dann aber wird es schwierig.
Den Teil der Eingabezeile, in dem steht, was gelesen werden soll, muss das Programm selbst analysieren. Zu diesem Zweck übergibt die Library eine Variable consult_words, die die Anzahl der zu analysierenden Worte enthält und einen Zeiger consult_from auf die Eingabezeile, der auf das erste Wort des Textes deutet, der gelesen werden soll, im letzten oben angeführten Beispiel wäre dieser Text ,,das Thema Eden''; consult_words wäre gleich 3; der Zeiger consult_from weist auf das Wort ,,das''.
Außerdem haben wir noch die Funktion NextWord() zur Verfügung, die das nächste Wort aus der Eingabezeile liest und mit dem internen Wörterbuch des Spiels vergleicht. Welches Wort das ,,nächste'' ist, erkennt die Funktion aus der globalen Variablen wn. Diese müssen wir - aus consult_from - initialisieren, um an der richtigen Stelle anzufangen. Praktischerweise zählt NextWord() die Variable wn bei jedem Aufruf um 1 hoch.
Die before-Regel für die Aktion ##Consult könnte - für Themen, die bis zu drei Worte lang sind und das Wort Thema enthalten können - etwa so aussehen:
Consult: wn = consult_from;
w1 = NextWord(); ! erstes Wort des Themas
w2 = NextWord(); ! evtl. zweites Wort des Themas
w3 = NextWord(); ! evtl. drittes ...
if (consult_words==1 && w1~='thema' or 'themen')
thema = w1;
else
if (consult_words==2 && w1=='dem' or 'den' or 'die' or 'der' or 'das' ) thema = w2;
else
if (consult_words==2 && w1=='thema')
thema = w2;
else
if (consult_words==3 && w2=='thema')
thema = w3;
else "Versuche es mit: ~Lies über <das Thema> im Heft nach~";
Die in 'einfachem Hochkomma' stehenden Worte sind keine schlichten Zeichenketten, sondern es sind im dictionary des Spiels eingetragene Konstanten, intern realisiert als Zeiger auf eine Tabelle mit den tatsächlichen Worten. (Jedes Wort, das im Programmtext in 'einfachen Hochkommas' geschrieben wird, wird in dieses Wörterbuch eingetragen.) Weil es aber konstante Werte sind, können sie in einer switch-Anweisung (zur Erinnerung: Kapitel 3.1.3)verwendet werden:
'adam', 'mich', 'eva', 'mensch', 'frau':
"Adam und Eva sind die ersten Menschen. Deutsche Lehrbücher
fangen immer bei Adam und Eva an.";
'heft', 'inform' , 'informissimus':
"Zusammen mit diesem Spiel sollten Sie den ~Abentteuerlichen
Informissimus Teutsch~ erhalten haben - eine Anleitung und eine
Kurzreferenz zum Programmieren deutschsprachiger interaktiver
Belletristik.";
'vorwort', 'hinweise' 'hilfe':
"Dies ist interaktive Belletristik.";
'garten', 'baum', 'Baeume':
"Im Garten Eden stehen viele Bäume, sie sind lustig anzusehen
und ihre Früchte sind gut zu essen. Nur die Bäume in der Mitte
des Gartens sind den Menschen verboten worden.";
'eden', 'spiel':
"Dieses Spiel ist ~nur~ das Bei-Spiel zum ~Abentteuerlichen
Informissimus Teutsch~.";
default: "Darüber steht nichts in dem kleinen Heft.";
}
open: ...
close: ...
],
Es geht aber auch einfacher. Man kann den Parser der Library die Arbeit machen lassen; dazu muss man ihm aber Objekte vorgeben, die die möglichen ,,Anfragen'' an den Inhalt des Heftes abdecken - und Regeln, wie er diese Objekte verwenden kann. Eine Klasse - Topic - für solche Objekte und die notwendigen Regeln enthält die zusätzliche Bibliothek GInfo. Sie definiert ausserdem ein ,,Aufhängerobjekt'' namens Topics, mit dem gesteuert werden kann, ob bestimmte Themen gerade ,,aktuell'' sind (dann sind sie children von Topics) oder nicht (dann kann man sie mit z.B. remove TMann; entfernen (und mit move TMann Topics; wieder ins Spiel bringen)).
Die einzelnen Objekte enthalten nur ihren eigenen Namen, grammatische Zusatzinformation - und in der name-property die Worte, mit denen sie vom Spieler angesprochen werden können ('Thema' erben sie von Topic). Wir lernen hier außerdem eine neue Kurzschreibweise kennen: Topic TMann bedeutet dasselbe wie Object TMann ... class Topic.
with short_name "Adam",
name 'Adam' 'Mann' 'Mensch' 'mich' 'mir' 'dich' 'dir',
dekl 0,
has male proper;
Topic TFrau Topics
with short_name "Eva",
name 'Eva' 'Frau' 'Mensch' 'Gefaehrtin' 'Gehilfin',
dekl 0,
has female proper;
Topic TSpiel Topics
with short_name "Programm",
name 'Spiel' 'Programm' 'Eden' 'Information' 'Informationen' 'info',
dekl 1;
! neuter erbt das Objekt von der Klasse Topic
Topic THilfe Topics
with short_name "Hilfe",
name 'Hilfe' 'Anleitung' 'Einführung',
dekl 9,
has female;
Consult:
switch (second) {
TMann, Tfrau:
"Adam und Eva sind die ersten Menschen.
Deutsche Lehrbücher fangen immer bei
Adam und Eva an.";
THeft: "Zusammen mit diesem Spiel werden Sie in
naher Zukunft den ~Abentteuerlichen
Informissimus Teutsch~ erhalten ..."
THilfe: "Dies ist interaktive Belletristik. Mehr
erfahren Sie mit ~Hilfe~.";
TGarten, TSpiel:
"Dieses Spiel ist ~nur~ das Bei-Spiel
zum ~Abentteuerlichen Informissimus
Teutsch~.
...
}
...
],