Defend()
========

FUNKTION
--------

  public int Defend(int dam, string|string* dam_type, int|mapping spell, 
    object enemy)

DEFINIERT IN
------------

  /std/living/combat

ARGUMENTE
---------

  int dam
    Initiale Staerke des Angriffs (10 dam ~ 1 HP)
  string* dam_type
    Art des Schadens, der angerichtet werden soll
    Muss ein Array von Schadenstypen sein, alte Objekte uebergeben hier
    manchmal strings.
  mapping 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 ---------- 0/1
      1, wenn Ruestungen wirken sollen, 0 sonst
      -> entspricht !spell, wenn dieses Int ist
    - SP_NO_ENEMY ----------------- 0/1
      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 -------- 0/1
      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 ---------------- 0/1
      1, falls der Spell aus einem Defend gerufen wurde (oder einer DefendFunc)
      -> verhindert Rekursionsprobleme
    - SP_NAME --------------------- string
      Name des Spells
    - SP_GLOBAL_ATTACK ------------ 0/1
      1 bei Flaechenspells
    - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
      Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig 
      reduziert. 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 -------------- 0/1 oder Array von Arrays
      0, fuer keine Treffermeldung, 1 sonst
      In einem Array koennen Ersatz-Treffermeldungen definiert werden. 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]), this_object());

  // ein magischer Angriff mit Treffermeldung:
  enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([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:`UseSkill`,
  :doc:`DefendInfo`

Letzte Aenderung: 29.12.2017, Bugfix
