next up previous contents index
Next: Aktionen abändern Up: Schritt für Schritt ins Previous: ,,... ein Buch, geschrieben

Subsections


Die Bevölkerung des Gartens, life und orders

Auch in dem schönsten Garten wird es dem Menschen alleine bald fad. Mit einem kleinen Trick wird etwas Belebung vorgetäuscht: bei durchschnittlich jedem dritten Zug wird nach dem Zufallsprinzip eine von acht Meldungen angezeigt, die verschiedene Tiere und ihre Bewegungen im Garten beschreiben. Das ist aber nur Illusion. Wir wollen uns mit echten Lebewesen - d.h. eigenständigen Objekten - beschäftigen.

,,Die Erde bringe hervor lebendige Tiere ...''

Ein Lebewesen ist zunächst ein Objekt, für das das Attribut animate gesetzt ist. Die Library berücksichtigt dann automatisch, dass mit dem Lebewesen verschiedene Aktionen möglich sind, die es für ein unbelebtes Objekt nicht zulässt. Das sind alle Kommunikationsvorgänge (fragen, antworten, etwas zeigen, erzählen, befehlen) sowie ein paar andere Aktionen, die man üblicherweise mit unbelebten Gegenständen nicht macht (angreifen, aufwecken küssen, einen Gegenstand übergeben oder nach ihm werfen). Die mit diesen Handlungen verbundenen Aktionen (für eine vollständige Liste siehe 3.2.7) könnten nun normalerweise in der before-property des Objektes behandelt werden.

Damit das Ganze übersichtlicher wird, gibt es aber eigens für diejenigen Aktionen, die der Spieler nur mit einem Lebewesen vornehmen kann, eine besondere property. Sie heißt life, funktioniert ansonsten aber genauso wie before.

Sehen wir uns also ein einfaches, aber dennoch wirkungsvolles Tier an:

Object  schlange 
 with   short_name "Schlange", 
        name 'schlange' 'schuppen' 'panzer' 'rot' 'schwarz' 'gross', 
        adj "rot und schwarz geschuppt", 
        dekl 9, 
        life [; 
         show, ask, askfor, tell: "Sie sieht dich kurz an  
                      und du fühlst dich wieder eiskalt."; 
         default: "Besser nicht. Das Biest ist unheimlich."; 
        ], 
        before [; 
         take, push, pull, touch, rub, lift, squeeze, taste: 
            <<attack self>>; 
         smell: "Ein Geruch wie Pech und Schwefel."; 
        ], 
        description "Das ist die Mutter aller Schlangen. Sie misst 
            wenigstens sieben Schritte  
            und hat einen Panzer aus roten und schwarzen Schuppen.", 
        initial "Eine große Schlange hat sich unter dem Baum der 
            Erkenntnis zusammengeringelt.", 
  has   animate static female;
Beachte: ##attack wird von life behandelt und aufgrund des default-Eintrags mit ,,Besser nicht...'' beantwortet. Mit dem in der before-property eingetragenen <<attack self>> wird das gleiche Verhalten für alle davor aufgeführten ,,einfachen'' Aktionen bewirkt.

,,Darum wird ein Mann seinen Vater und Mutter verlassen...''

Menschen und andere ,,intelligente'' Lebensformen unterscheiden sich für die Inform-Autorin in der Art der Konstruktion nicht vom Tier. Die eigentliche Herausforderung ist es, Objekte für andere Personen außer der Spielerfigur27 zu erschaffen, die sich im Kontext des Spiels einigermaßen selbständig und glaubhaft verhalten. In der Regel steht dabei das Kommunikationsverhalten dieser Objekte im Vordergrund, also ihre Reaktionen auf die Aktionen ##ask, ##tell etc.

In den frühen Tagen der Adventure-Programmierung waren richtige Abenteurer noch richtige Abenteurer und richtige NPC's waren wortkarge Diebe, Trolle oder Piraten, die sich ebenfalls recht eindimensional verhielten. Daher kommt es, dass Inform im Verhältnis zu anderen Features herzlich wenig Hilfestellung zur Programmierung von Gesprächen bietet. Das hat eine Vielzahl von Zusatzbibliotheken auf den Plan getrieben, die aber hier - mit Ausnahme des schon bekannten GInfo.h - nicht verwendet werden sollen und unbehandelt bleiben.28

Wir beschränken uns auf ,,einfachste'' ask-tell-Kommunikation.29 Die verwendbare Kommunikationsbandbreite wird dabei gewissermaßen auf die eines Zwei-Wort-Parsers begrenzt, d.h. wir können dem Gesprächspartner der Spielerfigur neben dem Verb nur ein Objekt (das Gesprächsthema) mitteilen, das vom Parser her mögliche zweite Objekt ist der Gesprächspartner selbst. Damit wir das Gesprächsthema nicht selbst parsen müssen, verwenden wir für die Gesprächsthemen die gleichen Themenobjekte wie für den Umgang mit Lesestoff, vergleiche oben 2.10.2. Sie sind am vorangestellten T zu erkennen.

Auf diese Weise ist aber auch schon eine ganze Menge möglich. Machen wir halt' mal einen völlig unbescheidenen Anfang:

Object Creator 
with   short_name "Gott", 
       dekl 4, 
       name 'Trurl' 'Gott' 'Allah' 'Herr' 'Schoepfer' 'Jehova' 
            ! etcetera ad libitum  
       initial "Du fühlst die Gegenwart des ERSTEN.", 
       description "Der HErr ist in seinem heiligen Tempel, des HErrn Stuhl 
          ist im Himmel. Du kannst IHN nicht sehen und nicht 
          beschreiben, aber du weißt, ER ist hier.", 
       before [; 
         examine, attack,throwAt, wakeOther, answer, ask, tell, order, 
            askfor, show: return false; 
       default: "Du wagst noch nicht einmal den Gedanken 
                 daran."; 
       ],
