promotional bannermobile promotional banner
premium banner
Compatibility for Brutality armor calculation and Apothic Attributes damage calculation

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.