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.
- 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.
- 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.
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.
- Genitiv Singular mit -s, Plural mit -e, Dativ Plural mit -en: der
Tag, das Jahr
- Genitiv Singular mit -s, Dativ Plural mit -n: der Apfel, das Segel
- Genitiv Singular mit -s, Plural mit -en: der Staat, das Auge
- Genitiv Singular mit -s, Plural mit -er, Dativ Plural mit -ern: der
Wald, das Bild
- Genitiv Singular mit -s, Plural mit -s: der Opa, das Deck
- Nominativ Singular ohne Endung, in allen anderen Fällen -en: der Mensch
- Plural mit -e, Dativ Plural mit -en: die Kraft
- nur im Dativ Plural mit -en: die Mutter
- alle Fälle im Plural mit -en: die Frau
- 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.
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.
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:
- 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.
- 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).
- 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,
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: Und es geschah also:
Up: Der Baum der Erkenntnis:
Previous: Inform
Frank Borger
2003-05-02