Description
Purpose
This mod fixes armor bypass compatibility math between Brutality and Apothic Attributes / AttributesLib.
The issue
In certain compatibility paths, Brutality’s lethality can push effective armor below zero before armor reduction is resolved.
If that negative armor is fed into a reduction formula without safeguards, results can become invalid (0, huge spikes, or non-finite values).
Why it happens
Brutality computes effective armor as:
modifiedArmor = targetArmor * (2 - armorPenetration) - lethality
Then armor reduction uses Apothic’s damage scaled constant a:
if damage < 20: a = 10
if damage >= 20: a = 10 + (damage - 20) / 2
Damage through factor:
a / (a + modifiedArmor)
Final damage after armor stage:
finalDamageAfterArmor = damage * (a / (a + modifiedArmor))
If modifiedArmor becomes strongly negative:
denominator can approach 0, causing extreme damage values
denominator can hit 0, causing inf / undefined damage cases
denominator can go negative, causing negative final damage result (doesnt heal target, but gets clamped to 0 in many cases)
Examples
Case A (negative output path)
targetArmor = 1, armorPenetration = 1, lethality = 12, damage = 20
modifiedArmor = 1 * (2 - 1) - 12 = -11
a = 10
final = 20 * (10 / (10 + -11)) = -200
Case B (divide-by-zero path)
targetArmor = 1, armorPenetration = 1, lethality = 11, damage = 20
modifiedArmor = -10
a = 10
final = 20 * (10 / (10 + -10)) = 20 * (10 / 0)
The fix
This mod applies two safeguards:
Clamp effective armor floor to 0 before reduction math (no negative armor input into armor formula).
Preserve high lethality scaling by splitting lethality into:
armor reduction down to zero
excess lethality converted into linear bonus damage:
bonus = unarmoredDamage * (excess * bonusPerExcessLethalityPoint)
Default:
bonusPerExcessLethalityPoint = 0.10 (10% per excess point, configurable)
Example of excess bonus
If unarmoredDamage baseline is 5, excess lethality is 4, and config is 0.10:
bonus = 5 * (4 * 0.10) = 2
Total = 5 + 2 = 7
Compatibility behavior
If Apothic Attributes is present, uses ALCombatRules#getArmorDamageReduction
If not, falls back to vanilla CombatRules.getDamageAfterAbsorb
Result
no divide by zero / infinite damage cases
no negative to zero behavior
predictable and configurable lethality scaling
Intended for packs using Brutality + Apothic/AttributesLib.


