next up previous contents index
Next: Und es geschah also: Up: Der Baum der Erkenntnis: Previous: Inform

Subsections



Die deutsche Library

In weiten Teilen - Arbeitsweise, Funktionen, Attribute, Properties, Aktionen - sind die deutsche und die englische Library übereinstimmend. Ich beschränke mich nicht auf die deutschen Eigenheiten, sondern versuche, die Library, so wie man sie für das deutschsprachige Programmieren braucht, als vollständiges Ganzes darzustellen. Rein englischsprachige Eigenheiten können mir dabei schon mal unter den Tisch gefallen sein.


Konstante

AMUSING_PROVIDED
ist normalerweise nicht definiert. Wird sie definiert, so wird der Spieler am Ende eines gewonnenen Spiels gefragt, ob er noch unterhaltsame Dinge wissen möchte; falls ja, wird die Routine Amusing() aufgerufen.
DEATH_MENTION_UNDO
ist normalerweise nicht definiert. Wird sie definiert, so wird Undo nach Spielende bei den möglichen Optionen (neben Restore, Restart, Quit und evtl. Amusing) mit aufgeführt.
DEBUG
ist normalerweise nicht definiert. Wird es definiert, so werden die Debuggerkommandos aktiviert.
HEADLINE = "TEXT";
muss definiert werden, gibt den Untertitel am Spielanfang aus.
MANUAL_PRONOUNS
ist normalerweise nicht definiert. Wird es definiert, so werden Pronomina nicht mehr ,,automatisch'' gesetzt.
MAX_CARRIED = AUSDRUCK;
Voreinstellung 100. Legt fest, wieviele Objekte die Spielerfigur auf einmal tragen kann.
MAX_SCORE = AUSDRUCK;
Voreinstellung 0. Die maximal erreichbare Punktezahl.
MAX_TIMERS = AUSDRUCK;
Voreinstellung 32. Legt die Höchstanzahl gleichzeitig aktiver timer und daemons fest.
NO_PLACES
ist normalerweise nicht definiert. Wird es definiert, so werden die Aktionen ##Objects und ##Places nicht eingebunden.
NUMBER_TASKS = AUSDRUCK;
Voreinstellung 1. Die Anzahl der zu erfüllenden Aufgaben.
OBJECT_SCORE = AUSDRUCK;
Voreinstellung 4. Punktezahl, die der Spieler für das erste Aufnehmen eines Objekts mit dem Attribut scored erhält.
R_NEU
ss und ß werden nach den neuen Rechtschreibregeln verwendet.
ROOM_SCORE = AUSDRUCK;
Voreinstellung 5. Punktezahl, die der Spieler für das erste Betreten eines Raums mit dem Attribut scored erhält.
SACK_OBJECT = OBJEKT;
Ein Objekt - mit dem Attribut container - in dem das Spiel automatisch Gegenstände verstaut, die der Spieler nicht mehr halten kann.
Story = "TEXT";
muss definiert werden, gibt den Titel am Spielanfang aus.
TARGET_GLULX
oder
TARGET_ZCODE
werden vom Compiler gesetzt, je nachdem, ob das Spiel in Z-Code oder Glulx übersetzt wird (Compilerschalter -G).
TASKS_PROVIDED
ist normalerweise nicht definiert. Wird es definiert, so wird das Scoring von Objekten/Räumen auf erfüllte Aufgaben erweitert.
USE_MODULES
ist normalerweise nicht definiert. Wird es definiert, so können vorkompilierte Bibliotheksdateien verwendet werden.
WITHOUT_DIRECTIONS
ist normalerweise nicht definiert. Wird es definiert, so werden die normalen Richtungen des Compass außer in und out deaktiviert; die Autorin muss eigene Richtungen festlegen.
WORDLENGTH
ist 2, wenn für Z-Code, und 4, wenn für Glulx übersetzt wird. Aus Kompatibilitätsgründen sollte man diese Konstante verwenden, wenn man Speicherarithmetik betreibt.

Variable

action
Die gerade ausgeführte Aktion
actor
Die Figur, die die Aktion ausführt, das kann nach einer order auch ein NPC sein.
compass
ist ein container, der die verfügbaren Richtungen enthält, also im Normalfall d_obj, e_obj, in_obj, n_obj, ne_obj, nw_obj, out_obj, s_obj, se_obj, sw_obj, u_obj, w_obj.
deadflag
ist im Spiel immer 0; wird es auf 1 gesetzt, ,,stirbt'' die Spielerfigur, bei 2 ist das Spiel als gewonnen beendet, alle Werte von 3 aufwärts sind frei für alternative Enden verwendbar.
inventory_stage
steuert den Ablauf von Routinen der properties invent und list_together
keep_silent
ist voreingestellt auf false, wenn es auf true gesetzt wird, geben die meisten Aktionen der Klasse 2 im Erfolgsfall keine Rückmeldung
LibraryMessages
ist ein im Bedarfsfall von der Autorin - vor Einbinden von VerbLib - zu definierendes Objekt, das eine before-Routine enthält, die für die in ihr abgefangenen Aktionen die Standardantworten der Library überschreibt.
location
Der Raum, in dem die Spielerfigur ist, wenn sie Licht hat. Hat es kein Licht, ist location==thedark und der Raum ist nur in der real_location zu finden.
notify_mode
ist voreingestellt auf true, wird es auf false gesetzt, erfolgt keine Meldung bei einer Veränderung des Punktestands
noun
Das direkte Objekt der aktuellen Aktion.
player
Die Spielerfigur.
real_location
Der Raum, in dem sich die Spielerfigur tatsächlich befindet, wenn es dunkel und location auf thedark gesetzt ist.
score
Der aktuelle Punktestand.
second
Das zweite, meist indirekte Objekt der aktuellen Aktion.
selfobj
die vordefinierte Spielerfigur. Der Zugriff sollte aber immer indirekt auf die Variable player erfolgen.
self
Das Objekt, dass die gerade verarbeitete Nachricht (message) empfangen hat
sender
das Objekt, das die Nachricht gesendet hat; oft InformLibrary, kann auch nothing sein
task_scores
ist ein byte array, der der Reihe nach die Punktzahlen für das aufgabenbasierte scoring enthält
thedark
ein obskurer Raum, der zur location (aber nicht zum parent der Spielerfigur) wird, wenn es dunkel ist.
the_time
Die Uhrzeit im Spiel, gemessen in Minuten nach Mitternacht
turns
Zahl der schon gespielten Züge
wn
(,,word number'') zeigt an, im wievielten Wort des Eingabezeile der Parser steht (erstes Wort==1). Die Routine NextWord() holt dieses Wort und addiert 1 zu wn.

Funktionen

