Niflheim/Inform - German Inform Library
Author: Ralf Herrmann
Keywords: inform

## German Inform Library

Die German Inform Library, im weiteren kurz ginform genannt, ist eine Bibliothek zur Erarbeitung deutschsprachiger Adventures (Interactive Fiction) mit Graham Nelsons Inform Compiler. Sie wird seit Dezember 1996 entwickelt und verbessert und stellt dem IF Autor einige mächtige Werkzeuge bereit:

- Eine automatische Deklination der Objektnamen
- Eine ausgefeilte »ß« Handhabung (sie passt sich selbsttätig an die Rechtschreibung des Spielers an)
- Eine einfache Objekterkennung durch Mustervergleich mit den Stammformen von Substantiven und Adjektiven
- Unterschiedliche Anreden: »Was willst Du tun?« oder »Was wollt Ihr tun?«

Wer nur ein mit ginform entwickeltes Adventure spielen will, der braucht weder diese Anleitung lesen noch ginform zu installieren. Die Bibliothek richtet sich einzig und allein an IF Autoren; für diese sind vielleicht auch folgende Seiten interessant:

- Eine Alternative zu ginform: Toni Arnolds Inform auf Deutsch
- Ein Überblick über IF im Allgemeinen und Autorensysteme im Besonderen findet sich bei Interactive-Fiction.de

### Copyright und Disclaimer

German Inform Library: Documentation
Copyright (C) 1997, 1998, 1999 Ralf Herrmann
$Release: 6.9.1$
$Revision: 1.8 $
$Date: 1999/08/01 22:06:28 $
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

### Technisches vorab

Um ein deutsches Adventure zu compilieren muß beim Compileraufruf die maximale Zahl der Verben hochgesetzt als auch die Sprache angegeben werden. Angenommen alle Library Dateien (Standard und ginform) lägen im Verzeichnis lib, sähe der Aufruf so aus:

    inform $MAX_VERBS=200 $MAX_ZCODE_SIZE=50000 +language_name=German +lib lib/advent.inf

ginform reserviert die Variablen @17 bis @31 für den eigenen Gebrauch. Dies sollte aber keine allzu große Einschränkung für den Autor darstellen, da diese Variablen eher selten gebraucht werden.

### Rechtschreibung und Umlaute

Aufgrund unterschiedlicher Handhabung des »ß« vor und nach der Reform der deutschen Rechtschreibung, sowie seiner Nichtanwendung in der Schweiz als auch den Problemen mancher Interpreter mit Umlauten erfordern und verdienen diese Sonderzeichen eine besondere Behandlung.
In der Eingabe werden die Umlaute immer durch ae, oe, ue und ss ersetzt, woraus folgt, dass im Wörterbuch eben diese Ersetzungen zu verwenden sind (dies erspart den Eintrag aller umgelauteten und nichtumgelauteten Schreibungen). Für die Ausgabe greift ginform auf verschiedene Variablen zurück, so dass Umlaute und das »ß« gemäß der vom Spieler gewünschten Rechtschreibung gewählt werden.

Variable | Deutsch | Reform | Schweiz | Ohne Umlaut
--- | --- | --- | --- | ---
@31 | ß | ss | ss | ss
@30 | ß | ß | ss | ss
@28 | ä | ä | ä | ae
@27 | Ä | Ä | Ä | Ae
@26 | ö | ö | ä | oe
@25 | Ö | Ö | Ö | Oe
@24 | ü | ü | ü | ue
@23 | Ü | Ü | Ü | Ue

Ein IF Autor sollte ebenfalls diese Variablen anstelle Informs üblicher Syntax, also »@28« anstatt »@:a« benutzen, damit sein Spiel sich den Erfordernissen und Wünschen des Spielers anpasst.

    Object river
      with
        short_name		"gr@24nen Flu@31",
        name		'fluss' 'gruen',
        description		"Das Wasser des Flusses glei@30t in allen T@26nen
    			von Gr@24n, was dem Flu@31 seinen Namen eintrug.",
      has
        male;

- Das Wasser des Flusses gleißt in allen Tönen von Grün, was dem Fluß... (alte Regeln)
- Das Wasser des Flusses gleißt in allen Tönen von Grün, was dem Fluss... (Rechtschreibreform)
- Das Wasser des Flusses gleisst in allen Tönen von Grün, was dem Fluss... (Schweizer Regeln)
- Das Wasser des Flusses gleisst in allen Toenen von Gruen, was dem Fluss... (ohne Umlaute)

