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


FUNKTION
========

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


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

   /std/living/combat.c


ARGUMENTE
=========

   dam
     Der Schaden, der voraussichtlich beim zu verteidigenden Lebewesen
     verursacht werden soll.
   dam_type
     Der Schadenstyp (oder die Schadenstypen), der beim zu
     verteidigenden Lebewesen verursacht werden sollen.
   spell
     Wenn das zu verteidigende Lebewesen mit Spells angegriffen wurde,
     so koennte man hier mehr Infos entnehmen.
   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.
   Desweiteren 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
     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
     mixed DefendOther(int dam,mixed dam_type,mixed spell,object enemy)
     { if(sizeof(dam_type)&&member_array(DT_FIRE,dam_type)!=-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
==========

   AddDefender(), RemoveDefender(), InformDefend(), Kill(), IsEnemy(),
   P_DEFENDERS, /std/living/combat.c, /sys/new_skills.h

Last modified: Fri Feb 25 14:45:00 2000 by Paracelsus
