
Defend()
********


FUNKTION
========

   public int Defend(int dam, string|string* dam_types, int|mapping
   si_spell,
      object enemy)


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

   /std/living/combat


ARGUMENTE
=========

   int dam
      Initiale Staerke des Angriffs (10 dam ~ 1 HP)

   string* dam_types
      Art des Schadens, der angerichtet werden soll Muss ein Array von
      Schadenstypen sein, alte Objekte uebergeben hier manchmal
      strings.

   mapping si_spell
      Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
      Alte Objekte uebergeben manchmal einen Integer (0 fuer
      Physikalischen Angriff, 1 fuer Zauber.

   object enemy
      Der Feind/Schadenverursacher


BESCHREIBUNG
============


Generell
--------

   Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
   Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
   des Schadens dementsprechend vermindert. Ggf. wird der Schaden
   zugefuegt und der Feind in  die Liste der Feinde aufgenommen. Der
   Schaden betraegt: (dam-
   Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
   aber nicht unter 0.


Der Parameter 'spell'
---------------------

   Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
   Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
   diverse Flags, die das Ergebnis manipulieren (in new_skills.h
   enthalten). Nichtangabe eines Flags gilt als 0.

   * SP_PHYSICAL_ATTACK (int)

        1, wenn es ein physischer Angriff ist, d.h. Ruestungen wirken
        sollen, 0 sonst. Dies entspricht dem alten !spell (wenn Spell
        kein Mapping ist).

   * SP_NO_ENEMY (int)

        1, falls der Angriff nicht toedlich ist, es also keinen echten
        Gegner gibt. Es wird dann reduce_hit_points() gerufen statt
        do_damage()

   * SP_NO_ACTIVE_DEFENSE (int)

        1, falls aktive Abwehren (wie zurueckschlagende Amulette,
        Karateabwehren oder Ausweichmanoever) unterbleiben sollen, zB
        bei Kratzen durch Dornen oder Fall aus grosser Hoehe ist
        aktive Abwehr oder Ausweichen unlogisch

   * SP_RECURSIVE (int)

        1, falls der Spell aus einem Defend gerufen wurde (oder einer
        DefendFunc). Dies ist sehr wichtig, um unendliche Rekursionen
        zu vermeiden, wenn zwei zurueckschlagende Verteidigungen
        zusammentreffen.

   * SP_NAME (string)

        Name des Spells

   * SP_GLOBAL_ATTACK (int)

        1 bei Flaechenspells (die mehrere Ziele treffen koennen)

   * SP_REDUCE_ARMOUR (mapping) ------------ Mapping: keys
     AT_X/P_BODY, values int>=0

        Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
        typabhaengig reduziert. Als Keys sind P_BODY und die AT_*
        erlaubt, die Werte muessen ints > 0 sein. Aufbau eines
        Mappings im Beispiel:

           ([AT_BOOTS: 0,  // Stiefel schuetzen gar nicht
             P_BODY:  50,  // Koerper zu 50%
             AT_BELT: 600  // Guertel zu 600%
           ])
           -> alle 'fehlenden' Eintraege wirken normal

   * SP_SHOW_DAMAGE (int or Array von Array)

        0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen.
        Falls individuelle Treffermeldungen geschwuenscht sind,
        koennen aber auch in einem Array Ersatz-Treffermeldungen
        definiert werden. Das Format ist:

           ({
           ({ int lphit1, string mess_me, string mess_en, string mess_room }),
           ({ lphit2, mess_me, mess_en, mess_room }),
           ...
           ({ lphitn, mess_me, mess_en, mess_room }),
           })
           wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
           aufsteigend sortiert.

        Ist ein Treffer x LP hart, werden die Meldungen des lphit-
        Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
        liegt.

        In den Meldungen mess_me (an den Getroffenen), mess_en (an den
        Feind), mess_room (an die restlichen Umstehenden) koennen
        Ersatzstrings wie folgt verwendet werden:

           @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
           @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)

   * EINFO_DEFEND (mapping)

        Dieses Mapping liefert erweiterte Informationen zu dem
        bisherigen Ablauf des aktiven Attacks. Die verfuegbaren
        Informationen sind in der Manpage zu DefendInfo festgehalten.


Reihenfolgen in Defend
----------------------

   * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
     existiert und kein netztoter Spieler ist

   * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)

   * P_TMP_ATTACK_HOOK wird abgefragt

   * die Ruestungen werden vom Schaden gegebenenfalls abgezogen

   * magischer Ausweichskill beruecksichtigt

   * sensitive Objekte werden ggf. benachrichtigt

   * InternalModifyDefend wird gerufen

   * Koerperabwehr abgezogen

   * der Schaden an do_damage()/reduce_hit_points() uebergeben

   * Flucht ueberpruefen mit CheckWimpyAndFlee()


BEMERKUNGEN
===========

   Ruestungen wirken konventionell nur, wenn mindestens ein
   Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
   SP_PHYSICAL_ATTACK auf 1 ist.

   Defend() beruecksichtigt magische Verteidigungen, die der Spieler
   bei sich hat, sollte also aus Fairness gegenueber den Objekten
   anderer Magier immer dem direkten reduce_hit_points() oder
   do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
   man sehr viel aendern.


RUECKGABEWERT
=============

   Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
   Lebenspunkte des Lebewesens.


BEISPIELE (SIEHE AUCH Defend_bsp)
=================================

   // ein simpler Angriff:
   enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());

   // ein magischer Angriff (ohne Treffermeldung):
   enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());

   // ein magischer Angriff mit Treffermeldung:
   enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
     this_object());


SIEHE AUCH
==========

   Angriff: Attack(), P_NO_ATTACK, InsertEnemy()

   Schaden:   P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(),
   reduce_hit_points()

   Schutz:    P_DEFENDERS, InformDefend(), DefendOther(), P_ARMOURS,
   P_AC, P_DEFEND_FUNC, QueryDefend(), P_BODY

   Daten:     P_LAST_COMBAT_TIME, P_LAST_DAMTYPES, P_LAST_DAMTIME,
   P_LAST_DAMAGE, P_DAMAGE_MSG

   Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance()

   Sonstiges: CheckSensitiveAttack(), InternalModifyDefend(),
   normalize_defend_args() UseSkill(), DefendInfo()

Letzte Aenderung: 20.01.2019, Zesstra
