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


FUNKTION
========

   public <int|string*|mapping|object>* 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
