
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
