
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
