SearchPath()
************


FUNKTION
========

   public int SearchPath(string from, string to, int para,
                         closure callback)


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

   /p/daemon/pathd.c
   <sys/pathd.h>


ARGUMENTE
=========

   from     - Der Startpunkt
   to       - Der Endpunkt
   para     - Die Parawelt in der gesucht wird (Normalwelt: 0)
   callback - Closure, die am Ende der Pfadsuche gerufen wird


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

   Diese Funktion berechnet - sofern moeglich - den kuerzesten Pfad zwischen
   <from> und <to> in der (Para-)Welt <para>.



   Die Pfadsuche wird anhand von Daten ueber von Spielern gelaufene Wege
   durchgefuehrt. D.h. Gebiete, die von Spielern nicht (in letzter Zeit mal)
   betreten werden, sind auch dem Pfaddaemon nicht bekannt. Auch kann es
   Gebiete geben, wo zwar gebietsintern Pfade bekannt sind, aber keine Wege
   in den Rest vom MG.

   Da diese Suche im Allgemeinen SEHR aufwendig sein kann, wird sie meistens
   nicht sofort fertig, sondern dauert eine Weile. Wenn sie fertig ist, wird
   die Closure <callback> aufgerufen und ihr die Argumente <from>, <to>,
   <parawelt>, <kosten>, <path> und <cmds> uebergeben. Die Bedeutung
   dieser Argumente ist unten erklaert.

   Eine Suche nach einem Pfad in einer Parawelt fuehrt durch Raeume der
   gewuenschen Parawelt und durch Raeume der Normalwelt.


RUeCKGABEWERT
=============

    1      - Suche wurde gestartet
    2      - Pfad gefunden (und callback gerufen)
   -1      - es laeuft schon ein Suchauftrage fuer die UID des anfragenden
             Objektes
   -2      - es laufen bereits zuviele Suchanfragen
   -3      - <from> und/oder <to> sind nicht bekannt



   An <callback> uebergebene Argumente am Ende der Pfadsuche:
       <from> - Startpunkt des Weges (string)
       <to>   - Zielpunkt des Weges (string)
       <para> - Parawelt des Weges (int)
       <costs>- Kosten des Wege. (int) Je hoeher, desto
                laenger/unguenstiger. 0, wenn kein Pfad gefunden
       <path> - Array mit Raumnamen, die durchlaufen werden (string*)
                0, wenn kein Pfad gefunden
       <cmds> - Array mit Kommandos zum Ablaufen des Weges (string*)
                0, wenn kein Pfad gefunden


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

   Es ist natuerlich nicht dazu gedacht, Spielern fertige Routen zwischen
   Orten zu geben - bzw. nur in Ausnahmefaellen.
   Pfadabfrgen werden geloggt.

   Die Angabe <costs> sagt grob etwas ueber die Laenge und vor allem ueber die
   "Qualitaet" des Pfades aus. Die steigt bei Paraweltwechseln, wenig
   abgelaufenen Verbindungen zwischen Raeumen oder wenn eine Verbindung kein
   normaler Ausgang ist.

   Die Closure <callback> sollte nicht zuviele Ticks verbrauchen.


BEISPIEL
========

   #include <pathd.h>
   void suchergebnis(string from, string to, int para, int costs, string*
        path, string* cmds) {
        tell_object(find_player("zesstra"), sprintf(
            "Ergebnis Pfadsuche von %s nach %s in Para %d fuer %d:\n %O\n %O\n",
            from, to, para, costs, path, cmds));
   };

   ...
   mixed res=PATHD->SearchPath("/gilden/abenteurer",
                               "/d/ebene/dancer/lucky/room/pova_la3",
                               0, #'suchergebnis);

22.12.2015, Zesstra
