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
|
|
Fünf Unterschiedliche Ideen rund um ein Thema
Auftanken Kurzentwürfe für Abenteuer
Ersatzteile Fertige Objekte, Befehle und Räume für Abenteuer
Werkstatt Mechanik und Innenleben von Textadventures
Testfahrt Die Straßenlage deutscher Adventures
Grand Prix Der Textadventure- Wettbewerb
Abbiegen Lohnende Nebenstraßen
Intern Was textfire.de will, wer es macht und wie man mitmacht
|