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

FUNKTION
--------
::

    public <int|string*|mapping>* 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 
