Difference between revisions of "Melee attack"

From DoomWiki.org

[unchecked revision][unchecked revision]
Line 1: Line 1:
I love you Helena. And that's all I really know..
+
'''Melee''' is a word borrowed from [[Wikipedia:French language|French]] (''mêlée'', [[Wikipedia:IPA chart for English|pronounced]] /mε'lε/) meaning hand-to-hand, close-quarters combat. Melee attacks are in contrast to ''ranged attacks'', performed at a distance, such as shooting [[bullet]]s, throwing [[fireball]]s or firing [[rocket]]s.
  
'''Is that I love you.'''
+
Melee attacks are featured in [[Doom]], [[Heretic]], [[Hexen]] and [[Strife]].  A number of the Doom [[monsters]] can perform melee attacks in the form of clawing, biting or punching. [[Demon]]s and [[Spectre]]s are melee attackers only, while others have both melee and ranged attacks—these are the [[Imp]], [[Cacodemon]], [[Revenant]], [[Hell Knight]] and [[Baron of Hell]]. [[Player]]s can perform melee attacks using the [[fists]] or the [[chainsaw]]. [[Lost Soul]]s may be seen like melee atackers only, but infact the program treats them like living [[projectile]]s.
 +
 
 +
== Technical ==
 +
 
 +
In the [[Doom source code]], there is a constant <tt>MELEERANGE</tt> defined as <tt>64*FRACUNIT</tt>. For a player, this means that a melee attack will be successful only if the target is no farther than 64 map units away. Using the [[angle]] the player is facing, the map point <tt>MELEERANGE</tt> units away is determined trigonometrically. Then the [[hitscan]] function is invoked, which will damage the first vulnerable thing (if any) along the line to that point.
 +
 
 +
For monsters that have melee attacks, the function <tt>P_CheckMeleeRange</tt> is called, and it returns <tt>true</tt> if a melee attack will be successful. If so, damage is inflicted immediately; if not, a ranged attack (if any) is launched.
 +
 
 +
In <tt>P_CheckMeleeRange</tt>, <tt>P_AproxDistance</tt> is called first. (Approximate distance is used, presumably, to avoid a time-consuming square root evaluation that calculating distance more precisely would require.) Then, the following code is executed:
 +
 
 +
    if (dist >= MELEERANGE-20*FRACUNIT+pl->info->radius)
 +
    return false;
 +
 
 +
This returns <tt>false</tt> if the calculated distance from the center of the attacker to the closest edge of the target is greater than or equal to 44 map units. Except for [[monster infighting]], the target will be a player (with radius 16) and melee attacks can occur only when the calculated distance is less than 60 map units. Finally, <tt>P_CheckSight</tt> is called to ensure that nothing is in between the attacker and the target.
 +
 
 +
==See also==
 +
* [[Hitscan]]
 +
* [[Fireball]]
 +
 
 +
==External links==
 +
* [http://www.graphicsgems.org/gems/HypotApprox.c Graphics Gems approximate hypotenuse]
 +
 
 +
[[Category:Gameplay]]

Revision as of 15:01, 11 March 2009

Melee is a word borrowed from French (mêlée, pronounced /mε'lε/) meaning hand-to-hand, close-quarters combat. Melee attacks are in contrast to ranged attacks, performed at a distance, such as shooting bullets, throwing fireballs or firing rockets.

Melee attacks are featured in Doom, Heretic, Hexen and Strife. A number of the Doom monsters can perform melee attacks in the form of clawing, biting or punching. Demons and Spectres are melee attackers only, while others have both melee and ranged attacks—these are the Imp, Cacodemon, Revenant, Hell Knight and Baron of Hell. Players can perform melee attacks using the fists or the chainsaw. Lost Souls may be seen like melee atackers only, but infact the program treats them like living projectiles.

Technical

In the Doom source code, there is a constant MELEERANGE defined as 64*FRACUNIT. For a player, this means that a melee attack will be successful only if the target is no farther than 64 map units away. Using the angle the player is facing, the map point MELEERANGE units away is determined trigonometrically. Then the hitscan function is invoked, which will damage the first vulnerable thing (if any) along the line to that point.

For monsters that have melee attacks, the function P_CheckMeleeRange is called, and it returns true if a melee attack will be successful. If so, damage is inflicted immediately; if not, a ranged attack (if any) is launched.

In P_CheckMeleeRange, P_AproxDistance is called first. (Approximate distance is used, presumably, to avoid a time-consuming square root evaluation that calculating distance more precisely would require.) Then, the following code is executed:

   if (dist >= MELEERANGE-20*FRACUNIT+pl->info->radius)
   return false;

This returns false if the calculated distance from the center of the attacker to the closest edge of the target is greater than or equal to 44 map units. Except for monster infighting, the target will be a player (with radius 16) and melee attacks can occur only when the calculated distance is less than 60 map units. Finally, P_CheckSight is called to ensure that nothing is in between the attacker and the target.

See also

External links