
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
