HOW TO EDIT THE BATTLEFIELD: 1942 DAMAGE SYSTEM

 

October 21, 2003

 

Introduction

A shot rings out, a soldier crumples to the ground; you respawn. How did that bullet get there and manage to kill you? This tutorial is all about Battlefield 1942's damage system. It discusses the mechanisms of how objects damage each other and shows how to precisely compute the effect of a weapon on a defender. Data presented is as of the v1.45 patch.

The battlefield's a dangerous place. There are three broad classes of objects that can take damage: soldiers, vehicles/emplacements, and facilities (e.g. the various objectives in Secret Weapons, such as generators, fuel silos, etc). Other static objects cannot take damage, but can cause damage directly (through collision) and indirectly (through ricochets). The main types of damage are:

 

We'll deal with each of these in turn, in excruciating detail.

 

Projectile Damage

First thing that happens is that a soldier fires some weapon. Most weapons have a single projectile; one exception is the shotgun, which shoots five shots at once in a pentagonal pattern. Deviation can affect the initial direction of the shots. Each projectile then goes outward on a path at a particular speed, going straight or affected by gravity. To determine damage, the one key piece of information needed about the projectile is its "attack material". Each projectile has a material associated with it. Most soldier projectile materials are found in the single file objects\handweapons\Common\Weapons.con. For example, here is the BAR's entry:

 

  ObjectTemplate.material 222

If a material for the projectile is not in here, then it is found in the object's corresponding Objects.con file (one oddity that should be noted: the Sg44 has a Material in its own Weapons.con, namely 216, but this .con file should not exist and is not used).

For grenades, mines, exppacks, the material is found in the corresponding Objects.con file. These materials tend to be set so that hitting someone with the grenade itself, for instance, does no damage; see Splash Damage for how explosives work).

The attack material for vehicle and emplaced weapons is normally found in its corresponding Weapons.con file. For example, the Defgun's projectile attack material of 252 is found in objects\Vehicles\Land\Defgun\Weapons.con. Some vehicle weapons (specifically, torpedoes and bombs) are found instead in the objects\Vehicles\Common\Weapons.con file.

30 times each second the server computes the current and future location of each projectile and object in the scene. Each projectile then has a line segment connecting its two locations for the given time slice. This is compared against all objects and scenery.

For each nearby object, the projectile is tested against a bounding box around the entire mesh. If this line segment does not intersect this box, then the object cannot be hit. Graphically an object can be extremely detailed, having many polygons. This level of detail is not normally necessary for collision detection. For efficiency, every object in the game has, in addition to its graphical polygon mesh, two collision meshes. The first mesh used for collision testing is the low quality collision mesh. This is a mesh with very few polygons that fully encloses the detailed model of the object. If the projectile hits the bounding box but misses this mesh, then no further testing is needed and only a few polygons are checked.

Say the low quality mesh is hit. Now the projectile's segment (which is actually a mathematical ray, since it has a direction to it) is tested against the second collision mesh, called the medium quality collision mesh. This mesh usually has more polygons in it, forming a tighter fit with how the object actually appears, but with unimportant detail polygons (e.g. vents, antennae, etc) stripped off. A common shortcut is to design just the medium quality collision mesh and also use this for the low quality mesh, saving modeling time at the expense of possibly slower interactive performance. In any case, if the projectile hits this medium mesh, the object is hit.

A few things can happen once the closest intersection location is found. The shot could be a projectile and explode at this point, or the shot might cause other effects elements to appear. An example is a tank shell hitting a concrete structure (see the image in the Collision Damage section), which causes chunks of concrete to break off and act as projectiles in turn. However, what we are concerned with here is whether the projectile damages the object.

To determine this we need to find the material of the defender. Each object and soldier has one or more materials associated with its collision mesh, with each polygon in the mesh having a single material. You can view and modify these materials in 3DS MAX by using the MDT plug-in tools designed for this game. Here are some example collision meshes for the M10 and Tiger:

