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
----------

     :doc:`../props/P_DEFEND_FUNC`, :doc:`QueryDefendd`
     /std/armour/combat.c
