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