To examine collision meshes, you first use the MDT plug-in to import the object file, e.g. standardMesh\Tiger_Hull_M1.sm, asking for only the collision meshes. Both the medium and low quality meshes are imported (and note that many mesh files do not have collision meshes; you must seek these out). You can then go into Modify mode in MAX, select a mesh (and hide or delete the other), open up the "editable mesh" by clicking on '+', and choose "polygon" or "face" within this list. You can then examine the material ID under the surface properties section of the menu. (Note: with Rexman's earlier MAX tools, the material numbers in 3DS MAX appear one higher than what are used in the game. For example, the airplane engine material will be seen as "61" in MAX, which is equivalent to "60" in the game's files. This mismatch does not occur with the MDT tools.)

There are a few main classes of defensive materials: 40-42 for soldiers, 43-47 for unarmored or lightly armored vehicles and buildings, 50-54 for tanks, 55-59 for ships and subs, 60-62 for planes, and 66 is the wooden decks of carriers and battleships. Within a class, a higher number is generally better armor (or at least a less vital component). For example, a Sherman's rear armor is material 50, a Tiger's front armor is material 54.

Once the defensive material is found, we can start computing the damage. Here's the full equation for how much damage a projectile takes:

  Hitpoints = MaterialDamage * DamageMod * AngleFalloff * DistanceMod

Let's examine each term in turn.

MaterialDamage: This value is found in the game\bf1942\Game\materialManagerdefine.con file. In this file are the basic attack value of almost every material in the game. There are also physics characteristics such as friction, elasticity, and resistance for the map terrain types, materials 0-15. As an example, here is the BAR assault gun's entry:

 rem *********** Assault Rifles **************
 MaterialManager.Material 222
 MaterialManager.MaterialAttGroup 222
 MaterialManager.MaterialDefGroup 222
 MaterialManager.MaterialDamage 9

The material damage value is 9 for the BAR, which is a very rough strength estimate for weapons in the same class. However, the DamageMod has a drastic effect on this value. The material damage values could all have been set to equal 1 throughout and the effect of each weapon could be tuned entirely through the DamageMod values. However, the material damage term does have the useful feature of being an overall "volume knob". If a weapon is felt to be too weak overall, you can turn up its overall effect by increasing the MaterialDamage value instead of having to modify each and every DamageMod value.

Note that I said "almost every material" is listed in the materialManagerdefine.con file. For new weapons, such as the shotgun, this material manager data is found in the corresponding damage system weapon file, e.g. bf1942\Game\damage_system\Shotgun.con, in the first few lines of the file.

DamageMod: Each weapon has a corresponding damage file, in the directory bf1942\Game\damage_system. This file occasionally contains the raw MaterialDamage value, as mentioned above, but the bulk of the file is how this weapon specifically affects various defensive materials. Each defensive material that the weapon can damage is given an entry in this file. For example, here is the BAR's entry for firing at a soldier's head:

 ***** BAR - DIRECT DAMAGE *****
 * Infantry target

 MaterialManager.AttGroup 222
 MaterialManager.DefGroup 40
 MaterialManager.DamageMod 2.5
 MaterialManager.SetEffectTemplate e_blood01

The AttGroup is the attacking material, the DefGroup the defending material. SetEffectTemplate is the effect that occurs when the weapon hits the defender (in this case, blood, though this effect is turned off by default for game rating purposes). If there is no entry for a defensive material, the weapon does not affect it. That said, all weapons have their effects against soldiers (materials 40-42) defined, even if the DamageMod is 0.

There is an alternate way that DamageMod is defined, called SetCell, that a very few weapons (the bombs and the Wespe) happen to use to define damage:

 MaterialManager.attGroup 201
 MaterialManager.setCell 40 20
 MaterialManager.setCell 41 20
 MaterialManager.setCell 42 20

The first number in SetCell is the DefGroup, the second is the DamageMod.

AngleFalloff: The damage a vehicle or soldier takes is modified by the angle that the shot hit. This has a logic to it: a glancing shot has to travel through more armor, or may wing a soldier instead of hitting some vital organ. If a shot hits dead-on, its angle to the defender's surface is 0 degrees; glancing off, it is near 90 degrees. So, AngleFalloff is computed simply as cosine(angle). At 0 degrees the cosine is 1.0, at 30 it's 0.866, at 45 degrees it's 0.707, at 60 it's 0.5, and at 90 degrees it is 0.0 - which makes sense, since you can't really hit a surface coming in at 90 degrees.

