Bannerlord mechanics

Combat damage

Bannerlord v1.5.7 · checked 2026-11-12 · updated 2026-11-13

How one blow becomes the damage an agent takes, and every skill, perk, banner and figurehead that changes it, at full precision for game v1.5.7.

Module overrides:

Skill guides with these perks: One Handed, Two Handed, Polearm, Bow, Crossbow, Throwing, Riding, Athletics, Crafting, Tactics, Roguery, Engineering, Mariner, Shipmaster, Boatswain.

Verdicts: works = does what the tooltip says, or more — broader effects are noted; differs = narrower, different or extra conditions/values than the tooltip; unused = never read by the game; ui_only = only shown in the interface. "Captain" halves come from the captain of the agent's formation; "Personal" halves from the agent's own character.

The damage pipeline

blow_damage is the final damage of a blow to an agent. It is produced in Mission::GetAttackCollisionResults. Base raw_damage, combine rule custom, floor 0. The steps run in this order.

1. Magnitude

magnitude = source magnitude · momentum_remaining · arm_hit_multiplier · agent_weapon_damage_multiplier · weapon_damage_factor
blow_magnitude = clamp(magnitude, 0, 500)
Source Value Conditions Verdict
Kick and shield bash magnitude 2 with no weapon, a LargeShield or a two-handed weapon; 1 with a SmallShield or other weapons kick or bash works
Unarmed strike magnitude speed_graph · momentum_remaining · FistFightDamageMultiplier (ManagedParameters 15) · 2 no weapon works
Horse charge magnitude s = abs(attacker velocity − victim velocity projected on the attacker direction) · c, c = ChargeDamageDotProduct; magnitude = s² · c · AttackerAgentMountChargeDamageProperty horse charge works
Fall damage magnitude vz = −vertical velocity (× FallSpeedReductionMultiplierForRiderDamage when the victim has a mount); (vz² · FallDamageMultiplier − FallDamageAbsorption) · sqrt(1 + encumbrance / (weight · scale²)) · (1 for humans, 1.41 otherwise); 0 below 3, capped at 499.9 fall works

2. Armor

armor = blow_adjusted_armor + 10 (back shield hit)

3. Raw damage

d          = blow_magnitude · 50 / (50 + armor)
raw_damage = (b · d + (1 − b) · max(0, d − k · armor)) · absorbed_ratio
Damage type b (blunt factor) k
Cut 0.1 0.5
Pierce 0.25 0.33
Blunt 0.6 0.2

4. Multipliers

m = bone_multiplier · sneak_attack_damage_multiplier · combat_difficulty_multiplier
m = 1 for a shield block or fall damage
Body part Cut Blunt Pierce Invalid type
None 1 1 1 1
Head, Neck 1.2 1.2 2.0 (human, missile) / 1.25 (human, melee) / 1.2 (non-human) 1.5
Chest, Abdomen, shoulders, arms 1.0 human, 0.8 non-human same same same
Legs 0.8 0.8 0.8 0.8

5. Inflicted damage clamp

inflicted = clamp(ceil(raw_damage · m), 0, 2000)

Shield blocks replace steps 2 to 5 with the shield-block branch. A missile blocked with a weapon gives 0.

6. Model modifiers

Runs only when inflicted > 0, in AgentApplyDamageModel::CalculateDamage:

if IsDamageIgnored:  result = 0
dealt   = agent_damage_dealt(inflicted)          amplifications
scaled  = dealt · damage_scaling                 scaling
taken   = agent_damage_taken(scaled)             reductions
general = taken · (1 + throwing_damage_bonus)    Throwing weapon
                · (1 + melee_damage_bonus)       melee weapon
                · (1 + damage_multiplier_bonus)  when an attacker agent exists
result  = max(0, general)

7. Round

blow_damage = Round(result)        0 when inflicted ≤ 0

Mission::GetAttackCollisionResults rounds the result into InflictedDamage and logs ModifiedDamage = round(result − inflicted).

Strike magnitude

Extra linear speed

strike_extra_linear_speed is the attacker's speed bonus that enters the swing, thrust and passive-usage magnitude formulas. Consumer SandboxStrikeMagnitudeModel::CalculateStrikeMagnitudeForSwing (SandBox); the same rule runs in CalculateStrikeMagnitudeForThrust and CalculateBaseBlowMagnitudeForPassiveUsage. Combine rule explained number, no clamp.

relative_speed     = |attacker velocity − victim velocity|
d                  = dot(weapon blow direction, normalized relative velocity)
d                  = min(d + 0.2, 1)                when d > 0
extra_linear_speed = relative_speed · d
                     · 0.7 (swing) or · 0.5 (thrust) or · 1 (passive usage)
