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:
    :doc:`../lfun/AddDefender`, :doc:`../lfun/RemoveDefender`, :doc:`../lfun/InformDefend`, :doc:`../lfun/Kill`, :doc:`../lfun/IsEnemy`, :doc:`../lfun/Defend`
  Properties
    :doc:`../props/P_DEFENDERS`
  Objekte:
    /std/living/combat.c, /sys/new_skills.h

Last modified: 2019-Aug-26, Arathorn 