DistanceMod: A number of hand weapons, namely the medics' submachineguns, the Breda and Bren, the shotgun, and the pistols, have their damage drop off with range. For all other weapons this term is always 1.0, i.e. the range does not affect the result. The important factors here are in the objects\handweapons\Common\Weapons.con file. Here is a typical entry, for the shotgun:

 

  ObjectTemplate.minDamage 0.5
  ObjectTemplate.distToStartLoseDamage 40
  ObjectTemplate.distToMinDamage 80

The distToStartLoseDamage specifies the distance (in meters) at which the damage of the projectile will start to decrease. The minDamage value is the lowest ratio possible for damage. The distToMinDamage is the distance beyond which the projectile does its minimum amount of damage. In other words, if a shotgun pellet hits at closer than 40 meters, the DistanceMod is 1.0, beyond 80 meters the DistanceMod is 0.5, between these two the DistanceMod drops linearly from 1.0 to 0.5. Submachineguns start to lose damage at 50 meters and drop to 0.5 at 100 meters. The pistols start to drop at 20 meters and drop to 0.5 at 40 meters. When the distance is between distToStartLoseDamage and distToMinDamage, the equation is this:

  DistanceMod = minDamage + (1-minDamage) * (distToMinDamage - distance) / (distToMinDamage - distToStartLoseDamage)

So for a shotgun pellet hitting at, say, 50 meters, the value would be:

  DistanceMod = 0.5 + (1-0.5) * (80 - 50) / (80 - 40) = 0.875

Hitpoints: Once you multiply these four values together you get how many hitpoints of damage the object takes. Each object has a number of hitpoints, defined in its Objects.con file as:

 

  ObjectTemplate.hitpoints 100
  ObjectTemplate.maxhitpoints 100

The hitpoints entry is how many hitpoints this type of object has when it is first appears, and maxhitpoints is the maximum number of hitpoints the object can reach with repair. These numbers are normally identical in a battle, but it is certainly possible to have objects begin or spawn in a damaged state. Note, however, that you are defining a class of objects, so all objects of that type will have the same initial damaged state. There is no way to single out certain vehicles in a class as starting damaged, short of defining the object twice.

Hitpoint values range from 10 for a Wasserfall rocket to 600 for a carrier to 1000 for the factory in the Battle of Britain. Soldiers take 30 hitpoints, and this entry is found in the objects\Soldiers\Common\CommonSoldierData.inc file. A full list of objects' hitpoint values can be found at the bottom of the Damage Page.

As an example of damage computation, let's continue with a bullet from the BAR hitting the head. As we found above, the MaterialDamage value is 9 for the BAR. The DamageMod value for hitting the head is 2.5. Say the bullet hits at an angle of 20 degrees away from a dead-on shot. AngleFalloff is then cosine(20 degrees), or 0.940. There is no modification due to distance, so DistanceMod is 1.0. Putting it all together:

  Hitpoints = MaterialDamage * DamageMod * AngleFalloff * DistanceMod
  Hitpoints
= 9 * 2.5 * 0.940 * 1.0 = 21.15

So the soldier takes 21.15 hitpoints of damage. He starts with 30 hitpoints, so if he was at full health, he's still alive but badly injured.

Splash Damage

Splash damage is what comes from explosions. An explosion affects objects whose center is inside the blast radius. This radius, measured in meters, is found in the Weapons.con file for the weapon, e.g. the Sturmtiger's setting is:

  ObjectTemplate.radius 20

If any terrain or object blocks the line segment between the explosion and the soldier's center, the soldier receives no damage from the explosion. Objects and terrain do not block splash damage attacks against vehicles and objectives.

