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(en) des Schadens, der angerichtet werden
                              soll
                              Muss ein Array von Schadenstypen sein,
                              alte Objekte uebergeben hier manchmal strings.
     int/mapping spell        - 0 fuer normale Angriffe (keine Zauber)
                              - 1 fuer Zauber (Standardruestungen ignorieren)
                              - mapping fuer mehr Informationen
                              Heute bitte nach Moeglichkeit ein Mapping
                              uebergeben.
     object enemy             der Feind/Schadenverursacher

BESCHREIBUNG
------------
::

     1. 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.

     2. 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_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.

     3. 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}), 0, this_object());

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

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

SIEHE AUCH
----------
::

     Angriff:   Attack(L), P_NO_ATTACK, InsertEnemy(L)
     Schaden:   P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE,
                do_damage(L), reduce_hit_points(L)
     Schutz:    P_DEFENDERS, InformDefend(L), DefendOther(L)
                P_ARMOURS, P_AC, P_DEFEND_FUNC, QueryDefend(L)
                P_BODY, A_DEX
     Daten:     P_LAST_COMBAT_TIME
                P_LAST_DAMTYPES, P_LAST_DAMTIME, P_LAST_DAMAGE
                P_DAMAGE_MSG
     Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance(L)
     Sonstiges: CheckSensitiveAttack(L)
                InternalModifyDefend(L)
                UseSkill(L),
                DefendInfo

15.09.2010, Zesstra

