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:`QueryDefend`
     /std/armour/combat.c