Achieved(AUSDRUCK);
Eine der punktbringenden Aufgaben ist erledigt.
AddToScope(GERUFENES_OBJEKT);
Wird in der add_to_scope-property eines Objekts aufgerufen. Das solcherart gerufene Objekt kommt dann zusammen mit dem rufenden Objekt in und aus dem Blickfeld (scope).
AfterRoutines()
ruft innerhalb einer Aktionsroutine die after-routinen aller Objekte auf, die sich mit der Aktion im after-Stadium befassen wollen. Siehe auch 3.2.8.
AllowPushDir(GESCHOBENES_OBJEKT)
ist in einer before-Routine im Zweig für ##PushDir zu verwenden, um das Schieben des Objekts in einen anderen Raum zu ermöglichen, siehe 3.2.7.
Banner()
gibt das ,,Banner'', also die Titelinformationen des Spiels, aus.
CDefArt(OBJEKT)
gleichbedeutend mit print (GDer) OBJEKT
ChangeDefault(PROPERTY,AUSDRUCK);
Ändert die Vorbelegung eines common property.
ChangePlayer(OBJEKT,FLAG)
Wechselt mit der Spielerfigur in das neue Objekt. Wenn das Flag auf true gesetzt ist, kommt bei der Raumbeschreibung der Zusatz ,,als OBJEKT'' um zu kennzeichnen, welche Person der Spieler gerade steuert.
DefArt(OBJEKT)
gleichbedeutend mit print (der) OBJEKT
DictionaryLookup(BYTE_ARRAY,LÄNGE)
Ein im BYTE_ARRAY->0 bis ->LÄNGE-1 abgelegtes Wort wird im Wörterbuch gesucht. Rückgabewert ist der Zeiger auf den Eintrag oder false.
DoMenu("TEXT",ROUTINE1,ROUTINE2)
Ruft ein Menüsystem auf den Schirm. Überholt durch menu.h.
DrawStatusLine()
Gibt die Statuszeile aus
EnglishNumber(AUSDRUCK)
Gibt die Zahl in - deutschen - Worten aus.
GetGNAOfObject(OBJEKT)
Ermittelt den gender-number-animation - Wert des short name eines OBJEKTS..
HasLightSource(OBJEKT)
Prädikat. Testet, ob das OBJEKT light hat und gibt true zurück, wenn ja.
InDefArt(OBJEKT)
gleichbedeutend mit print (ein) OBJEKT
IndirectlyContains(OBJEKT1,OBJEKT2)
Prädikat, das testet, ob OBJEKT2 im object tree irgendwo unterhalb von OBJEKT 1 steht und true zurückmeldet, falls dies der Fall ist.
IsSeeThrough(OBJEKT)
Prädikat, das true zurückgibt, wenn das OBJEKT Licht durchlässt; also entweder transparent, supporter, oder enterable hat, solange es sich nicht um einen closed container handelt.
Locale(OBJEKT,"ÜBERSCHRIFT","ZWISCHENÜBERSCHRIFT")
Gibt die volle Beschreibung eines OBJEKTS aus, das dabei behandelt wird, als ob es ein Raum wäre, d.h. zunächst wird die Beschreibung ausgegeben; ist diese Beschreibung leer, folgt die ÜBERSCHRIFT, wenn nicht, die ZWISCHENÜBERSCHRIFT. Danach folgen die in OBJEKT enthaltenen Objekte, deren Anzahl auch der Rückgabewert der Funktion ist.
LoopOverScope(ROUTINE,SPIELFIGUR)
Führt für jedes Objekt im Blickfeld (scope) der SPIELFIGUR die ROUTINE einmal aus (mit dem jeweiligen Objekt als Parameter). Ist keine SPIELFIGUR angegeben, wird automatisch die Spielerfigur (player) angenommen.
LTI_Insert(POSITION,CHARACTER)
Schiebt den CHARACTER an POSITION in den Standardeingabepuffer (library text array)
MoveFloatingObjects()
Aktualisiert alle Schiebekulissen (,,Floating objects'') und sollte nach jeder Änderung eines Kulissenobjekts aufgerufen werden.
NextWord()
Holt das nächste Wort aus der Eingabezeile und inkrementiert wn. Rückgabewert ist das Wort oder false, wenn das Wort nicht im Wörterbuch eingetragen ist oder die Eingabe erschöpft ist.
NextWordStopped()
Holt das nächste Wort aus der Eingabezeile und inkrementiert wn. Rückgabewert ist das Wort oder false, wenn das Wort nicht im Wörterbuch eingetragen ist oder -1, wenn die Eingabe erschöpft ist.
NounDomain(OBJEKT1,OBJEKT2,TYP)
ist eine grundlegende Routine des Parsers. Ihr werden zwei OBJEKTE übergeben, in deren Bereich gesucht werden soll (üblicherweise actor und location); außerdem als TYP eine der Konstanten NOUN_TOKEN, HELD_TOKEN oder CREATURE_TOKEN. Die Routine sucht dann, ob ab der aktuellen Position (wn) ein passendes Objekt zu finden ist und liefert dieses Objekt zurück; nothing, wenn nichts gefunden wird und REPARSE_CODE, wenn der Parser beim Spieler ,,nachfragen'' musste.
ObjectIsUntouchable(OBJEKT,FLAG)
Prädikat, das true zurückgibt, wenn zwischen der Spielerfigur und dem Objekt sich eine Barriere - ein geschlossener container - befindet. Seiteneffekt ist eine Nachricht an den Spieler. Das FLAG kann weggelassen werden, wird es auf true gesetzt, wird die Benachrichtigung unterdrückt.
OffersLight(OBJEKT)
Prädikat, das true zurückliefert, wenn das OBJEKT (Raum oder container) Licht enthält.
ParseToken(TOKENTYPE,TOKENDATA)
Das ist die ,,general parsing routine'' der Library, die die Eingabe auf ein erwartetes token überprüft. Für den Anwender zugänglich sind nur zwei verschiedene Tokentypen, nämlich ELEMENTARY_TT mit den möglichen Einträgen für Tokendata: NOUN_TOKEN, HELD_TOKEN, MULTI_TOKEN, MULTIHELD_TOKEN, MULTIEXCEPT_TOKEN, MULTIINSIDE_TOKEN, CREATURE_TOKEN und NUMBER_TOKEN. Außerdem kann der Tokentyp sein: SCOPE_TT; wobei Tokendata eine ,,scope routine'' sein muss. Rückgabewerte sind GPR_FAIL (nichts gefunden); GPR_PREPOSITION (Übereinstimmung, aber keine Daten); GPR_NUMBER eine gefundene Zahl, GPR_MULTIPLE bei einer gefundenen Übereinstimmung mit mehreren Objekten und GPR_REPARSE wenn mit dem Parsen von vorn angefangen werden muss - oder aber das gefundene Objekt.
PlaceInScope(OBJEKT)
Das OBJEKT wird ins Blickfeld (scope) gerückt. Normalerweise verwendet in Routinen für add_to_scope oder dem Grammatiktoken scope=ROUTINE.
PlayerTo(OBJEKT,FLAG)
versetzt bzw. teleportiert den Spieler in das OBJEKT (einen Raum oder ein enterable). Ist das FLAG false, wird als erstes ein ##Look im neuen Raum ausgelöst; bei true wird nichts ausgegeben und bei 2 wird eine abgekürzte Raumbeschreibung ausgegeben, wenn der Raum visited hat.
PronounNotice(OBJEKT)
Setzt alle grammatisch zulässigen Pronomen auf das OBJEKT.
PronounValue(PRONOMEN)
Ermittelt die aktuelle Belegung eines (als Wörterbucheintrag anzugebenden) PRONOMENS, nothing, wenn das Pronomen nicht besetzt ist.
ScopeWithin(OBJEKT)
Sinnvollerweise nur in ,,scope Routinen'' benutzbar und auch dort nur, wenn die Libraryvariable scope_stage auf 2 gesetzt ist. ScopeWithin() rückt den Inhalt von Objekt ins Blickfeld; d.h. zunächst die Child-Objekte und dann rekursiv deren Inhalt, wenn sie durchsichtig sind.
SetPronoun(PRONOMEN,OBJEKT)
Bewirkt, dass das OBJEKT vom Spieler mit dem PRONOMEN angesprochen werden kann.
SetTime(TIME,RATE)
Für Spiele, in denen die Zeit gemessen werden soll (nicht die Echtzeit, sondern eine fiktive Zeit, die nur für das Spiel gilt): Der Ausdruck für TIME setzt die Uhr auf eine Anzahl von Minuten nach Mitternacht; RATE gibt an, wieviel Minuten bei jedem Zug verstreichen; wenn ein negativer Wert angegeben wird, wieviel Züge auf eine Minute kommen. 0 bedeutet, dass keine Zeit verstreicht.
StartDaemon(OBJEKT)
Aktiviert den Dämon eines OBJEKTS
StartTimer(OBJEKT,AUSDRUCK)
Startet den Timer eines OBJEKTS und setzt den Anfangswert auf AUSDRUCK; der Timer wird in jedem Zug um 1 heruntergezählt.
StopDaemon(OBJEKT)
Hält den Dämon des OBJEKTS an.
StopTimer(OBJEKT)
Hält den Timer des OBJEKTS an
TestScope(OBJEKT,ACTOR)
Prädikat, das testet, ob ein OBJEKT im Blickfeld (scope) eines bestimmten ACTOR sich befindet; wird kein anderer ACTOR angegeben, wird der Test für die Spielerfigur ausgeführt.
TryNumber(WORDNUM)
versucht, das Wort an der angegebenen Stelle (WORDNUM ist ein Wert von wn) als Zahl zu parsen, gibt -1000 zurück, wenn es schiefgeht, ansonsten die gefundene Zahl. Zahlen über 10000 werden auf 10000 gekappt.
UnsignedCompare(A,B)
Zum Vergleich zweier Speicheradressen im Bereich 0..65535, denn > vergleicht nur mit Vorzeichen. Resultat 1 wenn A > B, 0 wenn A==B und -1 (bzw. 65535) wenn A<B.
WordAddress(WORDNUM)
WORDNUM ist eine Wortposition der Eingabezeile (vgl. wn) - Rückgabewert ist der byte array, in dem der Text des Wortes zeichenweise abgelegt ist.
WordInProperty(WORT,OBJEKT,PROPERTY)
Prädikat, das testet, ob das WORT in einem PROPERTY des OBJEKT enthalten ist; das PROPERTY muss einen Array von Wörterbucheinträgen enthalten; üblicherweise wird name verwendet.
WordLength(WORDNUM)
WORDNUM ist eine Wortposition der Eingabezeile (vgl. wn) - Rückgabewert ist die Länge des Worts an dieser Position.
WriteListFrom(OBJEKT,STIL)
Gibt eine Liste des OBJEKTS und aller folgenden Objekte der gleichen Ebene (der siblings) aus. Alle Objekte innerhalb eines Objekts X werden gelistet mit WriteListFrom(child(X), STIL). Der STIL wird durch Summieren aus folgenden Konstanten gebildet:

