FUNKTION:
     varargs int NewDoor(string|string* cmds, string dest, string|string* ids,
                         mapping|<int|string|string*>* props);
DEFINIERT IN:
     /std/room/doors.c

ARGUMENTE:
     cmds (string|string*)
          String oder Array von Strings mit den Befehlen, mit denen man
          durch die Tuer geht (in der Regel Richtungen wie "norden").
     dest (string)
          Pfad des Zielraumes, OHNE ".c", sonst wird eine zweiseitige Tuer
          (wie sie ueblich ist) nicht als solche erkannt.
     ids (string|string*)
          String oder Array von Strings mit den Bezeichnern der Tuer. Kann
          auch 0 sein; in diesem Fall laesst sich die Tuer nur als "tuer"
          ansprechen.
     props (mapping|<int|string|string*>*)
          Die Eigenschaften der Tuer (s.u.).

BESCHREIBUNG:
     Es wird eine neue Tuer geschaffen. Die Tuer laesst sich, wenn sie
     geoeffnet ist, mit den in <cmds> angegebenen Befehlen durchschreiten.
     Man gelangt dann in den Raum <dest>.

     Die Kommandos werden bei geoeffneter Tuer in die Liste der sichtbaren
     Ausgaenge eingefuegt.

     In <props> lassen sich Aussehen und Eigenschaften der Tuer festlegen.
     Historisch ist es ein Array mit Paaren von Schluesseln und Werten, d.h.
     es kommt immer erst ein Element, welches die Eigenschaft bezeichnet und
     dann ein Element mit dem Wert dieser Eigenschaft.
     Moderner ist es, ein Mapping mit den entsprechenden Schluesseln und
     Werten zu uebergeben. Dies ist auch dringend empfohlen.

     In <doorroom.h> sind dazu folgende Eigenschaften definiert:
     D_FLAGS
          DOOR_OPEN
               Die Tuer ist beim Erzeugen geoeffnet.
          DOOR_CLOSED
               Die Tuer ist beim Erzeugen geschlossen.
          DOOR_NEEDKEY
               Man benoetigt einen Schluessel zum Oeffnen der Tuer.
          DOOR_CLOSEKEY
               Man benoetigt einen Schluessel zum Schliessen der Tuer.
          DOOR_RESET_CL
               Die Tuer schliesst sich beim Reset.
          DOOR_RESET_OP
               Die Tuer oeffnet sich beim Reset.

     D_LONG
          Die Langbeschreibung der Tuer. 
          Hier kann ein Mapping eingetragen werden, das als Keys den Tuer-
          Status hat und die zugehoerige Langbeschreibung dazu. Beispiel:
          ([ D_STATUS_CLOSED : "Die Tuer ist geschlossen.\n",
             D_STATUS_OPEN   : "Die Tuer ist offen.\n" ])
          
          Default: "Eine Tuer.\n"

     D_SHORT
          Die Kurzbeschreibung der Tuer. Ein "%s" wird durch "geoeffnet"
          bzw. "geschlossen" ersetzt.

          Es werden die Kurzbeschreibungen aller im Raum vorhandenen Tueren
          aneinandergehaengt (es wird jeweils ein Leerzeichen eingeschoben),
          das Ganze mit break_string() umgebrochen und an P_INT_LONG
          angehaengt.

          Default: "Eine %se Tuer."

     D_NAME
          Der Name der Tuer. Dieser Name wird beim Oeffnen und Schliessen
          der Tuer sowie bei Fehlermeldungen ausgegeben. Man kann wie bei
          P_NAME einen String oder ein Array von Strings angeben.

          Default: "Tuer"

     D_GENDER
          Das Geschlecht der Tuer.

          Default: FEMALE

     D_MSGS
          String oder Array von drei Strings. Diese Strings werden beim
          Durchschreiten der Tuer an move() als dir bzw. dir, textout und
          textin uebergeben.

     D_FUNC
          String mit dem Namen einer Funktion, die im Startraum vor dem
          Durchschreiten der Tuer aufgerufen werden soll. Diese Funktion
          kann das Durchschreiten jedoch nicht verhindern!

     D_FUNC2
          String mit dem Namen einer Funktion, die im Zielraum nach dem
          Durchschreiten der Tuer aufgerufen werden soll.

     D_TESTFUNC
          Falls auf den Namen einer Funktion gesetzt, wird diese Funktion
          vor dem Durchschreiten im Startraum aufgerufen. Wenn sie einen
          Wert != 0 zurueckliefert, wird die Tuer NICHT durchschritten. 

     D_RESET_MSG
          Meldung, die beim Reset der Tuer ausgegeben wird.

     D_OPEN_WITH_MOVE
          Tuer oeffnet automatisch bei Eingabe des Befehls zum 
          Hindurchgehen.
          
