Programmieren, natürlich

> deutschsprachige Spiele mit Inform 7 und GerX

Jeder angehende Autor von Interactive Fiction oder anderen interaktiven Texten wie zum Beispiel elektronischen Lernmedien steht am Anfang vor der Frage: Ich möchte einen Text verfassen, der auf Anweisungen des Lesers reagiert und sich beim Lesen entsprechend formt und verändert – wie schreibe ich so etwas? Schnell wird dem Autor klar, dass zum reinen Erzähltext auch noch ein Mechanismus gehören muss, der den Dialog mit dem Leser ermöglicht. Sprich: es muss ein Computerprogramm geschrieben werden.

Das Autorensystem

Die Programmierung eines Spiels kann in einer herkömmlichen Allzweck-Programmiersprache geschehen, was jedoch mit einem sehr hohen Aufwand verbunden ist. Sämtliche Programmteile für das Textverständnis (der Parser), die Textausgabe und das Weltmodell, das grundlegende Dinge wie Behälter, Ablagen oder Kleidung simuliert, müssten völlig neu erstellt werden. Möchte ein Autor sich mehr auf seine Geschichte konzentrieren, sollte er ein speziell für sein Vorhaben ausgelegtes System benutzen, ein Autorensystem, von denen eine Vielzahl zur Verfügung steht.
Ein Großteil der interaktiven Literatur wurde und wird auf Englisch geschrieben. Die ersten Textspiele sind im angloamerikanischen Sprachraum schon Ende der 1970er Jahre programmiert worden, unter anderem auch, weil sich das Englische aufgrund seiner wenig flektierenden Beschaffenheit verhältnismäßig einfach maschinell verarbeiten lässt. Deutschsprachige Autoren, die ihre Geschichte lieber in ihrer Muttersprache verfassen möchten, können aber auf eine Auswahl moderner Autorensysteme zurückgreifen, die entweder speziell für das Erstellen deutscher interaktiver Texte geschaffen wurden oder eine Anpassung ans Deutsche erfahren haben.
Zu den Letzteren gehört das erstmals 2006 veröffentliche Autorensystem Inform 7 von Graham Nelson (kurz: I7), auf das wir uns hier konzentrieren möchten. I7 ist unserer Meinung nach für Einsteiger ohne Programmierkenntnisse sehr gut geeignet, auch wenn beim Schreiben deutschsprachiger Werke mit diesem System einige Besonderheiten zu beachten sind.

Inform 7

Inform 7 verfolgt den Ansatz des »literate programming«. Dies ist ein Terminus, den Donald Knuth als wichtigster Vertreter dieser neuen Richtung des Programmierens geprägt hat. Inform 7 unterscheidet sich von herkömmlich strukturierten Programmiersprachen in einem wesentlichen Punkt: der Programmcode besteht aus einer Teilmenge des Englischen und der Autor benutzt vollständige, grammatikalisch korrekte englische Sätze, um seine fiktive Welt und die dort geltenden Regeln zu beschreiben. Dabei sind Programmiersprache und Spielsprache eng miteinander verdrahtet. Eine einfache Definition wie

The book is a thing on the table.

erzeugt zwei Objekte mit den Bezeichnern »book« und »table«, platziert das Buch auf dem Tisch und erstellt zudem das nötige Vokabular »book« und »table«, das der Leser benutzen kann, um das Buch und den Tisch im Spiel anzusprechen. Zudem werden im angezeigten Text die Objekte als »book« und »table« dargestellt. Diese Art der Objektdefinition ist sehr elegant und intuitiv zu benutzen.

Deutschsprachige Spiele mit GerX

