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 'si_spell'
------------------------

   Ist 'si_spell' 0, dann gilt der Angriff als normale physische
   Attacke Uebergibt man als 'si_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/P_PARRY_WEAPON, values int>=0 Die
        Schutzwirkung durch P_AC/Magie einer Ruestung wird
        typabhaengig reduziert. Als Keys sind P_BODY, P_PARRY_WEAPON
        und die AT_* erlaubt, die Werte muessen ints >= 0 sein. Mit
        AT_DEFAULT_REDUCE laesst sich ein Standardwert fuer alle nicht
        gesetzten Eintraege setzen. Diese wirken dann nicht normal,
        sondern mit der hier angegebenen Staerke. 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, SP_SHOW_DAMAGE:0 ]),this_object());

   // ein magischer Angriff mit Treffermeldung:
   enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
         ([SP_PHYSICAL_ATTACK:0, 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: 08.07.2025, Bugfix
