________________________________________________________________________
| ||
14. Sichtbarkeit und Erreichbarkeit von Objekten | ||
14.1. Was man sehen und was anfassen kannWelche Sachen kann der Spieler sehen? Welche anfassen? Wenn sich der Spieler in einem Raum befindet kann er folgende Sachen sehen:
Er kann allerdings von den Sachen, die er sehen kann, nicht alles erreichen und damit auch nicht benutzen. Folgende Sachen kann er nicht benutzen:
Wenn der Spieler versucht, etwas von diesen Sachen zu benutzen, so wird die passende Antwort bereits vom Parser gegeben. Was aber ist der Unterschied zwischen entfernt und unerreichbar? Dieser Unterschied wird gemacht, um das Sitzen, Liegen und Stehen auf anderen Gegenständen zu erleichtern. Wenn man sich auf oder in einem anderen Gegenstand befindet, so bekommen alle Gegenstände, die sich nicht auf dem Objekt aSitz befinden, das Attribut unerreichbar. Somit kann der Spieler, wenn er auf einem Sofa sitzt, zwar alle Sachen sehen wie üblich, aber nur die Sachen bewegen, die sich auch auf dem Sofa befinden. Wenn der Spieler aufsteht, so bekommen alle Objekte das Attribut unerreichbar wieder abgenommen, und der Spieler kann alles berühren und manipulieren wie zuvor. Das hätte man natürlich auch mit dem Attribut entfernt bewerkstelligen können. Wenn im selben Raum aber ein Kronleuchter hängt, der entfernt ist, so wäre dieser erreichbar, wenn man sich auf das Sofa setzt und wieder aufsteht. Daher gibt es das Attribut unerreichbar. In der Objektdefinition sollte es aber nicht verwendet werden. Weiterhin angenommen, daß im Kronleuchter ein Schlüssel hängt. (Wie der dahingekommen ist, ist im Moment einmal egal.) Außerdem gibt es einen Tisch, auf den natürlich jeder klettern wird, um an den Schlüssel zu kommen. Dann muß dem Kronleuchter von Hand das Attribut entfernt abgenommen werden: Obj Tisch Name 'Biedermeier-Tischchen' n vor 'biedermeier' subst 'tisch' m 'tischchen' n Besch 'Sehr schöne Schreinerarbeit.' Attr Ablage Standfläche Sitz Gew 200 NachAusf (steigen_auf) AttrWeg Kronleuchter entfernt AttrWeg Kronleuchter unerreichbar (steigen_von) AttrHin Kronleuchter entfernt EndeAusf Das Attribut unerreichbar muß natürlich auch wegenommen werden, da es dem Kronleuchter in der Ausführung von steigen_auf gegeben wurde, weil der Kronleuchter natürlich nicht auf dem Tisch liegt. (Es werden nicht alle Objekte unerreichbar gemacht. Lediglich die Stamm- objekte (außer aSitz) und alle Objekte über aSitz sind unerreichbar. Alle darunterliegenden Objekte sind damit automatisch nicht erreichbar, auch wenn sie das Attribut unerreichbar nicht besitzen. Auf diese Weise kann sich der Spieler auf einen Stuhl an einen Tisch setzen. Der Tisch ist dann unerreichbar. Wenn man ihm das Attribut wieder wegnimmt, kann der Spieler nun bequem alles auf dem Tisch manipulieren. Das erspart eine Schleife.) Wenn ein Objekt das Attribut unerreichbar besitzt, so schreibt der Parser "Du kannst [den iObj] von [dem aSitz] aus nicht erreichen." Ansonsten wird nur ausgegeben "Du kommst nicht an [den iObj] heran." Eine Ausnahme sind hier Dekorationen, bei denen es heißt "[Der iObj] [ist] zu weit entfernt." Das ist zum Beispiel der Fall, wenn in unserem Raum auch ein großes Panoramafenster ist mit Blick auf das Meer. Man kann das Meer anschauen, aber nichts mit ihm machen. | ||
14.2. Änderungen der Sichtbarkeit und ErreichbarkeitOb ein Objekt sichtbar oder erreichbar ist, wird durch die Regeln im vorigen Abschnitt für die meisten Fälle gut beschrieben. In manchen Fällen möchte man diese Regeln aber ändern, und das meist nur in bestimmten Situationen. Denkbare Fälle sind:
Für solche Sonderfälle gibt es die Aktion SichtUndRW, das RW steht hier für Reichweite. Sie wird bei der Ortsüberprüfung der Objekte aufgerufen und gibt dem Autor die Möglichkeit, Objekte in oder außer Sicht- und Reichweite zu plazieren. Dies geschieht mit den Befehlen ObjInSicht Obj wobei Obj beliebige Objekte sein können. Diese Definition der Reich- und der Sichtweite gilt genau einen Zug lang, am Ende des Zuges wird die Sonderbehandlung der Objekte wieder zurückgesetzt. Wenn SichtUndRW aufgerufen wird, ist iObj das momentan betrachtete Objekt. Eine weitere Variable, #obj, gibt an, ob dieses Objekt als aObj, als aObj2 oder als aObj3 im eingegebenen Befehl stand, was den Werten von 1, 2 und 3 entspricht. Wird der Ort für den Akteur untersucht, so ist #obj = 0. Da zum Zeitpunkt der Ortsanalyse der Befehl bereits feststeht, kann auch aBef abgefragt werden, um das Objekt nur bei bestimmten Befehlen freizuschalten. (Der genaue Ablauf der Parserroutine steht in Kap. 15.1.) Als Beispiel soll hier die Regel aufgehoben werden, daß man einmal im dunkeln abgelegte Objekte nicht wieder aufheben kann: Aktion SichtUndRw Ausf Wenn /(Licht_in aRaum) und (iObj bewegt) und (aBef = nehmen) dann ObjInSicht iObj Ende EndeAusf Alle Sonderregelungen zur Erweiterung der Sicht und Reichweite müssen in dieser Aktion definiert werden. Da es aber in der Regel nicht sehr viele sind, ist die Aktion SichtUndRw dennoch recht übersichtlich. Da diese Aktion unter Umständen mehrfach aufgerufen wird, nämlich für jedes Objekt mindestens einmal, sollten hier keine Texte ausgegeben werden. Zum vorzeitigen Abbruch kann man die Flagge Fehler setzen. Ist ihr Wert kleiner als 40, so wird einer der Standard-Texte als Fehlermeldung ausgegeben. | ||
14.3. Ein Raum, der in der Mitte ein Gitter hatWie kann man nun einen Raum implementieren, der in der Mitte ein Gitter hat, durch das man alle Gegenstände auf der anderen Seite sehen kann, aber sie nicht bewegen kann? RaumVar Andere_Seite Raum Korridor Name 'Korridor' W Wests O Osts Besch 'Dieser Korridor läuft von Westen nach Osten.' Weg Wests Ausf Sei Andere_Seite Ostseite GeheZu Westseite EndeAusf Weg Osts Ausf Sei Andere_Seite Westseite GeheZu Ostseite EndeAusf Aktion SichtUndRW Ausf Wenn (aRaum Geteilter_Raum) und /(aBef = lage gehen) und (iObj in Andere_Seite) dann | Objekt sichtbar ObjInSicht iObj | aber nicht erreichbar ObjAusserRw iObj Ende EndeAusf RaumKlasse Geteilter_Raum NachAusf (Lage) Wenn (Licht_In aRaum) dann Text 'In der Mitte ist der Raum durch ein massives Gitter geteilt, das vom Boden bis zur Decke reicht.' Ende Wenn /(Licht_In Andere_Seite) dann Text 'Die andere Seite des Raums liegt in tiefer Dunkelheit.' sonst Wenn /(Licht_In aRaum) dann Text 'Durch ein Gitter, das vom Boden bis zur Decke reicht und das diesen Raum offensichtlich in zwei Hälften teilt, kommt jedoch etwas Licht hinein.' Ende ObjListe xObj (xObj in Andere_Seite) Wenn (AnzListe) dann Text 'Auf der anderen Seite des Raums siehst du [liste 1].' Schleife xObj Wenn (xObj in Andere_Seite) dann InhListe xObj Ende Ende Ende Ende EndeAusf Raum Westseite (Geteilter_Raum) Name 'Westseite des geteilten Raums' N Korridor O durch_Gitter Besch 'Du bist hier im westlichen Teil eines großen Raums.' Raum Ostseite (Geteilter_Raum) Name 'Ostseite des geteilten Raums' N Korridor W durch_Gitter Attr Dunkel Besch 'Du bist hier im östlichen Teil eines großen Raums.' Antwort Durch_Gitter Besch 'Nein. Gehe doch bitte im Norden um das Gitter herum.' Das wäre eine typische Anwendung von Sonderregelungen zur Sichtweite, wie sie im vorherigen Abschnitt beschrieben wurden. Hier muß man nur aufpassen, daß die Objekte auch außer Reichweite gelegt werden. Wenn ein Objekt nämlich in Sicht ist (was ja hier durch ObjInSicht der Fall ist), wird zur Überprüfung der Reichweite nur gecheckt, ob das Objekt in einem geschlossenen Behälter, entfernt oder unerreichbar ist. Da die Objekte im anderen Raum frei zugäng- lich sind, muß der Check mit ObjAußerRw korrigiert werden. | ||
|