Beim Schreiben mit GerX , einer deutschen Spracherweiterung für I7, ist die Verzahnung von Spiel- und Programmiersprache gestört, denn es wird nur die Spielsprache übersetzt. Der interaktive Text wird sich für den Leser während des Spielens vollständig auf Deutsch darstellen, doch der Autor muss weiterhin englische Sätze benutzen. Solange nicht auch das Programm in Form von deutschen Sätzen geschrieben werden kann, muss der Autor Kompromisse eingehen. Er kann sich a) zwischen einer bisweilen als unschön empfundenen »denglischen« Mischsprache entscheiden, bei der die Bezeichner auch ins Vokabular des Spiels übernommen werden, oder b) einer »einsprachigen« Schreibweise, bei der zwar englische Bezeichner verwendet werden, die deutschen Ausgabetexte und das deutsche Vokabular jedoch gesondert angegeben werden müssen:

a) The Buch is a thing.

oder

b) The book is a thing. The printed name is "Buch". Understand "Buch" as the book.

Wir bevorzugen die Variante b), da sie einem natürlichen Englisch entgegenkommt. Der Autor muss bei der Verwendung dieser Schreibart dem System verbieten, dass der Bezeichner »book« automatisch ins Vokabular des Spiels übernommen wird, aber das lässt sich beim Schreiben ganz einfach mit zwei Anweisungen bewerkstelligen:

A thing is usually privately-named. A room is usually privately-named.

Das Beispiel Mariel

GerX bietet ein paar Besonderheiten, die wir anhand der interaktiven Kurzgeschichte Mariel erläutern möchten. Ein kleiner Hinweis: wer das Spiel noch nicht gespielt hat, sollte nicht weiterlesen, damit er sich den Spielspaß nicht verdirbt. Der Text enthält nämlich direkte Auszüge aus dem Quellcode, die schon viel vom Spielmechanismus verraten.

Dynamische Raumbeschreibungen

Inform 7 integriert dynamische Raumbeschreibungen direkt in den Ausgabetext. Wo in anderen Sprachen lange Wenn-dann-Abfragen notwendig sind, ist eine von Attributen abhängige Textausgabe in I7 fließend integriert. Das zeigt das folgende Beispiel:

The backyard is a room, north from the window, in the outdoors. "[if unvisited]Noch bist du nicht in Sicherheit, das ganze Gelände ist mit einem unüberwindbaren hohen Zaun umschlossen. Es scheint, als liegt der Vordereingang auf der anderen Seite.[paragraph break][end if]Du stehst vor einem riesigen schwarzen Gebäude mit hunderten dieser kleinen, vergitterten Fenster. Der Hinterhof ist schmutzig und verwahrlost und in allen Ecken liegt Müll.[paragraph break]Zwei Wege umrunden das Gebäude; einer führt nach Osten und einer nach Westen."

Die Anweisung [if unvisited] prüft, ob der Leser schon einmal in diesem Raum war. Wenn nicht, gibt er den ersten Teil des Textes aus, wenn doch, dann überspringt er ihn. Ebenso könnten z.B. auch Tages- und Nachtbeschreibungen von Orten unterschieden werden.

Flexible Textausgabe

Was für Raumbeschreibungen zutrifft, gilt natürlich sinngemäß auch für Objektbeschreibungen. In Abhängigkeit der Position des Betts, festgehalten in einem »either-or« Attribut, nämlich lengthways und crossways soll hier eine unterschiedliche Beschreibung aufgerufen werden. Mit »Beschreibung« ist der Text gemeint, den das Spiel ausgibt, wenn der Spieler mit dem Kommando »untersuche« einen Gegenstand näher betrachet.

The bed is either crossways or lengthways. The bed is crossways.

The description of the bed is "Das Bett ist ein dünne Liege aus Sperrholz. [if crossways]Es nimmt fast den gesamten Raum zwischen Schrank und gegenüberliegender Wand ein[otherwise]Es nimmt fast den gesamten Raum zwischen Tür und Fenster ein[end if]."

[Otherwise] trennt die beiden Beschreibungen voneinander. Hier wird gleich ein weiteres Merkmal von I7 deutlich: die gute Lesbarkeit des Codes, auch für einen Außenstehenden. Das ist ein großer Vorteil bei Co-Autorenschaften, da beide Autoren, die vielleicht unabhängig voneinander an Teilen des Projekts arbeiten, sehr schnell erkennen können, was der andere gerade so macht.

