ACF_CalcArmor(Area, Ductility, Mass) = (Mass × 1000 / Area / 0.78) / sqrt(1 + Ductility) × ACF.ArmorMod
This converts entity mass into an equivalent armor thickness in millimeters for ACF damage resolution.
losArmor = armor / |cos(Angle) ^ ACF.SlopeEffectFactor|
losArmorHealth = armor^1.1 × (3 + min(1 / |cos(Angle) ^ ACF.SlopeEffectFactor|, 2.8) × 0.5)
maxPenetration = (Energy.Penetration / FrArea) × ACF.KEtoRHA
caliber = 20 × sqrt(FrArea^(1 / ACF.PenAreaMod) / π)
penProb = clamp(1 / (1 + exp(-43.9445 × (maxPenetration / losArmor / effectiveness - 1))), 0.0015, 0.9985)
breachProb = clamp((caliber / armor / effectiveness - 1.3) / 5.7, 0, 1)
If breach occurs and penetration exceeds armor:
Damage = FrArea × resiliance × damageMult × ductilitymult
Overkill = maxPenetration − armor
Loss = armor / maxPenetration
If penetration occurs without a clean breach:
Penetration = min(maxPenetration, losArmor × effectiveness)
Damage = (Penetration / losArmorHealth / effectiveness)^2 × FrArea × resiliance × damageMult × ductilitymult
If no penetration occurs:
Penetration = min(maxPenetration, losArmor × effectiveness)
Damage = (Penetration / losArmorHealth / effectiveness) × FrArea × resiliance × damageMult × ductilitymult
Armor materials modify effectiveness and damage resistance.
RHA: effectiveness = 1, resiliance = 1
Titanium: effectiveness = 1.7, resiliance = 0.75
Higher effectiveness increases effective armor, while lower resiliance reduces damage taken.
ductilitymult = 2 / (2 + ductilityvalue × 1.5), where ductilityvalue = (Entity.ACF.Ductility or 0) × 1.25.
Higher ductility reduces damage from hits.