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(),
     H_HOOK_EXIT_USE, P_EXITS, P_HIDE_EXITS, /std/room/exits.c
     ausgaenge

31.01.2015, Zesstra