### Anrede

Über die Konstanten ANREDE_DU und ANREDE_IHR wird gesteuert, wie der Spieler ageredet wird, in freundlichem Du oder respektvollem Ihr. Soll die Anrede, entgegen der Regeln für Briefe, klein geschrieben werden, so kann dies mit der ANREDE_DU_KLEIN eingestellt werden.

### Genus

Allen Objekten ist ihr grammatikalischer Genus (Maskulin, Feminin, Neutrum) mittels der Attribute `male`, `female` und `neuter` zuzuweisen, damit die Library diese richtig deklinieren bzw. den Artikel wählen kann.

### Präpositionen

Mit einem Artikel verschmolzene Präpositionen (ins, aufs, vom) in der Eingabe werden in die Präposition und den Artikel zerlegt. Dies ist bei der Wahl der Eigenschaft `name` eines Objektes zu beachten, da etwa aus einer »Fliege im Bernstein« »Fliege in dem Bernstein« wird.

### Verben

Verben bei denen im Imperativ die Endung -e entfallen kann, müssen ohne diesesn Suffix in die Grammatik aufgenommen werden. Gleichfalls müssen Umlaute, wie bereits erwähnt, durch ihre Umschreibungen ae, oe, ue und ss ersetzt werden. Dadurch reduziert sich etwa der Eintrag für küsse (küsse, küss, küß, kuesse, kuess, kueß) auf kuess.

### Eigenschaft name

Als Name eines Objektes (Eigenschaft) sind die Stammformen der Adjektive einzutragen, etwa schwarz bei einer schwarzen Truhe, so die Library die Endungen -er, -en, -em, -es und -e abschneidet. Weiterhin sind Umlaute in ihrer Umschreibung als ae, oe, ue und ss anzugeben. Dies erspart das Eintragen von mehreren Formen (insbesondere Akkussativ und Dativ) für die Adjektive.

    Object marsian
      with
        short_name		"kleinen gemeinen Gr@24nling vom Mars",
        declination		true true true false false,
        name		'klein' 'gemein' 'gruenling' 'von' 'dem' 'mars',
      has
        male;

### Eigenschaft short_name

Ist `short_name` ein String, so muß er im bestimmten Akkussativ angegeben sein, damit die Library ihn richtig deklinieren kann. Also das alte Fass und nicht ein altes Fass! Ist er eine Routine, so muß diese den Namen entsprechend der Variablen `short_name_case` und `indef_mode` ausgeben. Man beachte hierbei, daß für den Fall `indef_mode == NULL` kein Artikel (starke Beugung) ausgegeben wurde.

    Object stoff
      with
        short_name
          [;
            if (indef_mode == NULL)		!* kein Artikel
              switch (short_name_CASE)
                {
                  CASE_NOM: "weicher Stoff";
    	      CASE_GEN: "weichen Stoffes";
    	      CASE_DAT: "weichem Stoff";
    	      CASE_AKK: "weichen Stoff";
                };
            if (indef_mode == true)		!* unbestimmter Artikel vorangestellt
              switch (short_name_CASE)
                {
                  CASE_NOM: "weicher Stoff"
                  CASE_GEN: "weichen Stoffes";
    	      CASE_DAT: "weichen Stoff";
    	      CASE_AKK: "weichen Stoff";
                };
            switch (short_name_CASE)	!* bestimmter Artikel vorangestellt
    	  {
    	    CASE_NOM: "weiche Stoff";
                CASE_GEN: "weichen Soffes";
                CASE_DAT: "weichen Stoff";
                CASE_AKK: "weichen Stoff";
              };
          ],
      has
        male;

Die Routinen der Library zur automatischen Deklination sind recht ausgereift, so daß es selten notwendig sein sollte, dies alles selbst anzugeben; mehr dazu im Abschnitt Deklination.

### Eigenschaft enter_type

Für ein betretbares Objekt, Aufzug, Bank, Bett, etc., kann mittels der Eigenschaft `enter_type` die Ausgabe der Enter/GetOff/Exit Aktion angebpasst werden:

    Object sessel
      with
        short_name
          "bequemen Sessel",
        enter_type
          enter_sitze,
      has
        male enterable;