Material2 gives the attack material for splash damage for a weapon. This property is found in the weapon's Weapons.con file. For handweapons, this property is in the common\Weapons.con file (for the bazooka shell) or in the weapon's Objects.con file. For example, the explosive pack's Radius and Material2 are defined in objects\handweapons\exppack\objects.con:

  ObjectTemplate.radius 12
  ObjectTemplate.material2 204

The defense material of the target is easier to find than for direct damage, as in this case it is not derived from the collision mesh. The defense material is simply whatever value is set in the object's Objects.con file. For example, here is the setting for the Wespe:

  ObjectTemplate.material 45

The defensive material of a vehicle is often set to be about the thinnest armor in its vehicle class. Setting it this low is not a requirement, it is just the way it was done in BF 1942. For example, the Wespe's collision mesh uses materials 46 and 47, but its splash damage material is 45.

If the object is inside the explosion's radius and the damage is not blocked, the splash damage equation is used:

  Hitpoints = MaterialDamage * DamageMod * RadiusMod

MaterialDamage: This value is also found in the game\bf1942\Game\materialManagerdefine.con file. The Material2 value is used. For example, the explosive pack's Material2 is 204, and the corresponding entry is:

  MaterialManager.material 204
  MaterialManager.materialAttGroup 204
  MaterialManager.materialDefGroup 204
  MaterialManager.materialDamage 20

So the MaterialDamage base value is 20 for the explosive pack.

DamageMod: Similar to direct damage, the attack material and defense material are used to find the damage modifier, in the weapon's file in the directory bf1942\Game\damage_system. Continuing with an explosive pack (material 204) vs. a Wespe (material 45), the entry is in the file bf1942\Game\damage_system\exppack.con:

  MaterialManager.attGroup 204
  MaterialManager.defGroup 45
  MaterialManager.damageMod 3
  MaterialManager.setEffectTemplate e_ExplGranade

(Note that, if you look inside this file, the comments are incorrect about what material does what damage.) So, the DamageMod is 3 for the explosive pack vs. the Wespe.

RadiusMod: All explosions fall off with distance. The property DamageType in the weapon's Weapons.con file specifies the type. For explosive packs (and almost every other explosive) this entry is:

  ObjectTemplate.damageType 1

which means that the object explodes on impact. Landmines and flak guns are the only weapons with a DamageType of 4, which was introduced with the v1.4 patch. This setting is used to allow the projectile to explode when it is near another object. The property ObjectTemplate.explodeNearEnemyDistance sets this explosion distance.

Damage falls off linearly with distance from the center of the explosion, going to zero at its Radius. The term is simply (1 - distance/radius). For our example, say the explosive pack was put 1.2 meters from center of the Wespe. The radius mod is then (1 - 1.2/4), or 0.7.

Hitpoints: as with direct damage, this is the number of points of damage done. For our explosive pack vs. Wespe example, the MaterialDamage was 20, the DamageMod was 3, and the RadiusMod was 0.7. This gives:

  Hitpoints = MaterialDamage * DamageMod * RadiusMod
  Hitpoints = 20 * 3 * 0.7 = 42

So the Wespe takes 42 points of damage. It has 50 hitpoints at full strength, so it would be brought down to 8 hit points.

Collision Damage

Vehicles collide, wreckage hits a ship, a soldier falls down a hill - these are all instances where collision damage takes place. The relevant factors are the materials of the colliding objects and the square of the relative velocity. A classic kamikaze tactic is to run a jeep full-speed into a tank, blowing both up. However, if the tank goes into reverse before getting hit, it will often take considerably less damage, even though the relative impact velocity is not that much lower.

Collision damage can be an important factor in the weapon's effectiveness. For example, the splash damage of the Wasserfall rocket does not harm tanks. However, slamming one of these into a tank usually destroys it, due to the fragments of the rocket itself colliding with the tank. Another example is shooting tank shells against concrete and brick buildings. Such shots create stone ricochet fragments that are highly effective at killing soldiers and destroying vehicles.

The relevant files for collision damage are in the directory bf1942\Game\collision_armor. These files contain MaterialDamage and DamageMod values in the same way as computed for projectile and splash damage.

