Not affiliated with or endorsed by Overhype Studios.
I wrote this specification before implementing the Damage Calculator. It documents how Battle Brothers calculates damage under the hood, step by step in plain English with pseudocode.
If you are a modder working on damage-related mods, or just curious about the exact mechanics, this should give you a complete picture of how every variable interacts. All formulas were derived by studying the game engine independently. I compared results from my calculator with Turtle's calculator that was launched by Osgboy as a webapp (see here). I believe my calculator is correct, but I cannot guarantee it.
The core formula (below) uses variables like DamageTotalPerc and ArmorPiercingPerc. This section explains where those values come from.
All damage traits, perks, injuries, and status effects stack multiplicatively into a single multiplier:
DamageTotalPerc = 1.0 * Huge (1.10) -- trait * Drunkard (1.10) -- trait * Tiny (0.85) -- trait * Killing Frenzy (1.25) -- perk, only while active * Broken Arm (0.50) -- injury * Split Shoulder (0.50) -- injury * Cut Arm Sinew (0.60) -- injury * Injured Shoulder (0.75) -- injury * Dazed (0.75) -- status effect * Distracted (0.65) -- status effect * Strange Mushrooms (1.25)-- status effect * Double Grip (1.25) -- perk, 1-handed weapons only Example: Huge * Drunkard = 1.10 * 1.10 = 1.21 total, not 1.20.
Armor piercing starts with the weapon's base value, modified by the skill and perks. In Battle Brothers, the skill replaces the weapon's value entirely. In our calculator, we compute it as a delta (weapon base + skill difference), which produces the same result:
ArmorPiercingPerc = WeaponBaseAP + (SkillAP - WeaponBaseAP)
+ Duelist (0.25) -- perk, 1-handed weapons only
Capped at 1.0. Duelist stacks additively on top.
Note: Our delta approach means if a user edits weapon stats for a
Named weapon, the skill's relative contribution is preserved. For
example, a Named weapon with +5% AP and a skill that adds +10% over
the base will correctly show +15% over the weapon's original base.
Starts with the weapon's base armor damage percentage. Skills can multiply it:
DamageArmorPerc = WeaponBaseDamageArmorPerc * SkillArmorDamageMult Destroy Armor: base x1.50, mastery x2.00 Demolish Armor: base x1.45, mastery x1.93 Example: Polehammer (185%) with Demolish Armor mastery: 1.85 * 1.93 = 3.57 (357% armor damage)
Usually 1.0. Set to 0.0 for skills that deal no HP damage through the formula (Destroy Armor, Demolish Armor). Decapitate adds the missing HP ratio:
Decapitate: DamageRegularPerc += (1.0 - CurrentHP / MaxHP) At 50% HP: DamageRegularPerc = 1.0 + 0.5 = 1.5 (50% more HP damage)
AddedHeadshotDamagePerc = 0.0 + 0.50 -- headshot (always, on head hits) + 0.15 -- Brute trait + 0.50 -- Chop skill (1-handed axe) Steel Brow (defender): cancels the +0.50 headshot bonus and Chop bonus. Puncture: cancels the +0.50 headshot bonus (no headshot crit).
HeadshotChance = 0.25 (base) + WeaponHeadshotMod -- weapon-specific (e.g. flails +20%) + Juggler (0.05) -- background + Killer on the Run (0.10) -- background
Default: 0 (armor can fully absorb a hit) Batter: 10 (always deals at least 10 HP through armor) Destroy Armor / Demolish Armor: 10
When the target is injured: DamageTotalPerc *= 1.20
After landing a headshot, the next attack is guaranteed to target the head. Resets after a body hit.
Two independent random rolls within the weapon's damage range:
RegularDamage = rand(DamageMin, DamageMax) * DamageRegularPerc * DamageTotalPerc ArmorDamageRoll = rand(DamageMin, DamageMax) * DamageArmorPerc * DamageTotalPerc
The two rolls are independent. You can highroll armor damage but lowroll HP damage, or vice versa.
TotalDamageReceivedPerc = DamageTotalReceivedPerc * ArmorAttachmentDamageReceivedPerc
RegularDamage = (RegularDamage - RegularDamageReduction)
* DamageRegularReceivedPerc * TotalDamageReceivedPerc
ArmorDamageRoll = (ArmorDamageRoll - ArmorDamageReduction)
* DamageArmorReceivedPerc * TotalDamageReceivedPerc
See "Defender Perks" and "Racial Resistances" below for what feeds into these.
ArmorRemoved = min(Armor, ArmorDamageRoll) ArmorRemaining = Armor - ArmorRemoved
If ArmorPiercingPerc >= 1.0, armor is bypassed entirely (no durability lost).
The formula distinguishes three scenarios:
No armor on the body part: Damage directly removes HP.
Armor survives the attack:
HitpointsRemoved = max(0, RegularDamage * ArmorPiercingPerc
* DamagePiercingReceivedPerc
- ArmorRemaining * 0.1)
Remaining armor absorbs 10% per point.
Armor destroyed in the process: The piercing portion gets through as above, plus the excess damage that wasn't needed to destroy armor flows through as direct HP damage:
HitpointsRemoved += max(0, RegularDamage
* max(0.0, 1.0 - ArmorPiercingPerc
* DamagePiercingReceivedPerc)
- ArmorRemoved)
HitpointsRemoved = HitpointsRemoved * (1.0 + AddedHeadshotDamagePerc) HitpointsRemoved = max(round(HitpointsRemoved), HitpointDamageMinimum)
The final value is rounded to an integer. All intermediate calculations use floating point.
Each hit targets either the head (HeadshotChance, default 25%) or the body. Headshots hit the helmet armor pool. Body hits hit body armor. Both pools degrade independently over multiple hits.
Headshots add +50% to HP damage. Some traits and skills add additional headshot damage (see AddedHeadshotDamagePerc above).
Reduces armor damage based on current total armor (body + head combined):
DamageArmorReceivedPerc *= max(0.0, 1.0 - TotalArmor * 0.0005) Example: 230 body + 190 head = 420 total 1.0 - 420 * 0.0005 = 0.79 (21% armor damage reduction)
Recalculated every hit as armor degrades. More armor remaining means more protection.
Reduces HP damage based on armor weight (fatigue penalty from equipped armor). Light armor gives up to 60% HP damage reduction. Heavy armor gives almost no reduction.
DamageRegularReceivedPerc *= NimbleMult NimbleMult varies per enemy based on their armor's fatigue penalty. Typical values: 0.40 (light armor) to 1.0 (heavy armor, no benefit).
Removes the +50% headshot HP damage bonus by setting AddedHeadshotDamagePerc to -0.50, which cancels the +0.50 from the headshot. Also cancels Chop's +50% bonus. Headshots still target the helmet.
The first hit that would reduce HP to 0 or below instead sets HP to a random value between 11 and 15. Triggers once per fight. Clears all bleed stacks when triggered.
Halves bleed duration from 2 turns to 1 turn. Prevents bleed stacks from overlapping.
An injury occurs when a single hit deals HP damage greater than or equal to 25% of the enemy's max HP:
InjuryThreshold = 0.25 * MaxHP Head injuries have a higher threshold: HeadInjuryThreshold = 0.25 * MaxHP * 1.25 With Crippling Strikes (attacker perk): InjuryThreshold *= 0.66 (34% lower threshold)
Each sub-hit in multi-hit attacks (like Cascade) checks independently. Undead, beasts, and some other enemies are immune to injuries.
A morale check is triggered when a single hit deals at least 15 HP damage. The enemy then rolls against their Resolve. Failure drops morale by one level.
With the Fearsome perk, the threshold drops to 1 HP damage, triggering morale checks on almost every hit that penetrates armor.
Undead and constructs are immune to morale.
Cleave and Whip skills apply a bleed effect when the hit deals at least 6 HP damage.
BleedPerTurn = 5 (base) or 10 (with Weapon Mastery) BleedDuration = 2 turns (1 turn with Resilient)
Bleed is a stacking effect. Each qualifying hit adds a new stack with its own timer. Stacks tick on the enemy's turn:
Hit 1: apply bleed (2 turns remaining) Enemy turn: 1 stack ticks, 1 turn left Hit 2: apply new bleed (2 turns). Old bleed has 1 turn left. Enemy turn: 2 stacks tick simultaneously Hit 3: apply new bleed. Oldest stack expires. Enemy turn: 2 stacks tick (steady state with 2-turn bleeds)
Resilient halves duration to 1 turn, so old stacks expire before new ones are added (no overlap).
Nine Lives clears all bleed stacks. Undead, Alps, and Schrats are immune to bleeding.
Certain enemy groups take reduced damage from specific weapon skills. The resistance is applied as a multiplier to DamageRegularReceivedPerc for that skill.
Resistant to ranged weapons and piercing melee attacks:
Bows: 10% damage Javelins: 25% damage Crossbows: 33% damage Slings: 33% damage Dog Bites: 33% damage Other piercing: 50% damage Handgonnes: 50% damage
Bows: 10% damage Javelins: 25% damage Fire Lance: 25% damage Crossbows: 33% damage Slings: 33% damage Handgonnes: 33% damage Other piercing: 50% damage
Bows: 10% damage Fire Lance: 10% damage Crossbows: 33% damage Slings: 33% damage Javelins: 25% damage Handgonnes: 25% damage Other piercing: 50% damage
Both have resistances to ranged attacks but are not resistant to piercing melee. Specific values vary per skill. Schrats also reduce all incoming damage to 30% while their root shield is up (not modeled in our calculator).
Enemies with variable equipment have multiple possible body armor and helmet combinations, each with a spawn probability. Each simulation run randomly picks one combination weighted by probability.
For example, a Brigand Raider has 4 body armor options and 6 helmet options, resulting in 24 different possible loadouts.
HealPerTurn = floor(MaxHP * 0.06) For 160 HP Madman: floor(160 * 0.06) = 9 HP per turn
Heals on the enemy's turn, after bleed ticks. If an attack kills the Madman outright (HP <= 0 from the hit), he dies before bleed or heal apply. Otherwise: bleed ticks first, then heal (capped at max HP), then check if dead.
DamageArmorReceivedPerc *= 0.75
Armor takes 25% less damage, making it degrade slower.
DamageRegularPerc = 0.0 (no HP damage from formula) DamageArmorPerc *= 1.50 (base) or 2.00 (mastery) HitpointDamageMinimum = 10
DamageRegularPerc = 0.0 DamageArmorPerc *= 1.45 (base) or 1.93 (mastery) HitpointDamageMinimum = 10
Two hits per attack. Primary hit on the targeted body part at full damage. Secondary hit on the opposite body part at 50% damage (DamageTotalPerc *= 0.5). No headshot bonus on the secondary hit.
3 separate hits at 1/3 damage each (DamageRegularPerc = 0.33). Each hit independently rolls head or body targeting. Each independently checks for injury and morale triggers.
Same as Cascade but always targets the head.
DamageRegularPerc += (1.0 - CurrentHP / MaxHP)
Only scales HP damage, not armor damage.
ArmorPiercingPerc = 1.0 (bypasses armor entirely) AddedHeadshotDamagePerc = -0.5 (cancels headshot bonus)
ArmorPiercingPerc += 0.10 on headshots (base) ArmorPiercingPerc += 0.20 on headshots (mastery)
AddedHeadshotDamagePerc += 0.50 on headshots
Always targets the head (100% headshot chance).
Applies bleed (see Bleeding section). Base: 5 per turn. Mastery: 10 per turn.
In Battle Brothers, a skill's ArmorPiercingPerc replaces the weapon's value entirely. In our calculator, we compute it as a delta: FinalAP = WeaponBaseAP + (SkillAP - WeaponBaseAP). The end result is identical for standard weapons. The delta approach has the advantage that when a user enters custom stats for a Named weapon, the skill's relative contribution is preserved correctly.
Built by Pascal Klein (HeyPashi)