DefendFunc(L)

FUNKTION:
     int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);

DEFINIERT IN:
     eigenen Objekten; fuer /std/armour/combat.c

ARGUMENTE:
     dtyp
          Schadenstypen der Angriffsart.
          Sollte heute ein string* sein.
     spell
          0 bei veralteten konventionellen Angriffen im Regelfall jedoch
          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.

     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:

     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());
     }

     int DefendFunc(string *dtyp, mixed 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

----------------------------------------------------------------------------
Last modified: 18.Jul 2006 Muadib