There are two major types of collision damage: object/object and soldier/object (soldiers running into each other do not do anything). Object/object damage is computed separately for each object (if the object is destructible), first with one object being the attacker and the other the defender, then the reverse. The equation used is:

  Hitpoints = MaterialDamage * DamageMod * VelocityMod * CollisionAngleMod

MaterialDamage: this value is determined the same way as the value used for projectile damage, and is found in game\bf1942\Game\materialManagerdefine.con. For example, here is the Willy Jeep's entry:


  MaterialManager.material 45
  MaterialManager.materialAttGroup 45
  MaterialManager.materialDefGroup 45
  MaterialManager.materialDamage 1

so the MaterialDamage value is 1.

DamageMod: this value is found in a similar way to projectile damage, but this time the attack and defense material pair can also be found in the files in the bf1942\Game\collision_Armor directory. "Armor" here refers to all vehicles, objectives, and soldiers. For example, a jeep running into a Tiger tank uses the values in the LightArmor.con file:


  MaterialManager.attGroup 45
  MaterialManager.defGroup 54
  MaterialManager.damageMod 0.1
  MaterialManager.setEffectTemplate e_collision_metal

for a DamageMod of 0.1.

VelocityMod: is equal to the relative velocity squared times the SpeedMod property of the defending vehicle. The SpeedMod property is found inside the object's Objects.con file under the objects directory. For example, the Tiger's value, in file objects\Vehicles\Land\Tiger\Objects.con, is:

  ObjectTemplate.speedMod 0.75

In general, tanks tend to use a value of 0.75, while some (but not all) lighter vehicles and planes use 2.

CollisionAngleMod: is computed two different ways, depending on the AngleMod value of the defender. This value can be found inside the defending object's Objects.con file, similar to SpeedMod. However, most objects do not have this value set, so have a default of 0; only planes have this value set, and always to 1. The actual expression used is:

  CollisionAngleMode = AngleMod + (1 - AngleMod) * sine( cosine( angle ) * 90 degrees )

This looks complex, but because the AngleMod is always either 0 or 1, one part or the other of this expression goes away when evaluated. It's presented here in full, as in theory you could set AngleMod to some other value. The angle is the angle of collision between the two objects. Specifically, it is the direction of the attacker compared to the normal of the surface hit of the defender. 0 degrees is head-on. So, for airplanes the final value is simply 1, i.e. the angle an object collides with the plane does not matter, the plane will take full damage. For other objects, this term falls off with angle, e.g. 0 degrees gives 1.0, 30 degrees gives 0.978, 60 degrees gives 0.707, 80 degrees gives 0.270, 90 degrees gives 0.0. So hitting at anything but a glancing blow does nearly full damage.

So, for our jeep crashing into a Tiger, say the jeep is going 20 meters/second (about 45 MPH) relative to the Tiger when it hits. It impacts at an angle of 20 degrees. The equation is then:

  Hitpoints = MaterialDamage * DamageMod * VelocityMod * CollisionAngleMod
  Hitpoints = 1 * 0.1 * (20*20 * 0.75) * sine( cosine( 10 degrees ) * 90 degrees ) = 30

So the Tiger would take this much damage. Note the large effect that velocity has on this equation: at 30 meters/second damage goes up to about 67.5 hitpoints, and 40 meters/second does 120 hitpoints of damage.

Soldier/Object Collision Damage

Soldier/object damage computation is still more involved. First, if the relative speed is less than 8 meters/second (about 18 MPH), the soldier takes no damage, i.e. it's usually hard for a soldier to hurt himself running around. If this speed is greater, then the soldier's contribution to the speed has 8 meters/second subtracted from it if both objects are dynamic (i.e. the other object can move; the soldier is not falling onto a static object). In other words, a soldier can still hurt himself by falling, but the effect of running towards an oncoming vehicle vs. running away is ignored. There is no armor modifier, but a height modifier becomes important:

  Hitpoints = MaterialDamage * DamageMod * VelocityMod * HeightMod * HeightMod * CollisionAngleMod

These are computed as before, with the addition of the HeightMod value and a modification of theCollisionAngleMod value.