NEWLINE_BIT
Zeilenschaltung nach jedem Eintrag
INDENT_BIT
Einträge einrücken
FULLINV_BIT
Vollständiges Inventar
ENGLISH_BIT
Ganze Sätze bilden
RECURSE_BIT
Rekursiv nach üblichen Regeln arbeiten
ALWAYS_BIT
Immer rekursiv abarbeiten
TERSE_BIT
Knapper Stil
PARTINV_BIT
Nur kurzes Inventar
DEFART_BIT
Bestimmten Artikel verwenden
WORKFLAG_BIT
Nur Objekte mit workflag werden gelistet
ISARE_BIT
Einleitendes ,,ist'' bzw. ,,sind'' ausgeben
CONCEAL_BIT
Objekte mit concealed oder scenery werden weggelassen
YesOrNo()
Prädikat, das true rückmeldet, wenn der Spieler eine Ja/Nein-Frage mit Ja beantwortet hat. Die Frage selbst wird von YesOrNo() nicht behandelt, sie muss vor Aufruf der Routine gestellt worden sein.


Einhänger (entry point routines)

Diese Routinen haben zwar feste Namen, ihr Inhalt kann aber vom Benutzerprogramm frei definiert werden. Sie werden im Regelfall jedoch nicht vom Benutzerprogramm, sondern aus der Library heraus aufgerufen. Dort sind sie an festgelegten Stellen im Spielablauf ,,eingehängt''; wenn man an diesen Stellen etwas bestimmtes tun will, schreibt man es in die entsprechende Routine. Die einzige, die zwingend benutzt werden muss - um die Spielerfigur mit location = RAUM_ODER_ENTERABLE; an einen definierten Anfangsort zu setzen - ist initialise().44

AfterLife()
Wird aufgerufen, wenn deadflag einen anderen Wert als false (lebendig) oder 2 (gewonnen) annimmt und bietet die Gelegenheit, orangefarbenen Rauch zu verblasen und deadflag wieder auf false zu setzen.
AfterPrompt()
Wird nach dem Eingabeprompt (aber vor dem Einlesen der Eingabe) aufgerufen. Üblicherweise der Ort, an dem Zitatboxen ausgegeben werden, weil dann sichergestellt ist, dass sie nicht wegscrollen. Der Prompt selber kann durch einen Eintrag für die Aktion Prompt in der Dispatcherroutine LibraryMessages.before (siehe 3.2.2) geändert werden.
Amusing()
Wenn die Konstante AMUSING_PROVIDED definiert ist, ist hier der Ort, nach einem gewonnenen Spiel noch mehr oder weniger amüsante Zusatzinformationen unterzubringen.
BeforeParsing()
Wird aufgerufen, nachdem die Eingabezeile gelesen wurde, Eingabepuffer und Parsingtabellen initialisiert und wn auf 1 gesetzt wurde. Die Routine darf die Tabellen verändern und muss wn nicht zurücksetzen.
ChooseObjects(OBJEKT,C)
Wird vom Parser beim Parsing von multi-tokens oder bei Mehrdeutigkeiten aufgerufen.

Für multi-tokens gilt: Ist C false, möchte der Parser das OBJEKT von der Liste ausschließen, ist c true, möchte er es einschließen. Die Routine sollte false zurückgeben, um die Entscheidung des Parsers zu akzeptieren, 1, um das OBJEKT in die Liste einzuschließen und 2 um es auszuschließen.

Ist c==2, sucht der Parser Hilfe beim Auflösen einer Mehrdeutigkeit, die Routine sollte einen numerischen Wert zwischen 0 (OBJEKT völlig ungeeignet) und 9 (OBJEKT sehr gut geeignet) zurückgeben. Um dies zu entscheiden, steht die vom Parser beabsichtigte Aktion in der Variablen action_to_be.

DarkToDark()
Wird aufgerufen, wenn der Spieler versucht, von einem dunklen Ort an einen anderen unbeleuchteten Ort zu gelangen; in frühen Adventures trat hier meist ein Monster namens Grue auf und sorgte für einen angemessenen Grund, deadflag auf true zu setzen.
DeathMessage()
Für die Fälle von deadflag>=3 kann hier eine angemessene Nachricht zum Spielende gesetzt werden (nur die letzte, fettgedruckte und in Asterisks eingeschlossene Zeile, nicht der Text davor!)
GamePostRoutine()
Eine Dispatcherroutine, analog zu after. Wird aufgerufen, wenn alle anderen after-Routinen die Aktion haben passieren lassen, siehe 3.3.
GamePreRoutine()
Eine Dispatcherroutine, analog zu before. Wird vor allen anderen before-Routinen aufgerufen.
Initialise()
Muss zu Spielbeginn einmal aufgerufen werden und dabei location auf einen Anfangswert (Raum oder enterable) setzen. Üblicherweise wird hier auch der Begrüßungstext ausgegeben. Unmittelbar danach folgt das ,,Banner'' des Spiels (Titel, Untertitel, Angaben zur Version von Compiler und Library). Gibt initialise() den Wert 2 zurück, wird die Ausgabe des Banners unterdrückt und sollte mit der Routine Banner() alsbald nachgeholt werden.
InScope()
wird in zwei Situationen aufgerufen, wenn die Library ,,nachsieht'', was im Blickfeld (scope) ist: Einmal mit dem Flag et_flag auf true, dann kann festgelegt werden, welche Objekte ein each_turn ausführen sollen. Ist das Flag false, wird normal nach einem grammar token geparst. Beide Male können Objekte mit ScopeWithin() und PlaceInScope() hinzugefügt werden. Die Auswirkung dieser Routine ist dramatisch vom Rückgabewert abhängig: false bedeutet, dass die Library danach noch alle ,,normal'' im Blickfeld befindlichen Objekte hinzufügt; true bedeutet, dass nach InScope() abgebrochen wird und nur die hier explizit ins Blickfeld gerückten Objekte sich darin befinden.
LookRoutine()
Wird am Ende jeder ##Look-Aktion, d.h. am Ende jeder Raumbeschreibung aufgerufen.
NewRoom()
Wird - noch bevor eine Raumbeschreibung ausgegeben wird - aufgerufen, wenn sich der Raum verändert, entweder infolge einer erfolgreichen Bewegung oder eines PlayerTo().
ParseNoun(OBJEKT)
bietet die Gelegenheit, in das Parsen der name-property des übergebenen OBJEKTES einzugreifen. Der Rückgabewert ist wie bei einer parse_name-Routine die Anzahl der übereinstimmendes Wörter, false, wenn keine Übereinstimmung gefunden wurde und -1; wenn die Routine die Entscheidung an den Parser zurückgibt; wn muss dann auf das Wort zeigen, an dem der Parser weitermachen soll (normalerweise mit 1, aber nicht notwendigerweise).
ParseNumber(TEXT,N)
Eine Gelegenheit, sich in das Parsen von Zahlwörtern einzumischen. Der zu parsende Text befindet sich in einem array TEXT mit der Länge N. Rückgabewert ist eine Zahl zwischen 1 und 10000; false bedeutet, dass keine Zahl erkannt wurde.
ParserError(PE)
Zum Umdefinieren der Parser-Fehlermeldungen; mit PE wird eine Fehlernummer übergeben; der Rückgabewert ist true, wenn ParserError() eine angemessene Meldung selbst ausgegeben hat; false wenn die vordefinierte Meldung ausgegeben werden soll. Die Fehlerkonstanten und die vordefinierten Antworten (kursiv geschriebene Teile werden mit dem betreffenden Teil der nicht verstandenen Eingabe ausgefüllt) sind:

