Melee attack

From DoomWiki.org

Revision as of 22:20, 17 October 2005 by Radius (talk | contribs) (fmt)


Melee is a word borrowed from French (mêlée, pronounced MAY LAY) 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.

A number of the Doom monsters can perform melee attacks in the form of clawing, biting or (in one case) punching. In fact, Demons, Spectres and Lost Souls have only melee attacks. 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.

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.