HeightMod: The height is calculated as the vertical distance before the collision took place between the soldier and the object he's hitting. This height value is also affected by the soldier's damping ability. The rocketeer class has a damping value of 0.0, which is found in objects\Items\GerEliteKit\Common\Objects.con as the property ObjectTemplate.Damping. The height value is multiplied by this damping value (if present) to give the effective height. The height modification factor is computed based on this effective height and the relative speed. The HeightModis set to 1 (i.e. no effect) if the height is less than a meter, otherwise the HeightMod is set to the effective height. Note that the HeightModvalue is squared in the final equation.

CollisionAngleMod: This value is computed as before, but then may be modified due to the height of a fall or the relative speed of the collision. If the height before damping is between 1 and 2 meters, the CollisionAngleMod is set to "(1-CollisionAngleMod)*(height-1) + CollisionAngleMod". All this means is that for a fall of 1 meter theCollisionAngleMod value is used as is, at 2 meters this value is goes to 1, and between these two heights this value is interpolated between the two. In other words, as the distance fallen increases, the angle of impact matters less - a long fall is a long fall. At a height of more than 2 meters this value is always set to the maximum value of 1. However, we're not done yet. The relative speed (minus the soldier's contribution, as explained above) is checked: if this value is 30 meters/second or more, theCollisionAngleMod is set to its maximum of 1. If the speed is between 10 and 30, then this modifier is again interpolated between these two: "(1 - CollisionAngleMod)*((speed - 10)/20) +CollisionAngleMod". The intent is again to ignore the angle of impact when the collision speed is fairly high.

