DefendOther()
=============

FUNKTION
--------
::

	mixed DefendOther(int dam,mixed dam_type,mixed 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