Regeln und Definitionen

Was in anderen Sprachen mühsam über viele Abfragen in vielen verschiedenen Situationen erfolgen muss, kann in I7 oft in einer einzigen Codezeile geschrieben werden.

Definition: a thing is other if it is not the player.

I7 vergibt jetzt automatisch das Attribut »other« an alle Dinge, die nicht dem Spieler entsprechen, wobei es egal ist, wie viele Dinge vom Autor erschaffen werden. Genauso gut würde folgendes funktionieren:

Definition: a thing is owned if it is carried by the player.

Der Spieler nimmt einen beliebigen Gegenstand an sich, und dieser bekommt ohne weiteres Zutun das Attribut »owned«. Die Attibute lassen sich natürlich beliebig erweitern. Inform7 setzt bei »either-or« Attributen selbst das Gegenstück:

The policeman is either convinced or suspicious. The policeman is suspicious.

Setzt man in einem beliebigen Abschnitt des Quelltexts das Attribut »convinced« für den »policeman« ein, löscht I7 automatisch das Attribut »suspicious«.

Relations

Man kann Inform7 sogar neue natürliche Sätze beibringen, die es dann im Kontext korrekt anwendet:

Knowing about relates various people to various things. The verb to know about (he knows about, they know about, it is known about) implies the knowing about relation.

Obiges Beispiel definiert eine neue »relation« »knowing about«. Sagen wir mal, wir wollen, dass der Polizist im Grunde genommen misstrauisch ist. Im Spiel wird durch verschiedene Aktionen dieses Misstrauen gesteigert oder verringert. Dazu geben wir dem Polizisten eine Zahl, die sein Misstrauen ausdrückt:

The policeman has a number called suspiciousness.
The suspiciousness of the policeman is 5.

Jetzt können wir zu einem beliebigen Zeitpunkt diese Zahl erhöhen oder verringern. Dabei halten wir fest, ob der Polizist von dem entsprechenden Umstand bereits Kenntnis hat oder nicht:

Instead of asking the policeman about "brechstange/stange":
     say "'Sie sind mit einer Brechstange aus der Klinik
ausgebrochen?' sagt der Polizeibeamte. 'Was für eine dumme Idee.'";
     if the policeman does not know about the crowbar:
          now the policeman knows about the crowbar;
          increase suspiciousness of the policeman by 2

Die eingerückte Schreibweise erhöht die Lesbarkeit. Dazu verwendet man einfach die Tabulator-Taste. Untereinander geschriebene Passagen werden zusammen abgearbeitet. Falls der Polizist noch nichts über die Brechstange weiß, erhöht sich sein »suspiciousness«-Faktor um 2.

Adjektive und Understand

Kommen wir zur deutschen Sprache. Selbstverständlich müssen für Adjektive und Substantive die im Deutschen nicht immer ganz einfachen, korrekten Deklinationen angegeben werden. Das passiert mit folgender Syntax fast wie von selbst:

The rubbish is neuter scenery in the hospital. The printed name of the rubbish is "nutzlos[^] Gerümpel[-s]". Understand "nutzlos" and "geruempel", "muell [m]" and "sachen [p]" as the rubbish. The description of the rubbish is "Lauter komplett nutzlose Sachen, die kreuz und quer im Raum verteilt sind.".

Flektierende Adjektive bekommen einfach ein [^] hinten angestellt, Substantive bei Bedarf eine Endung. Synonyme, die ein anderes Geschlecht oder eine andere Anzahl als das Hauptobjekt haben, werden kenntlich gemacht: Gerümpel ist ein Neutrum, die Synonyme »Muell« und »Sachen« werden mit den Zusätzen [m] und [p] direkt nach den Synonymen als Maskulinum (männlich) beziehungsweise als Plural (Mehrzahl) markiert.

