Combat damage
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:
NavalStrikeMagnitudeModel(NavalDLC) delegates every strike magnitude method toSandboxStrikeMagnitudeModel(SandBox), so the SandBox methods are live. It extendsCalculateAdjustedArmorForBlow: it calls the SandBox method and then recomputes the armor from scratch (see Adjusted armor).NavalAgentApplyDamageModel(NavalDLC) delegates most methods toSandboxAgentApplyDamageModel(SandBox). It extendsApplyDamageAmplifications,ApplyDamageReductions,CalculateSailFireDamage,DecideMissileWeaponFlagsandShouldMissilePassThroughAfterShieldBreak, and itsCalculateRemainingMomentumoverwrites the base result for two-handed swings.- NavalDLC registers both
NavalStrikeMagnitudeModelandNavalAgentApplyDamageModel(extends) in sandbox and story campaigns, with no naval-battle gate. Terms not marked "naval battle" apply in every mission. - The combat difficulty multiplier comes from
SandboxMissionDifficultyModel, registered inSandBox.SandBoxSubModule::InitializeGameStarter.
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 magnitude, by blow kind:
- missile:
missile_magnitude(see Missile magnitude), timesmomentum_remainingandagent_weapon_damage_multiplieronly. - melee swing: the maximum of
swing_strike_magnitudeover 5 impact points. - melee thrust:
thrust_strike_magnitude. - passive usage (couch or brace):
passive_attack_damage. - kick or shield bash:
alternative_attack_magnitude · momentum_remaining, no further terms. - no weapon:
unarmed_magnitude, no further terms. - horse charge:
horse_charge_magnitude. - fall:
fall_magnitude.
- missile:
momentum_remaining: 1 for the first target, then the remaining momentum after each cleave (see Cleave momentum).arm_hit_multiplier: for a hit with another bone,ThrustHitWithArmDamageMultiplier(ManagedParameters 20) for thrusts andSwingHitWithArmDamageMultiplier(19) for swings; else, for a thrust that is not a tip hit and not shield-blocked,NonTipThrustHitDamageMultiplier(21); else 1.agent_weapon_damage_multiplier: agentstat game number.weapon_damage_factor: the weapon'sThrustDamageFactorfor thrusts,SwingDamageFactorotherwise. Applied to weapon melee blows only, not to missiles, kicks or unarmed hits.- The clamp to [0, 500] is applied in
ComputeBlowMagnitude.
| 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)
blow_adjusted_armor: the victim's armor of the hit body part after the attacker's penetration effects (see Adjusted armor). 0 for fall damage.- +10 when the blow hits a shield the victim carries on the back (
CollidedWithShieldOnBackandShieldOnBackset).
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 |
absorbed_ratio: the victim'sMonster.AbsorbedDamageRatio.- Kick or bash, fall, horse charge, empty weapon or another-bone hits count as Blunt here. This override does not reach the bone multiplier in step 4, which uses the collision's own damage type.
- An invalid damage type asserts and returns 0.
ComputeRawDamagelives inSandboxStrikeMagnitudeModel; NavalDLC delegates.
4. Multipliers
m = bone_multiplier · sneak_attack_damage_multiplier · combat_difficulty_multiplier
m = 1 for a shield block or fall damage
sneak_attack_damage_multiplier: agentstat game number, only when the weaponCanWeaponDealSneakAttack.combat_difficulty_multiplier:Mission.DamageToPlayerMultiplierwhen the victim (or the rider of the victim mount) is the main agent;DamageFromPlayerToFriendsMultiplierwhen the victim is in the main agent's battle side and the attacker is the main agent, elseDamageToFriendsMultiplier; else 1.bone_multiplier(GetDamageMultiplierForBodyPart, NavalDLC delegates):
| 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)
IsDamageIgnored: see Damage ignore chance.- Amplifications: agent_damage_dealt. Reductions: agent_damage_taken. General modifiers: General modifiers.
damage_scaling(ApplyDamageScaling, NavalDLC delegates): 4.5 whenMission.IsSallyOutBattleand the hit destructible component's entity has a specific script component, else 1. Needs a hit destructible component, so agent hits are unaffected.- The throwing and melee bonuses are exclusive: Throwing-skill weapons take the throwing bonus, other melee weapons the melee bonus.
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)
- Velocity contributions use the mount's velocity when the agent is mounted.
- Swing and thrust add perks only when the attacker is a troop or hero and
extra_linear_speed > 0; otherwise the result isextra_linear_speed. Passive usage has no such gate. - A mounted attacker gets Nomadic Traditions only; an attacker on foot gets the on-foot perks. Lancer and Unstoppable Force apply to Polearm in both cases.
- Passive usage has no Reckless Charge or Dash and Slash terms.
| 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
swing_speed = GetModifiedSwingSpeedForCurrentUsage / 4.5454545 · sqrt(speed_graph),speed_graph = SpeedGraphFunction(AttackProgress, strike type, direction).weapon_weight: item weight.weapon_length:GetRealWeaponLength.weapon_inertia:TotalInertia.weapon_center_of_mass:CenterOfMass.impact_point_i = a + i / 4 · (b − a),i = 0..4,a = min(0.93, p),b = min(0.93, p + clamp(0.4 / length, 0, 1)); the caller keeps the maximum magnitude.p = clamp(CollisionDistanceOnWeapon, −0.2, L) / LwithL= length + weapon offset z.
| 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
thrust_speed = GetModifiedThrustSpeedForCurrentUsage / 11.7647057 · sqrt(speed_graph).- The +2.5 on the weight is skipped for thrown weapons; the melee caller passes not-thrown.
| 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)
- Computed only when the attacker or victim has a mount or the victim is a mount, else 0.
- Then blow pipeline step 1 (momentum, arm hit, weapon multiplier, damage factor).
| 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 |
- Unstoppable Force
differs: the +3.0 factor gives four times the damage, not the tooltip's triple.
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.
armor= the victim's base armor effectiveness for the hit body part, the agentstatagent_armor_*value of that body part; 0 without a victim agent.- Fall damage skips the call (armor 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))
- The naval model calls the base and keeps
a0only as a > 0 gate. It re-tests Piercer and Slinging Competitions (never true here: they already gavea0 = 0) and recomputes from scratch with Vandal, Chink in the Armor, Bodkin, Puncture, Weak Spot, Shattering Blow (melee) or Shattering Volley (consumable with a relevant skill). - Each perk counts once. The SandBox factors are computed but their result is discarded whenever it is > 0; the live value comes from the naval recompute alone (plus the Piercer and Slinging Competitions zero results).
- The recompute drops the
(1 − armor_penetration_bow/crossbow)step. These agent properties are raised only by the Saber-tooth tiger figurehead, so that figurehead is inert: its armor penetration never reaches damage. - The armor perk bonuses (Vandal, Chink in the Armor, Bodkin, Puncture, Weak Spot, Shattering Blow, Shattering Volley) are positive factors summed into
E = armor · (1 + Σ bonus), so the adjusted armor ismax(0, armor · (1 − Σ bonus)): a +25% perk removes 25% of the hit body part's armor. - Captain halves use the attacker's captain, nulled when it is the attacker.
| 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 |
- Every row except Shattering Blow, Shattering Volley and the figurehead is read by both the SandBox method and the NavalDLC recompute with the same bonus; the live value is the NavalDLC one.
- Chink in the Armor
differs: only weapons with relevant skill One Handed; the tooltip says melee attacks (two-handed and polearm are not covered). - Vandal applies before any weapon test, so every attack counts.
- Shattering Blow and Shattering Volley have no naval-battle test of their own; their halves are naval_only, so they give nothing outside naval battles, as the tooltip shows (Sea only).
- Saber-tooth tiger figurehead
differs: inert, see above.
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)
S: terms added inSandboxAgentApplyDamageModel::ApplyDamageAmplifications. All S terms need the attacker character (the rider's character when the attacker is a mount) to be a troop or hero, else the result isincoming_damage.N: terms added inNavalAgentApplyDamageModel::ApplyDamageAmplifications, a standard modifier sum on the SandBox result. Terms only with an attacker that is a troop or hero.- The two modifier sums stack multiplicatively. Factors inside one sum add.
- Shield-block damage passes through this step too (see Shield-block branch), so "damage to shields" perks act on it.
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:
- Wood Chopper, Shield breaker and Beast Slayer secondary: applied only when the attacking troop wields a two-handed melee weapon; the tooltip says any troops in the formation.
- Last Hit: only thrown-weapon hits, which the tooltip does not state. The test is victim health ≤ 0.5 · max health, health before the blow, equality included.
- Splinters primary: a +300% percentage factor is added to the summed factors, i.e. 4× base damage on its own (more with other factors), not triple.
- Strong Legs primary: the kick bonus is a literal +100% percentage factor; no perk bonus value is read. It matches the tooltip's +100% kick damage, but it takes no environment, so it stays +100% at sea although the half is reduced at sea. Its -0.5 bonus is the fall damage reduction (see Reductions).
- Berserker and Confidence are exclusive (else-branch).
NavalDLC perks (N)
| 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 |
- Every Mariner half here is naval_only: the naval-battle test matches the tooltip line (Sea only), so it is not a difference. Brute Force has no naval-battle test of its own; its attacker environment gives nothing outside naval battles.
- Axe of the North Wind
differs: melee axes only (thrown axes excluded); not in the tooltip. - Sunny Disposition: daggers excluded.
- Warrior's Might primary: unarmed blows excluded.
- The Sky's Fury primary: shield hits included.
- Seaborne Fortress is a victim reduction placed in the amplification method: it reads the victim's captain.
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)
S: terms added inSandboxAgentApplyDamageModel::ApplyDamageReductions. All victim terms only when the victim character (the rider's character for a mount) is a troop or hero. Mounted Weapon Damage Penalty is an attacker term.N: terms added inNavalAgentApplyDamageModel::ApplyDamageReductions, a standard modifier sum on the SandBox result. Terms only with a victim that is a troop or hero and an attacker weapon.
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)
Riding: the attacker (rider) effective Riding.- Mounted Weapon Damage Penalty
differs: skipped when the weapon's relevant skill is Crossbow, which the description does not say. - Decreased Taken Ranged Attack Damage
differs: the in-game description is the morale-shock text ("% morale penalty from casualties"); the code reduces ranged damage taken. - Counter Fire secondary
differs: only troops wielding a crossbow in the main hand get the reduction; the tooltip says all troops. - Basher secondary
differs: only melee hits are reduced; the tooltip says all damage. There is no infantry or on-foot check, so it is broader than the tooltip on that side.
NavalDLC (N)
| 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 |
- The helm object carries a
UserDamageCalculateComponent, added to the pilot standing point. The main agent at the helm always gets the component's -0.6 factor regardless of the perk.
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))
- Shield armor:
GetModifiedArmorForCurrentUsageof the shield. - Type factor: missiles ThrowingAxe ×0.3, Javelin ×0.5, CanPenetrateShield+MultiplePenetration ×0.5, else ×0.15; melee Cut or Blunt ×0.7, Pierce ×0.5.
CalculateShieldDamage(SandBox, NavalDLC delegates):shield · (1 + banner bonus).- The result is stored as both inflicted damage and armor-absorbed damage.
- Step 6 still runs on this shield damage, so shield terms of the amplifications and reductions act on it: Wall Breaker, Prestige, Wood Chopper, Shield breaker, Shield Breaker (Throwing and Mariner), Splinters, Steel Core Shields, Shieldwall.
| 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)
damage_interrupt_threshold: ManagedParametersDamageInterruptAttackThresholdCut(10) for Cut,…Pierce(9) for Pierce,…Blunt(11) otherwise, by the blow's damage type.- Perk terms only for a troop or hero agent. Mounted agents get Dauntless Steed, others Spartan (if/else). Deft Hands when the wielded crossbow is reloading.
- Captain: the formation captain's character, nulled when it is the agent.
| 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.
- false unless the victim body part is in 0..6.
- true for a swing with CanHook by an unmounted attacker, or a thrust with CanDismount.
- else the perk overrides (troop or hero attacker).
- 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.
- Boulder or BallistaBoulder weapons: return 0.25 at once.
- Non-melee weapons: 0.
- Swing: +0.1 for a leg hit, then Show of Strength for two-handed weapons.
- 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
attacker_stun_base: computed inMissionCombatMechanicsHelper::GetDefendCollisionResultsfrom ManagedParameters stun terms (weapon weight offsets and bonuses, stance, block kind); not decomposed.StunPeriodMax: ManagedParameters 46. After the model call,GetDefendCollisionResultstakesmin(StunPeriodMax, value).- The defender multiplier stays 1.
| 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
- Computed only for agent hits that are not horse charges, an attacker not doing a passive attack, not a hit with another bone, a non-empty weapon, not a thrust, relevant skill Two Handed. No naval-battle gate.
- It overwrites the base result for every qualifying two-handed swing, with or without the perk.
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)
- The SandBox base model returns its damage argument unchanged.
weapon_fire_damage: the weapon's fire damage, scaled for missiles by the missile velocity length over a reference speed (MissionShip::OnHit). The reference speed comes from native engine code.- Captain perks come from the attacker's formation captain, self not excluded.
| 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 |
- Special Arrows primary
differs: it also adds +5 flat sail fire damage, not stated by the tooltip.MissionShip::OnHitmarks the hit as coming from a siege engine, so only the sail-hit path applies. The add was intended for the secondary half. - Special Arrows secondary
unused: the only sail-damage reader applies the primary half (role Captain, +5 add) and never the secondary FirstMate +40% factor. - The Sea Serpent factor also applies to hull fire damage, which no skill touches.
Game code
Decoded IL of the methods above (game v1.5.7):
- TaleWorlds.MountAndBlade.Mission.il:
GetAttackCollisionResults(final rounding). - TaleWorlds.MountAndBlade.MissionCombatMechanicsHelper.il:
ComputeBlowMagnitude,ComputeBlowMagnitudeMelee,ComputeBlowMagnitudeMissile,ComputeBlowMagnitudeFromHorseCharge,ComputeBlowMagnitudeFromFall,CalculateBaseMeleeBlowMagnitude,ConvertBaseAttackMagnitude,ComputeBlowDamage,ComputeBlowDamageOnShield,GetDefendCollisionResults. - TaleWorlds.MountAndBlade.ComponentInterfaces.AgentApplyDamageModel.il:
CalculateDamage,CalculateDefaultRemainingMomentum. - TaleWorlds.MountAndBlade.AttackInformation.il: armor, absorbed ratio, bone multiplier and captain fields.
- TaleWorlds.Core.CombatStatCalculator.il: swing, thrust and passive-usage magnitude formulas.
- SandBox.GameComponents.SandboxStrikeMagnitudeModel.il:
CalculateStrikeMagnitudeForSwing,CalculateStrikeMagnitudeForThrust,CalculateBaseBlowMagnitudeForPassiveUsage,CalculateStrikeMagnitudeForMissile,CalculateStrikeMagnitudeForUnarmedAttack,CalculateAdjustedArmorForBlow,ComputeRawDamage. - NavalDLC.GameComponents.NavalStrikeMagnitudeModel.il:
CalculateAdjustedArmorForBlow(recompute). - SandBox.GameComponents.SandboxAgentApplyDamageModel.il:
ApplyDamageAmplifications,ApplyDamageScaling,ApplyDamageReductions,ApplyGeneralDamageModifiers,CalculateShieldDamage,CalculateAlternativeAttackDamage,CalculatePassiveAttackDamage,GetDamageMultiplierForBodyPart,IsDamageIgnored,CalculateStaggerThresholdDamage,CanWeaponDismount,GetDismountPenetration,GetKnockBackPenetration,GetKnockDownPenetration,DecidePassiveAttackCollisionReaction,CalculateDefendedBlowStunMultipliers,DecideMissileWeaponFlags. - NavalDLC.GameComponents.NavalAgentApplyDamageModel.il:
ApplyDamageAmplifications,ApplyDamageReductions,CalculateRemainingMomentum,CalculateSailFireDamage,DecideMissileWeaponFlags,ShouldMissilePassThroughAfterShieldBreak. - SandBox.GameComponents.SandboxMissionDifficultyModel.il:
GetDamageMultiplierOfCombatDifficulty.
Changelog
- v1.5.7 (2026-11-12): Re-verified against v1.5.7 IL: Calculating trait charge-damage factor added; Unstoppable Force adds a +300% factor (×4); Pavise is no longer clamped; Skewer adds 0.25; Accuracy Training applies; perk halves follow the perk effect environment; Braced, Keep at Bay, Show of Strength, Hard Knock, Hammer Bolts and Knock Off dismount/knockdown halves are differs (tooltip +0.3% or +0.5%).
- v1.4.8 (2026-11-11): First version from IL.