[ t e x t f i r e . d e - Startseite ]

Sitemap
Druckversion


Ersatzteil

Personalisierte Spielerobjekte

In alten Zeiten war der Protagonist eines Adventures immer ein namenloser Held, der in die Welt auszog, um dunkle Höhlen zu erforschen oder böse Zauberer zu besiegen. Deshalb war die Notwendigkeit, den Charakter zu beschreiben oder gar dessen Aktionen von seinem Wesen abhängig zu machen, relativ gering. Spätere Spiele entwickelten viel klarer definierte Figuren, welche dem Spieler ganz andere Möglichkeiten der Identifikation und der Einbindung in die Spielwelt gaben.

Inform liefert standardmäßig folgende Antwort, wenn man sich selbst betrachtet:

>look at me
As good-looking as ever.

Dies mag natürlich für modernere Adventures etwas unbefriedigend sein, vor allem, wenn der Entwickler des Adventures sich die Mühe macht, einen komplexen Protagonisten zu erschaffen. Plundered Hearts ist hierfür ein schönes Beispiel:

>look at me
You are wearing a cotton frock, very pretty, if a tad outmoded for today's fashions.

In dieser einen kurzen Zeile wird dem Spieler nicht nur klar gemacht, dass die Protagonistin ein Kleid trägt, er erfährt mehr: Sie ist bedacht auf ihr Äußeres, durchaus modebewusst und gehört wohl einer wohlhabenden Gesellschaftsschicht an.

Wie lässt sich nun Ähnliches in Inform umsetzen? Die einfachste Lösung ist, ein Objekt für den Spieler zu erzeugen, welches am Anfang des Spiels als Spielerobjekt deklariert wird. Als Beispiel mag Wichtel gelten:

Object newselfobj "Willfried"
  with dekl 1,
       name "willfried" "fried" "wichtel" "kobold"
         "willi" "will",
       description [;
         print "Du bist Willfried, der Wichtel. Du hast
           grünliche, runzelige Haut, was jedoch nicht
           unangenehm ist, sondern dir ein
           naturverbundenes Aussehen verleiht";
         if (Hut has worn) print ". Im Moment trägst du
           au@sserdem deinen breiten Hut";
         ".";
       ],
       before [;
         Open: "Aber du doch bist von Natur aus ein
           sehr offener Wichtel!";
         Close: "Als Waldwichtel bist du von Haus aus
           offen und lä@sst dich nicht schlie@ssen.";
         Smell: "Hmmm... Waldmeister.";
         Taste: "Du schmeckst eben wie ein Wichtel,
           also eigentlich ganz gut.";
         Touch: "Du hast eine etwas runzelige, aber
           nicht unangenehme Haut.";
         Empty: "[Versuche es mit ~LEGE ALLES HIN~]";
         Search: <<Inv>>;
         SwitchOn: if (verb_word == 'mach')
           "Du fühlst dich wohl sehr einsam...";
           "Du suchst eine Weile an dir herum, bis du
           sicher bist, deinen ganzen Körper erfolglos
           nach versteckten Schaltern abgesucht zu
           haben.";
         SwitchOff: "Leider ist das bei dir nicht so
           einfach möglich, wie du es dir manchmal
           wünschen würdest.";
         Remove: "Schon gut...";
       ],
       after NULL,    life NULL,    each_turn NULL,
       time_out NULL, describe NULL,
       capacity 5, parse_name 0,
       orders 0, number 0,
  has  concealed animate proper transparent male supporter;

!Gegenstände, die der Wichtel bei sich hat
Object -> Hut "Wichtelhut"
        with dekl 1, adj "breitkrempig" "grün",
        name "hut" "wichtelhut" "breit" "krempe"
          "breitkrempig" "krempig" "gruen" "filzhut",
        description "Dein grüner Hut hat eine
          unglaublich breite Krempe, was dir ein noch
          wichtelhafteres Aussehen verleiht, wenn du
          ihn aufgesetzt hast.",
        invent [;
          print "deinen breitkrempigen Hut";
          if (self has worn)
            print " (auf deinem Kopf)";
          else print ", allerdings nicht aufgesetzt";
          return;
        ],
        after [;
          Disrobe: "Du nimmst den Hut von deinem Kopf.";
          Wear: "Du setzt dir deinen Hut wieder auf.";
        ],
        has male clothing worn;

!weiter unten im Code:

[ Initialise;
        !Spielerobjekt ändern
        ChangePlayer(newselfobj);
];

Das Objekt newselfobj wird also deklariert und in der Initialise-Routine zugewiesen. Das Objekt fängt die wichtigsten Namen des Wichtels ab, so daß man beispielsweise BETRACHTE WICHTEL oder WILLFRIED, GEHE NACH SÜDEN eingeben könnte. Außerdem werden einige Aktionen mit sinnvollen Antworten abgefangen, wenn der Spieler z.B. ÖFFNE MICH oder MACH MICH AN eingibt.

Noch ein weiteres Schmankerl: Man kann nun auch mittels einer react_before-Methode, die man dem Spielerobjekt gibt, bestimmte Aktionen des Spielers abfangen und filtern. Ein Beispiel aus Starrider:

react_before [o;
    Go: if (location == thedark) {
            !im Dunkeln gegen die Türen und Wände...
            o = real_location.(noun.door_dir);
            if (o ofclass S_Tuer)
                !S_Tuer ist in Starrider die Klasse
                !für Sicherheitstüren
                if (o hasnt open) o = 0;
            if (o == 0)
                "Du läufst blindlings gegen eine Wand
                oder eine geschlossene Tür!";
       }
],

Hier wird bei jeder Richtungseingabe des Spielers geprüft, ob man sich im Dunkeln befindet. Falls ja, dann gibt jedes Hindernis, sei es Tür oder Wand, die gleiche Meldung aus. Der Spieler weiß also nicht, ob eine geschlossene Tür oder eine Wand das Hindernis ist. (Ohne diese Routine würden Türen die Meldung geben »Die Tür ist geschlossen«, was die Frage aufwerfen würde, warum der Spieler weiß, dass die dunkle Wand überhaupt eine Tür ist).

14.10.2001, Max Kalus

 
[nach oben]