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)
---------------------------------

.. code-block:: pike

  // 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:
    :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`

  Schaden:
    :doc:`../props/P_ENABLE_IN_ATTACK_OUT`, :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`, :doc:`reduce_hit_points`

  Schutz:
    :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`, :doc:`DefendOther`, :doc:`../props/P_ARMOURS`, :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`, :doc:`QueryDefend`, :doc:`../props/P_BODY`

  Daten:
    :doc:`../props/P_LAST_COMBAT_TIME`, :doc:`../props/P_LAST_DAMTYPES`, :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`, :doc:`../props/P_DAMAGE_MSG`
  Resistenz:
    :doc:`../props/P_RESISTANCE_STRENGTHS`, :doc:`CheckResistance`

  Sonstiges:
    :doc:`CheckSensitiveAttack`, :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`, :doc:`UseSkill`, :doc:`DefendInfo`

Letzte Aenderung: 08.07.2025, Bugfix
