AddExit()
*********


FUNKTION
========

   void AddExit(string|string* cmd, closure|string dest);


DEFINIERT IN
============

   /std/room/exits


ARGUMENTE
=========

   string/string* cmd
        die Richtung(en), in die der Ausgang fuehrt
   string/closure dest
        das Ziel des Ausgangs mit Text/Closure


BESCHREIBUNG
============

   Es wird ein Ausgang in die Richtung(en) cmd eingefuegt. Die Art des
   Ausgangs haengt ab von dest:

   - ein String:
     - mit einem Dateinamen:
       Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet.
     - der Form "<msg>#dateiname"
       Der Ausgang fuehrt in den Raum, den der Dateiname bezeichnet,
       bei der Benutzung wird jedoch statt "<name> geht nach <richtung>"
       "<name> geht nach <msg>" ausgegeben.
   - eine Closure:
     Die Closure wird bei Nutzung des Ausgangs aufgerufen. Das entspricht
     eine SpecialExit - in der gerufenen Funktion muss man den Spieler
     selbst in den Zielraum bewegen.
     Gegebenenfalls kann das durch AddCmd() ersetzt werden.


BEMERKUNGEN
===========

   Man kann fuer den Dateinamen des Zielraumes auch einen relativen Pfad
   angeben. Die Auswertung erfolgt nach folgendem Schema:
   - "./<dateiname>"
     Es wird ein Zielraum relativ zum gleichen Verzeichnis wie dieser
     Raum angesprochen.
   - "../<dateiname>"
     Es wird ein Zielraum relativ zur Verzeichnisebene ueber der
     dieses Raumes angesprochen (analog mit mehrerern "../..")

   Mittels P_HIDE_EXITS kann man Ausgaenge verstecken.

   Bei der Benutzung eines Ausgangs wird der Hook H_HOOK_EXIT_USE
   ausgeloest.


BEISPIELE
=========

   ### normale Ausgaenge ###
   // Beim Kommando "sueden" kommt: "<name> geht nach Sueden."
   AddExit("sueden", "/gilden/abenteurer");

   // Beim Kommando "sueden" kommt: "<name> geht in die Gilde."
   AddExit("sueden", "in die Gilde#/gilden/abenteurer");

   ### Ausgaenge mit relativen Pfaden ###
   // Der Name des Raumes sei "/d/inseln/wargon/hafen1"
   // Dieser Ausgang geht nach "/d/inseln/wargon/kneipe":
   AddExit("norden", "./kneipe" );

   // Und dieser nach "/d/inseln/anthea/anlege":
   AddExit("sueden", "../anthea/anlege" );

   ### dynamische Ausgaenge ###
   // ein Ausgang soll nur von Froeschen benutzbar sein:

   static int lochfkt(string dir);            // Prototyp
   ...
   AddExit("loch", #'lochfkt);
   // auch identisch zu:
   // AddSpecialExit("loch", #'lochfkt); [eine Closure] oder
   // AddSpecialExit("loch", "lochfkt"); [ein Funktionsname]

   static int lochfkt(string dir) {
     if (!(this_player()->QueryProp(P_FROG))) {
       // Kein Frosch => passt nicht!
       notify_fail("Du bist zu gross!\n");
       return 0;
     }
     // Meldungen werden im move() gleich mitgegeben
     return this_player()->move("/room/loch", M_GO, 0,
                  "huepft ins Loch", "huepft herein");
   }


SIEHE AUCH
==========

   AddSpecialExit(), GetExits(),
   RemoveExit(), RemoveSpecialExit(),
   GuardExit(),
   H_HOOK_EXIT_USE, P_EXITS, P_HIDE_EXITS, /std/room/exits.c
   ausgaenge

Letzte Aenderung: 22.12.2016, Bugfix
