
DefendOther()
*************


FUNKTION
========

   public <int|string*|mapping>* DefendOther(int dam, string* dam_type,
                                       int|mapping si_spell, object enemy)


DEFINIERT IN
============

   /std/living/combat.c


ARGUMENTE
=========

   int dam
     Der Schaden, der voraussichtlich beim zu verteidigenden Lebewesen
     verursacht werden soll.

   string* dam_type
     Der Schadenstyp (oder die Schadenstypen), der beim zu
     verteidigenden Lebewesen verursacht werden sollen.

   mapping si_spell
     Mapping mit zusaetzlichen Informationen zum Angriff
     Alte Objekte uebergeben manchmal einen Integer (0 fuer
     physikalischen Angriff, 1 fuer Zauber.

   object enemy
     Der Feind, der ein zu verteidigendes Lebewesen angegriffen hat.


RUeCKGABEWERT
=============

   Array mit den Eintraegen der gegebenenfalls veraenderten
   uebergebenen Parameter:
           (1) dam      [Typ int],
           (2) dam_type [Typ string*],
           (3) spell    [Typ mapping].


BESCHREIBUNG
============

   Es ist moeglich, dass Objekte Angriffe auf Lebewesen abwehren oder
   umwandeln, sofern diese Objekte bei dem angegriffenen Lebewesen
   mittels AddDefender() angemeldet wurden und sich der selben Umgebung
   befinden.
   Zumeist wird es sich bei den Objekten natuerlich ebenfalls um
   andere Lebewesen handeln, die das Lebewesen, bei dem sie angemeldet
   sind, verteidigen sollen.

   Bei einem Angriff auf das Lebewesen koennen alle Objekte per Aufruf
   von DefendOther() in einen Angriff eingreifen, wobei die
   Schadensstaerke, der Schadenstyp (die Schadenstypen),
   Zusatzinformationen fuer Angriffsspells und der Angreifer als
   Parameter uebergeben werden.

   Des weiteren ist zu beachten, dass bei als physikalisch markierten
   Angriffen in einem Team nur Verteidiger aus der ersten Reihe
   beruecksichtigt werden und dass bei einem Angriff zufaellig aus
   allen moeglichen Verteidigern ausgewaehlt wird.

   Standardmaessig ist diese Funktion in Lebewesen bereits definiert,
   wobei der Skill SK_DEFEND_OTHER, sofern vorhanden, aufgerufen wird.


BEISPIEL
========

   Sehr beliebt sind in Gilden NPCs, die den Beschwoerer begleiten und
   verteidigen, z.B. beschworene Daemonen:

   inherit "/std/npc";

   include <properties.h>

   object owner;

   void create() {
     ::create();
     SetProp(P_NAME,"Daemon");
     ...
   }

   // nach Clonen des Daemons folgende Funktion mit Beschwoerer als
   // Parameter aufrufen
   void Identify(object caster) {
     if (!objectp(caster))
       call_out(#'remove,0);
     owner = caster;
     owner->AddDefender(this_object());
   }

   // der Daemon wehrt jeden Angriff mit Feuer voll ab, man muss zuerst
   // den Verteidiger umbringen, um den Beschwoerer toeten zu koennen
   public <int|string*|mapping>* DefendOther(int dam,
       string|string* dt, int|mapping spell, object enemy) {
     if (sizeof(dt) && member(dt, DT_FIRE) != -1)
       dam = 0;
     return ({dam, dam_type, spell});
   }

   Soll der Daemon sich auch in ein Team einordnen, in welchem sich der
   Beschwoerer eventuell befindet, so ist zusaetzlich AssocMember() in
   diesem Beschwoerer aufzurufen, wobei der Daemon als Parameter
   uebergeben wird.


SIEHE AUCH
==========

   Funktionen:
      AddDefender(), RemoveDefender(), InformDefend(), Kill(),
      IsEnemy(), Defend()

   Properties
      P_DEFENDERS

   Objekte:
      /std/living/combat.c, /sys/new_skills.h

Last modified: 2019-Aug-26, Arathorn