Schon bekommt man mit dem Test-Befehl »dekliniere« die korrekte Deklination:

>dekliniere gerümpel
Das nutzlose Gerümpel, des nutzlosen Gerümpels, dem nutzlosen Gerümpel, das nutzlose Gerümpel.
Ein nutzloses Gerümpel, eines nutzlosen Gerümpels, einem nutzlosen Gerümpel, ein nutzloses Gerümpel.

Hier sieht man aber noch einen kleinen Fehler: beim unbestimmten Artikel soll natürlich »ein« wegfallen, da das Gerümpel kein Gegenstand ist, der gezählt werden kann. Abhilfe schafft:

The special indefinite article of the rubbish is NO ARTICLE.

Jetzt gibt I7 korrekt aus:

>dekliniere gerümpel
Das nutzlose Gerümpel, des nutzlosen Gerümpels, dem nutzlosen Gerümpel, das nutzlose Gerümpel.
Nutzloses Gerümpel, nutzlosen Gerümpels, nutzlosem Gerümpel, nutzloses Gerümpel.

Listen

Ein weiteres schwieriges und aufwändiges Thema für Autoren sind Listen. In GerX ist auch eine Listenausgabe für alle Kasus integriert:

instead of thinking:
     say "Hier im Raum sind [a list of visible other things with nominative].[paragraph break]"

»Visible« ist ein weiteres Attribut, das I7 verwendet. Falls ein Gegenstand in einem geschlossenen Schrank ist, ist dieser natürlich nicht »visible«, obwohl er sich sehr wohl am Ort des Spielers befindet.

Obige Codezeile gibt für jeden Raum eine komplette Liste der darin enthaltenen Gegenstände aus. Man beachte: wir haben vorher »other« so definiert, dass der Spieler ausgenommen wird. Das kommt jetzt zum Tragen:

>denk nach
Hier im Raum sind ein kleines Fenster, eine weiße Tür, nutzloses Gerümpel, eine massive Wand, ein altes Bett und ein rostiger Metallschrank.

Änderungen an der Library

Die Library kann jederzeit beliebig geändert und angepasst werden. Im nachfolgenden Beispiel implementieren wir einen Befehl zur Konversation, mit dem der Spieler sich ohne Angabe der Person automatisch an die naheliegende Person an seinem Aufenthaltsort wendet.

Vaguely asking is an action applying to one topic.
Understand "frag ueber/zu/nach [text]" as vaguely asking.
Understand "erzaehl ueber/von [text]" as vaguely asking.
Understand "red ueber/von [text]" as vaguely asking.
Understand "schwatz ueber/von [text]" as vaguely asking.
Understand "schwätz ueber/von [text]" as vaguely asking.
Understand "sprich ueber/von [text]" as vaguely asking.
Understand "sprech ueber/von [text]" as vaguely asking.
Understand "bericht ueber/von [text]" as vaguely asking.

Hier wird eine neue Aktion definiert und dem Parser gesagt, welche Satzschablonen zutreffen sollen. Jetzt fehlt noch die Ausführung. Im »check«-Teil wird geprüft, ob überhaupt jemand da ist, im »carry out«-Teil wird die Aktion auf eine Zufallsperson umgeleitet, die nicht der Spieler selbst ist.

check vaguely asking:
     if the player can not see a person:
          say "Du redest ein wenig mit dir selbst. Das hat dich schon immer beruhigt.";
          stop the action;

carry out vaguely asking:
     now the noun is a random other person in the location;
     try asking the noun about.

Nichtspielercharaktere (NPCs) und Konversation

Ein immer wieder schwieriges Thema sind lebendig wirkende Nichtspielercharaktere, »non player characters« oder kurz: NPCs. Dies sind andere Figuren, die im Spiel auftauchen. I7 kann zum Beispiel mit einfacher Zufallsausgabe die Beschreibungen variieren:

Rule for writing a paragraph about the nurse:
     say "[one of][The nurse] wartet ungeduldig, mit strengem Blick, dass du dich wieder hinlegst.[or][The nurse] tritt ungeduldig von einem Fuß auf den anderen.[or][The nurse] schaut dich mit durchdringendem Blick an.[or][The nurse] macht dir unmissverständliche Zeichen, dich wieder hinzulegen.[or]Streng deutet [the nurse] auf das Bett.[at random]"

[One of] ... [or] ... [at random] definiert dabei den Rahmen. Oben sehen wir eine neue Regel, die wir erschaffen haben: statt der Standard-Antwort der Library »Du siehst hier eine Krankenschwester«, wird der Zufallstext generiert. Wir setzen gezielt [the nurse] ein, dann gibt I7 den »printed name« der Krankenschwester aus. Ein einfaches Beispiel für Kommunikation kann wie folgt aussehen:

instead of answering the nurse that for the first time:
     say "'Ähm, also ... ich ...'[paragraph break]Eine abrupte Stimme unterbricht dich. 'Hallo, ich bin Mariel und ich werde mich um Sie kümmern.' sagt sie und ein unterkühltes Lächeln umspielt ihre Lippen. 'Legen Sie sich erstmal wieder hin und ich bin gleich bei Ihnen.'";
     the printed name of the nurse is "Mariel";
     now the nurse is proper-named.

Die Krankenschwester wird zudem »personalisiert«: daher wird jetzt »Mariel« als »printed name« definiert und sie wird »proper-named«, also lässt I7 das »die« vor »Mariel« zukünftig weg.

Szenen und zeitabhängige Ereignisse

I7 kann nicht nur Attribute verteilen, wir können auch sogenannte Szenen einsetzen. Eine Szene hat einen definierten Anfang und ein definiertes Ende und wir bestimmen, was passiert, wenn die Szene gerade am Laufen ist.

Blocking is a scene. Blocking begins when the player can see the nurse.

When blocking begins:
     say "Gerade als du den Raum verlassen willst, steht urplötzlich eine Krankenschwester in der Tür. 'Aber, aber, mein Bester. Wer wird denn schon aufstehen?' sagt sie mit einem kühlen Unterton und betritt das Zimmer. 'Legen Sie sich erstmal wieder hin und ich bin gleich bei Ihnen.'"

Blocking ends naturally when the player is on the bed.

Blocking ends abruptly when time of day is after 09:23 AM.

In diesem Fall definieren wir zwei verschiedene Enden der Szene. Eine Szene kann natürlich oder abrupt enden, glücklich oder traurig oder in Anhängigkeit von anderen Faktoren wie z.B. der Zeit. Auch ein bestimmtes Ereignis kann in Abhängigkeit der Spielzeit abgerufen werden:

At 09:24 AM:
     if location is hospital:
          say "Du hörst seltsame Geräusche aus dem Nebenzimmer."

Definierte Funktionen

Selbst die Definition neuer Funktionen erfolgt in I7 in natürlicher Sprache:

Every turn during infusing:
     if the bed is crossways:
          kill the player.

Jetzt müssen wir I7 noch sagen, was dann zu tun ist:

To kill the player:
     if blocking has happened:
          say "[The nurse] betritt die Kammer wieder.[paragraph break]";
     otherwise:
          say "[A nurse] öffnet die Tür und betritt die Kammer. Vor dir steht eine Frau, etwa Mitte vierzig, mit blonden Haaren und einem weißen Kittel. Was dir wirklich Sorgen macht sind ihre hart wirkenden Gesichtszüge und die Tatsache, dass sich ihre Haut langsam von ihrem Gesicht abzulösen scheint.[paragraph break]";
          say "Sie hält eine Spritze mit einer grünen Flüssigkeit in der Hand. Du willst dich wehren, aber eisige Finger halten dich mit einem erbarmungslosen Griff fest. Du spürst ein grausames Brennen, als die grüne Flüssigkeit langsam in deinen Körper sickert.";
          end the story finally saying "Du bist verloren."