RUECKGABEWERT:
     1, wenn die Tuer ordungsgemaess eingebaut werden konnte, sonst 0.

BEMERKUNGEN:
     Zwei Tuerseiten gelten als verschiedene Seiten einer Tuer, wenn als
     Ziel in Raum A Raum B und in Raum B Raum A angegeben ist. Der Zustand
     wird abgefragt, wenn der Raum betreten wird (init), wenn die Tuer
     geoeffnet/geschlossen wird, P_INT_LONG oder P_EXITS abgefragt wird
     und beim Reset.

     Es sind auch Tueren moeglich, die nur auf einer Seite existieren, oder
     auch solche, die auf beiden Seiten verschieden aussehen oder gar auf
     einer Seite nur mit einem Schluessel zu oeffnen sind, auf der anderen
     jedoch kein Schluessel noetig ist.

     Wer aus irgendeinem Grund den Zustand einer Tuer selber abfragen oder
     veraendern will, kann dafuer in /obj/doormaster die Funktionen
     QueryDoorStatus(ziel) bzw. SetDoorStatus(ziel,status) aufrufen.

     *** ACHTUNG ***
     Es gibt eine Questbelohnung (Phiole aus der Sternenlicht-Quest von
     Miril), mit der man durch Tueren hindurchschauen kann. Derzeit ist das
     per default fuer alle Tueren erlaubt. Wenn man das nicht moechte,
     oder andere Texte ausgeben, als die Phiole normalerweise erzeugt,
     dann kann man dies durch Nutzung bestimmter Funktionen bzw. Flags
     erreichen. Zur Dokumentation siehe Manpage zu GetPhiolenInfos().

BEISPIELE:

  ** Dies ist eine gewoehnliche Tuer ohne Besonderheiten und ohne
     Extra-Beschreibung:

     NewDoor("sueden","/players/rochus/room/test1");

  ** Ein Portal:

     NewDoor("norden","/players/rochus/room/test2",
             "portal",
             ([ D_NAME:   "Portal",
                D_GENDER: NEUTER,
                D_SHORT:  "Im Norden siehst Du ein %ses Portal.",
                D_LONG:   "Das Portal ist einfach nur gigantisch.\n",
              ]) );

     Alternativ mit props in alter Arraynotation:
     NewDoor("norden","/players/rochus/room/test2",
             "portal",
             ({ D_NAME,   "Portal",
                D_GENDER, NEUTER,
                D_SHORT,  "Im Norden siehst Du ein %ses Portal.",
                D_LONG,   "Das Portal ist einfach nur gigantisch.\n"
              }) );
     
  ** Tueren mit Bewegungsmeldung:

     NewDoor("norden","/room/see2",
             ({ D_MSGS,  ({"nach Norden","schwimmt",
                           "kommt hereingeschwommen"}) }) );

  ** Eine Tuer mit Testfunktion:

     NewDoor("osten","/mein/zielraum",
             ({ D_TESTFUNC, "blocker_da" }) );

     Die Funktion blocker_da:

     int blocker_da()      // KEINE protected-Funktion! Sie wird sonst NICHT
     {                     // aufgerufen und ausgewertet!
       if ( present("mein_fieses_mo\nster",this_object()) )
        {
         write("Ein fieses Monster stellt sich Dir in den Weg.\n");
         return 1;
        }
       return 0;           // optional
     }

  ** Nun noch eine Tuer mit einigen Extras:

     NewDoor("nordwesten","/rooms/kammer",
             ({"tuer","holztuer"}),
             ({
               D_FLAGS,  (DOOR_CLOSED|DOOR_RESET_CL),
               D_MSGS,   ({"nach Nordwesten","geht",
                         "kommt durch eine Tuer herein"}),
               D_SHORT,  "Im Nordwesten siehst Du eine %se Holztuer.",
               D_LONG,   "Sie trennt den Laden vom dahinterliegenden Raum.\n",
               D_NAME,   "Holztuer",
               D_FUNC,   "view",
               D_FUNC2,  "look_up"
             }) );

     Im Startraum:

     void view()
     {
       write("Der Angestellte wirft Dir einen missbilligenden Blick zu, "
             "laesst Dich aber passieren.\n");
     }

     Im Zielraum:

     void look_up()
     {
       write("Ein alter Mann schaut kurz zu Dir auf und vertieft sich dann "
             "wieder in seine Akten.\n");
     }


SIEHE AUCH:
    QueryDoorKey(), QueryDoorStatus(), SetDoorStatus(),
    /std/room/doors.c, /obj/doormaster.c, GetPhiolenInfos(), QueryAllDoors()

-----------------------------------------------------------------------------
08.02.2015, Arathorn

