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

