
FUNKTION:
     int RegisterHelperObject(object helper, int type, 
                              string|closure callback);

DEFINIERT IN:
     /std/living/helpers.c

ARGUMENTE:
     object helper
       Das Objekt, das bei einem Lebewesen als Hilfsobjekt registriert 
       werden soll. Das Objekt muss sich dazu nicht im Inventar des
       Lebewesens befinden.
     int type
       Helfertyp, einer der in /sys/living/helpers.h definierten Typen:
       - HELPER_TYPE_AERIAL fuer die Flug-/Segelunterstuetzung
       - HELPER_TYPE_AQUATIC fuer Tauchunterstuetzung
     string|closure callback
        Closure oder Funktionsname als String; dies ist die Funktion, die im
        Objekt helper gerufen wird, um abzufragen, ob es sich aktuell fuer
        zustaendig erklaert oder nicht.

BESCHREIBUNG:
     Das Objekt "helper" wird als Hilfsobjekt fuer bestimmte Aktivitaeten wie
     zum Beispiel Fliegen oder Tauchen registriert. 
     
     Die als Callback uebergebene Funktion wird bei der Abfrage der 
     P_*_HELPERS-Properties (siehe unten) aufgerufen und deren 
     Rueckgabewert in der Property vermerkt. 
     
     Der Rueckgabewert der Callback-Methode muss im Wertebereich 
     0..10000 liegen, wobei ein Wert von 0 bedeutet, dass das Hilfsobjekt 
     sich gerade nicht zustaendig fuehlt. Bei den Werten >0 ist es dem 
     abfragenden Objekt ueberlassen, wie es diese Daten bewertet.

     Die Funktion muss existieren und public sein, d.h. von aussen gerufen 
     werden koennen.
     
     Die Funktion bekommt das Spielerobjekt und das abfragende Objekt als
     Parameter uebergeben.

HINWEIS:
     Es ist ein Unterschied, ob sich ein Objekt via UnregisterHelperObject()
     als Helfer austraegt, oder ob der Aufruf der Callback-Funktion eine
     0 zurueckgibt. Im letzteren Fall ist das Objekt nach wie vor 
     registriert und kann trotzdem vom abfragenden Objekt als 
     funktionsfaehig angesehen werden.

RUECKGABEWERTE:
      1  Objekt wurde erfolgreich registriert (HELPER_SUCCESS)
     -1  angegebenes Hilfsobjekt existiert nicht (HELPER_NO_CALLBACK_OBJECT)
     -2  angegebenes Hilfsobjekt ist bereits fuer diese Art der
         Unterstuetzung registriert (HELPER_ALREADY_LISTED)

BEISPIELE:
     a) Eine luftgefuellte Blase will sich als Tauch-Helfer am Spieler
     anmelden und ist zustaendig, solange sich noch Luft in ihr befindet:

     int luft = 5; // globale Variable z.B. fuer Luftinhalt von 5 Atemzuegen

     // Registrierung im Spielerobjekt
     if ( TP->RegisterHelperObject(ME, HELPER_TYPE_AQUATIC,
          "DivingCallback") == HELPER_SUCCESS ) {
       tell_object(TP, "Du kannst jetzt mit Hilfe der Luftblase unter Wasser "
         "atmen.\n");
     }

     // hier koennen natuerlich auch noch komplexere Dinge ablaufen, z.B.
     // wenn ein Wert zurueckgegeben werden soll, der nicht nur 0 oder 1 ist.
     public int DivingCallback(object player, object caller) {
       return (environment(ME)==player && luft>0);
     }

     b) Ein Spieler befindet sich in einem Raum mit einem steilen Abhang, den
     man hinunterspringen kann. Dies geht aber nur dann gefahrlos, wenn es
     Hilfsobjekte gibt, die den (Segel)flug erlauben:

     // cmd_springen() sei die Funktion, die bei der Eingabe des Befehls durch
     // den Spieler aufgerufen wird.
     static int cmd_springen(string str) {
       [...]
       // Property abfragen
       mapping helpers = TP->QueryProp(P_AERIAL_HELPERS);
       // Liste der Werte fuer die einzelnen Unterstuetzungsobjekte ermitteln
       int *values = m_values(helpers,0);
       // Spieler schonmal runterbewegen, die Folgen seines Handelns spuert
       // er dann, wenn er unten angekommen ist.
       TP->move(zielraum, M_GO|M_SILENT);
       // "helpers" ist immer ein Mapping, das pruefen wir nicht extra.
       // Wenn die Liste der Objekte noch mindestens ein Element enthaelt,
       // nachdem alle unzustaendigen Hilfsobjekte (Rueckgabewert der
       // Callback-Funktion == 0) rausgerechnet wurden, existiert mindestens
       // ein geeignetes Hilfsobjekt.
       if ( sizeof(values-({0})) ) {
         tell_object(TP, "Sanft segelst Du den Hang hinab.\n");
       }
       else {
         tell_object(TP, BS("Todesmutig springst Du den Hang hinab und "
           "schlaegst hart unten auf. Du haettest vielleicht daran denken "
           "sollen, Dir geeignete Hilfsmittel fuer so eine Aktion zu "
           "besorgen.");
         TP->Defend(800, ({DT_BLUDGEON}), ([SP_NO_ACTIVE_DEFENSE:1]), ME);
       }
       return 1;
     }

SIEHE AUCH:
     Funktionen:  UnregisterHelperObject()
     Properties:  P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
     Sonstiges:   /sys/living/helpers.h

05.02.2015 Arathorn