STUCK_PE
Diesen Satz verstehe ich nicht.
UPTO_PE
Ich habe dich nur soweit verstanden: ...
NUMBER_PE
Diese Zahl verstehe ich nicht.
CANTSEE_PE
Du kannst nichts dergleichen sehen.
TOOLIT_PE
Es sieht so aus, als hättest du zu wenig gesagt!
NOTHELD_PE
Du trägst das Objekt nicht bei dir!
MULTI_PE
[Mit diesem Verb kannst du nicht mehrere Objekte ansprechen.]
MMULTI_PE
[Du kannst pro Zeile nur einmal mehrere Objekte ansprechen.]
VAGUE_PE
Ich verstehe nicht, was mit ,,dem Pronomen'' gemeint ist.
EXCEPT_PE
Das ist nichts, worauf du dich in diesem Spiel beziehen musst.
ANIMA_PE
Das kannst du nur mit belebten Objekten machen.
VERB_PE
Dieses Verb verstehe ich nicht.
SCENERY_PE
Ein flüchtiger Blick darauf sagt dir, dass es sich um nichts wichtiges für das Spiel handelt.
ITGONE_PE
Im Augenblick ist ,,es'' (das Objekt) nicht zu sehen.
JUNKAFTER_PE
[Ich habe nicht verstanden, wie das endete.]
TOOFEW_PE
Nur Anzahl davon sind ansprechbar.
NOTHING_PE
Nichts zu tun!
ASKSCOPE_PE
(Ausgabe der verwendeten scope routine)
PrintRank()
Wird nach der Ausgabe der Punktezahl aufgerufen und ermöglicht Nachrichten im Stil von ,,... was Dir den Rang eines Amateurabenteurers verleiht.''
PrintVerb(V)
Wird aufgerufen, wenn der Parser in einer Nachfrage (,,Du möchtest ... aber was, womit...?'') den Namen eines Verbs ausgeben soll und bietet eine Gelegenheit, dies zu ändern. V ist die Wörterbuchadresse des Verbs. Ein Rückgabewert von true bedeutet, dass die Routine selbst ein Verb ausgegeben hat; false bedeutet, dass der Parser das Verb ausdruckt, das er von Anfang an verwenden wollte (v).
PrintTaskName(N)
Druckt den Text zur Aufgabe Nummer N aus (wird für ##Fullscore benötigt). Üblicherweise ein switch(n)-Statement.
TimePasses()
wird nach jedem Spielzug aufgerufen, der ,,Zeit'' im Spiel kostet, also nicht bei Aktionen von Metaverben.
UnknownVerb(WORD)
Wird aufgerufen, wenn der Parser ein unbekanntes Verb findet. Dies kann hier abgefangen und ein anderes Verb zurückgegeben werden, das der Parser stattdessen benutzen soll (z.B. 'hilf'). Wird false zurückgegeben, macht der Parser weiter und gibt eine ,,unbekanntes Verb''-Fehlermeldung aus.


Ausgaberegeln für Artikel und Pronomen

Diese Regeln sind tatsächlich ganz normale Routinen, die ein bestimmtes Objekt übergeben bekommen und dann im gewünschten Deklinationsfall und mit dem gewünschten Artikel oder - anstelle des Objektnamens - ein Pronomen als druckbaren String ausgeben. Der String ist aber nicht der Rückgabewert, sondern der Seiteneffekt dieser Routinen! Deshalb müssen sie - innerhalb eines print-Befehls - so geschrieben werden:

print (REGEL) OBJEKT
Denn die ,,normale'' Schreibweise

print REGEL(OBJEKT) ! SO NICHT!
führt zu keiner Fehlermeldung (diese Syntax ist für Routinen ja zulässig); gibt aber außer dem gewünschten String auch noch den Rückgabewert der Routine aus - meistens true, das als 1 gedruckt wird. Wenn in der Ausgabe eines Spiels unmotivierte Einsen stehen, sollte man nach einem solchen Fehler suchen.

Alle Regeln haben den Namen des gewünschten - grammatisch - männlichen Artikels oder Pronomens, der oder das ausgegeben werden soll; ob die weibliche oder neutrale Form gedruckt wird, hängt von den entsprechenden Attributen - male, female, neuter - des Objekts ab, ob Singular oder Plural verwendet werden, vom Attribut pluralname. Dekliniert wird außer dem short_name des Objekts auch jedes mit adj deklarierte Adjektiv; was unter post steht, wird nicht dekliniert.

Artikel45

Diese Regeln geben einen Artikel gefolgt vom korrekt deklinierten Namen des Objekts aus.

Artikel Nominativ Genitiv Dativ Akkusativ
bestimmt (der) (des) (dem) (den)
großgeschrieben (GDer) (Gdes) (GDem) (GDen)
unbestimmt (ein) (eines) (einem) (einen)
großgeschrieben (GEin) (GEines) (GEinem) (GEinen)
verneinend (kein) (keines) (keinem) (keinen)
großgeschrieben (GKein) (GKeines) (GKeinem) (Gkeinem)
nur dekliniert, kein Artikel (_er) (_es) (_em) (_en)

Hat das Objekt das Attribut proper (d.h. sein Name ist ein Eigenname), so wird grundsätzlich kein Artikel ausgegeben, vor einem Adjektiv aber wird der direkte Artikel ausgegeben.

Hat die property article des Objekts einen Eintrag, so wird dieser statt des unbestimmten Artikels vorangestellt, auch wenn es ein leerer String ist. Hat der Eintrag den Wert der Library-Konstante definit so wird immer der bestimmte Artikel verwendet.


Pronomen

Diese Regeln geben nur ein Pronomen, nicht aber den Namen des Objekts aus:

Pronomen Nominativ Genitiv Dativ Akkusativ
einfach (er) (seiner) (ihm) (ihn)
großgeschrieben (Ger) (GSeiner) (GIhm) (GIhn)
demonstrativ (dieser) (dieses) (diesem) (diesen)
großgeschrieben (GDieser) (GDieses) (GDiesem) (Gdiesen)


Kopulae

(isorare) gibt ,,ist'' oder ,,sind'' aus. Es kann aber auch einfach (ist) geschrieben werden. Analog gibt es (hat) für ,,hat'' oder ,,haben'' und (wird) für ,,wird'' oder ,,werden''. Das häufig vorkommende (GEr) OBJEKT (isorare) OBJEKT wird abgekürzt zu (GEristSiesind)OBJEKT.


Endungen von Verben

(endT) und (endEt) werden nach dem Stamm eines Verbs verwendet und evaluieren je nach Singular oder plural des folgenden Objekts zu t/en bzw. zu et/en.

Unregelmäßige Verben können mit der Konstruktion singplur(OBJEKT,"SINGULARFORM","PLURALFORM") ,,erschlagen'' werden.


Attribute (attributes) von Objekten

Ein Attribut ist etwas, das ein Objekt entweder haben kann oder nicht. Es handelt sich also technisch um Flags bzw. boole'sche Werte, die gesetzt sein oder nicht gesetzt sein können.

Es können zusätzliche Attribute mit dem (globalen) Befehl

Attribute BEZEICHNER; 
definiert werden. Inform kann maximal 48 Attribute verarbeiten.

In der Objektdefinition werden Attribute mit has gesetzt. Sie können später jederzeit mit give neu gesetzt oder geändert werden: give Fliegenpilz edible macht ihn essbar; zurückgesetzt werden sie mit der Tilde: give Hintertuer ~locked sperrt die Tür auf.

Getestet werden Attribute mit has und hasnt.

absent
wird zusammen mit dem Befehl remove gebraucht, um Schiebekulissen, sogenannte ,,floating objects" verschwinden zu lassen, d.h. Objekte, die einmal deklariert und mit found_in (3.2.7) von mehreren Räumen aus gesehen werden können. (remove beseitigt das gerade vorhandene Exemplar; absent sorgt dafür, dass es beim nächsten Raumwechsel des Spielers nicht automatisch wieder hereingeschoben wird.)
animate
kennzeichnet ein Lebewesen. Objekte mit diesem Attribut erkennt der Parser als creature.
clothing
kennzeichnet ein Kleidungsstück, das mit ##disrobe und ##wear aus- und angezogen werden kann.
concealed
versteckt das Objekt vor dem Spieler, ein ausdrückliches ##examine Osterei findet es aber.
container
ist ein Objekt in das man etwas hineintun (triggert ##Receive) oder aus dem man etwas herausnehmen kann (triggert ##LetGo. Kann nicht gleichzeitig das Attribut supporter besitzen.
door
kennzeichnet nicht nur Türen, sondern auch Brücken. Wenn die Eigenschaft door_to richtig eingestellt ist, macht es aus einer ##Enter-Aktion ein ##Go.
edible
Das Objekt ist essbar. Es reagiert auf ##eat. ##Vomit musst du selber definieren!
enterable
macht das Objekt für den Spieler begehbar, aber nur, wenn das Objekt auf dem Boden steht.
female, male, neuter
legen das grammatische Geschlecht eines Objekts fest. Das muss - anders als bei der englischen Library - auch bei unbelebten Objekten gemacht werden. Beachte: Erbt das Objekt von einer Klasse male oder female, ist aber selbst neuter, so muss das geerbte Geschlechtsmerkmal mit ~male oder ~female explizit gelöscht werden.
general
verleiht dem Objekt keine besondere Befehlsgewalt, sondern kann für beliebige Zwecke verwendet werden.
light
beleuchtet einen Raum, macht ein anderes Objekt zur Lichtquelle. give player light verbannt zuverlässig alle Grues aus dem Spiel.
lockable
macht ein Objekt (insb. Türen, Container) verschließbar und für ##Lock und ##Unlock empfänglich. Der Spieler braucht den richtigen Schlüssel (definiert mit with_key) zum Aufschließen.
locked
sorgt dafür, dass ein Objekt, das lockable hat, auch wirklich verschlossen ist.
moved
zeigt an, ob das Objekt vom Spieler schon bewegt wurde.
on
kennzeichnet ein eingeschaltetes switchable Objekt.
open
kennzeichnet ein offenes openable Objekt.
openable
ist ein Objekt, das mit ##Open und ##Close auf- und zugemacht werden kann, wenn nicht locked gesetzt ist. Wenn die Eigenschaften when_open und when_closed gesetzt sind, dann wird das Objekt unterschiedlich beschrieben, je nachdem, ob es offen oder zu ist.
pluralname
kennzeichnet ein Objekt, dessen Name im Plural steht. Paradoxerweise muss aber der short_name dennoch im Singular angegeben werden - das Umformulieren macht die Library! Achtung bei umlautender Pluralform (die muss angegeben werden)!

Inkurs:
ein altbekanntes Objekt46 könnte z.B. so definiert werden:
Object SewerPipes Wellhouse  
 with  name 'abfluss' 'rohr' 'rohre' 'abflussro' 'zwei' 'zwoelfzoe',  
       dekl 1,  
       short_name "Abflussrohr",  
       adj "zwölfzöllig",  
       article "zwei",  
       description "Sie sind zu eng zum Durchschlufen.  
                    Der einzige Ausgang ist im Westen.",  
 has   neuter pluralname scenery;

Ein weiteres Beispiel: Die Apfelblueten in Eden.

proper
kennzeichnet den Namen des Objekts als Eigennamen, so dass nie ein Artikel davor gesetzt wird.
scenery
kennzeichnet ein Dekorationsstück: Ein solches Objekt ist automatisch static und wird nicht mit in die Ausgabe von ##Look aufgenommen (weil es in der description des übergeordneten Objekts, i.d.R. des Raums, schon erwähnt wurde).
scored
vergibt Punkte: bei einem Raum ROOM_SCORE Punkte für das erste Betreten, bei einem anderen Objekt OBJECT_SCORE Punkte für das erste An-sich-nehmen.
static
macht ein Objekt unbeweglich, d.h. unempfindlich gegenüber ##Remove, ##Turn, ##Pull, ##Push und ##Take.
supporter
kennzeichnet ein Objekt, auf das man mit ##PutOn Sachen draufstellen (und wieder wegnehmen) kann. Es reagiert auf ##Receive und ##LetGo.
switchable
ist ein Objekt, das ein- und ausgeschaltet werden kann. Wenn die Eigenschaften when_on und when_off gesetzt sind, dann wird das Objekt unterschiedlich beschrieben, je nachdem, ob es ein- oder ausgeschaltet ist.
talkable
kennzeichnet Objekte, die kein animate haben, die aber trotzdem gegenüber Worten empfänglich sind (z.B.: Mikrofon, hallo).
transparent
ist ein container, dessen Inhalt sichtbar ist.
visited
ist ein Raum, in dem der Spieler schon gewesen ist.
workflag
ist ein intern verwendetes Flag.
worn
zeigt an, ob ein mit clothing gekennzeichnetes Kleidungsstück gerade getragen wird.


Eigenschaften (properties) von Objekten

Properties sind das eigentliche Fleisch der Objekte. Es gibt common properties, die alle Objekte von der Klasse Object geerbt haben. Daneben kann jedes Objekt weitere properties besitzen, die einfach in dem mit with eingeleiteten Teil der Objektdefinition (oder der Klassendefinition) zwischen den anderen properties definiert werden. Common properties sind für jedes Objekt definiert, d.h. ein (lesender) Zugriff ist möglich; ein schreibender aber nur, wenn sie in der Objektdefinition explizit belegt worden sind. Alle nachfolgenden properties der library sind common; additiv sind sind nur die, bei denen es angegeben ist. Wenn nicht anders angegeben, können die properties anstelle eines anderen Datentyps (in der Regel eines Objekts oder eines als Nachricht an den Spieler auszugebenden String) eine Routine enthalten, die einen solchen Datentyp zurückgibt oder einen String ausgibt.

add_to_scope
Objekte, die automatisch zusammen mit dem definierten Objekt in (und aus) dem Blickfeld (scope) geraten. Hier steht entweder eine Liste von einzelnen Objekten oder eine Routine, in der die einzelnen Objekte mit AddToScope() oder ScopeWithin() ins Blickfeld bewegt werden.
adj (deutsche Besonderheit)
enthält ein oder mehrere Adjektive (mehrere Adjektive als Liste, jedes in eigenen Anführungszeichen), die das Objekt im auszugebenden Text näher beschreiben. Sie werden mitdekliniert. Beachte: Es empfiehlt sich, solche Adjektive im name-property zu wiederholen; der Parser ,,schaut'' nur in name, nicht in adj.
after (additiv)
Eine Routine, die für alle erfolgreichen Aktionen der Klasse 2 aufgerufen wird, die in einem Raum stattfinden oder mit dem Objekt als noun ausgeführt werden (z.B. ##Take Apfel landet in der after-Routine des Apfels und des Raums, in dem die Aktion stattfindet; aber nur dann, wenn der Apfel tatsächlich genommen werden konnte!). Zum Format siehe 3.1.4. Rückgabewert ist entweder false (die Library arbeitet weiter und gibt die vordefinierte Nachricht aus) oder true (keine weitere Ausführung, was unterstellt, dass die after-Routine schon alles erledigt hat).
article
hier steht ein objektspezifischer unbestimmter Artikel, der statt ,,ein'' verwendet werden soll, wenn das Objekt (z.B. eine Flüssigkeit) nicht zählbar ist (z.B. ,,viel'', ,,wenig'' ...) oder ein leerer String, was bedeutet, dass nie ein unbestimmter Artikel ausgegeben wird. Mit der Konstante definit kann die Ausgabe eines bestimmten Artikels erzwungen werden. Beachte: Für Objekte mit dem Attribut proper wird dieser Eintrag ignoriert; bei Objekten mit dem Attribut pluralname ist er nicht vonnöten (vor diesen setzt die Library nie ein ,,ein'' ein ;-). Für ein komplett anderes Beispiel siehe den Inkurs bei pluralname 3.2.6.
articles
ein array mit den Artikeln des Objekts (in der deutschen Library obsolet)
before (additiv)
Eine Routine, die für alle Aktionen aufgerufen wird, die in einem Raum stattfinden oder mit dem Objekt als noun ausgeführt werden (z.B. ##Take Apfel landet in jedem Fall in der before-Routine des Apfels und des Raums, in dem die Aktion stattfindet und die Routinen haben die Chance, zu entscheiden, ob der Apfel gegessen werden kann oder nicht). Zum Format siehe 3.1.4. Rückgabewert ist entweder false (die Library arbeitet weiter, prüft, ob die Aktion evtl. Erfolg haben, durchgeführt werden und ins after-Stadium gelangen kann und gibt die vordefinierte Nachricht aus) oder true (keine weitere Ausführung, was unterstellt, dass die before-Routine schon alles erledigt hat bzw. dass nichts mehr geht.). Sonderfälle gibt es für

##Go
wenn das Objekt ein Fahrzeug ist, in dem sich die Spielerfigur befindet. Die Rückgabewerte von before haben dann folgende Wirkung:

0 (false)
lässt die Bewegung nicht zu und meldet dies.
1 (true)
bewegt Spieler und Fahrzeug.
2
lässt die Bewegung nicht zu und meldet nichts.
3
lässt die Bewegung zu und meldet nichts (dies sollte auch der Rückgabewert sein, wenn die Ortsveränderung selbst programmiert wird).
##PushDir
wenn das Objekt erfolgreich in eine Richtung (d.h. in einen anderen Raum) geschoben werden soll, muss die before-Routine AllowPushDir() aufrufen und true zurückgeben.
cant_go
Enthält für einen Raum die Nachricht, die ausgegeben wird, wenn der Spieler versucht, in eine nicht mit d_to etc. definierte Richtung zu gehen.
capacity
Die Zahl der Objekte, die ein container oder supporter fassen kann (Voreinstellung 100). Wird diese property für ein Spielerobjekt definiert, legt sie die Zahl der Objekte fest, die dieses Spielerfigur tragen kann (Voreinstellung in der Konstante MAX_CARRIED).
changing_gender
Wenn ein Objekt diese Property hat, kann hinter einzelnen Wörterbucheinträgen der name-property ein vom grammatischen Geschlecht des Objekts abweichendes female, male oder neuter angegeben werden. Wird das Objekt im Spiel mit einem so als abweichend gekennzeichneten Synonym angesprochen, wird das abweichende Geschlecht für nachfolgende Ausgaben berücksichtigt. Das vermeidet unschöne Begebenheiten wie ,,Mach' das Tor auf.'' - ,,Sie (nämlich die Tür) öffnet sich.''
d_to
und die properties für die anderen Richtungen: e_to,in_to, n_to,ne_to, nw_to,out_to, s_to,se_to, sw_to, up_to, w_to legen für Räume und begehbate Objekte fest, in welche Richtungen und wohin sie verlassen werden können. Sie sind vorbelegt mit false, was gleichbedeutend ist mit keinem Ausgang. true bedeutet ebenfalls kein Ausgang, aber ohne Benachrichtigung. Ein String ist gleichbedeutend mit keinem Ausgang, wobei der String ausgegeben wird und deshalb eine Nachricht enthalten sollte, warum es nicht weitergeht. Wenn diese properties ein Objekt, also einen anderen Raum oder eine Tür enthalten, existieren Weg und Ziel in dieser Richtung. Sie können auch eine Routine enthalten, die dann ihrerseits ein Objekt (Tür oder Raum), true, false oder einen String zurückgibt.
dekl (deutsche Besonderheit)
Die Deklination wird festgelegt durch die Eigenschaft dekl, gefolgt von einer Zahl, die angibt, zu welchem Deklinationssystem das Objekt (der short_name des Objekts) gehört. dekl 0 bedeutet, dass das Objekt gar nicht dekliniert wird.

  1. Genitiv Singular mit -s, Plural mit -e, Dativ Plural mit -en: der Tag, das Jahr
  2. Genitiv Singular mit -s, Dativ Plural mit -n: der Apfel, das Segel
  3. Genitiv Singular mit -s, Plural mit -en: der Staat, das Auge
  4. Genitiv Singular mit -s, Plural mit -er, Dativ Plural mit -ern: der Wald, das Bild
  5. Genitiv Singular mit -s, Plural mit -s: der Opa, das Deck
  6. Nominativ Singular ohne Endung, in allen anderen Fällen -en: der Mensch
  7. Plural mit -e, Dativ Plural mit -en: die Kraft
  8. nur im Dativ Plural mit -en: die Mutter
  9. alle Fälle im Plural mit -en: die Frau
  10. alle Fälle im Plural mit -s: die Oma
Dekliniert wird jedes Wort im short_name, außerdem ein mit adj definiertes Adjektiv. Nicht mitdekliniert wird der mit post nachgestellte Zusatz. Umlautungen im Plural (Apfel->Äpfel) kann die Library nicht.

daemon
Eine Hintergrundroutine (Dämon), die in jedem Spielzug einmal ausgeführt wird, wenn sie aktiv ist. Der daemon eines OBJEKTS wird aktiviert mit StartDaemon(OBJEKT) und angehalten mit StopDaemon(OBJEKT).
describe (additiv)
eine Routine, die vor description aufgerufen wird (und regelmäßig besondere Zusätze zur Beschreibung ausgibt). Ist der Rückgabewert false, macht die Library mit der description weiter, ist er true, wird die description nicht mehr ausgegeben.
description
enthält die ausführliche Beschreibung eines Raums oder die mit ##Examine abfragbare Beschreibung eines anderen Objekts.
door_dir
enthält eine der Richtungen d_to etc. (oder eine Routine mit diesem Rückgabewert) und gibt damit für Türen an, in welche Richtung (hinein) sie führen, d.h. wohin man gehen muss, um in die Tür zu kommen. Auch die Objekte d_obj etc. des compass können mit door_dir umgeleitet werden.
door_to
legt fest, ob und wohin es aus einer Tür heraus geht. Mögliche Inhalte wie d_to.
each_turn (additiv)
Eine Routine, die nach jedem Zug aufgerufen wird, solange das Objekt im Blickfeld (scope) des Spielers ist.
found_in
legt für Schiebekulissen (floating objects), die sich mit dem Spieler von Raum zu Raum bewegen, fest, in welchen Räumen sie zu sehen sind. Es enthält entweder eine Liste von Räumen, un denen die Kulisse vorhanden sein soll und von Objekten, in deren Gegenwart sie vorhanden sein soll; oder aber eine Routine, die true liefert, wenn die Kulisse da sein soll und false, wenn nicht. Ist das Attribut absent gesetzt, bleibt found_in ohne Wirkung.
grammar
eröffnet die Möglichkeit, Objekten mit den Attributen animate oder talkable eine eigene, von der allgemeinen Grammatik der Library abweichende Grammatik zu geben (Standardbeispiel: der mit Sprachbefehlen steuerbare Navigationscomputer interpretiert ,,HAL, nimm Kurs auf Jupiter'' nicht als ##Take-Befehl, sondern als besondere Anweisung). Die Routine kann auf den Variablen verb_word (das vom Parser als Verb erkannte Wort) und verb_wordnum (seine Position in der Eingabe) aufbauen. Für den Rückgabewert gibt es mehrere Möglichkeiten:

false
nichts gefunden, der Parser soll alleine weitermachen;
true
alles erledigt, action, noun und second gesetzt;
'Verb'
Ein Verb (sein Wörterbucheintrag), dessen Grammatikzeilen der Parser verwenden soll (wenn z.B. im obigen Beispiel ,,Kurs'' ein Objekt ist, das auf ##SetTo reagiert, könnte man 'stell' zurückgeben);
-'Verb'
(der negative Wert des Wörterbucheintrags): wie 'Verb' verfahren, aber anschließend die normalen Grammatikzeilen für das tatsächlich geschriebene Verb (verb_word) prüfen.
initial
Für einen Raum: Die Beschreibung bei Ankunft des Spielers in diesem Raum. Für ein Objekt: Die Beschreibung des Objekts in der Raumbeschreibung solange das Objekt nicht moved hat. Sollte für Türen, Container und switchable Objekte nicht verwendet werden (siehe stattdessen unten when_closed etc.).
inside_description
Die Raumbeschreibung, wenn sich der Spieler in diesem Objekt aufhält.
invent
Hier kann nur eine Routine stehen, die dann bei Erstellung eines Inventars zweimal aufgerufen wird (mit der Variablen inventory_stage auf 1 oder auf 2). Beim ersten Aufruf ist für das Objekt noch nichts ausgegeben, die Routine kann false zurückgeben und sich nicht einmischen oder den Inventareintrag vollständig ausgeben und true zurückgeben. Der zweite Aufruf erfolgt, wenn die Library schon den Namen des Objekts ausgedruckt hat (,,eine Taschenlampe''); die Routine kann dann Zusätze schreiben (,,kurz vor dem Erlöschen'') und true (Schluss des Eintrags, keine weitere Ausgabe) oder false zurückgeben (die Library macht weiter).
life (additiv)
Eine Dispatcherroutine, die ausschließlich bei animate-Objekten gebraucht wird und wie eine before-Routine aufgebaut ist, jedoch ausschließlich Regeln für die speziellen Aktionen ##Attack, ##Kiss, ##WakeOther, ##ThrowAt, ##Give, ##Show, ##Ask, ##Tell, ##Answer, ##Order enthält.
list_together
steuert, ob das Objekt in Listen (Inventar, Raumbeschreibungen ) zusammen mit anderen ähnlichen Objekten in einer Gruppe zusammengefasst wird: Enthält es eine Zahl, werden alle Objekte mit dieser Zahl zusammengefasst. Enthält es einen String (z.B. ,,Brücken'') werden alle Objekte mit diesem String zusammengefasst und eine Zeile mit der Anzahl und dem String vorangestellt (,,Sieben Brücken:'').
Komplizierter wird es mit einer Routine: Diese wird zweimal aufgerufen, wobei die Variable
name (additiv)
enthält ein oder mehrere Wörter (in Hochkommata), die in das Wörterbuch des Parsers eingetragen werden und unter denen der Parser das Objekt wiedererkennt. Hier werden der kleine rostige und der große silberne Schlüssel auseinandergehalten. name ist ein array aus Wörterbucheinträgen, eine Routine kann hier nicht stehen (dafür gibt es parse_name).

Umlaute und ß müssen hier in ae oe ue und ss aufgelöst werden, sonst schluckt der Parser die Wörter nicht!

Falls Synonyme ein anderes grammatisches Geschlecht als das eigentliche Objekt aufweisen, kann dieses Geschlecht (male/female/neuter) ohne Hochkomma hinter dem jeweiligen Synonym angegeben werden. Das Objekt muss in diesem Fall die Property changing_gender besitzen. So wird sichergestellt, das das Spiel das korrekte Pronomen verwendet und auf: ,,Nimm die Frucht'' mit ,,Du hast sie nicht.'' und nicht etwa mit ,,Du hast ihn [nämlich den Apfel] nicht.'' antwortet.

Für Räume soll name anderes bewirken: in der Beschreibung der Szenerie verwendete Wörter werden dem Parser bekannt gemacht, um häßliche Meldungen á la Ich-sehe-das-Objekt-nicht-das-ich-dir-eben-erst-beschrieben-habe zu vermeiden und durch ,,Das ist nicht wichtig'' o.ä. zu ersetzen.

Das funktioniert leider in der deutschen Fassung nur eingeschränkt, nämlich ohne Berücksichtigung der Artikel: ,,Untersuche Raum'' führt zu der als SCENERY_PEdafür vorgesehenen Nachricht. ,,Untersuche den Raum'' aber zur unerwünschten Fehlermeldung CANTSEE_PE.

number
Frei zur beliebigen Verwendung.
orders
Eine Dispatcherroutine eines Objekts mit animate oder talkable. Hier wird festgelegt, wie dieses Objekt auf Befehle (,,Eva, gib mir den Apfel'') reagiert.
parse_name
enthält eine Routine, die die Arbeit des Parsers unterstützt: Sie sollte mit NextWord() die Eingabezeile wortweise lesen und ihr Ergebnis (Zahl der passenden Wörter der Eingabe) zurückmelden. Findet sie dabei Pluralbezeichnungen 'ihres' Objekts, sollte sie die Variable parser_action auf ##PluralFound setzen. Den Eingabezeiger wn muss die Routine dabei nicht konservieren.
Wird die Routine mit parser_action==##TheSame aufgerufen, kann sie prüfen, ob die Objekte parser_one und parser_two unterscheidbar sind oder nicht.
Mögliche Rückgabewerte sind:

false
Die Eingabe passt nicht auf das Objekt.
n >= 1
Die Zahl der übereinstimmenden Worte in der Eingabe
-1
normaler Aufruf: Die Aufgabe wird an den Parser zurückgegeben. Aufruf mit ##TheSame: Die Objekte sind nicht unterscheidbar.
-2
Aufruf mit ##TheSame: Die Objekte sind verschieden.
plural
Die Pluralbezeichnung eines mehrfach vorkommenden Objekts, z.B. "Kieselsteine".
post (deutsche Besonderheit)
Ein nachgestellter Namensbestandteil, der nicht dekliniert wird, z.B.: die Wasserpfeife des Großwesirs
react_after
Eine Dispatcherroutine, die im before-Stadium aufgerufen wird, wenn das Objekt im Blickfeld (scope) ist.
react_before
Eine Dispatcherroutine, die im after-Stadium aufgerufen wird, wenn das Objekt im Blickfeld (scope) ist.
short_name
Der - auszugebende - Name des Objekts im Singular. Mit dekl muss noch angegeben werden, ob und wie er dekliniert werden soll. Für Pluralobjekte ist das Attribut pluralname zu setzen.
suffixes
enthält ein Array oder eine Routine, die unregelmäßige Deklinationsendungen angibt (dekl muss auf 0 gesetzt sein). Ein Array besteht aus 4 Strings für die Endungen der 4 Fälle, eine Routine bekommt als ersten Parameter den Fall (als eine der Konstanten Nom Gen Dat oder Akk) übergeben.
short_name_indef
Der short_name, wenn er mit einem unbestimmten Artikel benutzt wird (in der deutschen Library obsolet)
time_left
Der aktuelle Stand des Timers. Beachte: Der Startwert wird nicht hier, sondern mit der Routine StartTimer() zugewiesen.
time_out
Die Routine, die ausgeführt wird, wenn der Timer des Objekts abgelaufen ist.
when_closed, when_open
Unterschiedliche zusätzliche Beschreibungen für eine Tür oder einen container. Sie werden nur zusammen mit der ausführlichen Beschreibung des Raumes ausgegeben (d.h. bei ##Look).
when_off, when_on
Unterschiedliche zusätzliche Beschreibungen für ein wegen switchable ein- und ausschaltbares Objekt. Sie werden nur zusammen mit der ausführlichen Beschreibung des Raumes ausgegeben (d.h. bei ##Look).
with_key
Name eines Objekts, in der Regel eines Schlüssels, mit dem ein Objekt mit dem Attribut lockable vom Spieler auf- und zugesperrt werden kann.


Aktionen und Verben

``Verben'' sind die - deutschen - Verben im grammatischen Sinn, die der Parser versteht und in Aktionen umsetzt. Ein Verb kann verschiedene Aktionen auslösen, je nachdem, wie der vom Verb eingeleitete Satz aussieht, insbesondere, welche Präpositionen er aufweist.

``Aktionen'' sind die - in englischer Sprache definierten und hier mit zwei führenden Gattern versehenen - Befehle, die das Spielprogramm ausführt und die im Programm verwendet werden können. Eine Aktion kann durch viele verschiedene Verben ausgelöst werden.

Definition von Aktionen

Eine Aktion mit dem Namen ##AKTIONSNAME wird definiert, indem man eine - selbständige - Routine mit dem Namen AKTIONSNAMESub schreibt und wenigstens ein Verb so definiert, dass es diese Aktion auslöst.

Für eine Aktion der Klasse 3 - die im allgemeinen ,,nichts'' macht, als Text auszugeben - genügt eine Routine mit einem Befehl, der eine passende Standardantwort ausgibt, z.B. für eine Aktion ##Xyzzy:

[ XyzzySub; 
    "Nichts geschieht."; 
];
Eine Aktion der Klasse 2, die tatsächliche Veränderungen bewirkt; Objekte bewegt oder ihren Zustand verändert etc., muss - falls die beabsichtigte Veränderung stattgefunden hat, der Befehl des Spielers also ,,erfolgreich'' war - die Routine AfterRoutines() aufrufen; typischerweise als vorletzte Anweisung wie folgt:

if (AfterRoutines()) rtrue; 47
und danach - als letzte Anweisung - den für den erfolgreichen Abschluss der Aktion standardmäßig vorgegebenen Text ausgeben (der auf diese Weise übersprungen wird, wenn eine after-Routine true zurückgibt). So erst wird das für die properties after und react_after beschriebene Verhalten erzielt.

Aufruf von Aktionen

Aktionen kann nicht nur der Spieler auslösen, sondern auch die Autorin. Dafür wird der Name der Aktion - ohne Gatter - optional gefolgt von ein oder zwei Objekten (dem noun und dem second der Aktion) - in spitze Klammern eingeschlossen:

<Dig Acker Spaten> ;  
oder  
<<Dig Acker Spaten>>;
Die zweite Variante (mit Doppelklammern) beinhaltet ein implizites return true; nach Ausführung der Aktion.

Beachte: Der Parser wird dabei umgangen. Ob die Aktion Sinn macht, insbesondere ob die Objekte überhaupt im Blickfeld (scope) sind, muss hier die Autorin entscheiden.


Definition von Verben

Sie besteht aus dem Schlüsselwort verb gefolgt von einer Liste von Synonymen (als Stamm der Befehlsform, d.h ohne auslautendes ,,e'', in Hochkommata gefasst); gefolgt von einer oder mehreren Grammatikzeilen. Jede Grammatikzeile wird eingeleitet von einem Asterisk * als Platzhalter für das Verb oder eines der Synonyme, optional gefolgt von einem Satz aus Literalen (die meist Präpositionen darstellen) und anderen Tokens, die die Objekte des Satzes repräsentieren; danach einem Pfeil -> gefolgt vom Namen der auszulösenden Aktion und eventuell dem Schlüsselwort reverse. Der Parser geht später die Grammatikzeilen von oben nach unten durch und hält beim ersten erfolgreichen Vergleich an.

Ein (nicht nachahmungsfähiges) Beispiel:

verb 'tret' 'tritt' 'steig' 'kletter' 
    *                       -> VagueGo 
    * 'in' container        -> Enter 
    * 'auf' supporter       -> Enter 
    * 'auf'/'ueber' noun    -> Climb 
    * 'mit' held 'auf' noun -> Climb reverse;
Der Schrägstrich zwischen auf und über bedeutet, dass diese zwei Präpositionen alternativ stehen können. Die Angabe von reverse macht nur Sinn bei Grammatikzeilen, die eine Aktion mit einem direkten und einem indirekten Objekt verwenden: Normalerweise folgt erst das erste, i.d.R. direkte Objekt (das noun) dann das zweite Objekt (second). Ist aufgrund des verwendeten Satzbaus die Reihenfolge umgekehrt, muss reverse angegeben werden.

Metaverben - die nicht als Spielzüge zählen, keine Zeit verstreichen lassen und kein 'each turn' auslösen - werden definiert, indem das Schlüsselwort meta nach verb und vor der Synonymliste eingefügt wird.


Token (Zeichen) der Grammatik

'TEXT_IN_HOCHKOMMATA'
eben dieses Textliteral; mehrere Literale können mit einem Schrägstrich verbunden werden und gelten dann alternativ.
noun
jedes beliebige Objekt im Blickfeld (scope)
held
Ein Objekt, das die ausführende Person hält (das muss nicht notwendigerweise der Spieler selbst sein!)
multi
ein oder mehrere Objekte im Blickfeld (scope)
multiheld
ein oder mehrere Objekte, die die ausführende Person hält
multiexcept
ein oder mehrere Objekte im Blickfeld (scope), außer dem angegebenen Objekt
multiinside
ein oder mehrere Objekte im Blickfeld (scope), die innerhalb eines anderen Objekts sind
NAME_EINES_ATTRIBUTS
jedes beliebige Objekt im Blickfeld (scope), bei dem dieses Attribut gesetzt ist
creature
jedes beliebige Objekt im Blickfeld (scope) mit dem Attribut animate
noun=NAME_EINER_ROUTINE()
Jedes Objekt im Blickfeld, für das die Routine den Rückgabewert true liefert. Das noun wird an die Routine übergeben in der globalen Variable noun. Häufig von der Library benutzt in noun=ADirection, das prüft, ob das Objekt des Satzes eine gangbare Richtung darstellt.
scope=NAME_EINER_ROUTINE()
Jedes Objekt im durch die Routine definierten Blickfeld (für ein Beispiel siehe GinfoG.h). Die Routine wird dreimal aufgerufen, wobei die Variable scope_stage nacheinander auf 1, 2 und 3 gesetzt ist. In den verschiedenen Stadien sollte sie arbeiten wie folgt:
  1. Rückgabewert ist true, wenn ann dieser Stelle wie in einem multi...-token mehrere Objekte akzeptiert werden sollen, false, wenn nur ein Objekt zulässig ist.
  2. mit den Routinen ScopeWithin() und PlaceInScope() werden Objekte ins Blickfeld gesetzt. Rückgabewert ist true, wenn nur diese Objekte im Blickfeld sein sollen; false, wenn danach noch die Library alle Objekte hinzunehmen soll, die ohnehin im Blickfeld sind (es ist unschädlich, wenn auf diese Weise ein Objekt zweimal aufgeführt wird).
  3. das Objekt wurde nicht erkannt; die Routine darf eine eigene Fehlermeldung ausgeben.
number
Eine Zahl zwischen 1 und 10.000, für Zahlen bis zwanzig auch ausgeschrieben.
special
eine Zahl (wie number) oder ein (einzelnes) Wort.
NAME_EINER_ROUTINE()
jeder Text, den diese Routine akzeptiert. Die Routine muss den Eingabestrom an dieser Stelle selbständig weiter parsen und einen von mehreren möglichen vordefinierten Werten zurückgeben (siehe DM$^{4}$, p. 226 f.)
topic
jeder beliebige Text
hinein
Überliest 'hinein' und 'rein'.
heraus
Überliest 'heraus', 'herunter' und 'raus'.
xhinweg
Überliest 'weg', 'fort', 'hinweg' und 'hinfort'.
xhinein
Liest 'hinein' und 'rein' und ersetzt es mit dem zuletzt benutzten Objekt .
xheraus
Liest 'heraus', 'herunter' und 'raus' und ersetzt es mit dem zuletzt benutzten Objekt .
xdamit
Liest 'damit' etc. und ersetzt es mit dem zuletzt benutzten Objekt.
xdarauf
Liest 'darauf', 'drauf', 'herauf' und 'drauf' und ersetzt es mit dem zuletzt benutzten Objekt.


Umdefinieren von Verben

Neue Synonyme lassen sich mit verb = einfach hinzufügen und ,,erben'' alle bereits definierten Grammatikzeilen:

verb 'NEUES_SYNONYM' 'NOCH_EIN_SYNONYM' ... = 'SCHON_DEFINIERTES_VERB';
Soll die Grammatik eines bereits definierten Verbs abgeändert werden, können neue Grammatikzeilen mit dem Schlüsselwort extend definiert werden:

extend 'SCHON_DEFINIERTES_VERB' MODUS
gefolgt von den neuen Grammatikzeilen. MODUS ist dabei eines der Schlüsselwörter

first
Die neuen Zeilen werden vor allen anderen eingefügt.
last
Die neuen Zeilen werden erst nach allen schon vordefinierten Zeilen für dieses Verb eingefügt.
replace
Die bisher für dieses Verb definierten Zeilen werden gelöscht und durch die neuen Zeilen ersetzt.
Obwohl hier nur ein Verb und keine Synonymliste angegeben werden kann, gilt die Definition für alle Synonyme des nach extend angegebenen Verbs. Will man die Grammatik nur für bestimmte Synonyme aus der Liste erweitern, schreibt man:

extend only 'EIN_VERB' 'NOCH_EIN_VERB' MODUS
wiederum gefolgt von den neuen Grammatikzeilen.



Footnotes

... COLOR="#0000ff">initialise().44
und nicht initialize!
...Artikel45
In der englischen Library gibt es nur die Regeln (the) und (a) sowie (IsOrAre).
... Objekt46
die Wasserrohre aus dem Brunnenhaus von ,,Adventure'', Crowther/Wood 1972.
...if (AfterRoutines()) rtrue; 47
auch return AfterRoutines(); sollte funktionieren.

next up previous contents index
Next: Und es geschah also: Up: Der Baum der Erkenntnis: Previous: Inform
Frank Borger
2003-05-02