next up previous contents index
Next: ,,Da schied Gott das Up: Schritt für Schritt ins Previous: ,,... und siehe, eine

Subsections


,,Lasst uns Menschen machen ...''

Die Spielerfigur

Auch die Spielerfigur selbst ist ein Objekt. Man muss nicht unbedingt ein Objekt für sie definieren, sondern bekommt eine vorgefertigte Figur gestellt. Wer aber will, dass sich die Spielerfigur anders verhält oder dass sie anders aussieht als der Standard, der muss sich selber eine schnitzen:

Object  Adam

 with   name 'adam' 'Mensch' 'spieler' ,

        short_name "Adam",

        dekl 0,

        rippe true, 

        number,

        description [;

           if (self.rippe)

              { 

                  print "Du bist ein Mensch. " ;

                  style bold; print "Der "; style roman;

                  "Mensch. Du siehst so ähnlich aus wie ER, sagt man."; 

               }

           else

               if (self hasnt Erkenntnis)

                  "Eine Rippe fehlt. Dafür hast du eine frische

                   Narbe.";

               else

                   if (Feigenblatt hasnt worn) 

                      "Du bist nackt!";

                   else 

                      "Das Feigenblatt verdeckt deine Blöße nur

                       dürftig.";

           ],

        add_to_scope koerper,

 has    light proper male animate;

Um diese Spielerfigur zu verwenden, muss dann noch - in die Routine initialise() - eingefügt werden:

ChangePlayer(Adam);
Zweck des Ganzen ist es, Adam je nach dem Spielstadium anders aussehen zu lassen: Er hat nach der Erschaffung von Eva ja eine Rippe weniger als vorher; er darf erst dann bemerken, dass er nackt ist, wenn er von der Frucht des Baumes der Erkenntnis gegessen hat und er ist nicht mehr nackt, wenn er sein Feigenblatt trägt.

Für solche Entscheidungen sind boolesche Werte (also true und false) ganz praktisch: Die property rippe wird einfach neu eingeführt und mit true vorbelegt, solange Adam die Rippe noch hat. Bei Durchführung der bekannten Operation muss man dann adam.rippe=false; setzen.

Bei der Erkenntnis - nach der wir im Spiel ziemlich oft fragen und die nicht nur Adam, sondern auch Eva haben kann - gehen wir anders vor und verwenden ein Attribut. Das muss allerdings vorher definiert sein:

Attribute Erkenntnis;
und kann mit dem Befehl give gesetzt (give eva Erkenntnis;) und mit den Operatoren has und hasnt abgefragt werden.

Beachte:

Das Schlüsselwort has kommt in zwei verschiedenen Bedeutungen vor: zum Einen leitet es in der Objektdefinition die Liste der Attribute ein, die das Objekt hat; zum Anderen kann es in logischen Termen dazu benutzt werden, das Vorhandensein eines Attributs abzufragen: if ((adam has Erkenntnis) && (eva hasnt Erkenntnis)) ...

Die property number wird von der Library benötigt, wenn das Objekt als Spielfigur eingesetzt werden soll. Ebenso muss die Library wissen, dass Adam ein Lebewesen ist, dazu dient das Attribut animate. Das Attribut proper bewirkt, dass ,,Adam'' als Eigenname behandelt wird, so dass die Ausgaberoutinen nicht automatisch einen Artikel davorsetzen.

,,Das ist doch Bein von meinem Beine'' - Körperteile

Das Nachmodellieren einzelner Körperteile ist normalerweise nicht notwendig, es sei denn, die Körperteile hätten eine besondere Funktion im Spiel. An Adam ist in dieser Beziehung nur die Narbe interessant:

Object  koerper

 with   short_name "Körper",

        adj "dein",

        dekl 2,

        name 'rippe' 'narbe' 'koerper' 'bauch' ,

        before [;

           examine: return false;

           default: "Dein Körper gehört zu dir.";

           ],

        description [;

           if (adam.rippe)

              "Du siehst nichts Ungewöhnliches.";

           else 

              "Eine frische Narbe ist dort, wo vorher eine Rippe

               gewesen ist. Sie scheint gut zu heilen. -

               Sonst siehst du nichts Ungewöhnliches.";

           ],

 has    proper scenery male;

Dieser Körperteil ist kein Besitztum von Adam, d.h. das Objekt steht einfach unabhängig im Raum; dass der Spieler es dennoch sehen kann, wird durch die Zeile add_to_scope koerper in der Definition von Adam bewirkt. Da es kein Child des Objekts Adam ist, wird es beim Schwimmengehen auch nicht abgelegt.

Die default:-Regel in der before-property bewirkt, dass alle Aktionen, die der Spieler mit dem Körper versuchen mag (von Anzünden bis Wegwerfen) nur lakonisch mit ,,Dein Körper gehört zu dir'' abgewiesen werden (zur Erinnerung: Der String steht in Kurzschreibweise für ein print_ret und gibt true zurück: Ende der Aktion.)

Alle Aktionen? Nein, eine einzelne kleine Aktion, nämlich ##Examine, muss offen bleiben, sonst bekommt der Spieler ja die Beschreibung der Narbe nicht zu Gesicht. Also fügen wir eine Regel für ##Examine ein, die im wahrsten Sinn des Wortes nichts macht: Sie gibt false zurück, die Aktion wird unbeeinflusst weiter ausgeführt und die Beschreibung wird ausgegeben. Stünde statt des return false ein return true, würde die Regel auf andere Weise nichts machen: Ende der Aktion und nichts würde ausgegeben, auch die Beschreibung nicht.

,,... und flochten sich Feigenblätter zusammen...''

Für Kleidungsstücke gilt dasselbe wie für Körperteile. Beschränkung auf das Notwendigste sei die Maxime. Das fällt im Garten Eden auch gar nicht schwer:

Object  Feigenblatt 

 with   short_name "Feigenblatt",

        dekl 4,

        initial "Dir fällt auf, dass ein Feigenblatt gut geeignet 

                 wäre, um deine Blöße zu bedecken.",

        description "Ein Feigenblatt. Grün. Vielleicht ein bisschen 

                     zu klein.",

        after [;

           take: give self worn;

                 achieved(5);

                 "Du nimmst das Feigenblatt und machst dir einen 

                  Schurz daraus.";

          ],

        before [;

           disrobe, drop, give: "Aber das Feigenblatt ist so kleidsam!";

           ],

        name 'blatt' 'feigenblatt',

 has    neuter clothing;

Das Attribut clothing macht aus einem Objekt ein Kleidungsstück und ermöglicht die Verwendung der Aktionen ##Wear und ##Disrobe zum An- und Ausziehen. Dabei setzt die Library automatisch das Attribut worn, solange das Kleidungsstück getragen wird.

Das Feigenblatt hat die Besonderheit, dass es sich ,,von selber'' anzieht, wenn der Spieler es nimmt. Deshalb muss hier worn explizit gesetzt werden. (Außerdem gibt es Punkte für die sechste gelöste Aufgabe.) Einmal getragen, lässt es sich - nach dem Vorbild eines anderen klassischen Kleidungsstücks26 - wegen der Regel für ##Disrobe in der before-property allerdings nicht mehr ausziehen.



Footnotes

... Kleidungsstücks26
,,But the brass loincloth is so becoming!'' heißt es in Infocoms ,,Leather Goddesses of Phobos''. (Für Spielerinnen ist es ein brass bikini.)

next up previous contents index
Next: ,,Da schied Gott das Up: Schritt für Schritt ins Previous: ,,... und siehe, eine
Frank Borger
2003-05-02