trigger_sensitive_attack()
==========================

FUNKTION
--------
::

     varargs void trigger_sensitive_attack(object enemy, string key, int
     dam, mixed spell, mixed *options);

DEFINIERT IN
------------
::

     eigenen sensitiven Objekten, wird aufgerufen von
     /std/living/inventory.c

ARGUMENTE
---------
::

     enemy
          Der Gegner, der die Aktion ausgeloest hat.
     key
          Der ausloesende Schadenstyp.
     dam
          Der angerichtete Schaden.
     spell
          Wie bei Defend().
     options
          Array mit den in P_SENSITIVE angegebenen Optionen fuer diese
          Aktion.

BESCHREIBUNG
------------
::

     Wenn der bei einem Angriff zugefuegte Schaden den in P_SENSITIVE
     angegebenen Grenzwert uebersteigt sowie der als Schluessel angegebene
     Schadenstyp in den Schaedenstypen des Angriffes vorkommt, wird diese
     Funktion aufgerufen und kann entsprechend reagieren.

RUeCKGABEWERT
-------------
::

     keiner

BEISPIELE
---------
::

     Eine Fackel, die sich bei Feuerattacken selbst entzuendet und bei
     Wasserattacken verloescht, koennte man wie folgt implementieren:

     inherit "/std/lightsource.c"

     #include <properties.h>
     #include <sensitive.h>
     #include <combat.h>

     create()
     {
       ::create();

       SetProp(...); // die ueblichen Eigenschaften definieren

       SetProp(P_SENSITIVE,
           //  Ereignis          Key       Grenze (keine Optionen)
         ({ ({ SENSITIVE_ATTACK, DT_FIRE,  100 }),
            ({ SENSITIVE_ATTACK, DT_WATER, 100 }) }) );
     }

     varargs void
     trigger_sensitive_attack(object enemy, string key,
                              int dam, mixed spell)
     {
       // Es soll nicht verschwiegen werden, dass das Entzuenden und
       // Loeschen einer Lichtquelle so leider nicht funktioniert...
       if (key == DT_FIRE && !QueryProp(P_LIGHTED)) {
         SetProp(P_LIGHTED, 1);
         tell_object(environment(), "Die Fackel faengt Feuer.\n");
       }
       else if (key == DT_WATER && QueryProp(P_LIGHTED)) {
         SetProp(P_LIGHTED, 0);
         tell_object(environment(), "Die Fackel verlischt.\n");
       }
     }

SIEHE AUCH
----------
::

     trigger_sensitive_inv(), sensitive Objekte


Last modified: Sun May 19 15:56:25 1996 by Wargon

