AddSpecialExit()
****************


FUNKTION
========

   void AddSpecialExit(string|string* cmd, string|closure func);


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

   /std/room/exits


ARGUMENTE
=========

   string/string* cmd
        die Richtung(en), in die der Ausgang fuehrt
   string/closure func
        der Name der aufzurufenden Funktion/Closure


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

   Es wird ein Ausgang in die Richtung(en) cmd eingefuegt. Wird der
   Ausgang benutzt, so wird die Closure bzw. Funktion func ausgefuehrt.

   AddSpecialExit(cmd, "func") entspricht:
   - AddExit(keys, #'func)


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

   In func muss man den Spieler selbst in den Zielraum bewegen. Im
   Erfolgsfall sollte man einen Wert >0 zurueckgeben, im Fehlerfall einen
   Wert <=0.

   func bekommt als Parameter einen String mit der gewaehlten
   Bewegungsrichtung uebergeben.


BEISPIELE
=========

   // ein Ausgang soll nur von Froeschen benutzbar sein:

   AddSpecialExit("loch", "lochfkt");
   // der gleiche Aufruf, nur anders:
   // static int lochfkt(string dir);         // Prototyp
   // ...
   // AddSpecialExit("loch", #'lochfkt);
   // auch identisch zu:
   // AddExit("loch", #'lochfkt);

   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
==========

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

Letzte Aenderung: 22.12.2016, Bugfix