strike_extra_linear_speed = extra_linear_speed · (1 + Σ factors)
Perk Half Bonus Methods Conditions Verdict
Surging Blow (Athletics) primary 0.3 swing, thrust, passive on foot; passive usage only against a mounted victim or a horse works
Surging Blow (Athletics) secondary 0.3 swing, thrust, passive captain; on foot; passive usage only against a mounted victim or a horse works
Lancer (Polearm) primary 0.2 swing, thrust, passive mounted works
Lancer (Polearm) secondary 0.3 swing, thrust, passive captain works
Unstoppable Force (Polearm) secondary 0.3 swing, thrust, passive captain; mounted works
Nomadic Traditions (Riding) secondary 0.1 swing, thrust, passive captain; mounted works
Dash and Slash (Roguery) primary 0.5 swing, thrust on foot works
Reckless Charge (Two Handed) primary 0.2 swing, thrust two-handed weapon; on foot works

Swing magnitude

swing_strike_magnitude: consumer SandboxStrikeMagnitudeModel::CalculateStrikeMagnitudeForSwing (SandBox), base swing_kinetic_magnitude, explained number, no clamp. CombatStatCalculator.CalculateStrikeMagnitudeForSwing:

r  = weapon_length · impact_point − weapon_center_of_mass
u  = swing_speed · (0.5 + weapon_center_of_mass) + strike_extra_linear_speed
E0 = 0.5 · weapon_weight · u² + 0.5 · weapon_inertia · swing_speed²
J  = (u + swing_speed · r) / (1 / weapon_weight + r² / weapon_inertia)
E1 = 0.5 · weapon_weight · (u − J / weapon_weight)² + 0.5 · weapon_inertia · (swing_speed − J · r / weapon_inertia)²
swing_kinetic_magnitude = 0.067 · (E0 − E1 + 0.5)
swing_strike_magnitude  = swing_kinetic_magnitude · (1 + Sharpened Edge)    player-crafted items only
Perk Half Bonus Conditions Verdict
Sharpened Edge (Crafting) primary 0.02 player-crafted weapon; perk on the wielder differs

Sharpened Edge differs: the perk is checked on the wielding agent's character, not on the smith who crafted the weapon. It applies to any player-crafted weapon, whoever wields it, if the wielder has the perk. The tooltip says crafted weapons.

Thrust magnitude

thrust_strike_magnitude: consumer SandboxStrikeMagnitudeModel::CalculateStrikeMagnitudeForThrust (SandBox), explained number, no clamp.

u = thrust_speed + strike_extra_linear_speed
thrust base = 0.0625 · (weapon_weight + 2.5) · max(u, 0)²
thrust_strike_magnitude = thrust base · (1 + Sharpened Tip)    player-crafted items only
Perk Half Bonus Conditions Verdict
Sharpened Tip (Crafting) primary 0.02 player-crafted weapon; perk on the wielder differs

Sharpened Tip differs for the same reason as Sharpened Edge.

Worked example.

A thrust with a player-crafted 1.5 kg spear, wielded by a hero with Sharpened Tip. Inputs: weapon weight 1.5, thrust speed 7.5, strike extra linear speed 0.5.

Step Source Stage Change Running value
Base Melee thrust strike magnitude base 16.0000
1 Sharpened Tip factor +2% +0.3200 16.3200
Result Melee thrust strike magnitude 16.3200

With these inputs, melee thrust strike magnitude is 16.3200.

Passive usage magnitude

passive_attack_damage: the couch or brace blow magnitude. Consumer SandboxAgentApplyDamageModel::CalculatePassiveAttackDamage (SandBox), base passive_magnitude, sequential, no clamp.