Mögliche Werte sind: `enter_tritt, enter_sitze, enter_steige, enter_liege, enter_klettere, enter_gehe, enter_springe`

### Eigenschaft article

Aufgrund einer Unzulänglichkeit des Parsers muß ein Artikel, sofern er sich abhängig vom Kasus ändert, als Routine deklariert werden. Allerdings kann diese auf die Routinen zur automatischen Deklination zurückgreifen.

### Eigenschaft declination

Zwar ist die automatische Deklination bereits recht ausgereift, doch gibt es Fälle bei denen der Autor der Library helfen muß: vornehmlich bei Namen bei denen nicht alle Bestandteile zu deklinieren sind, bei Verwendung des Genitivs (worauf die ginform verzichtet) oder bei substantivierten Adjektiven. Jedes Wort des `short_name` korrespondiert mit einem Eintrag der Eigenschaft `declination`, der bestimmt auf welche Weise es dekliniert wird:

true:
  Automatische Deklination
false:
  Keine Deklination
none
  Ab diesem Wort keine Deklination mehr (entspricht: false false false ... false)
A0:
  (Substantiviertes Adjektiv) Dekliniere wie ein Adjektiv
S1_es:
  (Singular, Substantiv) Füge im Genitiv ein "es" an
S1_s:
  (Singular, Substantiv) Füge im Genitiv ein "s" an
S1_ses:
  (Singular, Substantiv) Füge im Genitiv ein "ses" and
S2_en:
  (Singular, Substantiv) Streiche im Nominativ die Endung "en" (Mensch-en)
S2_en:
  (Singular, Substantiv) Streiche im Nominativ die Endung "n" (Kunde-n)
S3:
  (Singular, Substantiv) Keine Änderung des Suffix
P1:
  (Plural, Substantiv) Füge im Dativ ein "n" an
P2:
  (Plural, Substantiv) Füge im Dativ ein "n" an
P3:
  (Plural, Substantiv) Keine Änderungen
P4:
  (Plural, Substantiv) Füge im Dativ ein "n" an
P5:
  (Plural, Substantiv) Keine Änderungen

Die eigene Angabe der Deklination bei Adjektiven ist nicht vorgesehen. Sie kann nur durch "false" ganz unterbunden werden.

### Nutzen der automatischen Deklination

Die Library kann den Namen eines Objektes nur dann deklinieren, wenn der `short_name` als String vorliegt; wird er dagegen als Routine spezifiziert obliegt dies dem Autor. Doch kann dieser auf folgende Routinen der Library zurückgreifen:

PrintAdjective(o, s, p);
  Dekliniert das Wort wie ein Adjektiv.
PrintSubstantive(o, s, p);
  Dekliniert das Wort wie ein Substantiv.
PrintName(o, s);
  Dekliniert den gesamten Namen (beachtet die Eigenschaft `declination`)

Sollte die Fehlermeldung Library Runtime Error 15 auftreten, so wurde für s kein String übergeben! Bei allen Aufrufen steht o für das Objekt, s einen String und p ein Flag ob das Wort im Plural steht.

    Object papier
      with
        short_name
          [;
            if (self hasnt general)
              PrintName(self, "zerkn@24llte St@24ck Papier");
            else
              PrintName(self, "alte Landkarte");
          ],
        declination		true false true,
        before
          [;
            Examine:
              give self general;
    	  self.declination = true true;
    	  give self ~neuter;
    	  give self female;

    	  "Vorsichtig entfaltet und gl@28ttet Ihr das Papier und erkennt: es ist
              eine alte Landkarte";
        has
          neuter;

### Ausgabehilfen

Folgende Routinen können über den `print (routine) obj;` Befehl eingesetzt werden:

(der) (dem) (des) (den)
  der Eimer, dem Eimer, des Eimers, den Eimer
(cDer) (cDen)
  Der Eimer, Den Eimer
(xder) (xdem) (xdes) (xden)
  Der, Dem, Des, Den (immer gefolgt von einem Leerzeichen)
(ein) (einem) (eines) (einen)
  ein Eimer, einem Eimer, eines Eimers, einen Eimer
(er) (cEr)
  er, Er (bzw. sie, Sie oder es, Es)
(ihn) (ihm)
  ihn, ihm
(ist) obj
  ist (oder sind)
(im) (vom)
  im Eimer, vom Eimer
(keinen)
  keinen Eimer