This is reproduced from the Working on an armour explanation thread.
The armor system in Dawn of War is quite complicated. Each entity has an armor type, an armor amount, and an armour minimum. Each weapon has damage, a default armor-piercing value, and optional armor-piercing values for each armor type.
Final Damage Multiplier = min( (100 - armour + armour_piercing_value) , 100 - armour_minimum ) / 100
armour and armour_minimum are in the ebp. armour_piercing_value is from the weapon blueprint.
How to set up the armor. Armor is defined in the entity blueprint.
GameData["health_ext"]["armour"] = 100.000
GameData["health_ext"]["armour_minimum"] = 0.000
GameData["type_ext"]["type_armour"] = Reference("tp_infantry_high")
For most units, all you should have to do is set the first value to 100, the second to 0, then pick an appropriate type for the third value. Here are the pre-defined armour types:
GameData["area_effect"]["weapon_damage"]["armour_damage"]["armour_piercing"] = 10.000
This defines the default armor-piercing value of the weapon. Armor-piercing values for specific armor types can be defined (and are described later) but if the weapon encounters something that does not have an armor type listed in the table, it will use this value.
GameData["area_effect"]["weapon_damage"]["armour_damage"]["armour_piercing_types"]["entry_01"]["armour_piercing_value"] = 30.600
GameData["area_effect"]["weapon_damage"]["armour_damage"]["armour_piercing_types"]["entry_01"]["armour_type"] = Reference("tp_infantry_low")
Here's an entry defining the armour-piercing value of a weapon vs. one armour type. This example shows a weapon dealing 30% damage against targets with tp_infantry_low armour. If the target's armour value is less than 100, the weapon would do more than 30% damage, but all stantard units have an armour value of 100. That is another reason to set your custom units' armour values to 100.
Often, a .NIL file, like eldar_shooting_weapons.nil, will create a table of armour_piercing_types for all 14 armor types, and leave it to other weapons (which inherit from it) to fill in the armour_piercing_value. I don't really like this, since 1) if the entry is created, the armour_piercing_value defaults to 0, so if you forget a damage type, your weapon won't even scratch it, and 2) the weapon files have lists of multipliers, but the armour types they go to are in a different file, making it hard to tell at a glance what armour types the weapon is effective against.
The damage multiplier is clamped to the range [0,1]
A weapon will never do less than min_damage_value. This trumps even "armour_minimum."