DefendInfo()
============

FUNKTION
--------
::

DEFINIERT IN
------------
::

     /sys/combat.h

ARGUMENTE
---------
::

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

     Die DefendInformationen werden im Runde eines Attack/Defend Vorgangs 
     in Attack initial angelegt und dem Defend ueber den Parameter spell
     uebergeben. Ist dieser Parameter ein Mapping, so sind die 
     DefendInformationen ueber den Key EINFO_DEFEND zu erhalten.
     Die Informationen liegen in Form eines Mappings vor.
     Vor Zugriff sollte immer auf die Existenz dieses Keys in dem Mapping
     geprueft werden, da nicht alle Informationen immer existieren.
     Die Keys sind in combat.h definiert und sind folgende:

     

    ORIGINAL_AINFO - Mapping 
        Hier ist eine Kopie des originalen ainfo-mappings des Attacks 
        vorhanden mit folgenden Eintraegen:
        Immer vorhandene Eintraege:
          SI_ENEMY              der angegriffene Gegner

        

        Angriff mit gezueckter Waffe:
          P_WEAPON              das Waffenobjekt selbst
          P_WEAPON_TYPE         P_WEAPON_TYPE der Waffe
          P_WC                  P_WC der Waffe
          P_NR_HANDS            P_NR_HANDS der Waffe
          SI_SKILLDAMAGE_TYPE   P_DAM_TYPE der Waffe
          SI_SKILLDAMAGE        waffe->QueryDamage(enemy)
             bei vorhandenem Zweihandskill SK_TWOHANDED wird nur der durch 
             den Skill modifizierte Schadenswert uebernommen
          SI_SKILLDAMAGE_MSG    "mit "+waffe->name(WEM,0)
          SI_SKILLDAMAGE_MSG2   "mit "+waffe->name(WEM,1)
          SI_SPELL              0

        Angriff mit blossen Haenden:
          P_WEAPON_TYPE         WT_HANDS
          P_WC                  P_HANDS[1]
          SI_SKILLDAMAGE        Schadenswert, aus P_HANDS[1] und A_STR 
                                berechnet
          SI_SKILLDAMAGE_TYPE   P_HANDS[2]
          SI_SKILLDAMAGE_MSG
          SI_SKILLDAMAGE_MSG2   beides P_HANDS[0]
          SI_SPELL              0

          

        Angriff mit einem Spell (SK_MAGIC_ATTACK):
          SI_SKILLDAMAGE        Schadenswert des Spells
          SI_SKILLDAMAGE_TYPE   Schadenstypen des Spells
          SI_SKILLDAMAGE_MSG    Schadensmeldung des Spells, wenn vorhanden,
                                sonst "mit magischen Faehigkeiten"
          SI_SKILLDAMAGE_MSG2   entsprechende Meldung des Spells, wenn 
                                gesetzt, ansonsten identisch mit 
                                SI_SKILLDAMAGE_MSG
          P_WEAPON_TYPE         P_WEAPON_TYPE des Spells, wenn vorhanden,
                                sonst WT_MAGIC
          SI_SPELL              SI_SPELL des Spells

          

        Hinweise:
        - Alle Eintraege in diesem Mapping koennen bereits durch
          InternalModifyAttack() veraendert worden sein.
        - Die Daten werden mittels deep_copy(ainfo) eingetragen.
        - Daten in den Eintraegen SI_SKILLDAMAGE* und SI_SPELL koennen bei
          physikalischen Angriffen durch die Skills FIGHT(P_WEAPON_TYPE) oder
          SK_FIGHT oder durch einen P_TMP_ATTACK_MOD bzw. Hook vom Typ 
          H_HOOK_ATTACK_MOD modifiziert worden sein.

        

    ORIGINAL_DAM - int
        Der Originalschaden aus dem Attack

    ORIGINAL_DAM_TYPE - string/string* 
        Der Originaldamagetyp aus dem Attack

    CURRENT_DAM - int
        Der momentane Schaden, nach schon erfolgten Modifikationen

  

    CURRENT_DAM_TYPE - string/string*
        Der momentane Damagetyp, nach schon erfolgten Modifikationen

  

    ENEMY_INSERTED - int
        0 oder 1 je nachdem ob der Angreifer schon in der enemy-list
        vorhanden war oder nicht

  

    RFR_REDUCE - int 
        0 oder reduzierter Schaden durch RFR Modifikation

  

    PRESENT_DEFENDERS - Array 
        Liste der durch InformDefend informierten Defender als Objekt.
        Ein Defender wird immer NACH InformDefend
        dazugefuegt

  

    DEFENDING_DEFENDER - Array ({})
        Hat ein durch InformDefend ein Defender verteidigt, so wird
        fuer diesen Defender ein Eintrag in diesem Array vorgenommen,
        welcher folgende Struktur besitzt.
                ({
                        DEF_DEFENDER - Object
                          Der Verteidiger, welcher VOR
                          DefendOther eingefuegt wird
                        DEF_DAM - int
                          Der veraenderte Schaden, welcher NACH 
                          DefendOther eingefuegt wird
                        DEF_DAMTYPE string/string*  
                          Die veraenderte Schadensart, welche 
                          NACH DefendOther eingefuegt wird
                        DEF_SPELL - Mapping   
                          Das Mapping des veraenderten Spells, welches
                          als Kopie NACH DefendOther eingefuegt wird
                })

  

    DEFEND_HOOK - Int/Array 
        DI_NOHOOK, wenn kein Hook da war, DI_HOOKINTERRUPT, wenn der
        Hook das Defend unterbricht, DI_HOOK, wenn ein Hook vorhanden 
        ist, dieser das Defend aber unveraendert laesst.
        Veraendert ein Hook das Defend, so ist hier ein Array zu finden
        mit den veraenderten Parametern in der Struktur:
                ({
                        HOOK_DAM - int
                           Der veraenderte Schaden
                        HOOK_DAMTYPE - string/string*   
                           Die veraenderte Schadensart
                        HOOK_SPELL - Mapping 
                           Das Mapping des veraenderten Spells als Kopie
                })

  

    DEFEND_ARMOURS - Mapping (2 Werte pro Key)
        Liste der beruecksichtigten Ruestungen. Fuer jede Ruestung
        wird ein Eintrag vorgenommen, mit dem Objekt der jeweiligen
        Ruestung als Key. Hierbei werden die Ruestungen erst eingetragen,
        wenn ihr jeweiliges QueryDefend() aufgerufen wird, d.h. es sind nicht
        von Anfang an alle getragenen Ruestung drin. Jeder Eintrag im Mapping
        besitzt die folgenden 2 Werte:
                DEF_ARMOUR_DAM - int 
                    Der Schaden NACH QueryDefend (vorher 0)
                DEF_ARMOUR_PROT - int
                    Verteidigungswert der Ruestung VOR DefendFunc
        Bsp: Ich will wissen, wie gut 'ruestung' schuetzte:
             spell[EINFO_DEFEND][DEFEND_ARMOURS][ruestung,DEF_ARMOUR_PROT]

    DEFEND_GUILD - Array 
        Eine Liste mit der Modifikation der Gilde mit der Struktur
                ({
                        GUILD_DAM - int
                          Der veraenderte Schaden
                        GUILD_DAMTYPE - string/string*
                          Die veraenderte Schadensart
                })

  

    DEFEND_RESI - int
        Schaden nach CheckResistance

  

    DEFEND_BODY - int
        Schaden nach Beruecksichtigung des Bodies (nur
        physikalisch)

  

    DEFEND_LOSTLP - int
        Tatsaechlich abgezogene LP

  

    DEFEND_CUR_ARMOUR_PROT - int
        Schutz der Ruestung vor Call der
        DefendFunc. Ist nur in der DefendFunc definiert. Kann auch aus
        DEFEND_ARMOURS entnommen werden

     

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

     Attack, Defend

18.Jul 2006 Muadib

