________________________________________________________________________
| ||
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. | ||
|