s  = strike_extra_linear_speed
w' = weapon_weight + 20 / (s^0.1 if s > 0 else 1)
passive_magnitude = 0.0625 · (w' + 2.5) · (0.83 · s)²       0 when < 10
passive_attack_damage = passive_magnitude · (1 + Unstoppable Force)
Perk Half Bonus Stage Conditions Verdict
Unstoppable Force (Polearm) primary 3.0 factor attacker is a troop or hero; blow blocked with a shield differs

Missile magnitude

missile_speed_bonus_factor: consumer SandboxStrikeMagnitudeModel::CalculateStrikeMagnitudeForMissile (SandBox), base 0, explained number, no clamp.

v  = |victim velocity − missile velocity|   (|missile velocity| without a victim agent)
v0 = MissileStartingBaseSpeed
v' = v + (v − v0) · missile_speed_bonus_factor     when v > v0, else v' = v
missile_magnitude = (v' / v0)² · MissileTotalDamage
Perk Half Bonus Stage Conditions Verdict
Running Throw (Throwing) primary 0.25 add hero attacker; AmmoClass Sling, Stone, ThrowingAxe, ThrowingKnife or Javelin; v > v0 differs

Running Throw differs: the tooltip shows +0.3% damage, but the game adds 25% of the missile's speed above its starting speed, which enters damage squared.

Adjusted armor

blow_adjusted_armor: the victim's armor of the hit body part after the attacker's penetration effects. Consumer NavalStrikeMagnitudeModel::CalculateAdjustedArmorForBlow (NavalDLC), base armor, combine rule custom, floor 0.

Base model (SandBox)

a0 = armor                                       armor ≤ 0 or attacker not a troop or hero
a0 = 0                                           Piercer or Slinging Competitions applies
E  = armor · (1 + Σ SandBox factors)
a0 = max(0, armor − (E − armor))
a0 = a0 · (1 − armor_penetration_bow)            Bow weapons
a0 = a0 · (1 − armor_penetration_crossbow)       Crossbow weapons

Live model (NavalDLC recompute)

a0 = SandBox result
result = a0                                      a0 ≤ 0 or attacker not a troop or hero
E'     = armor · (1 + Σ naval factors)           fresh modifier sum from the raw armor
result = max(0, armor − (E' − armor))
Perk Half Bonus Scaling Conditions Verdict
Vandal (Two Handed) primary 0.25 bonus any weapon works
Chink in the Armor (One Handed) primary 0.1 bonus one-handed weapon differs
Bodkin (Bow) primary 0.1 bonus bow works
Bodkin (Bow) secondary 0.05 bonus captain; bow works
Puncture (Crossbow) primary 0.1 bonus crossbow works
Puncture (Crossbow) secondary 0.05 bonus captain; crossbow works
Weak Spot (Throwing) primary 0.3 bonus throwing weapon works
Weak Spot (Throwing) secondary 0.1 bonus captain; throwing weapon works
Shattering Blow (Mariner) primary 0.5 bonus melee weapon works
Shattering Blow (Mariner) secondary 0.5 bonus captain; melee weapon works
Shattering Volley (Mariner) primary 0.5 bonus consumable weapon works
Shattering Volley (Mariner) secondary 0.5 bonus captain; consumable weapon works
Piercer (Crossbow) primary 20.0 override 0 crossbow; raw armor < 20 works
Slinging Competitions (Throwing) primary -0.2 override 0 SlingStone; head hit; bonus value not read works
Saber-tooth tiger figurehead — — 1 − armor_penetration_bow/crossbow bow or crossbow differs

Amplifications (agent_damage_dealt)

agent_damage_dealt: blow damage after attacker amplifications. Consumer NavalAgentApplyDamageModel::ApplyDamageAmplifications (NavalDLC), base incoming_damage (the inflicted damage from step 5, only when > 0), combine rule custom, no clamp.

agent_damage_dealt = (incoming_damage + Σ S adds) · (1 + Σ S factors) · (1 + Σ N factors)

Banners (S)

Banner Bonus by level Conditions Verdict
Increased Melee Damage 0.05/0.1/0.15 attacker formation banner; melee weapon works
Increased Melee Damage Against Mounted Troops 0.1/0.2/0.3 attacker formation banner; melee weapon; victim has a mount (hits on the horse itself do not count) works
Increased Ranged Damage 0.04/0.06/0.08 attacker formation banner; non-melee consumable weapon (arrows, bolts, thrown) works
Increased Charge Damage 0.1/0.2/0.3 attacker formation banner; horse charge; rider is a troop or hero works
Decreased Charge Damage -0.1/-0.2/-0.3 victim formation banner; horse charge differs

Personality trait (S)

Source Bonus by trait level Conditions Verdict
Calculating trait (charge damage) 0.1 / 0.05 for the two lowest Calculating levels attacker formation has a charge order; the army leader, else the party leader, has the trait and is not the attacker works

Decreased Charge Damage differs: the in-game description reuses the Increased Charge Damage text (charge damage to mounted troops in your formation). The code reduces horse-charge damage taken by any victim in the banner formation, mounted or not, and only when the charging rider is a troop or hero.

SandBox perks (S)

Perk Half Bonus Stage Conditions Verdict
Basher (One Handed) primary 0.5 factor shield bash works
To Be Blunt (One Handed) primary 0.05 factor one-handed axe or mace works
Cavalry (One Handed) primary 0.05 factor one-handed weapon; mounted works
Cavalry (One Handed) secondary 0.05 factor captain; melee weapon; mounted works
Duelist (One Handed) primary 0.2 factor one-handed weapon; off hand empty works
Deadly Purpose (One Handed) primary 0.05 factor one-handed weapon works
Deadly Purpose (One Handed) secondary 0.1 factor captain; melee weapon; on foot works
Prestige (One Handed) primary 0.5 factor one-handed weapon; shield hit works
Way of the Sword (One Handed) secondary 0.005 factor bonus * (skill - 250) one-handed weapon works
Wood Chopper (Two Handed) primary 0.3 factor two-handed weapon; shield hit works
Wood Chopper (Two Handed) secondary 0.15 factor captain; two-handed weapon; shield hit differs
Head Basher (Two Handed) primary 0.1 factor two-handed axe or mace works
Head Basher (Two Handed) secondary 0.02 factor captain; on foot works
Shield breaker (Two Handed) primary 0.4 factor two-handed weapon; shield hit works
Shield breaker (Two Handed) secondary 0.1 factor captain; two-handed weapon; shield hit differs
Beast Slayer (Two Handed) primary 0.5 factor two-handed weapon; victim is a mount works
Beast Slayer (Two Handed) secondary 0.1 factor captain; two-handed weapon; victim is a mount differs
Berserker (Two Handed) primary 0.2 factor two-handed weapon; attacker hit point rate < 0.5 works
Confidence (Two Handed) primary 0.15 factor two-handed weapon; health above 0.9 works
Reckless Charge (Two Handed) secondary 0.02 factor captain; on foot works
Blade Master (Two Handed) primary 0.1 factor two-handed weapon works
Vandal (Two Handed) secondary 0.2 factor captain; destructible object hit works
Way Of The Great Axe (Two Handed) secondary 0.005 factor bonus * (skill - 250) two-handed weapon works
Pikeman (Polearm) primary 0.02 factor polearm; on foot works
Pikeman (Polearm) secondary 0.02 factor captain; on foot works
Cavalry (Polearm) primary 0.02 factor melee polearm; mounted works
Cavalry (Polearm) secondary 0.02 factor captain; mounted works
Braced (Polearm) secondary 0.1 factor captain; attacker human on foot; victim a rider or a ridden mount; any weapon works
Clean Thrust (Polearm) primary 0.1 factor melee polearm; thrust works
Steed Killer (Polearm) primary 0.7 factor melee polearm; victim is a mount works
Steed Killer (Polearm) secondary 0.3 factor captain; on foot works
Guards (Polearm) primary 0.5 factor melee polearm; head shot works
Phalanx (Polearm) secondary 0.03 factor captain works
Sharpen the Tip (Polearm) primary 0.05 factor polearm thrust works
Sharpen the Tip (Polearm) secondary 0.05 factor captain; on foot works
Way of the Spear (Polearm) secondary 0.005 factor bonus * (skill - 250) polearm works
Dead Aim (Bow) primary 0.3 factor bow; head shot works
Bow Control (Bow) secondary 0.05 factor captain; bow works
Strong bows (Bow) primary 0.08 factor bow works
Strong bows (Bow) secondary 0.05 factor captain; bow; troop tier at least 3 works
Hunter Clan (Bow) primary 0.3 factor bow; victim is a mount works
Deadshot (Bow) secondary 0.005 factor bonus * max(skill - 200, 0) bow works
Unhorser (Crossbow) primary 0.4 factor bolts; victim is a mount works
Unhorser (Crossbow) secondary 0.2 factor captain; bolts; victim is a mount works
Sheriff (Crossbow) primary 0.5 factor bolts; head shot works
Sheriff (Crossbow) secondary 0.1 factor captain; bolts; victim on foot works
Hammer Bolts (Crossbow) secondary 0.1 factor captain; bolts works
Mighty Pull (Crossbow) secondary 0.005 factor bonus * (skill - 200) bolts works
Shield Breaker (Throwing) primary 0.4 factor throwing weapon; shield hit works
Shield Breaker (Throwing) secondary 0.08 factor captain; throwing weapon; shield hit works
Hunter (Throwing) primary 0.4 factor throwing weapon; victim is a mount works
Hunter (Throwing) secondary 0.08 factor captain; throwing weapon; victim is a mount works
Flexible Fighter (Throwing) primary 0.1 factor throwing weapon used in melee works
Mounted Skirmisher (Throwing) secondary 0.1 factor captain; throwing weapon; mounted works
Knock Off (Throwing) secondary 0.05 factor captain; throwing weapon; victim mounted works
Last Hit (Throwing) primary 0.5 factor thrown weapon; victim health ≤ half differs
Head Hunter (Throwing) primary 0.5 factor throwing weapon; head hit works
Splinters (Throwing) primary 3.0 factor throwing axe; shield hit differs
Splinters (Throwing) secondary 0.5 factor captain; throwing weapon; shield hit works
Impale (Throwing) secondary 0.1 factor captain; throwing weapon works
Unstoppable Force (Throwing) secondary 0.005 factor bonus * max(skill - 200, 0) throwing weapon works
Full Speed (Riding) primary 0.2 factor horse charge; mounted works
Full Speed (Riding) secondary 0.1 factor captain; horse charge; mounted works
Horse Archer (Riding) primary 0.1 factor consumable weapon; mounted works
Horse Archer (Riding) secondary 0.05 factor captain; consumable weapon; mounted works
Mounted Warrior (Riding) primary 0.05 factor melee weapon; mounted works
Mounted Warrior (Riding) secondary 0.05 factor captain; melee weapon; mounted works
The Way Of The Saddle (Riding) primary 0.3 add max(skill - 250, 0) * bonus horse charge; rider's effective Riding works
Powerful (Athletics) primary 0.04 factor melee weapon works
Powerful (Athletics) secondary 0.02 factor captain; melee weapon works
Strong Arms (Athletics) primary 0.05 factor throwing weapon works
Strong Legs (Athletics) primary -0.5 (literal 1.0 used) factor 1 kick (no weapon, alternative attack) differs
Carver (Roguery) primary 0.1 factor civilian weapon works
Carver (Roguery) secondary 0.02 factor captain; one-handed melee weapon works
Partners in Crime (Roguery) secondary 0.02 factor captain; bandit troops works
Dash and Slash (Roguery) secondary 0.02 factor captain; two-handed melee weapon works
Coaching (Tactics) secondary 0.01 factor captain; attacker and victim are troops or heroes; every blow kind works
Law Keeper (Tactics) secondary 0.04 factor captain; victim is a bandit works
Gens d'armes (Tactics) primary 0.02 factor captain; mounted; victim on foot works
Torsion Engines (Engineering) secondary 3.0 add bolts works
Dreadful Besieger (Engineering) secondary 0.05 factor captain; bolts works
Wall Breaker (Engineering) secondary 0.1 factor captain; shield hit works
Improved Tools (Engineering) secondary 0.05 factor captain; melee weapon works

skill is the perk holder's skill in the perk's skill. The Way Of The Saddle uses the rider's effective Riding; 250 is MaxSkillRequiredForEpicPerkBonus.

differs reasons:

Perk Half Bonus Conditions Verdict
Brute Force (Mariner) primary 0.5 kick or bash works
Shield Breaker (Mariner) primary 0.3 captain; shield hit; naval battle works
Axe of the North Wind (Mariner) primary 0.2 melee axe; naval battle differs
Sunny Disposition (Mariner) primary 0.2 melee sword; naval battle works
Home Turf Advantage (Mariner) primary 0.2 melee weapon; on own ship; naval battle works
Home Turf Advantage (Mariner) secondary 0.2 captain; melee weapon; on own ship; naval battle works
Boarding Master (Mariner) primary 0.15 melee weapon; on an enemy ship; naval battle works
Boarding Master (Mariner) secondary 0.15 captain; melee weapon; on an enemy ship; naval battle works
Mighty Blows (Mariner) secondary 0.15 captain; two-handed weapon; naval battle works
Crew of Spears (Mariner) secondary 0.15 captain; throwing weapon; naval battle works
Warrior's Might (Mariner) primary 0.2 melee weapon; naval battle works
Warrior's Might (Mariner) secondary 0.2 captain; throwing weapon; naval battle works
The Sky's Fury (Mariner) primary 0.15 consumable weapon (Bow, Crossbow or Throwing skill); naval battle works
The Sky's Fury (Mariner) secondary 0.15 captain; bow or crossbow; naval battle works
The Corsair's Edge (Shipmaster) primary 0.1 one-handed weapon; naval battle works
Seaborne Fortress (Shipmaster) secondary -0.2 victim's captain; ranged weapon; victim crew not boarded; naval battle works
Accuracy Training (Boatswain) primary 0.3 captain; ranged weapon; shield hit; naval battle works

Reductions (agent_damage_taken)

agent_damage_taken: blow damage after victim reductions. Consumer NavalAgentApplyDamageModel::ApplyDamageReductions (NavalDLC), base scaled_damage, combine rule custom, no clamp.

scaled_damage      = agent_damage_dealt · damage_scaling
agent_damage_taken = scaled_damage · (1 + Σ S factors) · (1 + Σ N factors)

SandBox (S)

Source Half Bonus Conditions Verdict
Mounted Weapon Damage Penalty (Riding skill effect) — base -0.2, 0.002 per point, max 0 mounted attacker; not a crossbow differs
Banner: Decreased Taken Melee Attack Damage — -0.05/-0.1/-0.15 victim formation banner; melee weapon works
Banner: Decreased Taken Ranged Attack Damage — -0.05/-0.1/-0.15 victim formation banner; consumable weapon differs
Braced (Athletics) primary -0.4 horse charge (also the holder's horse) works
Braced (Athletics) secondary -0.3 captain; horse charge works
Sure Footed (Polearm) primary -0.4 horse charge works
Sure Footed (Polearm) secondary -0.3 captain; horse charge works
Strong Legs (Athletics) primary -0.5 fall damage works
Skirmish Phase Master (Bow) primary -0.1 projectile works
Skirmish Phase Master (Bow) secondary -0.1 captain; projectile; ranged troops works
Counter Fire (Crossbow) primary -0.1 projectile; victim holds a crossbow works
Counter Fire (Crossbow) secondary -0.03 captain; projectile; victim holds a crossbow differs
Skirmisher (Throwing) primary -0.1 projectile; victim holds a throwing weapon works
Skirmisher (Throwing) secondary -0.03 captain; projectile works
Basher (One Handed) secondary -0.04 captain; melee weapon; victim formation in shield wall differs
Shieldwall (One Handed) primary -0.2 shield block on the wrong side works
Steel Core Shields (One Handed) primary -0.1 shield hit works
Steel Core Shields (One Handed) secondary -0.1 captain; shield hit; on foot works
Elite Reserves (Tactics) secondary -0.05 captain works
Mounted Weapon Damage Penalty factor = min(0, −0.2 + 0.002 · Riding)
Source Half Bonus Conditions Verdict
The Helmsman's Shield (Shipmaster) primary -0.5 consumable weapon; victim at the helm; naval battle works
Ship helm damage reduction — helm_reduction_factor main agent at a helm; consumable weapon; naval battle works
Rallying Cry (Mariner) secondary -0.1 captain; melee weapon; victim on own ship; naval battle works
Terror of the Seas (Mariner) secondary -0.1 captain; melee weapon; victim on an enemy ship; naval battle works
Naval AI arrow and bolt reduction — -0.15 naval battle; consumable weapon; AI-controlled attacker with an arrow or bolt works
Naval storyline set-piece ballista reduction — -0.9 main agent at the helm object; BallistaBoulder; storyline set-piece mission type 5 works

General modifiers

After reductions, in ApplyGeneralDamageModifiers (SandBox, NavalDLC delegates):

Term Scaling Conditions Raised by Verdict
Throwing weapon damage bonus 1 + throwing_damage_bonus Throwing-skill weapon Raven figurehead works
Melee weapon damage bonus 1 + melee_damage_bonus melee weapon not of Throwing skill boarded ship's CrewMeleeDamageFactor works
General damage multiplier bonus 1 + damage_multiplier_bonus attacker agent exists 0 from UpdateHumanStats, minus the agentstat naval_damage_penalty for humans in naval battles works
Final floor max(raw_damage, 0) — — works

Shield-block branch

When the blow is blocked with a shield, ComputeBlowDamageOnShield replaces steps 2 to 5:

0 unless the shield CanBlockRanged and CanGiveDamageToAgentShield
raw    = ComputeRawDamage(damage type, magnitude, shield armor, 1)
raw    = raw · type factor
raw    = raw · 2                                   BonusAgainstShield
raw    = raw · ShieldRightStanceBlockDamageMultiplier (54)    unless the victim is in left stance   (raw > 0)
raw    = raw · ShieldCorrectSideBlockDamageMultiplier (55)    correct-side block                     (raw > 0)
shield = truncated(CalculateShieldDamage(raw))
Source Bonus Conditions Verdict
Banner: Decreased Taken Shield Damage -0.15/-0.25/-0.3 victim formation banner; shield block works

Passive attacks against shields

Unstoppable Force (Polearm) primary adds a +3.0 factor to passive_attack_damage (four times the damage) when the blow is blocked with a shield (see Passive usage magnitude).

Damage ignore chance

damage_ignore_chance: the chance that a missile hit on a back shield is ignored. Consumer SandboxAgentApplyDamageModel::IsDamageIgnored (SandBox, NavalDLC delegates), base 0, combine rule custom, no clamp.

chance  = bonus                      when a perk applies (Pavise), else 0
ignored = random roll ≤ chance       CalculateDamage returns 0
Perk Half Bonus Conditions Verdict
Pavise (Crossbow) primary 0.75 consumable attacker weapon; hit on the shield on the back; victim (or rider) has the perk works

Stagger

stagger_threshold_damage: the damage needed to interrupt the victim's attack. Consumer SandboxAgentApplyDamageModel::CalculateStaggerThresholdDamage (SandBox), base damage_interrupt_threshold, explained number, no clamp. Caller MissionCombatMechanicsHelper::DecideAgentShrugOffBlow.

stagger_threshold_damage = damage_interrupt_threshold · (1 + Σ factors)
Perk Half Bonus Conditions Verdict
Spartan (Athletics) primary 0.5 on foot works
Dauntless Steed (Riding) primary 0.5 mounted works
Deft Hands (Crossbow) primary 0.5 reloading a crossbow works
Deft Hands (Crossbow) secondary 0.5 captain; reloading a crossbow works

Dismount, knockback, knockdown

Can dismount

can_weapon_dismount: boolean (1 = true). Consumer SandboxAgentApplyDamageModel::CanWeaponDismount (SandBox), custom. Caller MissionCombatMechanicsHelper::DecideAgentDismountedByBlow.

  1. false unless the victim body part is in 0..6.
  2. true for a swing with CanHook by an unmounted attacker, or a thrust with CanDismount.
  3. else the perk overrides (troop or hero attacker).
  4. else false.
Perk Half Conditions Verdict
Hammer Bolts (Crossbow) primary bolts differs
Knock Off (Throwing) primary throwing weapon differs

Hammer Bolts and Knock Off differs: this check reads the perk without an environment, so it does not switch the land-only halves off in a naval battle. Ship crews always spawn unmounted; the Blocked Estuary story mission (a naval battle) spawns a horse for the player.

Dismount penetration

dismount_penetration: consumer SandboxAgentApplyDamageModel::GetDismountPenetration (SandBox), base 0, sequential, floor 0. Used after can_weapon_dismount.

dismount_penetration = max(0, 0 + 0.25 (swing with CanHook) + one perk add by weapon skill)
Source Half Bonus Conditions Verdict
Weapon CanHook and CanDismount flags — 0.25 swing with CanHook works
Braced (Polearm) primary 0.25 polearm differs
Hammer Bolts (Crossbow) primary 0.5 bolts differs
Knock Off (Throwing) primary 0.25 throwing weapon differs

Worked example. All terms are adds, so their order does not change the sum.

A swing with a polearm that has the CanHook flag, by a hero with Braced.

Step Source Stage Change Running value
Base Dismount penetration base 0.0000
1 Weapon CanHook and CanDismount flags add +0.2500 0.2500
2 Braced add +0.2500 0.5000
Result Dismount penetration 0.5000

With these inputs, dismount penetration is 0.5000.

Knockback penetration

knockback_penetration: consumer SandboxAgentApplyDamageModel::GetKnockBackPenetration (SandBox), base 0, sequential, no clamp. Used by MissionCombatMechanicsHelper::DecideAgentKnockedBackByBlow.

Perk Half Bonus Conditions Verdict
Keep at Bay (Polearm) primary 0.3 polearm thrust; attacker is a troop or hero differs

Knockdown penetration

knockdown_penetration: consumer SandboxAgentApplyDamageModel::GetKnockDownPenetration (SandBox), base 0, sequential, no clamp. Used by MissionCombatMechanicsHelper::DecideWeaponKnockDown after CanWeaponKnockDown.

  1. Boulder or BallistaBoulder weapons: return 0.25 at once.
  2. Non-melee weapons: 0.
  3. Swing: +0.1 for a leg hit, then Show of Strength for two-handed weapons.
  4. Any strike: +0.15 for a head hit, then Hard Knock for polearms.
Source Half Bonus Conditions Verdict
Boulder override — 0.25 Boulder or BallistaBoulder works
Leg hit — 0.1 melee swing; legs works
Head hit — 0.15 melee; head works
Show of Strength (Two Handed) primary 0.3 two-handed weapon; swing differs
Hard Knock (Polearm) primary 0.25 polearm differs

Braced, Keep at Bay, Show of Strength, Hard Knock, Hammer Bolts and Knock Off primary are differs: their halves are Add increments, so the tooltip prints the bonus unscaled as "+0.3%" or "+0.5%" (0.25 rounds to 0.3; see Tooltip rendering), while the game subtracts 0.25, 0.3 or 0.5 from a resistance that is a 0–1 fraction of the victim's health limit (25, 30 or 50 percentage points).

Couched lance pass-through

couched_lance_pass_through_chance: the chance that a couched lance passes through after a kill. Consumer SandboxAgentApplyDamageModel::DecidePassiveAttackCollisionReaction (SandBox, NavalDLC delegates), base 0.05, sequential, no clamp.

chance = 0.05 + Skewer                       victim killed and attacker HasMount
reaction = pass through when a random roll < chance, else bounce

The caller also requires a thrust, an attacker doing a passive attack and inflicted damage > 0.

Perk Half Bonus Conditions Verdict
Skewer (Polearm) primary 0.25 mounted works

Stun after a defended blow

attacker_stun_period: consumer SandboxAgentApplyDamageModel::CalculateDefendedBlowStunMultipliers (SandBox), base attacker_stun_base, sequential, cap stun_period_max.

attacker_stun_period = min(StunPeriodMax, attacker_stun_base · max(0, 1 + Σ perk terms))     Blocked or Parried
Perk Half Bonus Scaling Conditions Verdict
Mighty Blow (Athletics) primary 0.05 multiply 1 + bonus the perk holder's attack is blocked or parried differs

Mighty Blow differs: the tooltip says enemies are stunned longer; the IL lengthens the stun period named for the attacker, i.e. the perk holder. The engine code that uses that period is native.

Cleave momentum

cleave_momentum_loss: two-handed cleave momentum loss. Consumer NavalAgentApplyDamageModel::CalculateRemainingMomentum (NavalDLC), base 0, explained number, floor 0.

cleave_momentum_loss = (0 + armor_absorbed_share) · (1 + Mighty Blows)
armor_absorbed_share = AbsorbedByArmor / InflictedDamage          when InflictedDamage > 0
remaining momentum   = (momentum − cleave_momentum_loss) · 0.5,   0 when < 0.25

Base rule (AgentApplyDamageModel::CalculateDefaultRemainingMomentum, used for every other blow):

crush-through                                      0.3 · momentum
needs InflictedDamage > 0, no shield block or back-shield hit, agent hit, not horse charge:
passive attack                                     0.5 · momentum
CanHitMultipleTargets (not thrust, not another bone)   momentum · (1 − armor_absorbed_share) · 0.5,   0 when < 0.25
else                                               0

The naval recompute has no crush-through, shield-block or CanHitMultipleTargets test, and subtracts the loss from momentum instead of scaling momentum.

Source Half Bonus Stage Conditions Verdict
Armor-absorbed share of the blow — armor_absorbed_share add two-handed swing works
Mighty Blows (Mariner) primary -0.5 factor two-handed swing works

Worked example.

A two-handed swing whose first hit had 40% of the blow absorbed by armor, by a hero with Mighty Blows. Inputs: armor absorbed share 0.4.

Step Source Stage Change Running value
Base Two-handed cleave momentum loss base 0.0000
1 Armor-absorbed share of the blow add +0.4000 0.4000
2 Mighty Blows factor -50% -0.2000 0.2000
Result Two-handed cleave momentum loss 0.2000

With these inputs, two-handed cleave momentum loss is 0.2000.

Missile flags and shield break

Missile weapon flags

missile_weapon_flags: a flag set, not a number. Consumer NavalAgentApplyDamageModel::DecideMissileWeaponFlags (NavalDLC, extends), custom.

missile_flags = missile_flags | CanPenetrateShield        when a perk applies (Impale, Crew of Spears)
Perk Half Model Conditions Verdict
Impale (Throwing) primary SandBox javelin works
Crew of Spears (Mariner) primary NavalDLC javelin; naval battle works

Crew of Spears: naval battles only, which matches its naval_only half (Sea only). Its bonus (0.0) is not read.

Missile pass-through after a shield break

missile_pass_through_after_shield_break: boolean (1 = true). Consumer NavalAgentApplyDamageModel::ShouldMissilePassThroughAfterShieldBreak (NavalDLC, extends), base 0 (the SandBox model returns false), custom.

Perk Half Conditions Verdict
Crew of Spears (Mariner) primary throwing axe; naval battle works

Crew of Spears: naval battles only, which matches its naval_only half (Sea only).

Sail fire damage

sail_fire_damage: fire damage to a ship sail. Consumer NavalAgentApplyDamageModel::CalculateSailFireDamage (NavalDLC, extends), base weapon_fire_damage, explained number, no clamp.

sail_fire_damage = (weapon_fire_damage + Σ adds) · (1 + Σ factors)
Source Half Bonus Stage Conditions Verdict
Enemy of the Wood (Mariner) secondary 0.25 factor captain; enemy sails works
Special Arrows (Boatswain) primary 5.0 add captain; not a ship siege engine missile differs
Special Arrows (Boatswain) secondary 0.4 — — unused
Sea Serpent figurehead — -figurehead_effect factor the hit ship has the figurehead works

Game code

Decoded IL of the methods above (game v1.5.7):

Changelog