
P_AQUATIC_HELPERS
*****************


NAME
====

   P_AQUATIC_HELPERS "lib_p_aquatic_helpers"


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

   <living/helpers.h>


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

   Diese Property kann in allen Lebewesen abgefragt werden, um die
   Objekte zu ermitteln, die fuer die Unterstuetzung beim Tauchen bei
   diesem Lebewesen registriert haben. Die Daten werden als Mapping
   der folgenden Form zurueckgeliefert: ([ Objekt : Rueckgabewert von
   dessen Callback-Methode ]) Eine Erlaeuterung dazu findet sich in
   der Dokumentation zu *RegisterHelperObject()*.


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

   Diese Property kann nur abgefragt werden. Es ist erwuenscht, dass
   entsprechende, neu geschaffene Stellen jegliche Helfer akzeptieren,
   deren Callback-Methode >0 zurueckgibt.


BEISPIEL
========

   Um zu ermitteln, ob der Spieler mindestens ein Objekt bei sich hat,
   das beim Tauchen hilft, sucht man alle Objekte aus dem Mapping
   heraus, die einen Wert >0 eingetragen haben und prueft deren
   Anzahl:

   mapping aquatic = this_player()->QueryProp(P_AQUATIC_HELPERS);
   object* helpers = filter( m_indices(aquatic), function int (object h) {
                       return (aquatic[h]>0); });
   if ( sizeof(helpers) ) {
     tell_object(this_player(), "Du stuerzt Dich in die Fluten und "
       "stellst ueberrascht fest, dass Du mit Hilfe "+
       helpers[0]->name(WESSEN,1)+" sogar unter Wasser atmen kannst!\n");
   }
   else {
     tell_object(this_player(), "Du hast nichts zum Tauchen bei Dir.\n");
   }


SIEHE AUCH
==========

   Methoden:    *RegisterHelperObject()*, *UnregisterHelperObject()*
   Properties:  *P_HELPER_OBJECTS*, *P_AERIAL_HELPERS*

04.02.2018, Arathorn
