next up previous contents index
Next: Eden ungekürzt Up: Schritt für Schritt ins Previous: Allerlei Dämonen

Subsections


,,... daß sein ganzes Alter ward neunhundertunddreißig Jahre, und starb.''

Spoilerwarnung: Lösen Sie Eden, bevor Sie diesen Abschnitt lesen.

Der Herr sieht alles (und gibt Punkte)

Aus dem Rätselspiel stammt die Konvention, Handlungen des Spielers mit Punkten zu belohnen und eine Gesamtwertung anzugeben. Die einfachste Vorgehensweise ist es, für das Einsammeln bestimmter Gegenstände (Schätze) und für das Betreten bestimmter Räume Punkte zu vergeben. Die entprechenden Objekte (Räume und bewegliche Objekte) werden einfach mit dem Attribut scored versehen. Die insgesamt erreichbaren Punkte müssen in der Konstante MAX_SCORE angegeben werden. Den Rest (Buchhaltung und Ermitteln der Gesamtpunktzahl) besorgt die Library ganz von alleine.

Wem das nicht reicht, der kann außerdem noch einzelne zu lösende Aufgaben (tasks) definieren. Eden hat deren 8, numeriert von 0 bis 7. Jede Aufgabe bis auf eine wird mit 7 Punkten bewertet, eine nur mit einem Punkt37, so dass sich eine Gesamtsumme von 50 Punkten ergibt. Das erfordert folgende Definitionen:

Constant TASKS_PROVIDED;              ! schaltet die Aufgabenrechnung ein 
Constant NUMBER_TASKS = 8;            ! Anzahl der Aufgaben 
Constant MAX_SCORE = 50;              ! höchste erreichbare Punktzahl 
Array task_scores -> 7 7 7 7 7 1 7 7; ! Der letzte lausige Punkt bei Aufgabe 5
Die Bewertung erfolgt durch Aufruf der Funktion achieved() mit der Nummer der jeweils gelösten Aufgabe als Argument, wie wir es oben 2.7 beim Türöffnen gesehen haben. Die Library achtet auch hier darauf, dass Punkte bei Wiederholung der Aktion nicht doppelt vergeben werden.

Das Ganze ist aber öde, wenn wir dem Spieler nicht mitteilen können, für welche Aktionen er die Punkte bekommen hat. Für die scored-Objekte macht das die Library automatisch; für die Aufgaben ist etwas Arbeit nötig, nämlich das Vorbereiten einer Routine mit dem Namen PrintTaskName und geeigneten Ausgabetexten:

[ PrintTaskName task_number; 
    switch (task_number) 
 { 
     0: "für das Erfinden eines neuen Namens."; ! 'Schlange', s.o. 
     1: "für das Finden einer zweiten Primel."; 
     2: "als Trost für den Verlust einer Rippe."; 
     3: "für das Erkennen deines Weibes Eva."; 
     4: "für die Erkenntnis von Gut und Böse."; 
     5: "für den letzten lausigen Punkt"; 
     6: "für das Überwinden einer Grenze."; 
     7: "für die Rose."; 
     } 
]; english 


Tod und Spielende

Ob die Spielerfigur am Leben ist oder nicht, entscheidet die Variable deadflag. Im ,,Normalbetrieb'' steht sie auf 0, entsprechend dem Wert false. Es genügt, der Variablen den Wert 1 oder true zuzuweisen, um das Spiel unrühmlich zu beenden. Zweckmäßigerweise sollte noch irgend ein sinniger Text nach dem Muster ,,Du trittst auf eine Schlange, die ausprobiert, ob sie sich für die unsanfte Behandlung revanchieren kann. Sie kann.'' ausgegeben werden. Die Library sorgt dann nur noch für eine zentrierte, mit Sternchen versehene Todesnachricht und beendet den Spieldurchlauf nach Ablauf des aktuellen Spielzugs.

Der Spieler will das Spiel aber gewinnen. Auch das läuft seltsamerweise über deadflag und zwar, indem man es auf den Wert 2 setzt. (Zweckmäßigerweise sollte noch irgend ein sinniger Text nach dem Muster ,,Auf deinem Konto liegt jetzt der gesamte Schatz der Chubakka Maru.'' ausgegeben werden. Die Library sorgt dann nur noch für eine zentrierte, mit Sternchen versehene Gewinnmitteilung und beendet den Spieldurchlauf.)

Das reicht für das klassische Todesfallen-und-Schatzsucher-Adventure völlig aus. In Eden allerdings gibt es keine Todesfalle, dafür aber mehrere verschiedene Enden, von denen keines ,,gewonnen'' oder ,,gestorben'' ist. Das ist kein Problem: deadflag kann auch auf andere Werte ab 3 aufwärts gesetzt werden. Dann gibt es keine vorgefertigte Todes- oder Gewinnbenachrichtigung; die abschließende Grußkarte darf man sich in einer Routine namens DeathMessage selber anfertigen (Zentrieren und Sternchen macht die Library aber dennoch):

[ DeathMessage; 
    if (deadflag == 3) print "Du hast deine Chance vertan."; 
    if (deadflag == 4) print "Du hast dein Weib Eva verraten."; 
    if (deadflag == 5) print "Du bist zur Hölle gefahren."; 
    if (deadflag == 6) print "Du bist im Garten Eden geblieben"; 
    if (deadflag == 7) print "Du hast deine Bestimmung erfüllt."; 
];
Zum Schluss noch ein Beispiel für das Setzen von deadflag mit der Ausgabe eines - mehr oder weniger - sinnigen Textes:

deadflag = 6; 
"^Du erkennst dein Weib Eva und ihr werdet eine Ewigkeit  
 lang glücklich und zufrieden im Paradies leben.";
Beachte: Der Spielzug wird - einschließlich des auszugebenden Textes - noch ausgeführt. Erst nach vollständiger Ausführung wird deadflag kontrolliert, so dass es durchaus vor dem Abschlusstext gesetzt werden darf.



Footnotes

... Punkt37
Das ist der in vielen Spielen zu findende (bzw. traditionell nur schwer zu findende) ,,letzte lausige Punkt''.

next up previous contents index
Next: Eden ungekürzt Up: Schritt für Schritt ins Previous: Allerlei Dämonen
Frank Borger
2003-05-02