DefendFunc()
************


FUNKTION
========

   public int DefendFunc(string* dtyp, mapping spell, object enemy);


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

   Eigenen Objekten; fuer /std/armour/combat.c


ARGUMENTE
=========

   dtyp
      Schadenstypen der Angriffsart.

   spell
      Ein Mapping mit weiteren Infos. Bei einem konventionellen
      Angriff ist spell[SP_PHYSICAL_ATTACK] gleich 1.

   enemy
      Der angreifende Gegner


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

   Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus
   (oder auch ein Ruestungsmalus) errechnet werden, der zu dem
   normalen Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert
   wird.


RUeCKGABEWERT
=============

   Der Ruestungsbonus, der zur Ruestungsklasse addiert werden soll.


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

   Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
   zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
   dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
   Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen die
   DefendFuncs nicht konstant wirken. Ausserdem sind solche Ruestungen
   immer genehmigungspflichtig.

   Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
   SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.


BEISPIELE
=========

   Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
   und bei Angriffen durch Geister geschwaecht wird:

   protected void create()
   {
     ::create();

     SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
     SetProp(P_AC, 20);
     ...
     // Die DefendFunc() ist in der Ruestung selbst definiert
     SetProp(P_DEFEND_FUNC, this_object());
   }

   public int DefendFunc(string* dtyp, mapping spell, object enemy)
   {
     int prot;

     // Zuerst fragen wir den Angriff durch Feuer ab:
     if (member(dtyp, DT_FIRE) >= 0)  // Feuer gehoert zu den Schadenstypen
       prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
                              // kommt man also maximal auf 14+20 = 34,
                              // liegt also unter der fuer AT_ARMOUR
                              // geltenden Obergrenze

     // Und jetzt der Geistertest
     if (enemy->QueryProp(P_RACE) == "Geist" ||
         enemy->is_class_member(CL_GHOST))
       prot -= random(10);

     // Der Rueckgabewert wird auf den aus P_AC errechneten Wert
     // draufgeschlagen
     return prot;
   }


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

   P_DEFEND_FUNC, QueryDefend() /std/armour/combat.c
