STANDARDOBJEKT FUER RAEUME:

BENUTZUNG:
      inherit "/std/room";
      
      #include <properties.h>
      #include <rooms.h>            // Fuer AddItem() und NewDoor()

BESCHREIBUNG:
      Ein Raum ist ein Objekt, das von Spielern oder anderen Lebewesen
      betreten werden kann. Er hat Lang- und Kurzbeschreibungen von
      innen und aussen (zum Beispiel Schiffe oder aehnliche Raeume in
      Raeumen), die sich der Spieler je nach seinen Beduerfnissen
      anzeigen lassen kann (kurz/lang-Modus).

   Properties:

      P_INT_SHORT
            Kurzbeschreibung innerhalb des Raumes
      P_INT_LONG
            Langbeschreibung innerhalb des Raumes
      P_SHORT
            Kurzbeschreibung von aussen (nur noetig, wenn man den Raum
            auch wirklich von aussen sehen kann)
      P_LONG
            Langbeschreibung von aussen (siehe P_SHORT)
      Um Situationsbezogene Beschreibungen zu bekommen, kann man 
      Querymethoden auf die jeweiligen Properties setzen, siehe Dokumentation
      zu Set().

      P_LIGHT
            Lichtlevel des Raums (0 dunkel, 1 hell)
      P_LIGHT_TYPE
            Lichtart, mit der der Raum beleuchtet ist, zB LT_SUNLIGHT
      P_INDOORS
            Wenn es sich um einen Aussenraum handelt, 0. 1 fuer Innenraeume.
      P_TRANSPARENT
            Ist ungleich 0, wenn man in den Raum von aussen reinschauen
            kann, oder von innen nach aussen
      P_NO_TPORT
            Zum verhindern von Teleportversuchen in oder aus dem Raum
      P_NOMAGIC
            Im Raum kann nicht gezaubert werden.
  P_WATER
    Im Raum kann geangelt werden, und man kann ggf. sogar Fische fangen.

   Funktionen:

  AddExit(string|string* kmnd, string zielraum)
            <kmnd> kann ein String sein oder eine Liste von Strings
            mit den Kommandos mit denen der Spieler in <zielraum>
            landen soll.
      RemoveExit(string|string* kmnd)
            <kmnd> ist ein String oder eine Liste von Strings, deren
            Ausgaenge entfernt werden sollen. Dabei muss man etwas vor-
            sichtig sein, da ein Spieler, der zum Zeitpunkt des Aufrufs
            im Raum ist, die Aktion fuer sich noch definiert hat.
            Also: Nur benutzen, wenn man weiss, was man tut!
      AddSpecialExit(string|string* kmnd, string funktion)
            <funktion> wird aufgerufen, wenn der Spieler das Kommando
            <kmnd> tippt (oder eins der Kommandos, wenn <kmnd> eine
            Liste ist). Nuetzlich zum Beispiel um einen Spieler nur
            durchzulassen, wenn ein Waechter nicht da ist.
            P_AERIAL_HELPERS/P_AQUATIC_HELPERS
              Sollte es gewuenscht sein, dass bestimmte Raeume z.B. nur 
              fliegend erreicht werden koennen, oder dass man fuer einen 
              bestimmten Ausgang tauchen koennen muss, sind diese 
              Properties hilfreich, die im Spielerobjekt definiert sind 
              und die dort aktuell registrierten Hilfsobjekte fuers 
              Fliegen/Segeln und Tauchen enthalten.
      RemoveSpecialExit(string|string* kmnd)
            siehe RemoveExit()
      NewDoor()
            Fuegt dem Raum eine Tuer hinzu, die in einen zweiten Raum fuehrt,
            und die der Spieler (ggf. mit einem Schluessel) oeffnen und 
            schliessen kann.
      
      Um Raeume interessanter zu machen, kann man ihnen Details, die 
      vom Spieler angeschaut werden koennen, einbauen:

      AddDetail(string|string* keys, string descr)
            Eine Beschreibung von Details, die vom Spieler angeschaut
            werden koennen wird dem Raum gegeben. <keys> kann ein
            String sein oder eine Liste von Strings. <descr> ist
            die Beschreibung, die der Spieler erhaelt.
      RemoveDetail(string|string* keys)
            Entfernt ein Detail aus einem Raum. <keys> kann ein String
            sein oder eine Liste von Strings.
      AddSpecialDetail(string|string* keys, string function)
            Im Prinzip wie AddDetail(), nur wird als zweites Argument
            kein fester String angegeben, sondern eine Funktion, die
            einen String zurueckgeben muss. Damit kann man variable
            Details programmieren.
      RemoveSpecialDetail(string|string* keys)
            siehe RemoveDetail()
      AddReadDetail(string|string* keys, string desc)
            <desc> wird ausgegeben, wenn ein Spieler den <key> liest.
            <keys> kann wieder ein String oder eine Liste von Strings
            sein.
      RemoveReadDetail(string|string* keys)
            siehe RemoveDetail()
      AddRoomMessage(string* msg, int prob, string|mixed *func)
            Alle <prob> Sekunden wird aus einer Liste von Meldungen
            (<msg>) zufaellig eine ausgesucht, die dann im Raum er-
            scheint. Wenn das Argument <func> angegeben ist, wird
            eine Funktion diesen Namens aufgerufen, der der Index
            der ausgegebenen Meldung als Argument uebergeben wird.
            Func darf auch einen Array von Funktionen enthalten.

      AddCmd(string|string* cmd, string func, int flag)
            Im Raum wird beim Kommando <cmd> (oder einem der Kommandos)
            die Funktion <func> aufgerufen. <func> muss 1 zurueck-
            geben, wenn die Funktion die Kombination aus Kommando
            und Argumenten akzeptiert, ansonsten 0. Alles was ein
            Spieler hinter <cmd> noch angibt, wird der Funktion als
            Argument uebergeben. Wenn <flag> gesetzt ist, wird jedes
            Kommando, das mit <cmd> beginnt akzeptiert.
      RemoveCmd(string|string* cmd)
            Entfernt ein Kommando aus dem Raum.
            ACHTUNG: Bei Spielern, die zum Zeitpunkt des Funktions-
            aufrufs noch im Raum sind, ist das Kommando noch definiert.
            Also: Nur benutzen, wenn man genau weiss, was man tut.

      AddItem(string filename, int refresh)
            Ein Objekt mit Pfad <filename> wird erzeugt und in den
            Raum bewegt, dabei gibt es vier verschiedene Modi, die
            ueber das Argument <refresh> angegeben werden:
            REFRESH_NONE: Das Objekt wird nur beim allerersten mal
                  erzeugt, und dann nie wieder (erst beim reboot)
            REFRESH_DESTRUCT: Ein neues Objekt wird erst erzeugt, 
                  wenn das alte zerstoert ist. So kann man sicher
                  gehen, dass nur ein Exemplar im Spiel ist.
            REFRESH_REMOVE: Beim reset wird ein neues Objekt erzeugt,
                  wenn sich das alte nicht mehr im Raum befindet.
            REFRESH_ALWAYS: Bei jedem reset wird ein neues Objekt 
                  erzeugt. VORSICHT: Kann zu riesigen Mengen von
                  Objekten fuehren, wenn ein Raum lange nicht be-
                  sucht wird.
            Die Konstanten REFRESH_* sind in <rooms.h> definiert.

      Auf die Properties P_EXITS, P_SPECIAL_EXITS, P_DETAILS, 
      P_SPECIAL_DETAILS, P_READ_DETAILS, P_COMMANDS und P_ITEMS
      sollte NICHT direkt zugegriffen werden.