So, let's keep our example simple: a soldier hits the ground at a speed of 15 meters/second, with a height fall in 1/30th of a second of 0.45 meters. The speed is greater than 8 meters/second, so damage will be computed. The ground is a static object, so there is no reduction in the soldier's speed due to being hit by a dynamic object (a vehicle, wreckage, etc). TheMaterialDamage value is found in materialManagerDefine.con, and is 30 for all ground/water materials 0-15. The DamageMod value is in the MaterialManagerSettings.con file, and for attack materials 0-15 (different types of ground, the exception is Material 1 is water) and for defense material 41 (soldier's trunk) theDamageMod is 0.001. The SpeedMod for a soldier is found in CommonSoldierData.inc, and is 0.5. Say the CollisionAngleModis originally 0.9. Because the speed is between 10 and 20 meters/second, this value would be recomputed as:

  New CollisionAngleMod = (1 - CollisionAngleMod)*((speed - 10)/20) + CollisionAngleMod

  New CollisionAngleMod = (1 - 0.9)*((15 - 10)/20) + 0.9 = 0.925

The CollisionAngleMod is not affected by the height, since the height is less than 1. The HeightMod is forced to 1, since the height is less than 1.

  Hitpoints = MaterialDamage * DamageMod * VelocityMod * HeightMod * HeightMod * CollisionAngleMod
  Hitpoints = 30 * 0.001 * (15*15*0.5) * 1 * 1 * 0.925 = 3.1 hitpoints

The Weapons Effects page details a wide range of experiments of ramming one vehicle into another, to give a sense of what these collision effects mean in practice.

Critical Damage

Some vehicles stop moving and take damage by themselves when heavily damaged. The idea is that if a vehicle is nearly destroyed, it's probably on fire and will soon be fully destroyed on its own. The relevant values in the object's Objects.con file are:

  ObjectTemplate.criticalDamage 12
  ObjectTemplate.hpLostWhileCriticalDamage 1.5

The criticalDamage value is the number of hitpoints at or below which the object starts to self-destruct. This is usually about 10%-20% of the maxhitpoints, though can vary on up to 50%. The hpLostWhileCriticalDamage value gives how many hitpoints are lost per second when in the critical zone. Note that normally an engineer can repair at a faster rate than this damage rate and so can bring a vehicle back from the brink. The repair factor is set in as "objectTemplate.repairFactor 0.15", which is how much is repaired per 1/30th of a second, i.e. 4.5 hitpoints per second. While we are on the topic, medics heal using "objectTemplate.healFactor 0.25" for others (7.5 hitpoints/second) and "objectTemplate.selfHealFactor 0.15" (4.5 hitpoints/second) for themselves.

Abandonment Damage

This type of damage occurs when a vehicle is moved away from its spawn point and then left unattended. The vehicle will self-destruct after a certain amount of time. This type of damage is important for game play, as it means that abandoned vehicles will eventually disappear and then get replaced at its original spawn point. Unlike most other damage factors, these settings are found in the level's battle type ObjectSpawnTemplates.con file, e.g. Bf1942\Levels\Anzio\Conquest\ObjectSpawnTemplates.con. Here is an example:

  ObjectTemplate.TimeToLive 45
  ObjectTemplate.Distance 40
  ObjectTemplate.DamageWhenLost 10

These settings mean that if the vehicle is moved 40 meters or more away from its spawn point, it will have 45 seconds to live unattended. After this period, the vehicle will take 10 hitpoints of damage each second.

Upside-Down Damage

If an object's Objects.con has this property defined:

  ObjectTemplate.hpLostWhileUpSideDown 10

then the object takes this much damage per second when it is determined to be upside-down (even the slightest bit, i.e. rocking back and forth on its side).

Water/Drowning Damage

If an object's Objects.con has these properties defined:

  ObjectTemplate.damageFromWater 1
  ObjectTemplate.hpLostWhileDamageFromWater 10

then it takes the amount of damage per second specified by hpLostWhileDamageFromWater when touching water. For soldiers, the standard definition, in objects\Soldiers\Common\CommonSoldierData.inc, is:

  ObjectTemplate.hpLostWhileDamageFromWater 1
  ObjectTemplate.WaterDamageDelay 90
  ObjectTemplate.DamageFromWater 1

The additional value WaterDamageDelay delays drowning damage for 90 seconds, then damage takes place at a hitpoint per second.

Desertion Damage

After nine seconds you take damage when you leave the battlefield, and a fully healthy soldier will then die in about six seconds. The game detects out of bounds by finding color "7", a specific terrain type, in the battle's materialmap.raw file. The relevant property for setting the amount of damage taken per second is game.damageForBeingOutsideWorld <float>, which defaults to 5.0 hitpoints per second. There is no command for changing the delay.

Damage Analysis Program

The damage.pl damage analysis program in the damage program archive can be used to analyze and debug any mod's weapons and armor behavior. The Damage Page is an example of output from this script, giving an analysis of BF 1942 and its two expansions.

To use this Perl program, you first need to install a Perl distribution, if you do not have one. ActiveState's Perl distribution is free and high quality.

To run the damage.pl script, you need to do a few things:

You're now ready to run the perl script. To analyze the damage system for the mod, type:
    perl c:\perlprogs\damage.pl > myweapons.htm
  
This generates the analysis. Note that some of the information in this analysis is not generated by the program. Specifically, the "Direct Hit Defense Material IDs" section is not. This information is stored in the defenders' collision meshes, which the program does not analyze.

There are a few user options, including the ability to set table names for Desert Combat and Eve of Destruction weapons, and to see the (usually) unused armor types. You enable or disable these by editing the damage.pl file itself; the options are near the top of the file.

This program is not perfect. Since it does not have access to all the collision mesh materials, it will not find names for armor materials used on meshes but not used as splash damage materials anywhere. Set $showallarmor=1 in the program if you want to see all armor types.

For Battlefield 1942 with the Secret Weapons expansion, the program will detect and warn that the MaterialDamage value for materials 256 and 257 gets reset. This is actually a feature, in that the .con files should normally not do this. The DP 1928 assault gun and the Wasserfall rocket were accidentally assigned to the same attack material, so these weapons cannot be used in the same mod without some work to redefine the material of one or the other.

Resources

See the Damage Page for much related information and a full rundown of BF weapons and armor. The Weapons Effects chart is a more readable (though less precise) presentation based on the Damage Page, and also includes data from empirical testing.

Acknowledgements

Thanks to Trevor Larkum for first outlining the basics of the projectile damage system to me, and to Patrik P. and the other programmers at DICE for answering my questions.