
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*, "QueryDefendd" /std/armour/combat.c
