<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.datoolset.net/mw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mouser9169</id>
		<title>Dragon Age Toolset Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.datoolset.net/mw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mouser9169"/>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/wiki/Special:Contributions/Mouser9169"/>
		<updated>2026-05-15T10:20:31Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.6</generator>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_h&amp;diff=16669</id>
		<title>Combat h</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_h&amp;diff=16669"/>
				<updated>2011-08-03T00:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Includes:===&lt;br /&gt;
&lt;br /&gt;
[[effects_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[items_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[combat_damage_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[ui_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[sys_soundset_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[ai_threat_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[2da_constants_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[stats_core_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Constants:===&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
const float ATTACK_LOOP_DURATION_INVALID = 999.0f; &lt;br /&gt;
const float ATTACK_HIT_BIAS = 4.0f; &lt;br /&gt;
// General bias in the system towards hits instead of misses. &lt;br /&gt;
&lt;br /&gt;
const int ATTACK_TYPE_MELEE = 1; &lt;br /&gt;
const int ATTACK_TYPE_RANGED = 2;&lt;br /&gt;
&lt;br /&gt;
const float SPECIAL_BOSS_DEATHBLOW_THRESHOLD = 0.04; &lt;br /&gt;
// at this % of health, any meelee attack may trigger the deathblow of special bosses; &lt;br /&gt;
&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
// Point blank range (no penalty range for bows) &lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
const float POINT_BLANK_RANGE = 8.0f; &lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Structs=== &lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
// Attack Result struct, used by Combat_PerformAttack* &amp;lt;br&amp;gt;&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
struct CombatAttackResultStruct &lt;br /&gt;
{ &lt;br /&gt;
&lt;br /&gt;
    int     nAttackResult;      //  - COMBAT_RESULT_* constant&lt;br /&gt;
    int     nDeathblowType;&lt;br /&gt;
    float   fAttackDuration;   //  - Duration of the aim loop for ranged weapons&lt;br /&gt;
    effect  eImpactEffect;       //  - Impact Effect&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functions===&lt;br /&gt;
&lt;br /&gt;
[[Combat_GetAttackHand]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[CheckForDeathblow]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetValidDeathblow]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetAttackType]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetFlankingBonus]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_CheckBackStab]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetAttackResult]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_PerformAttack]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleCommandAttack]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleAttackImpact]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleAbilityAttackImpact]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleCreatureDisappear]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[IsCombatHit]] &amp;lt;br&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------&amp;lt;br&amp;gt;&lt;br /&gt;
Category: [[Core Includes]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_h&amp;diff=16668</id>
		<title>Combat h</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_h&amp;diff=16668"/>
				<updated>2011-08-03T00:40:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Includes:===&lt;br /&gt;
&lt;br /&gt;
[[effects_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[items_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[combat_damage_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[ui_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[sys_soundset_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[ai_threat_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[2da_constants_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[stats_core_h]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Constants:===&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
const float ATTACK_LOOP_DURATION_INVALID = 999.0f; &lt;br /&gt;
const float ATTACK_HIT_BIAS = 4.0f; &lt;br /&gt;
// General bias in the system towards hits instead of misses. &lt;br /&gt;
&lt;br /&gt;
const int ATTACK_TYPE_MELEE = 1; &lt;br /&gt;
const int ATTACK_TYPE_RANGED = 2;&lt;br /&gt;
&lt;br /&gt;
const float SPECIAL_BOSS_DEATHBLOW_THRESHOLD = 0.04; &lt;br /&gt;
// at this % of health, any meelee attack may trigger the deathblow of special bosses; &lt;br /&gt;
&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
// Point blank range (no penalty range for bows) &lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
const float POINT_BLANK_RANGE = 8.0f; &lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Structs=== &lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
// Attack Result struct, used by Combat_PerformAttack* &amp;lt;br&amp;gt;&lt;br /&gt;
// ----------------------------------------------------------------------------- &lt;br /&gt;
struct CombatAttackResultStruct &lt;br /&gt;
{ &lt;br /&gt;
&lt;br /&gt;
    int     nAttackResult;      //  - COMBAT_RESULT_* constant&lt;br /&gt;
    int     nDeathblowType;&lt;br /&gt;
    float   fAttackDuration;   //  - Duration of the aim loop for ranged weapons&lt;br /&gt;
    effect  eImpactEffect;       //  - Impact Effect&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Functions===&lt;br /&gt;
&lt;br /&gt;
[[Combat_GetAttackHand] &amp;lt;br&amp;gt;&lt;br /&gt;
[[CheckForDeathblow]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetValidDeathblow]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetAttackType]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetFlankingBonus]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_CheckBackStab]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_GetAttackResult]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_PerformAttack]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleCommandAttack]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleAttackImpact]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleAbilityAttackImpact]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Combat_HandleCreatureDisappear]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[IsCombatHit]] &amp;lt;br&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------&amp;lt;br&amp;gt;&lt;br /&gt;
Category: [[Core Includes]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16546</id>
		<title>Combat GetAttackHand</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16546"/>
				<updated>2011-08-01T06:48:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: [[Combat_HandleCommandAttack]]&lt;br /&gt;
&lt;br /&gt;
Calls: [[GetWeaponStyle]]&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
* @brief Determine which hand to use for an attack&lt;br /&gt;
*&lt;br /&gt;
* Only applicable in dual weapon style. Returns which hand to use for the next attack&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 - main hand, 1 - offhand&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int Combat_GetAttackHand(object oCreature = OBJECT_SELF)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nHand = 0;&lt;br /&gt;
    if (GetWeaponStyle(oCreature) == WEAPONSTYLE_DUAL)&lt;br /&gt;
    {&lt;br /&gt;
        nHand = GetLocalInt(oCreature, COMBAT_LAST_WEAPON);&lt;br /&gt;
        SetLocalInt(oCreature, COMBAT_LAST_WEAPON, !nHand);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return nHand;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16545</id>
		<title>Combat HandleCommandAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16545"/>
				<updated>2011-08-01T06:47:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls: [[Combat_GetAttackHand]]&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16544</id>
		<title>IsCombatHit</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16544"/>
				<updated>2011-08-01T05:59:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
int IsCombatHit(int nAttackResult)&lt;br /&gt;
{&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_MISS || nAttackResult == COMBAT_RESULT_BLOCKED || nAttackResult == COMBAT_RESULT_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    } else&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16543</id>
		<title>Combat HandleCreatureDisappear</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16543"/>
				<updated>2011-08-01T05:58:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// Handles any combat related logic for when a creature disappears from combat. This function should be run&lt;br /&gt;
// at 2 cases both for a player object and a creature object:&lt;br /&gt;
// 1. Disappear event&lt;br /&gt;
// 2. Appear event when the hostile creature turned non-hostile&lt;br /&gt;
void Combat_HandleCreatureDisappear(object oCreature, object oDisappearer)&lt;br /&gt;
{&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;Combat_HandleCreatureDisappeart&amp;quot;,&amp;quot;creature: &amp;quot; + GetTag(oCreature) + &amp;quot;, disappearer: &amp;quot; + GetTag(oDisappearer));&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    if(IsFollower(oCreature))&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // If the party does no longer perceive any hostiles....&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        if (!IsPartyPerceivingHostiles(oCreature))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (!IsPartyDead())&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR PARTY!&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
&lt;br /&gt;
                SSPlaySituationalSound(GetRandomPartyMember(),SOUND_SITUATION_END_OF_COMBAT);&lt;br /&gt;
&lt;br /&gt;
                DelayEvent(3.0f, GetModule(), Event(EVENT_TYPE_DELAYED_GM_CHANGE));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else // non party members&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
        if (!IsPerceivingHostiles(oCreature) &amp;amp;&amp;amp; GetCombatState(oCreature) == TRUE)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR NORMAL CREATURE!&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
            SetCombatState(oCreature,FALSE);&lt;br /&gt;
&lt;br /&gt;
            // Added to make a COMBAT_END event&lt;br /&gt;
            // FAB 9/4&lt;br /&gt;
            event evCombatEnds = Event(EVENT_TYPE_COMBAT_END);&lt;br /&gt;
            //evCombatEnds = SetEventInteger(evCombatEnds, 0, bcombatstate);&lt;br /&gt;
            SignalEvent(oCreature, evCombatEnds);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16542</id>
		<title>Combat HandleAbilityAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16542"/>
				<updated>2011-08-01T05:58:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// GZ: Temporary function to prevent the world from collapsing upon itself&lt;br /&gt;
&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage);&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    effect eImpactEffect = EffectImpact(fDamage, OBJECT_INVALID);&lt;br /&gt;
&lt;br /&gt;
    Combat_HandleAttackImpact(oAttacker, oTarget, nAttackResult, eImpactEffect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16541</id>
		<title>Combat HandleAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16541"/>
				<updated>2011-08-01T05:57:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an attack impact event&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nAttackResult   The result of the attack (COMBAT_RESULT_*)&lt;br /&gt;
*  @param eImpactEffect   The attack's impact effect.&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect);&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nUIMessage = UI_MESSAGE_MISSED;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // We retired combat result blocked, so we treat it as a miss here.&lt;br /&gt;
    // Might be back in DA2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
        nUIMessage = UI_MESSAGE_BLOCKED;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // If the target managed to stealth, we're converting it into a miss&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp; nAttackResult != COMBAT_RESULT_MISS &amp;amp;&amp;amp; IsInvisible(oTarget) )&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Target turned invisible - hit converted to miss&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // Tell the damage effect to update gore and by how much...&lt;br /&gt;
        // see gore_h for details or ask georg.&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        object oWeapon = GetEffectObject(eImpactEffect,0);&lt;br /&gt;
        int nApp = GetAppearanceType(oAttacker);&lt;br /&gt;
        int nAbility = GetEffectInteger(eImpactEffect,1);&lt;br /&gt;
&lt;br /&gt;
        float fPerSpace = GetM2DAFloat(TABLE_APPEARANCE, &amp;quot;PERSPACE&amp;quot;, nApp);&lt;br /&gt;
        // Skipping range check if the creature is large (personal space greater or equal to one)&lt;br /&gt;
        if (IsObjectValid(oWeapon) &amp;amp;&amp;amp; IsUsingMeleeWeapon(oAttacker, oWeapon) &amp;amp;&amp;amp; fPerSpace &amp;lt; 1.0)&lt;br /&gt;
        {&lt;br /&gt;
            if (GetDistanceBetween(oTarget, oAttacker) &amp;gt; 5.0f)&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Melee attack impact from past 5m found, changed to COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
                nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // The attack was successful, ...&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
       float fDamage = GetEffectFloat(eImpactEffect,0);&lt;br /&gt;
       int nVfx = GetEffectInteger(eImpactEffect,0);&lt;br /&gt;
       int nDamageType = GetEffectInteger(eImpactEffect, 2);&lt;br /&gt;
&lt;br /&gt;
        // special damage type override for Shale, filtered for performance reasons&lt;br /&gt;
        int nAppearanceType = GetAppearanceType(oAttacker);&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Attacker appearance type = &amp;quot; + ToString(nAppearanceType));&lt;br /&gt;
        #endif&lt;br /&gt;
        if (nAppearanceType == 10100) // new shale type&lt;br /&gt;
        {&lt;br /&gt;
            // check for damage type modifying effect&lt;br /&gt;
            effect[] eModifiers = GetEffects(oAttacker, 10000);&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  Modifier effects present = &amp;quot; + ToString(GetArraySize(eModifiers)));&lt;br /&gt;
            #endif&lt;br /&gt;
            if (IsEffectValid(eModifiers[0]) == TRUE)&lt;br /&gt;
            {&lt;br /&gt;
                int nOverrideDamageType = GetEffectInteger(eModifiers[0], 0);&lt;br /&gt;
                nDamageType = nOverrideDamageType;&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  First modifier is valid with type &amp;quot; + ToString(nOverrideDamageType));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // If damage was negative, something went wrong and we bail out&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        if(fDamage &amp;lt; 0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        int nGore;&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Only melee weapons update gore.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsObjectValid(oWeapon))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                // Attacks that are not deathblows may play an attack grount.&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                if (nAttackResult != COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
                {&lt;br /&gt;
                    SSPlaySituationalSound(oAttacker, SOUND_SITUATION_ATTACK_IMPACT);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // only update gore if the target can bleed (PeterT 25/7/08)&lt;br /&gt;
                int nTargetAppearance = GetAppearanceType(oTarget);&lt;br /&gt;
                if (GetM2DAInt(TABLE_APPEARANCE, &amp;quot;bCanBleed&amp;quot;, nTargetAppearance) == TRUE)&lt;br /&gt;
                {&lt;br /&gt;
                    nGore =  DAMAGE_EFFECT_FLAG_UPDATE_GORE;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackResult == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_CRITICALHIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Damage below a certain threshold is not displayed as critical&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (fDamage &amp;gt;= DAMAGE_CRITICAL_DISPLAY_THRESHOLD)&lt;br /&gt;
            {&lt;br /&gt;
                if (IsPartyMember(oAttacker))&lt;br /&gt;
                {&lt;br /&gt;
                        Engine_ApplyEffectOnObject(EFFECT_DURATION_TYPE_TEMPORARY,EffectScreenShake( SCREEN_SHAKE_TYPE_CRITICAL_HIT ),oTarget, 1.0f, oAttacker);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if ( nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BACKSTAB&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_BACKSTAB;&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
          //   UI_DisplayMessage(oAttacker, UI_MESSAGE_BACKSTAB);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if (nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
        {&lt;br /&gt;
              #ifdef DEBUG&lt;br /&gt;
              Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_DEATHBLOW&amp;quot;);&lt;br /&gt;
              #endif&lt;br /&gt;
&lt;br /&gt;
              nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_HIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Templar's Righteous Strike - 25% mana damage&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsMagicUser(oTarget))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                if (HasAbility(oAttacker,ABILITY_TALENT_RIGHTEOUS_STRIKE))&lt;br /&gt;
                {&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_MANA;&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_25;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                     ApplyEffectVisualEffect(oAttacker, oTarget, 90181, EFFECT_DURATION_TYPE_INSTANT, 0.0f, ABILITY_TALENT_RIGHTEOUS_STRIKE);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        //            Here is where the actual damage is dealt&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        Effects_ApplyInstantEffectDamage(oTarget, oAttacker, fDamage, nDamageType, nGore,nAbility,nVfx);&lt;br /&gt;
        Combat_Damage_CheckOnImpactAbilities(oTarget, oAttacker, fDamage, nAttackResult, oWeapon, nAbility);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        UI_DisplayMessage(oAttacker, nUIMessage);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BLOCKED&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // Do something smart here in the future&lt;br /&gt;
        //        UI_DisplayMessage(oAttacker, UI_MESSAGE_MISSED);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Stats - handle hit rate&lt;br /&gt;
    STATS_HandleHitRate(oAttacker, nAttackResult);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16540</id>
		<title>Combat HandleCommandAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16540"/>
				<updated>2011-08-01T05:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16539</id>
		<title>Combat PerformAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16539"/>
				<updated>2011-08-01T05:56:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*&lt;br /&gt;
*  @returns CombatAttackResultStruct with damage and attackresult populated&lt;br /&gt;
*&lt;br /&gt;
*  &amp;quot;Don't touch this if you want to live&amp;quot;&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon , float fDamageOverride = 0.0f, int nAbility = 0);&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon ,  float fDamageOverride = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
    struct  CombatAttackResultStruct stRet;&lt;br /&gt;
    float   fDamage = 0.0f;&lt;br /&gt;
    int     nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    stRet.fAttackDuration =    ATTACK_LOOP_DURATION_INVALID ;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Attack check happens here...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    stRet.nAttackResult = Combat_GetAttackResult(oAttacker, oTarget, oWeapon );&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If attack result was not a miss, go on to calculate damage&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stRet.nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        int bCriticalHit = (stRet.nAttackResult == COMBAT_RESULT_CRITICALHIT);&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        // If attack result was not a miss, check if we need to handle a deathblow&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        fDamage = ( (fDamageOverride == 0.0f) ?&lt;br /&gt;
                          Combat_Damage_GetAttackDamage(oAttacker, oTarget, oWeapon, stRet.nAttackResult) : fDamageOverride);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        float fTargetHealth = GetCurrentHealth( oTarget );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // -----------------------------------------------------------------&lt;br /&gt;
        //  Ranged weapons attacks are not synched and therefore we never&lt;br /&gt;
        //  need to worry about reporting deathblows to the engine.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When not using a ranged weapon, there are synchronize death blows to handle&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if ( nAttackType != ATTACK_TYPE_RANGED &amp;amp;&amp;amp; nAbility == 0 &amp;amp;&amp;amp; stRet.nAttackResult != COMBAT_RESULT_MISS )&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Deathblows against doors look cool, but really...&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (  GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Special conditions.&lt;br /&gt;
                //&lt;br /&gt;
                // There are a few cases in the single player campaign&lt;br /&gt;
                // where we want the spectacular deathblow to occur if possible.&lt;br /&gt;
                //&lt;br /&gt;
                // The following logic defines these conditions&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                int nAppearance =   GetAppearanceType(oTarget) ;&lt;br /&gt;
                int nRank       = GetCreatureRank(oTarget);&lt;br /&gt;
&lt;br /&gt;
                int bSpecial =   FALSE;&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // ... all boss ogres (there's 1 in the official campaign) by request&lt;br /&gt;
                //     from Dr. Muzyka.&lt;br /&gt;
                // ... all elite bosses&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (nAppearance == APR_TYPE_OGRE || (nRank == CREATURE_RANK_BOSS||nRank == CREATURE_RANK_ELITE_BOSS)  ) ||&lt;br /&gt;
                      nRank == CREATURE_RANK_ELITE_BOSS)&lt;br /&gt;
                {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // ... but only if they are at the health threshold&lt;br /&gt;
                        //     required for deathblows to trigger&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        if (IsHumanoid(oAttacker))&lt;br /&gt;
                        {&lt;br /&gt;
                            bSpecial = _GetRelativeResourceLevel(oTarget, PROPERTY_DEPLETABLE_HEALTH) &amp;lt; SPECIAL_BOSS_DEATHBLOW_THRESHOLD;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Deathblows occur when&lt;br /&gt;
                //  ... target isn't immortal (duh) AND&lt;br /&gt;
                //      ... the damage of the hit exceeds the creature's health OR&lt;br /&gt;
                //      ... aforementioned 'special' conditions are met.&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (!IsImmortal( oTarget ) &amp;amp;&amp;amp; (fDamage &amp;gt;= fTargetHealth || bSpecial)))&lt;br /&gt;
                {&lt;br /&gt;
&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    // ... only from party members AND&lt;br /&gt;
                    //    ... if we determine that a deathblow doesn't interrupt gameplay OR&lt;br /&gt;
                    //    ... aforementioned 'special' conditions are met&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    if (IsPartyMember(oAttacker) &amp;amp;&amp;amp; (CheckForDeathblow(oAttacker, oTarget) || bSpecial))&lt;br /&gt;
                    {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // Verify some more conditions...&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        int bDeathBlow = Combat_GetValidDeathblow(oAttacker, oTarget);&lt;br /&gt;
                        if (bDeathBlow)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_DEATHBLOW ;&lt;br /&gt;
&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            // Special treatment for ogre&lt;br /&gt;
                            // Reason: The ogre, unlike all other special bosses&lt;br /&gt;
                            //         has a second, non spectacular deathblow.&lt;br /&gt;
                            //         if we specify 0, there's a 50% chance that&lt;br /&gt;
                            //         one is played, which we don't want in this&lt;br /&gt;
                            //         case, so we're passing the id of the&lt;br /&gt;
                            //         spectacular one instead.&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            if (bSpecial &amp;amp;&amp;amp; nAppearance == APR_TYPE_OGRE)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 5; // 5 - ogre slowmo deathblow&lt;br /&gt;
                            }&lt;br /&gt;
                            else&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 0;  // 0 - auto select in engine;&lt;br /&gt;
                            }&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            // Failure to meet conditions: convert to hit.&lt;br /&gt;
                            if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        // Failure to meet conditions: convert to hit.&lt;br /&gt;
                        if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 } /* ishumanoid*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            } /* obj_type creature*/&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    int nDamageType = DAMAGE_TYPE_PHYSICAL;&lt;br /&gt;
&lt;br /&gt;
    if ( nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Certain projectiles modifyt the damage type done by a ranged weapon&lt;br /&gt;
        // This is defined in PRJ_BASE.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        int nProjectileIndex = GetLocalInt(oWeapon,PROJECTILE_OVERRIDE);&lt;br /&gt;
        if (nProjectileIndex)&lt;br /&gt;
        {&lt;br /&gt;
            int nDamageTypeOverride = GetM2DAInt(TABLE_PROJECTILES,&amp;quot;DamageType&amp;quot;,nProjectileIndex);&lt;br /&gt;
            if (nDamageTypeOverride&amp;gt;0)&lt;br /&gt;
            {&lt;br /&gt;
                nDamageType = nDamageTypeOverride;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When using a ranged weapon, we need to report the duration of the&lt;br /&gt;
        // aim loop to the engine&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        stRet.fAttackDuration = GetCreatureRangedDrawSpeed(oAttacker, oWeapon);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        float fSpeed = CalculateAttackTiming(oAttacker, oWeapon);&lt;br /&gt;
        if (fSpeed&amp;gt;0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            stRet.fAttackDuration = fSpeed;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // The Impact effect is not a real effect - it is not ever applied. Instead&lt;br /&gt;
    // it is used to marshal information about the attack back to the impact&lt;br /&gt;
    // event.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stRet.eImpactEffect = EffectImpact(fDamage, oWeapon, 0, 0, nDamageType);&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.Combat_PerformAttack&amp;quot;,&amp;quot; Attack Result: &amp;quot; + Log_GetAttackResultNameById(stRet.nAttackResult),  oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return stRet;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16538</id>
		<title>Combat GetAttackResult</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16538"/>
				<updated>2011-08-01T05:56:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine whether or not an attack hits a target.&lt;br /&gt;
*&lt;br /&gt;
* Note that this function only calculates to hit and crits, death blows are&lt;br /&gt;
* determined in Combat_PerformAttack&lt;br /&gt;
*&lt;br /&gt;
* @param oAttacker  The attacker&lt;br /&gt;
* @param oTarget    The target that is being attacked&lt;br /&gt;
* @param nAbility   If != 0, it won't trigger backstabs and deathblows.&lt;br /&gt;
*&lt;br /&gt;
* @returns  COMBAT_RESULT_HIT, COMBAT_RESULT_CRITICALHIT or COMBAT_RESULT_MISS&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0);&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Debug&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nForcedCombatResult = GetForcedCombatResult(oAttacker);&lt;br /&gt;
    if (nForcedCombatResult != -1)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Skipped rules, FORCED RESULT IS:&amp;quot; + ToString(nForcedCombatResult), oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return nForcedCombatResult;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Placeables are always hit&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Placeable, automatic result : COMBAT_RESULT_HIT&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Displacement&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDisplace = GetCreatureProperty(oTarget, PROPERTY_ATTRIBUTE_DISPLACEMENT);&lt;br /&gt;
    float fRand = RandomFloat()*100.0;&lt;br /&gt;
    if ( fRand &amp;lt; fDisplace)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Displacement effect kciked in, automatic result : COMBAT_RESULT_MISS&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // if the target has the evasion talent, attribute this miss to the talent&lt;br /&gt;
        // (random 50% because the anim is interrupting)&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (HasAbility(oTarget, ABILITY_TALENT_EVASION) &amp;amp;&amp;amp; fRand &amp;lt; (20.0f - (RandomFloat()*10.0f)  ))&lt;br /&gt;
        {&lt;br /&gt;
                command currentCmd = GetCurrentCommand(oTarget);&lt;br /&gt;
                int nCmdType = GetCommandType(currentCmd);&lt;br /&gt;
                // Evasion only plays during attack and wait commands.&lt;br /&gt;
                if ( nCmdType == COMMAND_TYPE_WAIT || nCmdType == COMMAND_TYPE_ATTACK || nCmdType == COMMAND_TYPE_INVALID )&lt;br /&gt;
                {&lt;br /&gt;
                    ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, Effect(1055), oTarget, 0.0f, oTarget, ABILITY_TALENT_EVASION);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int  nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
    int nRet;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Get the attackers attack rating (includes effects and equipment stats)&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fAttackRating;&lt;br /&gt;
&lt;br /&gt;
    if (GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Staves always hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fAttackRating =  GetCreatureAttackRating (oAttacker);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Add item stat (usually 0) along with scripted boni and attack bias.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    fAttackRating += GetItemStat(oWeapon,   ITEM_STAT_ATTACK) + fBonus + ATTACK_HIT_BIAS;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fAttackRating += Diff_GetRulesAttackBonus(oAttacker);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with figuring out which critical hit modifier (melee, ranged, etc)&lt;br /&gt;
    // to use for this attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fCriticalHitModifier;&lt;br /&gt;
    int     nCriticalHitModifier  = (nAttackType == ATTACK_TYPE_RANGED) ?  CRITICAL_MODIFIER_RANGED : CRITICAL_MODIFIER_MELEE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fCriticalHitModifier = GetCreatureCriticalHitModifier(oAttacker, nCriticalHitModifier);&lt;br /&gt;
    fCriticalHitModifier += GetItemStat(oWeapon, ITEM_STAT_CRIT_CHANCE_MODIFIER);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    //  Bravery grants +3.5 critical hit per enemy past the first 2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_BRAVERY))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        int nEnemies = Max(0,GetArraySize(GetCreaturesInMeleeRing(oAttacker,0.0, 359.99f,TRUE,0))-2);&lt;br /&gt;
        fCriticalHitModifier +=  nEnemies * 3.5f;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Calculate Flanking Bonus&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fFlanking = Combat_GetFlankingBonus(oAttacker, oTarget);&lt;br /&gt;
    if (fFlanking &amp;gt; 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Also increase chance for critical hits by 1/5th of the flanking bonus&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        fCriticalHitModifier *=  (1.0 + (fFlanking/5.0));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Range plays a role too.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDistance =  GetDistanceBetween(oAttacker, oTarget);&lt;br /&gt;
    float fNoPenaltyDistance = MaxF(POINT_BLANK_RANGE,GetItemStat(oWeapon, ITEM_STAT_OPTIMUM_RANGE));&lt;br /&gt;
    fDistance = MaxF(fDistance-fNoPenaltyDistance,0.0f);&lt;br /&gt;
&lt;br /&gt;
    float fAttackRoll = 50.0;&lt;br /&gt;
    float fPenalties = fDistance; // every meter distance past the free range is -1!&lt;br /&gt;
    float fAttack = fAttackRating  + fAttackRoll + fFlanking - fPenalties;&lt;br /&gt;
&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
    // BEGIN SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        int bThreatenCritical = (RandomFloat()*100.0f   &amp;lt; fCriticalHitModifier  );&lt;br /&gt;
&lt;br /&gt;
        if (!bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Attacking out of stealth always threatens crit.&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_SKILL_STEALTH_1))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Death hex effect ... all hits are auto crit&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_DEATH_HEX))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Autocrit effect&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oAttacker, EFFECT_TYPE_AUTOCRIT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Double strike does not allow crits&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // rapid shot doesn't allow critical strikes&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_RAPIDSHOT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Targets that have critical hit immunity can not be crit...&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Critical hit averted, target has critical hit immunity&amp;quot;, oTarget);&lt;br /&gt;
            bThreatenCritical = !HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
    // END SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with calculating the defense values of the attack target&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDefenseRating =  GetCreatureDefense(oTarget) + ((nAttackType == ATTACK_TYPE_RANGED) ? GetCreatureProperty(oTarget,PROPERTY_ATTRIBUTE_MISSILE_SHIELD):0.0f);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fDefenseRating += Diff_GetRulesDefenseBonus(oTarget);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // A hit is successful if the attack rating exceeds the defense rating&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (RandomFloat()*100.0f &amp;lt;  fAttack - fDefenseRating)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // If we threatened a critical, we crit here, otherwise just report normal hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        nRet =  ( (bThreatenCritical) ? COMBAT_RESULT_CRITICALHIT : COMBAT_RESULT_HIT  );&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
        {&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // If we are backstabbing, we change the result here if it&lt;br /&gt;
            // was a crit. Abilities never bs (anim priority)&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if ( nAbility == 0 &amp;amp;&amp;amp; Combat_CheckBackstab(oAttacker, oTarget, oWeapon,fFlanking))&lt;br /&gt;
            {&lt;br /&gt;
                    nRet =  COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Miss...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Misdirection Hex&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetHasEffects(oAttacker, EFFECT_TYPE_MISDIRECTION_HEX))&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Attacker under misdirection hex: Hits are misses, crits are hits.&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        if (nRet == COMBAT_RESULT_HIT || nRet == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
        }&lt;br /&gt;
        else if (nRet == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_HIT;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //  return COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation: &amp;quot; +&lt;br /&gt;
                     &amp;quot; fAttack:&amp;quot;  + ToString(fAttack) +&lt;br /&gt;
                     &amp;quot; = (fAttackRating: &amp;quot; + ToString(fAttackRating) +&lt;br /&gt;
                     &amp;quot; fAttackRoll:&amp;quot; + ToString(fAttackRoll) +&lt;br /&gt;
                     &amp;quot; (range penalty:&amp;quot; + ToString(fPenalties) + &amp;quot;)&amp;quot;+&lt;br /&gt;
                     &amp;quot; fFlanking: &amp;quot; + ToString(fFlanking) +&lt;br /&gt;
                     &amp;quot; fBonus(script): &amp;quot; + ToString(fBonus) +&lt;br /&gt;
                     &amp;quot;)&amp;quot; , oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation (2):  &amp;quot; +&lt;br /&gt;
                     &amp;quot; fDefenseRating: &amp;quot; + ToString(fDefenseRating) +&lt;br /&gt;
                     &amp;quot; fCriticalHitModifier: &amp;quot; + ToString(fCriticalHitModifier) +&lt;br /&gt;
                     &amp;quot; bThreatenCritical: &amp;quot; + ToString(bThreatenCritical), oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return nRet;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16537</id>
		<title>Combat CheckBackStab</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16537"/>
				<updated>2011-08-01T05:55:42Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Check if backstab conditions are true&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_CheckBackstab(object oAttacker, object oTarget, object oWeapon, float fFlankingBonus)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we we are a rogue&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (!HasAbility(oAttacker, ABILITY_TALENT_HIDDEN_ROGUE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!IsHumanoid(oAttacker))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And target is not immune&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And attacker does not use double strike mode&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     // -------------------------------------------------------------------------&lt;br /&gt;
    // We can only backstab if we are flanking.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fFlankingBonus&amp;gt;0.0)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         /* Coup de grace*/&lt;br /&gt;
        if (HasAbility(oAttacker, ABILITY_TALENT_BACKSTAB))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_STUN))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else if (GetHasEffects(oTarget, EFFECT_TYPE_PARALYZE))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16536</id>
		<title>Combat GetFlankingBonus</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16536"/>
				<updated>2011-08-01T05:55:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
float Combat_GetFlankingBonus(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TALENT_SHIELD_TACTICS))&lt;br /&gt;
    {&lt;br /&gt;
        if (IsUsingShield(oTarget))&lt;br /&gt;
            return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (GetHasEffects(oTarget, EFFECT_TYPE_FLANK_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    float fAngle = GetAngleBetweenObjects(oTarget, oAttacker);&lt;br /&gt;
    float fFactor = 0.0;&lt;br /&gt;
    float fMaxModifier = 15.0;&lt;br /&gt;
&lt;br /&gt;
    // The attackers ability to flank is stored in a creature property&lt;br /&gt;
    float fFlankingAngle = GetCreatureProperty(oAttacker, PROPERTY_ATTRIBUTE_FLANKING_ANGLE);&lt;br /&gt;
&lt;br /&gt;
    if (fFlankingAngle &amp;lt;= 10.0 ) /*old savegames have this at 10*/&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 60.0; // old savegames need this to avoid divby0 later&lt;br /&gt;
    }&lt;br /&gt;
    else if (fFlankingAngle&amp;gt;180.0)&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 180.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_COMBAT_MOVEMENT))&lt;br /&gt;
    {&lt;br /&gt;
        fMaxModifier = 20.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( fMaxModifier &amp;lt;= 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( (fAngle&amp;gt;= (180.0 - fFlankingAngle) &amp;amp;&amp;amp; fAngle&amp;lt;=(180.0 + fFlankingAngle )))&lt;br /&gt;
    {&lt;br /&gt;
        // Shield block negats flanking on the left.&lt;br /&gt;
&lt;br /&gt;
        int bShieldBlock =  HasAbility(oTarget,ABILITY_TALENT_SHIELD_BLOCK);&lt;br /&gt;
        int bUsingShield = IsUsingShield(oTarget);&lt;br /&gt;
&lt;br /&gt;
        if (!bShieldBlock || fAngle &amp;lt; 180.0 || (bShieldBlock &amp;amp;&amp;amp; !bUsingShield) )&lt;br /&gt;
        {&lt;br /&gt;
            fFactor = (fFlankingAngle -  fabs( 180.0 - fAngle))/fFlankingAngle;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Only rogues get the full positional benefits on the battlefield,&lt;br /&gt;
    // everyone else gets halfa&lt;br /&gt;
    float fClassModifier = GetCreatureCoreClass(oAttacker) == CLASS_ROGUE?1.0f:0.5f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return fFactor * fMaxModifier * fClassModifier;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16535</id>
		<title>Combat GetAttackType</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16535"/>
				<updated>2011-08-01T05:54:42Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Return the type of the current attack based on the weapon in the main hand&lt;br /&gt;
// used only in command_pending...&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon);&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon)&lt;br /&gt;
{&lt;br /&gt;
    if (IsUsingRangedWeapon(oAttacker, oWeapon))&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_RANGED;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_MELEE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16534</id>
		<title>Combat GetValidDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16534"/>
				<updated>2011-08-01T05:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine a valid deathblow for the current target&lt;br /&gt;
*&lt;br /&gt;
* Called when the script decides to do a deathblow, this function will return&lt;br /&gt;
* a DEATHBLOW_* constant representing the deathblow to use against the creature&lt;br /&gt;
*&lt;br /&gt;
* If the creature does not support deathblows (immunity, no animation) or can not&lt;br /&gt;
* be deathblowed (Immortal, Plot, Party Member, Flagged as invalid in the toolset)&lt;br /&gt;
* the function returns 0&lt;br /&gt;
*&lt;br /&gt;
* @param oTarget    The target for the Deathblow&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 or DEATH_BLOW_*&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget);&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // First, let's check if we can even perform deathblows with the attacker&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     int bCanDeathblow =       CanPerformDeathblows(oAttacker);&lt;br /&gt;
&lt;br /&gt;
     if (!bCanDeathblow)&lt;br /&gt;
     {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     int nValid =              GetM2DAInt(TABLE_APPEARANCE,&amp;quot;ValidDeathblows&amp;quot;, GetAppearanceType(oTarget));&lt;br /&gt;
&lt;br /&gt;
     int bImmortal            = IsImmortal(oTarget);&lt;br /&gt;
     int bPlot                = IsPlot(oTarget);&lt;br /&gt;
     int bCanDiePermanently   = GetCanDiePermanently(oTarget);&lt;br /&gt;
     int bAlreadyDead         = HasDeathEffect(oTarget);&lt;br /&gt;
&lt;br /&gt;
      #ifdef DEBUG&lt;br /&gt;
     Log_Trace(LOG_CHANNEL_COMBAT_DEATH,&amp;quot;GetValidDeathblow&amp;quot;,&amp;quot;nValid: &amp;quot; + ToString(nValid) + &amp;quot; bImmortal: &amp;quot; + ToString(bImmortal) + &amp;quot; bPlot:&amp;quot; +&lt;br /&gt;
                                ToString(bPlot) + &amp;quot; bCanDiePermanently:&amp;quot; + ToString(bCanDiePermanently));&lt;br /&gt;
&lt;br /&gt;
     #endif&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // If we are immortal, Plot, or can not die permanently (e.g. a party member),&lt;br /&gt;
     // we return 0&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     if (bImmortal || bPlot || !bCanDiePermanently || IsPartyMember(oTarget) || bAlreadyDead)&lt;br /&gt;
     {&lt;br /&gt;
       return 0;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16533</id>
		<title>CheckForDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16533"/>
				<updated>2011-08-01T05:53:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Check if a deathblow should occur.&lt;br /&gt;
*&lt;br /&gt;
* Examine a number of parameters to see whether or not we can play a deathblow&lt;br /&gt;
* without interrupting the flow of combat.&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int CheckForDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
    int nRank = GetCreatureRank(oTarget);&lt;br /&gt;
    int nLevel = GetLevel(oAttacker);&lt;br /&gt;
    float fChance = GetM2DAFloat(TABLE_CREATURERANKS,&amp;quot;fDeathblow&amp;quot;, nRank);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Any rank flagged 1.0 or higher triggers a deathblow.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fChance &amp;gt;= 1.0f)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we perceive more than 1 creature, then half the chance of triggering&lt;br /&gt;
    // a deathblow with each perceived hostile.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nCount = GetArraySize(GetPerceivedCreatureList(oAttacker, TRUE));&lt;br /&gt;
    if (nCount &amp;gt; 1)&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= (2.0/IntToFloat(nCount));&lt;br /&gt;
    }&lt;br /&gt;
    //Increase chance of death blow in origin stories (level 1 and 2)&lt;br /&gt;
    //1.5 times the chance&lt;br /&gt;
    if ( nLevel &amp;lt; 3 )&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= 1.5;&lt;br /&gt;
    }&lt;br /&gt;
    return (RandomFloat()&amp;lt;fChance);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16532</id>
		<title>Combat GetAttackHand</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16532"/>
				<updated>2011-08-01T05:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls: [[GetWeaponStyle]]&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
* @brief Determine which hand to use for an attack&lt;br /&gt;
*&lt;br /&gt;
* Only applicable in dual weapon style. Returns which hand to use for the next attack&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 - main hand, 1 - offhand&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int Combat_GetAttackHand(object oCreature = OBJECT_SELF)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nHand = 0;&lt;br /&gt;
    if (GetWeaponStyle(oCreature) == WEAPONSTYLE_DUAL)&lt;br /&gt;
    {&lt;br /&gt;
        nHand = GetLocalInt(oCreature, COMBAT_LAST_WEAPON);&lt;br /&gt;
        SetLocalInt(oCreature, COMBAT_LAST_WEAPON, !nHand);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return nHand;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16531</id>
		<title>Combat GetAttackHand</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16531"/>
				<updated>2011-08-01T05:48:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls: [[GetWeaponStyle]]&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
* @brief Determine which hand to use for an attack&lt;br /&gt;
*&lt;br /&gt;
* Only applicable in dual weapon style. Returns which hand to use for the next attack&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 - main hand, 1 - offhand&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int Combat_GetAttackHand(object oCreature = OBJECT_SELF)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nHand = 0;&lt;br /&gt;
    if (GetWeaponStyle(oCreature) == WEAPONSTYLE_DUAL)&lt;br /&gt;
    {&lt;br /&gt;
        nHand = GetLocalInt(oCreature, COMBAT_LAST_WEAPON);&lt;br /&gt;
        SetLocalInt(oCreature, COMBAT_LAST_WEAPON, !nHand);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return nHand;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16530</id>
		<title>IsCombatHit</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16530"/>
				<updated>2011-08-01T05:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
int IsCombatHit(int nAttackResult)&lt;br /&gt;
{&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_MISS || nAttackResult == COMBAT_RESULT_BLOCKED || nAttackResult == COMBAT_RESULT_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    } else&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16529</id>
		<title>Combat HandleCreatureDisappear</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16529"/>
				<updated>2011-08-01T05:31:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// Handles any combat related logic for when a creature disappears from combat. This function should be run&lt;br /&gt;
// at 2 cases both for a player object and a creature object:&lt;br /&gt;
// 1. Disappear event&lt;br /&gt;
// 2. Appear event when the hostile creature turned non-hostile&lt;br /&gt;
void Combat_HandleCreatureDisappear(object oCreature, object oDisappearer)&lt;br /&gt;
{&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;Combat_HandleCreatureDisappeart&amp;quot;,&amp;quot;creature: &amp;quot; + GetTag(oCreature) + &amp;quot;, disappearer: &amp;quot; + GetTag(oDisappearer));&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    if(IsFollower(oCreature))&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // If the party does no longer perceive any hostiles....&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        if (!IsPartyPerceivingHostiles(oCreature))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (!IsPartyDead())&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR PARTY!&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
&lt;br /&gt;
                SSPlaySituationalSound(GetRandomPartyMember(),SOUND_SITUATION_END_OF_COMBAT);&lt;br /&gt;
&lt;br /&gt;
                DelayEvent(3.0f, GetModule(), Event(EVENT_TYPE_DELAYED_GM_CHANGE));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else // non party members&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
        if (!IsPerceivingHostiles(oCreature) &amp;amp;&amp;amp; GetCombatState(oCreature) == TRUE)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR NORMAL CREATURE!&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
            SetCombatState(oCreature,FALSE);&lt;br /&gt;
&lt;br /&gt;
            // Added to make a COMBAT_END event&lt;br /&gt;
            // FAB 9/4&lt;br /&gt;
            event evCombatEnds = Event(EVENT_TYPE_COMBAT_END);&lt;br /&gt;
            //evCombatEnds = SetEventInteger(evCombatEnds, 0, bcombatstate);&lt;br /&gt;
            SignalEvent(oCreature, evCombatEnds);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16528</id>
		<title>Combat HandleAbilityAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16528"/>
				<updated>2011-08-01T05:30:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// GZ: Temporary function to prevent the world from collapsing upon itself&lt;br /&gt;
&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage);&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    effect eImpactEffect = EffectImpact(fDamage, OBJECT_INVALID);&lt;br /&gt;
&lt;br /&gt;
    Combat_HandleAttackImpact(oAttacker, oTarget, nAttackResult, eImpactEffect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16527</id>
		<title>Combat HandleAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16527"/>
				<updated>2011-08-01T05:30:01Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an attack impact event&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nAttackResult   The result of the attack (COMBAT_RESULT_*)&lt;br /&gt;
*  @param eImpactEffect   The attack's impact effect.&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect);&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nUIMessage = UI_MESSAGE_MISSED;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // We retired combat result blocked, so we treat it as a miss here.&lt;br /&gt;
    // Might be back in DA2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
        nUIMessage = UI_MESSAGE_BLOCKED;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // If the target managed to stealth, we're converting it into a miss&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp; nAttackResult != COMBAT_RESULT_MISS &amp;amp;&amp;amp; IsInvisible(oTarget) )&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Target turned invisible - hit converted to miss&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // Tell the damage effect to update gore and by how much...&lt;br /&gt;
        // see gore_h for details or ask georg.&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        object oWeapon = GetEffectObject(eImpactEffect,0);&lt;br /&gt;
        int nApp = GetAppearanceType(oAttacker);&lt;br /&gt;
        int nAbility = GetEffectInteger(eImpactEffect,1);&lt;br /&gt;
&lt;br /&gt;
        float fPerSpace = GetM2DAFloat(TABLE_APPEARANCE, &amp;quot;PERSPACE&amp;quot;, nApp);&lt;br /&gt;
        // Skipping range check if the creature is large (personal space greater or equal to one)&lt;br /&gt;
        if (IsObjectValid(oWeapon) &amp;amp;&amp;amp; IsUsingMeleeWeapon(oAttacker, oWeapon) &amp;amp;&amp;amp; fPerSpace &amp;lt; 1.0)&lt;br /&gt;
        {&lt;br /&gt;
            if (GetDistanceBetween(oTarget, oAttacker) &amp;gt; 5.0f)&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Melee attack impact from past 5m found, changed to COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
                nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // The attack was successful, ...&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
       float fDamage = GetEffectFloat(eImpactEffect,0);&lt;br /&gt;
       int nVfx = GetEffectInteger(eImpactEffect,0);&lt;br /&gt;
       int nDamageType = GetEffectInteger(eImpactEffect, 2);&lt;br /&gt;
&lt;br /&gt;
        // special damage type override for Shale, filtered for performance reasons&lt;br /&gt;
        int nAppearanceType = GetAppearanceType(oAttacker);&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Attacker appearance type = &amp;quot; + ToString(nAppearanceType));&lt;br /&gt;
        #endif&lt;br /&gt;
        if (nAppearanceType == 10100) // new shale type&lt;br /&gt;
        {&lt;br /&gt;
            // check for damage type modifying effect&lt;br /&gt;
            effect[] eModifiers = GetEffects(oAttacker, 10000);&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  Modifier effects present = &amp;quot; + ToString(GetArraySize(eModifiers)));&lt;br /&gt;
            #endif&lt;br /&gt;
            if (IsEffectValid(eModifiers[0]) == TRUE)&lt;br /&gt;
            {&lt;br /&gt;
                int nOverrideDamageType = GetEffectInteger(eModifiers[0], 0);&lt;br /&gt;
                nDamageType = nOverrideDamageType;&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  First modifier is valid with type &amp;quot; + ToString(nOverrideDamageType));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // If damage was negative, something went wrong and we bail out&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        if(fDamage &amp;lt; 0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        int nGore;&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Only melee weapons update gore.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsObjectValid(oWeapon))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                // Attacks that are not deathblows may play an attack grount.&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                if (nAttackResult != COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
                {&lt;br /&gt;
                    SSPlaySituationalSound(oAttacker, SOUND_SITUATION_ATTACK_IMPACT);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // only update gore if the target can bleed (PeterT 25/7/08)&lt;br /&gt;
                int nTargetAppearance = GetAppearanceType(oTarget);&lt;br /&gt;
                if (GetM2DAInt(TABLE_APPEARANCE, &amp;quot;bCanBleed&amp;quot;, nTargetAppearance) == TRUE)&lt;br /&gt;
                {&lt;br /&gt;
                    nGore =  DAMAGE_EFFECT_FLAG_UPDATE_GORE;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackResult == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_CRITICALHIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Damage below a certain threshold is not displayed as critical&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (fDamage &amp;gt;= DAMAGE_CRITICAL_DISPLAY_THRESHOLD)&lt;br /&gt;
            {&lt;br /&gt;
                if (IsPartyMember(oAttacker))&lt;br /&gt;
                {&lt;br /&gt;
                        Engine_ApplyEffectOnObject(EFFECT_DURATION_TYPE_TEMPORARY,EffectScreenShake( SCREEN_SHAKE_TYPE_CRITICAL_HIT ),oTarget, 1.0f, oAttacker);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if ( nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BACKSTAB&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_BACKSTAB;&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
          //   UI_DisplayMessage(oAttacker, UI_MESSAGE_BACKSTAB);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if (nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
        {&lt;br /&gt;
              #ifdef DEBUG&lt;br /&gt;
              Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_DEATHBLOW&amp;quot;);&lt;br /&gt;
              #endif&lt;br /&gt;
&lt;br /&gt;
              nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_HIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Templar's Righteous Strike - 25% mana damage&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsMagicUser(oTarget))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                if (HasAbility(oAttacker,ABILITY_TALENT_RIGHTEOUS_STRIKE))&lt;br /&gt;
                {&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_MANA;&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_25;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                     ApplyEffectVisualEffect(oAttacker, oTarget, 90181, EFFECT_DURATION_TYPE_INSTANT, 0.0f, ABILITY_TALENT_RIGHTEOUS_STRIKE);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        //            Here is where the actual damage is dealt&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        Effects_ApplyInstantEffectDamage(oTarget, oAttacker, fDamage, nDamageType, nGore,nAbility,nVfx);&lt;br /&gt;
        Combat_Damage_CheckOnImpactAbilities(oTarget, oAttacker, fDamage, nAttackResult, oWeapon, nAbility);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        UI_DisplayMessage(oAttacker, nUIMessage);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BLOCKED&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // Do something smart here in the future&lt;br /&gt;
        //        UI_DisplayMessage(oAttacker, UI_MESSAGE_MISSED);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Stats - handle hit rate&lt;br /&gt;
    STATS_HandleHitRate(oAttacker, nAttackResult);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16526</id>
		<title>Combat HandleCommandAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16526"/>
				<updated>2011-08-01T05:29:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16525</id>
		<title>Combat PerformAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16525"/>
				<updated>2011-08-01T05:28:43Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*&lt;br /&gt;
*  @returns CombatAttackResultStruct with damage and attackresult populated&lt;br /&gt;
*&lt;br /&gt;
*  &amp;quot;Don't touch this if you want to live&amp;quot;&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon , float fDamageOverride = 0.0f, int nAbility = 0);&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon ,  float fDamageOverride = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
    struct  CombatAttackResultStruct stRet;&lt;br /&gt;
    float   fDamage = 0.0f;&lt;br /&gt;
    int     nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    stRet.fAttackDuration =    ATTACK_LOOP_DURATION_INVALID ;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Attack check happens here...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    stRet.nAttackResult = Combat_GetAttackResult(oAttacker, oTarget, oWeapon );&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If attack result was not a miss, go on to calculate damage&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stRet.nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        int bCriticalHit = (stRet.nAttackResult == COMBAT_RESULT_CRITICALHIT);&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        // If attack result was not a miss, check if we need to handle a deathblow&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        fDamage = ( (fDamageOverride == 0.0f) ?&lt;br /&gt;
                          Combat_Damage_GetAttackDamage(oAttacker, oTarget, oWeapon, stRet.nAttackResult) : fDamageOverride);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        float fTargetHealth = GetCurrentHealth( oTarget );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // -----------------------------------------------------------------&lt;br /&gt;
        //  Ranged weapons attacks are not synched and therefore we never&lt;br /&gt;
        //  need to worry about reporting deathblows to the engine.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When not using a ranged weapon, there are synchronize death blows to handle&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if ( nAttackType != ATTACK_TYPE_RANGED &amp;amp;&amp;amp; nAbility == 0 &amp;amp;&amp;amp; stRet.nAttackResult != COMBAT_RESULT_MISS )&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Deathblows against doors look cool, but really...&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (  GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Special conditions.&lt;br /&gt;
                //&lt;br /&gt;
                // There are a few cases in the single player campaign&lt;br /&gt;
                // where we want the spectacular deathblow to occur if possible.&lt;br /&gt;
                //&lt;br /&gt;
                // The following logic defines these conditions&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                int nAppearance =   GetAppearanceType(oTarget) ;&lt;br /&gt;
                int nRank       = GetCreatureRank(oTarget);&lt;br /&gt;
&lt;br /&gt;
                int bSpecial =   FALSE;&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // ... all boss ogres (there's 1 in the official campaign) by request&lt;br /&gt;
                //     from Dr. Muzyka.&lt;br /&gt;
                // ... all elite bosses&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (nAppearance == APR_TYPE_OGRE || (nRank == CREATURE_RANK_BOSS||nRank == CREATURE_RANK_ELITE_BOSS)  ) ||&lt;br /&gt;
                      nRank == CREATURE_RANK_ELITE_BOSS)&lt;br /&gt;
                {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // ... but only if they are at the health threshold&lt;br /&gt;
                        //     required for deathblows to trigger&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        if (IsHumanoid(oAttacker))&lt;br /&gt;
                        {&lt;br /&gt;
                            bSpecial = _GetRelativeResourceLevel(oTarget, PROPERTY_DEPLETABLE_HEALTH) &amp;lt; SPECIAL_BOSS_DEATHBLOW_THRESHOLD;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Deathblows occur when&lt;br /&gt;
                //  ... target isn't immortal (duh) AND&lt;br /&gt;
                //      ... the damage of the hit exceeds the creature's health OR&lt;br /&gt;
                //      ... aforementioned 'special' conditions are met.&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (!IsImmortal( oTarget ) &amp;amp;&amp;amp; (fDamage &amp;gt;= fTargetHealth || bSpecial)))&lt;br /&gt;
                {&lt;br /&gt;
&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    // ... only from party members AND&lt;br /&gt;
                    //    ... if we determine that a deathblow doesn't interrupt gameplay OR&lt;br /&gt;
                    //    ... aforementioned 'special' conditions are met&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    if (IsPartyMember(oAttacker) &amp;amp;&amp;amp; (CheckForDeathblow(oAttacker, oTarget) || bSpecial))&lt;br /&gt;
                    {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // Verify some more conditions...&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        int bDeathBlow = Combat_GetValidDeathblow(oAttacker, oTarget);&lt;br /&gt;
                        if (bDeathBlow)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_DEATHBLOW ;&lt;br /&gt;
&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            // Special treatment for ogre&lt;br /&gt;
                            // Reason: The ogre, unlike all other special bosses&lt;br /&gt;
                            //         has a second, non spectacular deathblow.&lt;br /&gt;
                            //         if we specify 0, there's a 50% chance that&lt;br /&gt;
                            //         one is played, which we don't want in this&lt;br /&gt;
                            //         case, so we're passing the id of the&lt;br /&gt;
                            //         spectacular one instead.&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            if (bSpecial &amp;amp;&amp;amp; nAppearance == APR_TYPE_OGRE)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 5; // 5 - ogre slowmo deathblow&lt;br /&gt;
                            }&lt;br /&gt;
                            else&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 0;  // 0 - auto select in engine;&lt;br /&gt;
                            }&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            // Failure to meet conditions: convert to hit.&lt;br /&gt;
                            if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        // Failure to meet conditions: convert to hit.&lt;br /&gt;
                        if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 } /* ishumanoid*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            } /* obj_type creature*/&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    int nDamageType = DAMAGE_TYPE_PHYSICAL;&lt;br /&gt;
&lt;br /&gt;
    if ( nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Certain projectiles modifyt the damage type done by a ranged weapon&lt;br /&gt;
        // This is defined in PRJ_BASE.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        int nProjectileIndex = GetLocalInt(oWeapon,PROJECTILE_OVERRIDE);&lt;br /&gt;
        if (nProjectileIndex)&lt;br /&gt;
        {&lt;br /&gt;
            int nDamageTypeOverride = GetM2DAInt(TABLE_PROJECTILES,&amp;quot;DamageType&amp;quot;,nProjectileIndex);&lt;br /&gt;
            if (nDamageTypeOverride&amp;gt;0)&lt;br /&gt;
            {&lt;br /&gt;
                nDamageType = nDamageTypeOverride;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When using a ranged weapon, we need to report the duration of the&lt;br /&gt;
        // aim loop to the engine&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        stRet.fAttackDuration = GetCreatureRangedDrawSpeed(oAttacker, oWeapon);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        float fSpeed = CalculateAttackTiming(oAttacker, oWeapon);&lt;br /&gt;
        if (fSpeed&amp;gt;0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            stRet.fAttackDuration = fSpeed;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // The Impact effect is not a real effect - it is not ever applied. Instead&lt;br /&gt;
    // it is used to marshal information about the attack back to the impact&lt;br /&gt;
    // event.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stRet.eImpactEffect = EffectImpact(fDamage, oWeapon, 0, 0, nDamageType);&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.Combat_PerformAttack&amp;quot;,&amp;quot; Attack Result: &amp;quot; + Log_GetAttackResultNameById(stRet.nAttackResult),  oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return stRet;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16524</id>
		<title>Combat GetAttackResult</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16524"/>
				<updated>2011-08-01T05:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine whether or not an attack hits a target.&lt;br /&gt;
*&lt;br /&gt;
* Note that this function only calculates to hit and crits, death blows are&lt;br /&gt;
* determined in Combat_PerformAttack&lt;br /&gt;
*&lt;br /&gt;
* @param oAttacker  The attacker&lt;br /&gt;
* @param oTarget    The target that is being attacked&lt;br /&gt;
* @param nAbility   If != 0, it won't trigger backstabs and deathblows.&lt;br /&gt;
*&lt;br /&gt;
* @returns  COMBAT_RESULT_HIT, COMBAT_RESULT_CRITICALHIT or COMBAT_RESULT_MISS&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0);&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Debug&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nForcedCombatResult = GetForcedCombatResult(oAttacker);&lt;br /&gt;
    if (nForcedCombatResult != -1)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Skipped rules, FORCED RESULT IS:&amp;quot; + ToString(nForcedCombatResult), oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return nForcedCombatResult;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Placeables are always hit&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Placeable, automatic result : COMBAT_RESULT_HIT&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Displacement&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDisplace = GetCreatureProperty(oTarget, PROPERTY_ATTRIBUTE_DISPLACEMENT);&lt;br /&gt;
    float fRand = RandomFloat()*100.0;&lt;br /&gt;
    if ( fRand &amp;lt; fDisplace)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Displacement effect kciked in, automatic result : COMBAT_RESULT_MISS&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // if the target has the evasion talent, attribute this miss to the talent&lt;br /&gt;
        // (random 50% because the anim is interrupting)&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (HasAbility(oTarget, ABILITY_TALENT_EVASION) &amp;amp;&amp;amp; fRand &amp;lt; (20.0f - (RandomFloat()*10.0f)  ))&lt;br /&gt;
        {&lt;br /&gt;
                command currentCmd = GetCurrentCommand(oTarget);&lt;br /&gt;
                int nCmdType = GetCommandType(currentCmd);&lt;br /&gt;
                // Evasion only plays during attack and wait commands.&lt;br /&gt;
                if ( nCmdType == COMMAND_TYPE_WAIT || nCmdType == COMMAND_TYPE_ATTACK || nCmdType == COMMAND_TYPE_INVALID )&lt;br /&gt;
                {&lt;br /&gt;
                    ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, Effect(1055), oTarget, 0.0f, oTarget, ABILITY_TALENT_EVASION);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int  nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
    int nRet;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Get the attackers attack rating (includes effects and equipment stats)&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fAttackRating;&lt;br /&gt;
&lt;br /&gt;
    if (GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Staves always hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fAttackRating =  GetCreatureAttackRating (oAttacker);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Add item stat (usually 0) along with scripted boni and attack bias.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    fAttackRating += GetItemStat(oWeapon,   ITEM_STAT_ATTACK) + fBonus + ATTACK_HIT_BIAS;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fAttackRating += Diff_GetRulesAttackBonus(oAttacker);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with figuring out which critical hit modifier (melee, ranged, etc)&lt;br /&gt;
    // to use for this attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fCriticalHitModifier;&lt;br /&gt;
    int     nCriticalHitModifier  = (nAttackType == ATTACK_TYPE_RANGED) ?  CRITICAL_MODIFIER_RANGED : CRITICAL_MODIFIER_MELEE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fCriticalHitModifier = GetCreatureCriticalHitModifier(oAttacker, nCriticalHitModifier);&lt;br /&gt;
    fCriticalHitModifier += GetItemStat(oWeapon, ITEM_STAT_CRIT_CHANCE_MODIFIER);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    //  Bravery grants +3.5 critical hit per enemy past the first 2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_BRAVERY))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        int nEnemies = Max(0,GetArraySize(GetCreaturesInMeleeRing(oAttacker,0.0, 359.99f,TRUE,0))-2);&lt;br /&gt;
        fCriticalHitModifier +=  nEnemies * 3.5f;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Calculate Flanking Bonus&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fFlanking = Combat_GetFlankingBonus(oAttacker, oTarget);&lt;br /&gt;
    if (fFlanking &amp;gt; 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Also increase chance for critical hits by 1/5th of the flanking bonus&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        fCriticalHitModifier *=  (1.0 + (fFlanking/5.0));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Range plays a role too.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDistance =  GetDistanceBetween(oAttacker, oTarget);&lt;br /&gt;
    float fNoPenaltyDistance = MaxF(POINT_BLANK_RANGE,GetItemStat(oWeapon, ITEM_STAT_OPTIMUM_RANGE));&lt;br /&gt;
    fDistance = MaxF(fDistance-fNoPenaltyDistance,0.0f);&lt;br /&gt;
&lt;br /&gt;
    float fAttackRoll = 50.0;&lt;br /&gt;
    float fPenalties = fDistance; // every meter distance past the free range is -1!&lt;br /&gt;
    float fAttack = fAttackRating  + fAttackRoll + fFlanking - fPenalties;&lt;br /&gt;
&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
    // BEGIN SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        int bThreatenCritical = (RandomFloat()*100.0f   &amp;lt; fCriticalHitModifier  );&lt;br /&gt;
&lt;br /&gt;
        if (!bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Attacking out of stealth always threatens crit.&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_SKILL_STEALTH_1))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Death hex effect ... all hits are auto crit&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_DEATH_HEX))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Autocrit effect&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oAttacker, EFFECT_TYPE_AUTOCRIT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Double strike does not allow crits&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // rapid shot doesn't allow critical strikes&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_RAPIDSHOT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Targets that have critical hit immunity can not be crit...&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Critical hit averted, target has critical hit immunity&amp;quot;, oTarget);&lt;br /&gt;
            bThreatenCritical = !HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
    // END SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with calculating the defense values of the attack target&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDefenseRating =  GetCreatureDefense(oTarget) + ((nAttackType == ATTACK_TYPE_RANGED) ? GetCreatureProperty(oTarget,PROPERTY_ATTRIBUTE_MISSILE_SHIELD):0.0f);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fDefenseRating += Diff_GetRulesDefenseBonus(oTarget);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // A hit is successful if the attack rating exceeds the defense rating&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (RandomFloat()*100.0f &amp;lt;  fAttack - fDefenseRating)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // If we threatened a critical, we crit here, otherwise just report normal hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        nRet =  ( (bThreatenCritical) ? COMBAT_RESULT_CRITICALHIT : COMBAT_RESULT_HIT  );&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
        {&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // If we are backstabbing, we change the result here if it&lt;br /&gt;
            // was a crit. Abilities never bs (anim priority)&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if ( nAbility == 0 &amp;amp;&amp;amp; Combat_CheckBackstab(oAttacker, oTarget, oWeapon,fFlanking))&lt;br /&gt;
            {&lt;br /&gt;
                    nRet =  COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Miss...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Misdirection Hex&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetHasEffects(oAttacker, EFFECT_TYPE_MISDIRECTION_HEX))&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Attacker under misdirection hex: Hits are misses, crits are hits.&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        if (nRet == COMBAT_RESULT_HIT || nRet == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
        }&lt;br /&gt;
        else if (nRet == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_HIT;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //  return COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation: &amp;quot; +&lt;br /&gt;
                     &amp;quot; fAttack:&amp;quot;  + ToString(fAttack) +&lt;br /&gt;
                     &amp;quot; = (fAttackRating: &amp;quot; + ToString(fAttackRating) +&lt;br /&gt;
                     &amp;quot; fAttackRoll:&amp;quot; + ToString(fAttackRoll) +&lt;br /&gt;
                     &amp;quot; (range penalty:&amp;quot; + ToString(fPenalties) + &amp;quot;)&amp;quot;+&lt;br /&gt;
                     &amp;quot; fFlanking: &amp;quot; + ToString(fFlanking) +&lt;br /&gt;
                     &amp;quot; fBonus(script): &amp;quot; + ToString(fBonus) +&lt;br /&gt;
                     &amp;quot;)&amp;quot; , oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation (2):  &amp;quot; +&lt;br /&gt;
                     &amp;quot; fDefenseRating: &amp;quot; + ToString(fDefenseRating) +&lt;br /&gt;
                     &amp;quot; fCriticalHitModifier: &amp;quot; + ToString(fCriticalHitModifier) +&lt;br /&gt;
                     &amp;quot; bThreatenCritical: &amp;quot; + ToString(bThreatenCritical), oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return nRet;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16523</id>
		<title>Combat CheckBackStab</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16523"/>
				<updated>2011-08-01T05:27:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Check if backstab conditions are true&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_CheckBackstab(object oAttacker, object oTarget, object oWeapon, float fFlankingBonus)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we we are a rogue&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (!HasAbility(oAttacker, ABILITY_TALENT_HIDDEN_ROGUE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!IsHumanoid(oAttacker))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And target is not immune&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And attacker does not use double strike mode&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     // -------------------------------------------------------------------------&lt;br /&gt;
    // We can only backstab if we are flanking.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fFlankingBonus&amp;gt;0.0)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         /* Coup de grace*/&lt;br /&gt;
        if (HasAbility(oAttacker, ABILITY_TALENT_BACKSTAB))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_STUN))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else if (GetHasEffects(oTarget, EFFECT_TYPE_PARALYZE))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16522</id>
		<title>Combat GetFlankingBonus</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16522"/>
				<updated>2011-08-01T05:27:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
float Combat_GetFlankingBonus(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TALENT_SHIELD_TACTICS))&lt;br /&gt;
    {&lt;br /&gt;
        if (IsUsingShield(oTarget))&lt;br /&gt;
            return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (GetHasEffects(oTarget, EFFECT_TYPE_FLANK_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    float fAngle = GetAngleBetweenObjects(oTarget, oAttacker);&lt;br /&gt;
    float fFactor = 0.0;&lt;br /&gt;
    float fMaxModifier = 15.0;&lt;br /&gt;
&lt;br /&gt;
    // The attackers ability to flank is stored in a creature property&lt;br /&gt;
    float fFlankingAngle = GetCreatureProperty(oAttacker, PROPERTY_ATTRIBUTE_FLANKING_ANGLE);&lt;br /&gt;
&lt;br /&gt;
    if (fFlankingAngle &amp;lt;= 10.0 ) /*old savegames have this at 10*/&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 60.0; // old savegames need this to avoid divby0 later&lt;br /&gt;
    }&lt;br /&gt;
    else if (fFlankingAngle&amp;gt;180.0)&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 180.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_COMBAT_MOVEMENT))&lt;br /&gt;
    {&lt;br /&gt;
        fMaxModifier = 20.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( fMaxModifier &amp;lt;= 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( (fAngle&amp;gt;= (180.0 - fFlankingAngle) &amp;amp;&amp;amp; fAngle&amp;lt;=(180.0 + fFlankingAngle )))&lt;br /&gt;
    {&lt;br /&gt;
        // Shield block negats flanking on the left.&lt;br /&gt;
&lt;br /&gt;
        int bShieldBlock =  HasAbility(oTarget,ABILITY_TALENT_SHIELD_BLOCK);&lt;br /&gt;
        int bUsingShield = IsUsingShield(oTarget);&lt;br /&gt;
&lt;br /&gt;
        if (!bShieldBlock || fAngle &amp;lt; 180.0 || (bShieldBlock &amp;amp;&amp;amp; !bUsingShield) )&lt;br /&gt;
        {&lt;br /&gt;
            fFactor = (fFlankingAngle -  fabs( 180.0 - fAngle))/fFlankingAngle;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Only rogues get the full positional benefits on the battlefield,&lt;br /&gt;
    // everyone else gets halfa&lt;br /&gt;
    float fClassModifier = GetCreatureCoreClass(oAttacker) == CLASS_ROGUE?1.0f:0.5f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return fFactor * fMaxModifier * fClassModifier;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16521</id>
		<title>Combat GetAttackType</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16521"/>
				<updated>2011-08-01T05:27:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Return the type of the current attack based on the weapon in the main hand&lt;br /&gt;
// used only in command_pending...&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon);&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon)&lt;br /&gt;
{&lt;br /&gt;
    if (IsUsingRangedWeapon(oAttacker, oWeapon))&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_RANGED;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_MELEE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16520</id>
		<title>Combat GetValidDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16520"/>
				<updated>2011-08-01T05:26:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine a valid deathblow for the current target&lt;br /&gt;
*&lt;br /&gt;
* Called when the script decides to do a deathblow, this function will return&lt;br /&gt;
* a DEATHBLOW_* constant representing the deathblow to use against the creature&lt;br /&gt;
*&lt;br /&gt;
* If the creature does not support deathblows (immunity, no animation) or can not&lt;br /&gt;
* be deathblowed (Immortal, Plot, Party Member, Flagged as invalid in the toolset)&lt;br /&gt;
* the function returns 0&lt;br /&gt;
*&lt;br /&gt;
* @param oTarget    The target for the Deathblow&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 or DEATH_BLOW_*&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget);&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // First, let's check if we can even perform deathblows with the attacker&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     int bCanDeathblow =       CanPerformDeathblows(oAttacker);&lt;br /&gt;
&lt;br /&gt;
     if (!bCanDeathblow)&lt;br /&gt;
     {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     int nValid =              GetM2DAInt(TABLE_APPEARANCE,&amp;quot;ValidDeathblows&amp;quot;, GetAppearanceType(oTarget));&lt;br /&gt;
&lt;br /&gt;
     int bImmortal            = IsImmortal(oTarget);&lt;br /&gt;
     int bPlot                = IsPlot(oTarget);&lt;br /&gt;
     int bCanDiePermanently   = GetCanDiePermanently(oTarget);&lt;br /&gt;
     int bAlreadyDead         = HasDeathEffect(oTarget);&lt;br /&gt;
&lt;br /&gt;
      #ifdef DEBUG&lt;br /&gt;
     Log_Trace(LOG_CHANNEL_COMBAT_DEATH,&amp;quot;GetValidDeathblow&amp;quot;,&amp;quot;nValid: &amp;quot; + ToString(nValid) + &amp;quot; bImmortal: &amp;quot; + ToString(bImmortal) + &amp;quot; bPlot:&amp;quot; +&lt;br /&gt;
                                ToString(bPlot) + &amp;quot; bCanDiePermanently:&amp;quot; + ToString(bCanDiePermanently));&lt;br /&gt;
&lt;br /&gt;
     #endif&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // If we are immortal, Plot, or can not die permanently (e.g. a party member),&lt;br /&gt;
     // we return 0&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     if (bImmortal || bPlot || !bCanDiePermanently || IsPartyMember(oTarget) || bAlreadyDead)&lt;br /&gt;
     {&lt;br /&gt;
       return 0;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16519</id>
		<title>CheckForDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16519"/>
				<updated>2011-08-01T05:26:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Check if a deathblow should occur.&lt;br /&gt;
*&lt;br /&gt;
* Examine a number of parameters to see whether or not we can play a deathblow&lt;br /&gt;
* without interrupting the flow of combat.&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int CheckForDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
    int nRank = GetCreatureRank(oTarget);&lt;br /&gt;
    int nLevel = GetLevel(oAttacker);&lt;br /&gt;
    float fChance = GetM2DAFloat(TABLE_CREATURERANKS,&amp;quot;fDeathblow&amp;quot;, nRank);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Any rank flagged 1.0 or higher triggers a deathblow.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fChance &amp;gt;= 1.0f)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we perceive more than 1 creature, then half the chance of triggering&lt;br /&gt;
    // a deathblow with each perceived hostile.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nCount = GetArraySize(GetPerceivedCreatureList(oAttacker, TRUE));&lt;br /&gt;
    if (nCount &amp;gt; 1)&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= (2.0/IntToFloat(nCount));&lt;br /&gt;
    }&lt;br /&gt;
    //Increase chance of death blow in origin stories (level 1 and 2)&lt;br /&gt;
    //1.5 times the chance&lt;br /&gt;
    if ( nLevel &amp;lt; 3 )&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= 1.5;&lt;br /&gt;
    }&lt;br /&gt;
    return (RandomFloat()&amp;lt;fChance);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16518</id>
		<title>Combat GetAttackHand</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16518"/>
				<updated>2011-08-01T05:25:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Calls:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
* @brief Determine which hand to use for an attack&lt;br /&gt;
*&lt;br /&gt;
* Only applicable in dual weapon style. Returns which hand to use for the next attack&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 - main hand, 1 - offhand&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int Combat_GetAttackHand(object oCreature = OBJECT_SELF)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nHand = 0;&lt;br /&gt;
    if (GetWeaponStyle(oCreature) == WEAPONSTYLE_DUAL)&lt;br /&gt;
    {&lt;br /&gt;
        nHand = GetLocalInt(oCreature, COMBAT_LAST_WEAPON);&lt;br /&gt;
        SetLocalInt(oCreature, COMBAT_LAST_WEAPON, !nHand);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return nHand;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16516</id>
		<title>IsCombatHit</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=IsCombatHit&amp;diff=16516"/>
				<updated>2011-08-01T05:09:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; int IsCombatHit(int nAttackResult) {     if (nAttackResult == COMBAT_RESULT_MISS || nAttackResult == COMBAT_RESULT_BLOCK...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
int IsCombatHit(int nAttackResult)&lt;br /&gt;
{&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_MISS || nAttackResult == COMBAT_RESULT_BLOCKED || nAttackResult == COMBAT_RESULT_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    } else&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16515</id>
		<title>Combat HandleCreatureDisappear</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCreatureDisappear&amp;diff=16515"/>
				<updated>2011-08-01T05:05:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; // Handles any combat related logic for when a creature disappears from combat. This function should be run // at 2 case...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// Handles any combat related logic for when a creature disappears from combat. This function should be run&lt;br /&gt;
// at 2 cases both for a player object and a creature object:&lt;br /&gt;
// 1. Disappear event&lt;br /&gt;
// 2. Appear event when the hostile creature turned non-hostile&lt;br /&gt;
void Combat_HandleCreatureDisappear(object oCreature, object oDisappearer)&lt;br /&gt;
{&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;Combat_HandleCreatureDisappeart&amp;quot;,&amp;quot;creature: &amp;quot; + GetTag(oCreature) + &amp;quot;, disappearer: &amp;quot; + GetTag(oDisappearer));&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    if(IsFollower(oCreature))&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // If the party does no longer perceive any hostiles....&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        if (!IsPartyPerceivingHostiles(oCreature))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (!IsPartyDead())&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR PARTY!&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
&lt;br /&gt;
                SSPlaySituationalSound(GetRandomPartyMember(),SOUND_SITUATION_END_OF_COMBAT);&lt;br /&gt;
&lt;br /&gt;
                DelayEvent(3.0f, GetModule(), Event(EVENT_TYPE_DELAYED_GM_CHANGE));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else // non party members&lt;br /&gt;
    {&lt;br /&gt;
        AI_Threat_UpdateEnemyDisappeared(oCreature, oDisappearer);&lt;br /&gt;
        if (!IsPerceivingHostiles(oCreature) &amp;amp;&amp;amp; GetCombatState(oCreature) == TRUE)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT, &amp;quot;Combat_HandleCreatureDisappear&amp;quot;, &amp;quot;STOPPING COMBAT FOR NORMAL CREATURE!&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
            SetCombatState(oCreature,FALSE);&lt;br /&gt;
&lt;br /&gt;
            // Added to make a COMBAT_END event&lt;br /&gt;
            // FAB 9/4&lt;br /&gt;
            event evCombatEnds = Event(EVENT_TYPE_COMBAT_END);&lt;br /&gt;
            //evCombatEnds = SetEventInteger(evCombatEnds, 0, bcombatstate);&lt;br /&gt;
            SignalEvent(oCreature, evCombatEnds);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16514</id>
		<title>Combat HandleAbilityAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAbilityAttackImpact&amp;diff=16514"/>
				<updated>2011-08-01T05:04:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; // GZ: Temporary function to prevent the world from collapsing upon itself  void Combat_HandleAbilityAttackImpact(object...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// GZ: Temporary function to prevent the world from collapsing upon itself&lt;br /&gt;
&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage);&lt;br /&gt;
void Combat_HandleAbilityAttackImpact(object oAttacker, object oTarget, int nAttackResult, float fDamage)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    effect eImpactEffect = EffectImpact(fDamage, OBJECT_INVALID);&lt;br /&gt;
&lt;br /&gt;
    Combat_HandleAttackImpact(oAttacker, oTarget, nAttackResult, eImpactEffect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16513</id>
		<title>Combat HandleAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16513"/>
				<updated>2011-08-01T05:02:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an attack impact event&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nAttackResult   The result of the attack (COMBAT_RESULT_*)&lt;br /&gt;
*  @param eImpactEffect   The attack's impact effect.&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect);&lt;br /&gt;
void Combat_HandleAttackImpact(object oAttacker, object oTarget, int nAttackResult, effect eImpactEffect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nUIMessage = UI_MESSAGE_MISSED;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // We retired combat result blocked, so we treat it as a miss here.&lt;br /&gt;
    // Might be back in DA2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
        nUIMessage = UI_MESSAGE_BLOCKED;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // If the target managed to stealth, we're converting it into a miss&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp; nAttackResult != COMBAT_RESULT_MISS &amp;amp;&amp;amp; IsInvisible(oTarget) )&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Target turned invisible - hit converted to miss&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
        nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // Tell the damage effect to update gore and by how much...&lt;br /&gt;
        // see gore_h for details or ask georg.&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        object oWeapon = GetEffectObject(eImpactEffect,0);&lt;br /&gt;
        int nApp = GetAppearanceType(oAttacker);&lt;br /&gt;
        int nAbility = GetEffectInteger(eImpactEffect,1);&lt;br /&gt;
&lt;br /&gt;
        float fPerSpace = GetM2DAFloat(TABLE_APPEARANCE, &amp;quot;PERSPACE&amp;quot;, nApp);&lt;br /&gt;
        // Skipping range check if the creature is large (personal space greater or equal to one)&lt;br /&gt;
        if (IsObjectValid(oWeapon) &amp;amp;&amp;amp; IsUsingMeleeWeapon(oAttacker, oWeapon) &amp;amp;&amp;amp; fPerSpace &amp;lt; 1.0)&lt;br /&gt;
        {&lt;br /&gt;
            if (GetDistanceBetween(oTarget, oAttacker) &amp;gt; 5.0f)&lt;br /&gt;
            {&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Melee attack impact from past 5m found, changed to COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
                #endif&lt;br /&gt;
                nAttackResult = COMBAT_RESULT_MISS;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
    // The attack was successful, ...&lt;br /&gt;
    // -----------------------------------------------------------------&lt;br /&gt;
       float fDamage = GetEffectFloat(eImpactEffect,0);&lt;br /&gt;
       int nVfx = GetEffectInteger(eImpactEffect,0);&lt;br /&gt;
       int nDamageType = GetEffectInteger(eImpactEffect, 2);&lt;br /&gt;
&lt;br /&gt;
        // special damage type override for Shale, filtered for performance reasons&lt;br /&gt;
        int nAppearanceType = GetAppearanceType(oAttacker);&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;Attacker appearance type = &amp;quot; + ToString(nAppearanceType));&lt;br /&gt;
        #endif&lt;br /&gt;
        if (nAppearanceType == 10100) // new shale type&lt;br /&gt;
        {&lt;br /&gt;
            // check for damage type modifying effect&lt;br /&gt;
            effect[] eModifiers = GetEffects(oAttacker, 10000);&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  Modifier effects present = &amp;quot; + ToString(GetArraySize(eModifiers)));&lt;br /&gt;
            #endif&lt;br /&gt;
            if (IsEffectValid(eModifiers[0]) == TRUE)&lt;br /&gt;
            {&lt;br /&gt;
                int nOverrideDamageType = GetEffectInteger(eModifiers[0], 0);&lt;br /&gt;
                nDamageType = nOverrideDamageType;&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;  First modifier is valid with type &amp;quot; + ToString(nOverrideDamageType));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        // If damage was negative, something went wrong and we bail out&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        if(fDamage &amp;lt; 0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        int nGore;&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Only melee weapons update gore.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsObjectValid(oWeapon))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                // Attacks that are not deathblows may play an attack grount.&lt;br /&gt;
                // -------------------------------------------------------------&lt;br /&gt;
                if (nAttackResult != COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
                {&lt;br /&gt;
                    SSPlaySituationalSound(oAttacker, SOUND_SITUATION_ATTACK_IMPACT);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // only update gore if the target can bleed (PeterT 25/7/08)&lt;br /&gt;
                int nTargetAppearance = GetAppearanceType(oTarget);&lt;br /&gt;
                if (GetM2DAInt(TABLE_APPEARANCE, &amp;quot;bCanBleed&amp;quot;, nTargetAppearance) == TRUE)&lt;br /&gt;
                {&lt;br /&gt;
                    nGore =  DAMAGE_EFFECT_FLAG_UPDATE_GORE;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackResult == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_CRITICALHIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Damage below a certain threshold is not displayed as critical&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (fDamage &amp;gt;= DAMAGE_CRITICAL_DISPLAY_THRESHOLD)&lt;br /&gt;
            {&lt;br /&gt;
                if (IsPartyMember(oAttacker))&lt;br /&gt;
                {&lt;br /&gt;
                        Engine_ApplyEffectOnObject(EFFECT_DURATION_TYPE_TEMPORARY,EffectScreenShake( SCREEN_SHAKE_TYPE_CRITICAL_HIT ),oTarget, 1.0f, oAttacker);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if ( nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BACKSTAB&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_BACKSTAB;&lt;br /&gt;
             nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
          //   UI_DisplayMessage(oAttacker, UI_MESSAGE_BACKSTAB);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if (nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
        {&lt;br /&gt;
              #ifdef DEBUG&lt;br /&gt;
              Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_DEATHBLOW&amp;quot;);&lt;br /&gt;
              #endif&lt;br /&gt;
&lt;br /&gt;
              nGore |= DAMAGE_EFFECT_FLAG_CRITICAL;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            #ifdef DEBUG&lt;br /&gt;
            Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_HIT&amp;quot;);&lt;br /&gt;
            #endif&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Templar's Righteous Strike - 25% mana damage&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (IsMagicUser(oTarget))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetItemType(oWeapon) == ITEM_TYPE_WEAPON_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
                if (HasAbility(oAttacker,ABILITY_TALENT_RIGHTEOUS_STRIKE))&lt;br /&gt;
                {&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_MANA;&lt;br /&gt;
                     nGore |= DAMAGE_EFFECT_FLAG_LEECH_25;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                     ApplyEffectVisualEffect(oAttacker, oTarget, 90181, EFFECT_DURATION_TYPE_INSTANT, 0.0f, ABILITY_TALENT_RIGHTEOUS_STRIKE);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        //            Here is where the actual damage is dealt&lt;br /&gt;
        // -------------------------------------------------------------&lt;br /&gt;
        Effects_ApplyInstantEffectDamage(oTarget, oAttacker, fDamage, nDamageType, nGore,nAbility,nVfx);&lt;br /&gt;
        Combat_Damage_CheckOnImpactAbilities(oTarget, oAttacker, fDamage, nAttackResult, oWeapon, nAbility);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_MISS&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        UI_DisplayMessage(oAttacker, nUIMessage);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else  if (nAttackResult == COMBAT_RESULT_BLOCKED)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleAttackImpact&amp;quot;,&amp;quot;COMBAT_RESULT_BLOCKED&amp;quot;);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // Do something smart here in the future&lt;br /&gt;
        //        UI_DisplayMessage(oAttacker, UI_MESSAGE_MISSED);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Stats - handle hit rate&lt;br /&gt;
    STATS_HandleHitRate(oAttacker, nAttackResult);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16512</id>
		<title>Combat HandleAttackImpact</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleAttackImpact&amp;diff=16512"/>
				<updated>2011-08-01T04:56:23Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; /** *  @brief Handles processing an Attack Command * *  @param oAttacker       The command owner, usually OBJEC_TSE *  @...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16511</id>
		<title>Combat HandleCommandAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16511"/>
				<updated>2011-08-01T04:54:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16510</id>
		<title>Combat HandleCommandAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_HandleCommandAttack&amp;diff=16510"/>
				<updated>2011-08-01T04:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; /** *  @brief Handles processing an Attack Command * *  @param oAttacker       The command owner, usually OBJEC_TSE *  @...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJEC_TSE&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*  @param nCommandId      The command Id&lt;br /&gt;
*  @param nCommandSubType The command subtype&lt;br /&gt;
*&lt;br /&gt;
*  @returns COMBAT_RESULT_* constant&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType);&lt;br /&gt;
int  Combat_HandleCommandAttack(object oAttacker, object oTarget, int nCommandSubType)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    struct CombatAttackResultStruct stAttack1;&lt;br /&gt;
    struct CombatAttackResultStruct stAttack2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    object oWeapon;&lt;br /&gt;
    object oWeapon2;&lt;br /&gt;
&lt;br /&gt;
    int nHand = Combat_GetAttackHand(oAttacker);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_MAIN)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Double Weapon Strike.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        nHand=HAND_BOTH;&lt;br /&gt;
        oWeapon = GetItemInEquipSlot(INVENTORY_SLOT_MAIN);&lt;br /&gt;
        oWeapon2 = GetItemInEquipSlot(INVENTORY_SLOT_OFFHAND);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Handle Attack #1&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stAttack1 = Combat_PerformAttack(oAttacker, oTarget, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
           stAttack2 = Combat_PerformAttack(oAttacker, oTarget, oWeapon2);&lt;br /&gt;
&lt;br /&gt;
           if (stAttack1.nAttackResult != COMBAT_RESULT_DEATHBLOW &amp;amp;&amp;amp;  stAttack2.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
           {&lt;br /&gt;
                stAttack1 = stAttack2;&lt;br /&gt;
                nHand = HAND_MAIN; // Deathblows just use the main hand.&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we execute a deathblow, we gain the death fury effect for a couple of&lt;br /&gt;
    // seconds and apply the deathblow command&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stAttack1.nAttackResult == COMBAT_RESULT_DEATHBLOW)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // Georg: Do Not Modify the following section.&lt;br /&gt;
        // START &amp;gt;&amp;gt;&lt;br /&gt;
        // GM - Adding the deathblow should be the last thing done because it&lt;br /&gt;
        // will clear the attack command.&lt;br /&gt;
        // Specifically, SetAttackResult MUST be executed before adding the deathblow.&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        WR_AddCommand(oAttacker, CommandDeathBlow(oTarget, stAttack1.nDeathblowType), TRUE, TRUE);&lt;br /&gt;
&lt;br /&gt;
        return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
        // &amp;lt;&amp;lt; END&lt;br /&gt;
        // ----------------------------------------------------------------------&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // SetAttackResult requires a result in either the first or second result&lt;br /&gt;
    // field to determine which hand should attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (nHand == HAND_MAIN || stAttack1.nAttackResult == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_OFFHAND)&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  COMBAT_RESULT_INVALID, Effect(),&lt;br /&gt;
                                        stAttack1.nAttackResult, stAttack1.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else if (nHand == HAND_BOTH)&lt;br /&gt;
    {&lt;br /&gt;
         SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,stAttack2.nAttackResult, stAttack2.eImpactEffect );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
          SetAttackResult(oAttacker,  stAttack1.nAttackResult, stAttack1.eImpactEffect,&lt;br /&gt;
                                    COMBAT_RESULT_INVALID, Effect()  );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (stAttack1.fAttackDuration != ATTACK_LOOP_DURATION_INVALID)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (IsHumanoid(oAttacker))&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if(nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &amp;quot;attack duration&amp;quot; for ranged weapons actually overrides&lt;br /&gt;
                // the time spent drawing and preparing to aim&lt;br /&gt;
                if ( GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF )&lt;br /&gt;
                {&lt;br /&gt;
                    SetAttackDuration(oAttacker, 0.30);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    object oArmor =GetItemInEquipSlot(INVENTORY_SLOT_CHEST);&lt;br /&gt;
                    if ( !IsArmorMassive(oArmor) &amp;amp;&amp;amp; HasAbility(oAttacker, ABILITY_TALENT_MASTER_ARCHER))&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (IsArmorHeavyOrMassive(oArmor) )&lt;br /&gt;
                    {&lt;br /&gt;
                         if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.0);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 2.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if(IsFollower(oAttacker))&lt;br /&gt;
                            SetAttackDuration(oAttacker, 0.8);&lt;br /&gt;
                        else&lt;br /&gt;
                            SetAttackDuration(oAttacker, 1.5);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                SetAimLoopDuration(oAttacker, stAttack1.fAttackDuration );&lt;br /&gt;
&lt;br /&gt;
                #ifdef DEBUG&lt;br /&gt;
                Log_Trace(LOG_CHANNEL_COMBAT,&amp;quot;combat_h.HandleCommandAttack&amp;quot;,&amp;quot;RangedAim Loop Duration set to &amp;quot; + FloatToString(stAttack1.fAttackDuration));&lt;br /&gt;
                #endif&lt;br /&gt;
            }&lt;br /&gt;
            else if (nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                SetAttackDuration(oAttacker,stAttack1.fAttackDuration);&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return COMMAND_RESULT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Command_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16509</id>
		<title>Combat PerformAttack</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_PerformAttack&amp;diff=16509"/>
				<updated>2011-08-01T04:50:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; /** *  @brief Handles processing an Attack Command * *  @param oAttacker       The command owner, usually OBJECT_SELF * ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
*  @brief Handles processing an Attack Command&lt;br /&gt;
*&lt;br /&gt;
*  @param oAttacker       The command owner, usually OBJECT_SELF&lt;br /&gt;
*  @param oTarget         The Target of the command&lt;br /&gt;
*&lt;br /&gt;
*  @returns CombatAttackResultStruct with damage and attackresult populated&lt;br /&gt;
*&lt;br /&gt;
*  &amp;quot;Don't touch this if you want to live&amp;quot;&lt;br /&gt;
*&lt;br /&gt;
*  @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon , float fDamageOverride = 0.0f, int nAbility = 0);&lt;br /&gt;
struct CombatAttackResultStruct Combat_PerformAttack(object oAttacker, object oTarget, object oWeapon ,  float fDamageOverride = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
    struct  CombatAttackResultStruct stRet;&lt;br /&gt;
    float   fDamage = 0.0f;&lt;br /&gt;
    int     nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
&lt;br /&gt;
    stRet.fAttackDuration =    ATTACK_LOOP_DURATION_INVALID ;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Attack check happens here...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    stRet.nAttackResult = Combat_GetAttackResult(oAttacker, oTarget, oWeapon );&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If attack result was not a miss, go on to calculate damage&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (stRet.nAttackResult != COMBAT_RESULT_MISS)&lt;br /&gt;
    {&lt;br /&gt;
        int bCriticalHit = (stRet.nAttackResult == COMBAT_RESULT_CRITICALHIT);&lt;br /&gt;
&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        // If attack result was not a miss, check if we need to handle a deathblow&lt;br /&gt;
        // -------------------------------------------------------------------------&lt;br /&gt;
        fDamage = ( (fDamageOverride == 0.0f) ?&lt;br /&gt;
                          Combat_Damage_GetAttackDamage(oAttacker, oTarget, oWeapon, stRet.nAttackResult) : fDamageOverride);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        float fTargetHealth = GetCurrentHealth( oTarget );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // -----------------------------------------------------------------&lt;br /&gt;
        //  Ranged weapons attacks are not synched and therefore we never&lt;br /&gt;
        //  need to worry about reporting deathblows to the engine.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When not using a ranged weapon, there are synchronize death blows to handle&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if ( nAttackType != ATTACK_TYPE_RANGED &amp;amp;&amp;amp; nAbility == 0 &amp;amp;&amp;amp; stRet.nAttackResult != COMBAT_RESULT_MISS )&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Deathblows against doors look cool, but really...&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (  GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Special conditions.&lt;br /&gt;
                //&lt;br /&gt;
                // There are a few cases in the single player campaign&lt;br /&gt;
                // where we want the spectacular deathblow to occur if possible.&lt;br /&gt;
                //&lt;br /&gt;
                // The following logic defines these conditions&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                int nAppearance =   GetAppearanceType(oTarget) ;&lt;br /&gt;
                int nRank       = GetCreatureRank(oTarget);&lt;br /&gt;
&lt;br /&gt;
                int bSpecial =   FALSE;&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // ... all boss ogres (there's 1 in the official campaign) by request&lt;br /&gt;
                //     from Dr. Muzyka.&lt;br /&gt;
                // ... all elite bosses&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (nAppearance == APR_TYPE_OGRE || (nRank == CREATURE_RANK_BOSS||nRank == CREATURE_RANK_ELITE_BOSS)  ) ||&lt;br /&gt;
                      nRank == CREATURE_RANK_ELITE_BOSS)&lt;br /&gt;
                {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // ... but only if they are at the health threshold&lt;br /&gt;
                        //     required for deathblows to trigger&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        if (IsHumanoid(oAttacker))&lt;br /&gt;
                        {&lt;br /&gt;
                            bSpecial = _GetRelativeResourceLevel(oTarget, PROPERTY_DEPLETABLE_HEALTH) &amp;lt; SPECIAL_BOSS_DEATHBLOW_THRESHOLD;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                // Deathblows occur when&lt;br /&gt;
                //  ... target isn't immortal (duh) AND&lt;br /&gt;
                //      ... the damage of the hit exceeds the creature's health OR&lt;br /&gt;
                //      ... aforementioned 'special' conditions are met.&lt;br /&gt;
                // ---------------------------------------------------------&lt;br /&gt;
                if ( (!IsImmortal( oTarget ) &amp;amp;&amp;amp; (fDamage &amp;gt;= fTargetHealth || bSpecial)))&lt;br /&gt;
                {&lt;br /&gt;
&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    // ... only from party members AND&lt;br /&gt;
                    //    ... if we determine that a deathblow doesn't interrupt gameplay OR&lt;br /&gt;
                    //    ... aforementioned 'special' conditions are met&lt;br /&gt;
                    // -----------------------------------------------------&lt;br /&gt;
                    if (IsPartyMember(oAttacker) &amp;amp;&amp;amp; (CheckForDeathblow(oAttacker, oTarget) || bSpecial))&lt;br /&gt;
                    {&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        // Verify some more conditions...&lt;br /&gt;
                        // -------------------------------------------------&lt;br /&gt;
                        int bDeathBlow = Combat_GetValidDeathblow(oAttacker, oTarget);&lt;br /&gt;
                        if (bDeathBlow)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_DEATHBLOW ;&lt;br /&gt;
&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            // Special treatment for ogre&lt;br /&gt;
                            // Reason: The ogre, unlike all other special bosses&lt;br /&gt;
                            //         has a second, non spectacular deathblow.&lt;br /&gt;
                            //         if we specify 0, there's a 50% chance that&lt;br /&gt;
                            //         one is played, which we don't want in this&lt;br /&gt;
                            //         case, so we're passing the id of the&lt;br /&gt;
                            //         spectacular one instead.&lt;br /&gt;
                            // ---------------------------------------------&lt;br /&gt;
                            if (bSpecial &amp;amp;&amp;amp; nAppearance == APR_TYPE_OGRE)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 5; // 5 - ogre slowmo deathblow&lt;br /&gt;
                            }&lt;br /&gt;
                            else&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nDeathblowType = 0;  // 0 - auto select in engine;&lt;br /&gt;
                            }&lt;br /&gt;
&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            // Failure to meet conditions: convert to hit.&lt;br /&gt;
                            if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                            {&lt;br /&gt;
                                stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        // Failure to meet conditions: convert to hit.&lt;br /&gt;
                        if (stRet.nAttackResult != COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
                        {&lt;br /&gt;
                            stRet.nAttackResult = COMBAT_RESULT_HIT;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 } /* ishumanoid*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            } /* obj_type creature*/&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    int nDamageType = DAMAGE_TYPE_PHYSICAL;&lt;br /&gt;
&lt;br /&gt;
    if ( nAttackType == ATTACK_TYPE_RANGED)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Certain projectiles modifyt the damage type done by a ranged weapon&lt;br /&gt;
        // This is defined in PRJ_BASE.&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        int nProjectileIndex = GetLocalInt(oWeapon,PROJECTILE_OVERRIDE);&lt;br /&gt;
        if (nProjectileIndex)&lt;br /&gt;
        {&lt;br /&gt;
            int nDamageTypeOverride = GetM2DAInt(TABLE_PROJECTILES,&amp;quot;DamageType&amp;quot;,nProjectileIndex);&lt;br /&gt;
            if (nDamageTypeOverride&amp;gt;0)&lt;br /&gt;
            {&lt;br /&gt;
                nDamageType = nDamageTypeOverride;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // When using a ranged weapon, we need to report the duration of the&lt;br /&gt;
        // aim loop to the engine&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        stRet.fAttackDuration = GetCreatureRangedDrawSpeed(oAttacker, oWeapon);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        float fSpeed = CalculateAttackTiming(oAttacker, oWeapon);&lt;br /&gt;
        if (fSpeed&amp;gt;0.0f)&lt;br /&gt;
        {&lt;br /&gt;
            stRet.fAttackDuration = fSpeed;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // The Impact effect is not a real effect - it is not ever applied. Instead&lt;br /&gt;
    // it is used to marshal information about the attack back to the impact&lt;br /&gt;
    // event.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    stRet.eImpactEffect = EffectImpact(fDamage, oWeapon, 0, 0, nDamageType);&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.Combat_PerformAttack&amp;quot;,&amp;quot; Attack Result: &amp;quot; + Log_GetAttackResultNameById(stRet.nAttackResult),  oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return stRet;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16508</id>
		<title>Combat GetAttackResult</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16508"/>
				<updated>2011-08-01T04:46:02Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:   Parameters:  Variables:  Used for: &amp;lt;dascript&amp;gt; /** * @brief Determine whether or not an attack hits a target. * * Note that this function only calculates to hit and c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine whether or not an attack hits a target.&lt;br /&gt;
*&lt;br /&gt;
* Note that this function only calculates to hit and crits, death blows are&lt;br /&gt;
* determined in Combat_PerformAttack&lt;br /&gt;
*&lt;br /&gt;
* @param oAttacker  The attacker&lt;br /&gt;
* @param oTarget    The target that is being attacked&lt;br /&gt;
* @param nAbility   If != 0, it won't trigger backstabs and deathblows.&lt;br /&gt;
*&lt;br /&gt;
* @returns  COMBAT_RESULT_HIT, COMBAT_RESULT_CRITICALHIT or COMBAT_RESULT_MISS&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0);&lt;br /&gt;
int Combat_GetAttackResult(object oAttacker, object oTarget, object oWeapon, float fBonus = 0.0f, int nAbility = 0)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Debug&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nForcedCombatResult = GetForcedCombatResult(oAttacker);&lt;br /&gt;
    if (nForcedCombatResult != -1)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Skipped rules, FORCED RESULT IS:&amp;quot; + ToString(nForcedCombatResult), oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return nForcedCombatResult;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Placeables are always hit&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Placeable, automatic result : COMBAT_RESULT_HIT&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Displacement&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDisplace = GetCreatureProperty(oTarget, PROPERTY_ATTRIBUTE_DISPLACEMENT);&lt;br /&gt;
    float fRand = RandomFloat()*100.0;&lt;br /&gt;
    if ( fRand &amp;lt; fDisplace)&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Displacement effect kciked in, automatic result : COMBAT_RESULT_MISS&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // if the target has the evasion talent, attribute this miss to the talent&lt;br /&gt;
        // (random 50% because the anim is interrupting)&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (HasAbility(oTarget, ABILITY_TALENT_EVASION) &amp;amp;&amp;amp; fRand &amp;lt; (20.0f - (RandomFloat()*10.0f)  ))&lt;br /&gt;
        {&lt;br /&gt;
                command currentCmd = GetCurrentCommand(oTarget);&lt;br /&gt;
                int nCmdType = GetCommandType(currentCmd);&lt;br /&gt;
                // Evasion only plays during attack and wait commands.&lt;br /&gt;
                if ( nCmdType == COMMAND_TYPE_WAIT || nCmdType == COMMAND_TYPE_ATTACK || nCmdType == COMMAND_TYPE_INVALID )&lt;br /&gt;
                {&lt;br /&gt;
                    ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, Effect(1055), oTarget, 0.0f, oTarget, ABILITY_TALENT_EVASION);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return COMBAT_RESULT_MISS;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int  nAttackType = Combat_GetAttackType(oAttacker, oWeapon);&lt;br /&gt;
    int nRet;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Get the attackers attack rating (includes effects and equipment stats)&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fAttackRating;&lt;br /&gt;
&lt;br /&gt;
    if (GetBaseItemType(oWeapon) == BASE_ITEM_TYPE_STAFF)&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Staves always hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        return COMBAT_RESULT_HIT;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fAttackRating =  GetCreatureAttackRating (oAttacker);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Add item stat (usually 0) along with scripted boni and attack bias.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    fAttackRating += GetItemStat(oWeapon,   ITEM_STAT_ATTACK) + fBonus + ATTACK_HIT_BIAS;&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fAttackRating += Diff_GetRulesAttackBonus(oAttacker);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with figuring out which critical hit modifier (melee, ranged, etc)&lt;br /&gt;
    // to use for this attack.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float   fCriticalHitModifier;&lt;br /&gt;
    int     nCriticalHitModifier  = (nAttackType == ATTACK_TYPE_RANGED) ?  CRITICAL_MODIFIER_RANGED : CRITICAL_MODIFIER_MELEE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    fCriticalHitModifier = GetCreatureCriticalHitModifier(oAttacker, nCriticalHitModifier);&lt;br /&gt;
    fCriticalHitModifier += GetItemStat(oWeapon, ITEM_STAT_CRIT_CHANCE_MODIFIER);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    //  Bravery grants +3.5 critical hit per enemy past the first 2&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_BRAVERY))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        int nEnemies = Max(0,GetArraySize(GetCreaturesInMeleeRing(oAttacker,0.0, 359.99f,TRUE,0))-2);&lt;br /&gt;
        fCriticalHitModifier +=  nEnemies * 3.5f;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Calculate Flanking Bonus&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fFlanking = Combat_GetFlankingBonus(oAttacker, oTarget);&lt;br /&gt;
    if (fFlanking &amp;gt; 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Also increase chance for critical hits by 1/5th of the flanking bonus&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        fCriticalHitModifier *=  (1.0 + (fFlanking/5.0));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Range plays a role too.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDistance =  GetDistanceBetween(oAttacker, oTarget);&lt;br /&gt;
    float fNoPenaltyDistance = MaxF(POINT_BLANK_RANGE,GetItemStat(oWeapon, ITEM_STAT_OPTIMUM_RANGE));&lt;br /&gt;
    fDistance = MaxF(fDistance-fNoPenaltyDistance,0.0f);&lt;br /&gt;
&lt;br /&gt;
    float fAttackRoll = 50.0;&lt;br /&gt;
    float fPenalties = fDistance; // every meter distance past the free range is -1!&lt;br /&gt;
    float fAttack = fAttackRating  + fAttackRoll + fFlanking - fPenalties;&lt;br /&gt;
&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
    // BEGIN SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        int bThreatenCritical = (RandomFloat()*100.0f   &amp;lt; fCriticalHitModifier  );&lt;br /&gt;
&lt;br /&gt;
        if (!bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Attacking out of stealth always threatens crit.&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_SKILL_STEALTH_1))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Death hex effect ... all hits are auto crit&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_DEATH_HEX))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // Autocrit effect&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if (GetHasEffects(oAttacker, EFFECT_TYPE_AUTOCRIT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            // Double strike does not allow crits&lt;br /&gt;
            // ---------------------------------------------------------------------&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // rapid shot doesn't allow critical strikes&lt;br /&gt;
            if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_RAPIDSHOT))&lt;br /&gt;
            {&lt;br /&gt;
                bThreatenCritical = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // Targets that have critical hit immunity can not be crit...&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        if (bThreatenCritical)&lt;br /&gt;
        {&lt;br /&gt;
            Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Critical hit averted, target has critical hit immunity&amp;quot;, oTarget);&lt;br /&gt;
            bThreatenCritical = !HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
    // END SECTION CRITICAL HITS&lt;br /&gt;
    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // This section deals with calculating the defense values of the attack target&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    float fDefenseRating =  GetCreatureDefense(oTarget) + ((nAttackType == ATTACK_TYPE_RANGED) ? GetCreatureProperty(oTarget,PROPERTY_ATTRIBUTE_MISSILE_SHIELD):0.0f);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Easier difficulties grant the player a bonus.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    fDefenseRating += Diff_GetRulesDefenseBonus(oTarget);&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // A hit is successful if the attack rating exceeds the defense rating&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (RandomFloat()*100.0f &amp;lt;  fAttack - fDefenseRating)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        // If we threatened a critical, we crit here, otherwise just report normal hit&lt;br /&gt;
        // ---------------------------------------------------------------------&lt;br /&gt;
        nRet =  ( (bThreatenCritical) ? COMBAT_RESULT_CRITICALHIT : COMBAT_RESULT_HIT  );&lt;br /&gt;
&lt;br /&gt;
        if ( nAttackType == ATTACK_TYPE_MELEE)&lt;br /&gt;
        {&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            // If we are backstabbing, we change the result here if it&lt;br /&gt;
            // was a crit. Abilities never bs (anim priority)&lt;br /&gt;
            // -----------------------------------------------------------------&lt;br /&gt;
            if ( nAbility == 0 &amp;amp;&amp;amp; Combat_CheckBackstab(oAttacker, oTarget, oWeapon,fFlanking))&lt;br /&gt;
            {&lt;br /&gt;
                    nRet =  COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Miss...&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Misdirection Hex&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (GetHasEffects(oAttacker, EFFECT_TYPE_MISDIRECTION_HEX))&lt;br /&gt;
    {&lt;br /&gt;
        #ifdef DEBUG&lt;br /&gt;
        Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; Attacker under misdirection hex: Hits are misses, crits are hits.&amp;quot;, oTarget);&lt;br /&gt;
        #endif&lt;br /&gt;
&lt;br /&gt;
        if (nRet == COMBAT_RESULT_HIT || nRet == COMBAT_RESULT_BACKSTAB)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_MISS;&lt;br /&gt;
        }&lt;br /&gt;
        else if (nRet == COMBAT_RESULT_CRITICALHIT)&lt;br /&gt;
        {&lt;br /&gt;
            nRet = COMBAT_RESULT_HIT;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //  return COMBAT_RESULT_BACKSTAB;&lt;br /&gt;
&lt;br /&gt;
    #ifdef DEBUG&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation: &amp;quot; +&lt;br /&gt;
                     &amp;quot; fAttack:&amp;quot;  + ToString(fAttack) +&lt;br /&gt;
                     &amp;quot; = (fAttackRating: &amp;quot; + ToString(fAttackRating) +&lt;br /&gt;
                     &amp;quot; fAttackRoll:&amp;quot; + ToString(fAttackRoll) +&lt;br /&gt;
                     &amp;quot; (range penalty:&amp;quot; + ToString(fPenalties) + &amp;quot;)&amp;quot;+&lt;br /&gt;
                     &amp;quot; fFlanking: &amp;quot; + ToString(fFlanking) +&lt;br /&gt;
                     &amp;quot; fBonus(script): &amp;quot; + ToString(fBonus) +&lt;br /&gt;
                     &amp;quot;)&amp;quot; , oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    Log_Trace_Combat(&amp;quot;combat_h.GetAttackResult&amp;quot;,&amp;quot; ToHit Calculation (2):  &amp;quot; +&lt;br /&gt;
                     &amp;quot; fDefenseRating: &amp;quot; + ToString(fDefenseRating) +&lt;br /&gt;
                     &amp;quot; fCriticalHitModifier: &amp;quot; + ToString(fCriticalHitModifier) +&lt;br /&gt;
                     &amp;quot; bThreatenCritical: &amp;quot; + ToString(bThreatenCritical), oAttacker, oTarget, LOG_CHANNEL_COMBAT_TOHIT );&lt;br /&gt;
&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return nRet;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16507</id>
		<title>Combat CheckBackStab</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16507"/>
				<updated>2011-08-01T04:42:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Check if backstab conditions are true&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_CheckBackstab(object oAttacker, object oTarget, object oWeapon, float fFlankingBonus)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we we are a rogue&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (!HasAbility(oAttacker, ABILITY_TALENT_HIDDEN_ROGUE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!IsHumanoid(oAttacker))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And target is not immune&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And attacker does not use double strike mode&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     // -------------------------------------------------------------------------&lt;br /&gt;
    // We can only backstab if we are flanking.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fFlankingBonus&amp;gt;0.0)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         /* Coup de grace*/&lt;br /&gt;
        if (HasAbility(oAttacker, ABILITY_TALENT_BACKSTAB))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_STUN))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else if (GetHasEffects(oTarget, EFFECT_TYPE_PARALYZE))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16506</id>
		<title>Combat GetFlankingBonus</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16506"/>
				<updated>2011-08-01T04:41:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
float Combat_GetFlankingBonus(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TALENT_SHIELD_TACTICS))&lt;br /&gt;
    {&lt;br /&gt;
        if (IsUsingShield(oTarget))&lt;br /&gt;
            return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (GetHasEffects(oTarget, EFFECT_TYPE_FLANK_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    float fAngle = GetAngleBetweenObjects(oTarget, oAttacker);&lt;br /&gt;
    float fFactor = 0.0;&lt;br /&gt;
    float fMaxModifier = 15.0;&lt;br /&gt;
&lt;br /&gt;
    // The attackers ability to flank is stored in a creature property&lt;br /&gt;
    float fFlankingAngle = GetCreatureProperty(oAttacker, PROPERTY_ATTRIBUTE_FLANKING_ANGLE);&lt;br /&gt;
&lt;br /&gt;
    if (fFlankingAngle &amp;lt;= 10.0 ) /*old savegames have this at 10*/&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 60.0; // old savegames need this to avoid divby0 later&lt;br /&gt;
    }&lt;br /&gt;
    else if (fFlankingAngle&amp;gt;180.0)&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 180.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_COMBAT_MOVEMENT))&lt;br /&gt;
    {&lt;br /&gt;
        fMaxModifier = 20.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( fMaxModifier &amp;lt;= 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( (fAngle&amp;gt;= (180.0 - fFlankingAngle) &amp;amp;&amp;amp; fAngle&amp;lt;=(180.0 + fFlankingAngle )))&lt;br /&gt;
    {&lt;br /&gt;
        // Shield block negats flanking on the left.&lt;br /&gt;
&lt;br /&gt;
        int bShieldBlock =  HasAbility(oTarget,ABILITY_TALENT_SHIELD_BLOCK);&lt;br /&gt;
        int bUsingShield = IsUsingShield(oTarget);&lt;br /&gt;
&lt;br /&gt;
        if (!bShieldBlock || fAngle &amp;lt; 180.0 || (bShieldBlock &amp;amp;&amp;amp; !bUsingShield) )&lt;br /&gt;
        {&lt;br /&gt;
            fFactor = (fFlankingAngle -  fabs( 180.0 - fAngle))/fFlankingAngle;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Only rogues get the full positional benefits on the battlefield,&lt;br /&gt;
    // everyone else gets halfa&lt;br /&gt;
    float fClassModifier = GetCreatureCoreClass(oAttacker) == CLASS_ROGUE?1.0f:0.5f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return fFactor * fMaxModifier * fClassModifier;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16505</id>
		<title>Combat GetAttackType</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16505"/>
				<updated>2011-08-01T04:41:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Return the type of the current attack based on the weapon in the main hand&lt;br /&gt;
// used only in command_pending...&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon);&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon)&lt;br /&gt;
{&lt;br /&gt;
    if (IsUsingRangedWeapon(oAttacker, oWeapon))&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_RANGED;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_MELEE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16504</id>
		<title>Combat GetValidDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16504"/>
				<updated>2011-08-01T04:40:31Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine a valid deathblow for the current target&lt;br /&gt;
*&lt;br /&gt;
* Called when the script decides to do a deathblow, this function will return&lt;br /&gt;
* a DEATHBLOW_* constant representing the deathblow to use against the creature&lt;br /&gt;
*&lt;br /&gt;
* If the creature does not support deathblows (immunity, no animation) or can not&lt;br /&gt;
* be deathblowed (Immortal, Plot, Party Member, Flagged as invalid in the toolset)&lt;br /&gt;
* the function returns 0&lt;br /&gt;
*&lt;br /&gt;
* @param oTarget    The target for the Deathblow&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 or DEATH_BLOW_*&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget);&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // First, let's check if we can even perform deathblows with the attacker&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     int bCanDeathblow =       CanPerformDeathblows(oAttacker);&lt;br /&gt;
&lt;br /&gt;
     if (!bCanDeathblow)&lt;br /&gt;
     {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     int nValid =              GetM2DAInt(TABLE_APPEARANCE,&amp;quot;ValidDeathblows&amp;quot;, GetAppearanceType(oTarget));&lt;br /&gt;
&lt;br /&gt;
     int bImmortal            = IsImmortal(oTarget);&lt;br /&gt;
     int bPlot                = IsPlot(oTarget);&lt;br /&gt;
     int bCanDiePermanently   = GetCanDiePermanently(oTarget);&lt;br /&gt;
     int bAlreadyDead         = HasDeathEffect(oTarget);&lt;br /&gt;
&lt;br /&gt;
      #ifdef DEBUG&lt;br /&gt;
     Log_Trace(LOG_CHANNEL_COMBAT_DEATH,&amp;quot;GetValidDeathblow&amp;quot;,&amp;quot;nValid: &amp;quot; + ToString(nValid) + &amp;quot; bImmortal: &amp;quot; + ToString(bImmortal) + &amp;quot; bPlot:&amp;quot; +&lt;br /&gt;
                                ToString(bPlot) + &amp;quot; bCanDiePermanently:&amp;quot; + ToString(bCanDiePermanently));&lt;br /&gt;
&lt;br /&gt;
     #endif&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // If we are immortal, Plot, or can not die permanently (e.g. a party member),&lt;br /&gt;
     // we return 0&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     if (bImmortal || bPlot || !bCanDiePermanently || IsPartyMember(oTarget) || bAlreadyDead)&lt;br /&gt;
     {&lt;br /&gt;
       return 0;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16503</id>
		<title>CheckForDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=CheckForDeathblow&amp;diff=16503"/>
				<updated>2011-08-01T04:40:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Check if a deathblow should occur.&lt;br /&gt;
*&lt;br /&gt;
* Examine a number of parameters to see whether or not we can play a deathblow&lt;br /&gt;
* without interrupting the flow of combat.&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int CheckForDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
    int nRank = GetCreatureRank(oTarget);&lt;br /&gt;
    int nLevel = GetLevel(oAttacker);&lt;br /&gt;
    float fChance = GetM2DAFloat(TABLE_CREATURERANKS,&amp;quot;fDeathblow&amp;quot;, nRank);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // Any rank flagged 1.0 or higher triggers a deathblow.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fChance &amp;gt;= 1.0f)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we perceive more than 1 creature, then half the chance of triggering&lt;br /&gt;
    // a deathblow with each perceived hostile.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    int nCount = GetArraySize(GetPerceivedCreatureList(oAttacker, TRUE));&lt;br /&gt;
    if (nCount &amp;gt; 1)&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= (2.0/IntToFloat(nCount));&lt;br /&gt;
    }&lt;br /&gt;
    //Increase chance of death blow in origin stories (level 1 and 2)&lt;br /&gt;
    //1.5 times the chance&lt;br /&gt;
    if ( nLevel &amp;lt; 3 )&lt;br /&gt;
    {&lt;br /&gt;
        fChance *= 1.5;&lt;br /&gt;
    }&lt;br /&gt;
    return (RandomFloat()&amp;lt;fChance);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16502</id>
		<title>Combat GetAttackHand</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackHand&amp;diff=16502"/>
				<updated>2011-08-01T04:39:23Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by: &lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
Variables:&lt;br /&gt;
&lt;br /&gt;
Used for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
* @brief Determine which hand to use for an attack&lt;br /&gt;
*&lt;br /&gt;
* Only applicable in dual weapon style. Returns which hand to use for the next attack&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 - main hand, 1 - offhand&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int Combat_GetAttackHand(object oCreature = OBJECT_SELF)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    int nHand = 0;&lt;br /&gt;
    if (GetWeaponStyle(oCreature) == WEAPONSTYLE_DUAL)&lt;br /&gt;
    {&lt;br /&gt;
        nHand = GetLocalInt(oCreature, COMBAT_LAST_WEAPON);&lt;br /&gt;
        SetLocalInt(oCreature, COMBAT_LAST_WEAPON, !nHand);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return nHand;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16501</id>
		<title>Combat CheckBackStab</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_CheckBackStab&amp;diff=16501"/>
				<updated>2011-08-01T04:36:02Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by: &amp;lt;dascript&amp;gt;  // ----------------------------------------------------------------------------- // Check if backstab conditions are true // ------------------------------...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Check if backstab conditions are true&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_CheckBackstab(object oAttacker, object oTarget, object oWeapon, float fFlankingBonus)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // If we we are a rogue&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (!HasAbility(oAttacker, ABILITY_TALENT_HIDDEN_ROGUE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!IsHumanoid(oAttacker))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And target is not immune&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TRAIT_CRITICAL_HIT_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    // And attacker does not use double strike mode&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (IsModalAbilityActive(oAttacker, ABILITY_TALENT_DUAL_WEAPON_DOUBLE_STRIKE))&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     // -------------------------------------------------------------------------&lt;br /&gt;
    // We can only backstab if we are flanking.&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (fFlankingBonus&amp;gt;0.0)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         /* Coup de grace*/&lt;br /&gt;
        if (HasAbility(oAttacker, ABILITY_TALENT_BACKSTAB))&lt;br /&gt;
        {&lt;br /&gt;
            if (GetHasEffects(oTarget, EFFECT_TYPE_STUN))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else if (GetHasEffects(oTarget, EFFECT_TYPE_PARALYZE))&lt;br /&gt;
            {&lt;br /&gt;
                return TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16500</id>
		<title>Combat GetFlankingBonus</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetFlankingBonus&amp;diff=16500"/>
				<updated>2011-08-01T04:32:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by: &amp;lt;dascript&amp;gt; float Combat_GetFlankingBonus(object oAttacker, object oTarget) {       if (HasAbility(oTarget, ABILITY_TALENT_SHIELD_TACTICS))     {         if (IsUsingShi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
float Combat_GetFlankingBonus(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (HasAbility(oTarget, ABILITY_TALENT_SHIELD_TACTICS))&lt;br /&gt;
    {&lt;br /&gt;
        if (IsUsingShield(oTarget))&lt;br /&gt;
            return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (GetHasEffects(oTarget, EFFECT_TYPE_FLANK_IMMUNITY))&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    float fAngle = GetAngleBetweenObjects(oTarget, oAttacker);&lt;br /&gt;
    float fFactor = 0.0;&lt;br /&gt;
    float fMaxModifier = 15.0;&lt;br /&gt;
&lt;br /&gt;
    // The attackers ability to flank is stored in a creature property&lt;br /&gt;
    float fFlankingAngle = GetCreatureProperty(oAttacker, PROPERTY_ATTRIBUTE_FLANKING_ANGLE);&lt;br /&gt;
&lt;br /&gt;
    if (fFlankingAngle &amp;lt;= 10.0 ) /*old savegames have this at 10*/&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 60.0; // old savegames need this to avoid divby0 later&lt;br /&gt;
    }&lt;br /&gt;
    else if (fFlankingAngle&amp;gt;180.0)&lt;br /&gt;
    {&lt;br /&gt;
        fFlankingAngle = 180.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // -------------------------------------------------------------------------&lt;br /&gt;
    if (HasAbility(oAttacker, ABILITY_TALENT_COMBAT_MOVEMENT))&lt;br /&gt;
    {&lt;br /&gt;
        fMaxModifier = 20.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( fMaxModifier &amp;lt;= 0.0 )&lt;br /&gt;
    {&lt;br /&gt;
        return 0.0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( (fAngle&amp;gt;= (180.0 - fFlankingAngle) &amp;amp;&amp;amp; fAngle&amp;lt;=(180.0 + fFlankingAngle )))&lt;br /&gt;
    {&lt;br /&gt;
        // Shield block negats flanking on the left.&lt;br /&gt;
&lt;br /&gt;
        int bShieldBlock =  HasAbility(oTarget,ABILITY_TALENT_SHIELD_BLOCK);&lt;br /&gt;
        int bUsingShield = IsUsingShield(oTarget);&lt;br /&gt;
&lt;br /&gt;
        if (!bShieldBlock || fAngle &amp;lt; 180.0 || (bShieldBlock &amp;amp;&amp;amp; !bUsingShield) )&lt;br /&gt;
        {&lt;br /&gt;
            fFactor = (fFlankingAngle -  fabs( 180.0 - fAngle))/fFlankingAngle;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Only rogues get the full positional benefits on the battlefield,&lt;br /&gt;
    // everyone else gets halfa&lt;br /&gt;
    float fClassModifier = GetCreatureCoreClass(oAttacker) == CLASS_ROGUE?1.0f:0.5f;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return fFactor * fMaxModifier * fClassModifier;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16499</id>
		<title>Combat GetAttackType</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetAttackType&amp;diff=16499"/>
				<updated>2011-08-01T04:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by: &amp;lt;dascript&amp;gt; // ----------------------------------------------------------------------------- // Return the type of the current attack based on the weapon in the main ha...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Return the type of the current attack based on the weapon in the main hand&lt;br /&gt;
// used only in command_pending...&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon);&lt;br /&gt;
int Combat_GetAttackType(object oAttacker, object oWeapon)&lt;br /&gt;
{&lt;br /&gt;
    if (IsUsingRangedWeapon(oAttacker, oWeapon))&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_RANGED;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return ATTACK_TYPE_MELEE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16498</id>
		<title>Combat GetValidDeathblow</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Combat_GetValidDeathblow&amp;diff=16498"/>
				<updated>2011-08-01T04:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mouser9169: Created page with &amp;quot;Called by:  &amp;lt;dascript&amp;gt; /** * @brief Determine a valid deathblow for the current target * * Called when the script decides to do a deathblow, this function will return * a DEATHBL...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Called by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* @brief Determine a valid deathblow for the current target&lt;br /&gt;
*&lt;br /&gt;
* Called when the script decides to do a deathblow, this function will return&lt;br /&gt;
* a DEATHBLOW_* constant representing the deathblow to use against the creature&lt;br /&gt;
*&lt;br /&gt;
* If the creature does not support deathblows (immunity, no animation) or can not&lt;br /&gt;
* be deathblowed (Immortal, Plot, Party Member, Flagged as invalid in the toolset)&lt;br /&gt;
* the function returns 0&lt;br /&gt;
*&lt;br /&gt;
* @param oTarget    The target for the Deathblow&lt;br /&gt;
*&lt;br /&gt;
* @returns  0 or DEATH_BLOW_*&lt;br /&gt;
*&lt;br /&gt;
* @author Georg Zoeller&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget);&lt;br /&gt;
int Combat_GetValidDeathblow(object oAttacker, object oTarget)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // First, let's check if we can even perform deathblows with the attacker&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     int bCanDeathblow =       CanPerformDeathblows(oAttacker);&lt;br /&gt;
&lt;br /&gt;
     if (!bCanDeathblow)&lt;br /&gt;
     {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     int nValid =              GetM2DAInt(TABLE_APPEARANCE,&amp;quot;ValidDeathblows&amp;quot;, GetAppearanceType(oTarget));&lt;br /&gt;
&lt;br /&gt;
     int bImmortal            = IsImmortal(oTarget);&lt;br /&gt;
     int bPlot                = IsPlot(oTarget);&lt;br /&gt;
     int bCanDiePermanently   = GetCanDiePermanently(oTarget);&lt;br /&gt;
     int bAlreadyDead         = HasDeathEffect(oTarget);&lt;br /&gt;
&lt;br /&gt;
      #ifdef DEBUG&lt;br /&gt;
     Log_Trace(LOG_CHANNEL_COMBAT_DEATH,&amp;quot;GetValidDeathblow&amp;quot;,&amp;quot;nValid: &amp;quot; + ToString(nValid) + &amp;quot; bImmortal: &amp;quot; + ToString(bImmortal) + &amp;quot; bPlot:&amp;quot; +&lt;br /&gt;
                                ToString(bPlot) + &amp;quot; bCanDiePermanently:&amp;quot; + ToString(bCanDiePermanently));&lt;br /&gt;
&lt;br /&gt;
     #endif&lt;br /&gt;
&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     // If we are immortal, Plot, or can not die permanently (e.g. a party member),&lt;br /&gt;
     // we return 0&lt;br /&gt;
     // ------------------------------------------------------------------------&lt;br /&gt;
     if (bImmortal || bPlot || !bCanDiePermanently || IsPartyMember(oTarget) || bAlreadyDead)&lt;br /&gt;
     {&lt;br /&gt;
       return 0;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
Category: [[Combat_H]]&lt;/div&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	</feed>