<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://datoolset.net/mw/index.php?action=history&amp;feed=atom&amp;title=Combat_GetAttackResult</id>
		<title>Combat GetAttackResult - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://datoolset.net/mw/index.php?action=history&amp;feed=atom&amp;title=Combat_GetAttackResult"/>
		<link rel="alternate" type="text/html" href="http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;action=history"/>
		<updated>2026-06-29T04:57:16Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.25.6</generator>

	<entry>
		<id>http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16873&amp;oldid=prev</id>
		<title>Sunjammer: Fixing category</title>
		<link rel="alternate" type="text/html" href="http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16873&amp;oldid=prev"/>
				<updated>2011-08-07T14:31:16Z</updated>
		
		<summary type="html">&lt;p&gt;Fixing category&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 14:31, 7 August 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L319&quot; &gt;Line 319:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 319:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/dascript&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/dascript&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Category: &lt;/del&gt;[[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Combat_H&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Category:Functions from combat_h&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sunjammer</name></author>	</entry>

	<entry>
		<id>http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16538&amp;oldid=prev</id>
		<title>Mouser9169 at 05:56, 1 August 2011</title>
		<link rel="alternate" type="text/html" href="http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16538&amp;oldid=prev"/>
				<updated>2011-08-01T05:56:16Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 05:56, 1 August 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L6&quot; &gt;Line 6:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 6:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Variables:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Variables:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Returns:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Used for:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Used for:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16524&amp;oldid=prev</id>
		<title>Mouser9169 at 05:28, 1 August 2011</title>
		<link rel="alternate" type="text/html" href="http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16524&amp;oldid=prev"/>
				<updated>2011-08-01T05:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 05:28, 1 August 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Called by: &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Called by: &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Calls:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Parameters:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Parameters:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mouser9169</name></author>	</entry>

	<entry>
		<id>http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16508&amp;oldid=prev</id>
		<title>Mouser9169: Created page with &quot;Called by:   Parameters:  Variables:  Used for: &lt;dascript&gt; /** * @brief Determine whether or not an attack hits a target. * * Note that this function only calculates to hit and c...&quot;</title>
		<link rel="alternate" type="text/html" href="http://datoolset.net/mw/index.php?title=Combat_GetAttackResult&amp;diff=16508&amp;oldid=prev"/>
				<updated>2011-08-01T04:46:02Z</updated>
		
		<summary type="html">&lt;p&gt;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;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&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>

	</feed>