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