Das return false ist notwendig, um das nachfolgende default: nicht alle Aktionen ,,auffressen'' zu lassen. Da before vor life aufgerufen wird, müssen auch die speziellen, sonst für life reservierten Aktionen freigehalten werden.

orders [; 
   give: <<ask self noun>>; 
   default: "ER lässt sich nicht befehlen."; 
],
Die Property orders ist ein zweiter Spezialfall für Lebewesen. Hier landen Befehle, die der Spieler dem NPC direkt erteilt. Der einzige hier sinnvolle Befehl lautet ,,Herr, gib' mir Eva.'' Er wird durch die Konstruktion mit umgeleitet auf den für ,,Frage den Herrn über Eva'' bestimmten Programmteil. Aber auch alle anderen ,,Gib mir''-Befehle werden so auf die entsprechenden ,,Frage-über''-Antworten umgeleitet. Ebenso werden weiter unten die ,,frage nach''-Befehle umgeleitet.30

life [; 
   Attack, ThrowAt, Kiss, Love: "Du wagst noch nicht einmal den 
         Gedanken daran."; 
   WakeOther: "ER schläft nicht."; 
   order: "ER lässt sich nicht befehlen."; 
   Answer: "Du hast das Gefühl, dass du mit jemand sprichst, der 
            dich versteht."; 
   Ask: switch (second)  
        { 
          adam, TMann: "~Ich habe dich heute morgen nach meinem Bilde 
             gemacht, aber jetzt bin mir 
             gar nicht sicher, ...~ - ER kommt ins Grübeln."; 
          Creator, TEli: "~Ich bin der, der ich bin.  
             Namen tun nichts zur Sache.~"; 
          TEinsamkeit, TFrau: 
             ErschaffeEva(); 
             return true;

          TApfel : "~Du sollst von dem Baum in der Mitte 
             des Gartens nicht essen.~";

          TObst, TGarten: "~Ich habe den Garten zu deinem 
             Aufenthalt gemacht und die Früchte zu deiner Nahrung.~"; 
          TSchlange : 
             "~Es ist besser, wenn du darüber nichts weißt.

              Glaube der Schlange kein Wort!~"; 
          tuer, TPforte: "~Hmm. - Ich hatte die Pforte des Gartens mit Bedacht 
             zugesperrt gelassen.~";  
          schwert, TSchwert: 
             if (sofa has general) ! Spieler hat das Schwert entdeckt 
                 "~Waffen sind die Werkzeuge des Bösen. Lass' die  
                  Finger davon.~"; 
             else 
                 "~Schwert? Welches Schwert?~"; 
          TWasser:  
             "~Die Quelle speist die vier Ströme, die vier Ströme 
              speisen alle Wasser der Welt.~"; 
          TAntwort: 
             "ER beginnt vom Leben und der Schöpfung zu sprechen 
              und dir wird alles klar."; 
          TTier:  
             "~Du bist es, der eingesetzt wurde, um über alle Tiere zu 
              herrschen.~";  
          TEngel:  
             "~Sie schweben in den höheren Sphären und loben mich 
              mit ihrer Musik.~";  
          default: "~Fragen, immer nur Fragen ...~"; 
        }; 
   Tell: switch (second)  
        { 
          TSchlange, TPforte: 
            if (schlange in mitte) 
                 "~Das musste wohl früher oder später passieren. Ich  
                  sperre die Pforte lieber wieder zu.~"; 
            else 
                 "~Du hast die Schlange also vertrieben? Ja, die 
                  Gerechtigkeit des Frommen macht seinen Weg eben...~"; 
          TEinsamkeit, TFrau: 
             ErschaffeEva(); 
             return true; 
          default: "Du hast das Gefühl, dass dir jemand zuhört, der 
             dich versteht."; 
        }; 
   askFor: <<ask self noun>>; 
 
], 
  
has male animate;



Footnotes

... Spielerfigur27
Im Fachjargon Non-Player-Characters (NPC) genannt.
...28
Die wichtigste Neuerung ist die menügesteuerte Kommunikation: Auf den Befehl ,,sprich mit ...'' erhält derSpieler eine Auswahl verschiedener vorgegebener Sätze und kann sich für einen entscheiden. Die präsentierte Auswahl verändert sich je nach dem Fortgang des Gesprächs. Das kanonische Beispiel dieser Technik ist ,,Photopia'' von Adam Cadre.
...29
Ask-Tell-Kommunikation ist keinesfalls mit ,,einfach'' gleichzusetzen. Eine der komplexesten NPC überhaupt, Galatea im gleichnamigen Spiel von Emily Short, verwendet auch ,,nur'' ask und tell.
...30
Eine mögliche Falle für die Autorin ist der Unterschied zwischen Übersetzung und Bedeutung der Aktion ##AskFor. Die Bedeutung ist ,,verlange das Objekt'' im Sinn von ,,gib' das Objekt her''. Die Übersetzung enthält aber insbesondere auch ,,frage nach dem Objekt'', was im Deutschen gern gleichbedeutend mit ,,gib' mir Informationen über das Objekt'' verwendet wird. Das ist aber eine ganz andere Aktion, nämlich ##Ask. Nach einigem Gefiddel mit diesem Problem habe ich meine Version von GInfo.h so umgebaut, dass ,,frage nach'' generell als ##Ask verstanden wird.

next up previous contents index
Next: Aktionen abändern Up: Schritt für Schritt ins Previous: ,,... ein Buch, geschrieben
Frank Borger
2003-05-02