Damit stehen dem Autor ein paar mächtige Tools zur Verfügung, um I7 ganz seinen persönlichen Bedürfnissen, bzw. ganz seiner Geschichte anzupassen.

Das waren natürlich ein nur kleine Ausschnitte aus dem Quellcode von Mariel, anhand derer einige Besonderheiten von I7 gezeigt wurden. Es gibt natürlich noch viel viel mehr zu entdecken. Eine kurze Übersicht über die Besonderheiten können hier eingesehen werden:

 ifiction.pageturner.de/inform7/gerxdoku.html

Interessierte Leser finden den kompletten Quellcode von Mariel mit einer vollständigen Dokumentation unter:

 ifiction.pageturner.de/inform7/spiele/mariel/

Neuere Entwicklungen

Der Autor hat seit dem neuen Build 6E72 von Inform 7 eine Vielzahl von Release-Optionen zur Verfügung. Beliebige »Feelies« können eingebunden werden, wie z.B. PDF-Dateien mit Zeitungsartikeln o.ä., die das Spielgefühl noch intensivieren, Kartenmaterial oder Hilfedateien, eine Komplettlösung und Cover-Art.
Es können Webseiten mit Web-Interpretern wie »Parchment« oder das neue »Quixe« mit einer einfachen Codezeile generiert werden. Viel Kleinarbeit, die früher mühsam per Hand gemacht werden musste, entfällt somit. Die Zeit für notwendiges technisches Beiwerk wird minimiert und stattdessen in die Geschichte investiert – das kommt Autoren und Lesern gleichermaßen zugute.
Die Entwicklergemeinde von Erweiterungen für I7 ist recht groß, so dass dem Autor immer mehr neue Funktionen für die unterschiedlichsten Bereiche zur Verfügung stehen. Inform 7 kann Programme für zwei unterschiedliche virtuelle Maschinen erzeugen, nämlich für die hoffnungslos veraltete Z-Maschine und für das von Andrew Plotkin erdachte Glulx. Im Gegensatz zur Z-Maschine sind die Glulx-Spiele multimediafähig und können sehr viel größer sein. Das hat neue Möglichkeiten zur Gestaltung von Textspielen eröffnet.
Gerade erst wurden die Glimmr-Erweiterungen von Erik Temple (Glimmr = GLulx Image and MultiMedia Resources) veröffentlicht, die eine Vielzahl von Funktionen wie Maussteuerung, Buttons, Fenster usw. zur Verfügung stellt. Erste Glimmr-Beispiele zeigen klickbare Buttons, automatisch generierte Spiel- und Landkarten, Bildausschnitte, die sich in Abhängigkeit des Aufenthaltsortes des Spielercharakters verändern, und mausgesteuerte Fortbewegung. Textadventures könnten also in Zukunft ein völlig neues Gesicht bekommen.
Die Keyword Interface-Erweiterung von Aaron Reed markiert wichtige Objekte, Richtungen und Gesprächsthemen auf Wunsch im Text farbig, um gerade bei längeren Geschichten die Lesbarkeit zu erhöhen und zu verdeutlichen, mit welchen Dingen man interagieren kann.
Auch für deutschsprachige Autoren und Programmierer gibt es noch viel zu tun. Jeder kann seine Arbeit in Form von Erweiterungen mit anderen teilen oder bestehende Erweiterungen übersetzen und auf diese Weise helfen, I7 als Werkzeug für interaktive Texte auf Deutsch weiter zu entwickeln und zu optimieren.

Erschienen in The Parser 1 (2010), N° 1, August 2010, S. 5-9.

The Parser N° 1

Download The Parser N° 1
Journal für Interactive FictionThe Parser N° 1 - Journal für Interactive Fiction

Inform 7 und GerX

Das neue GerX-LogoDas neue GerX-Logo von Michael Baltes