
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
