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(), DefendOther(),
      Kill(), IsEnemy(), Defend(), QueryDefenders(),
      QueryPresentDefenders(), QueryNearDefenders(),

   Properties
      P_DEFENDERS

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

Last modified: 2019-Aug-26, Arathorn
