________________________________________________________________________
[<<] [Inhalt] [>>] III. Beispiele

14. Sichtbarkeit und Erreichbarkeit von Objekten

14.1.   Was man sehen und anfassen kann
14.2.   Änderungen der Sichtbarkeit und Erreichbarkeit
14.3.   Ein Raum, der in der Mitte ein Gitter hat

14.1. Was man sehen und was anfassen kann

Welche Sachen kann der Spieler sehen? Welche anfassen? Wenn sich der Spieler in einem Raum befindet kann er folgende Sachen sehen:

  • alle Sachen, die sich im Raum befinden
  • alle Sachen, die er bei sich hat
  • alle Sachen, die sich auf einer Ablage befinden
  • alles, was in einem Behälter ist, der nicht geschlossen ist oder der transparent ist
  • alles, was eine 'transparente' Person bei sich hat
  • alles, was sich an einem anderen sichtbaren Objekt befindet

Er kann allerdings von den Sachen, die er sehen kann, nicht alles erreichen und damit auch nicht benutzen. Folgende Sachen kann er nicht benutzen:

  • das, was in einem transparenten Behälter eingeschlossen ist
  • das, was eine transparente Person bei sich hat
  • alles, was das Attribut entfernt besitzt
  • alles, was das Attribut unerreichbar besitzt.
  • alles, was in, auf oder an einem dieser Objekte ist.

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 Erreichbarkeit

Ob 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:

  • Der Spieler kann Dinge in einem dunklen Raum nicht sehen. Macht er zum Beispiel seine Lampe dort aus und legt sie ab, dann kann er sie nicht wieder aufnehmen, da er sie nach den normalen Regeln nicht sieht. Man könnte nun eine Regel definieren, nach der der Spieler Dinge in dunklen Räumen nehmen kann, wenn er sie bereits kennt.

  • Um mit einer Person reden zu können, muß man sie sehen können. Das ist natürlich eine Annäherung. Wenn der Spieler in einer dunklen Zelle gefangen ist, dann kommt er vielleicht nur durch Hilfe seines Zellengenossen heraus, dem er Anweisungen geben muß. Dazu müßte man zulassen, daß der Spieler mit ihm reden kann.

  • Ähnlich ist es bei anderen Sinnen als der Sicht: Im dunkeln kann man sich nur auf Dinge beziehen, die man sieht. Wie ist es aber mit Dingen, die man riechen kann? Oder hören? Oder betasten? (Die Regeln von TAG definieren ja Erreichbarkeit, also die Möglichkeit, ein Objekt anzufassen, als einen Sonderfall der Sichtbarkeit.)

  • Manchmal kann man von einem Ort aus Dinge sehen, die sich an einem anderen Ort des Adventures befinden, z.B. wenn man von einem Balkon im ersten Stock auf einen Hof oder auf die Straße schaut.

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
ObjAußerSicht Obj
ObjInRW Obj
ObjAußerRW 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 hat

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

Martin Oehm, 04.02.2000 Vorheriges KapitelInhaltsverzeichnisNächstes Kapitel