Bannerlord mechanics

Sieges

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

Every game number of the campaign siege (bombardment, engine construction, walls, engine losses) that a skill, perk or building changes, at full precision for game v1.5.7: hit chance, damage, rate of fire and hit points of siege engines, construction progress, wall hit points, crew casualties when an engine is destroyed, collateral casualties of a bombardment hit, prebuilt engines and the fire engines offered in the siege production menu.

No official module overrides DefaultSiegeEventModel, DefaultWallHitPointCalculationModel or SiegeEventCampaignBehavior: NavalDLC, SandBox and StoryMode leave every number here to the base game. SandBox only provides the player's siege production menu, the sole caller of the fire-engine lists.

Plain-language versions per skill: Engineering, Tactics, Crossbow, Medicine, Steward.

Conventions

Engine stats come from game data

The per-engine stats are not set by the siege formulas. Hit chance, anti-personnel hit chance, damage, base hit points, campaign rate of fire per day and man-day cost are defined for each engine type in the game's siege engine data files, which the game reads when it loads.

Sides and holders

Reading the tables

Each game number has a header table (consumer method, base, combine rule, clamp) and a source table. Value is the perk half's bonus (for a skill effect, the bonus per skill point); bonus in a scaling expression is this value. Stage: add adds to the sum, factor adds to the factor sum, multiply multiplies the running value, base sets the base, override sets the value outright.

Verdict:

Combine rules

explained_number numbers are built by the game's standard modifier sum:

result = clamp( (base + Σ add) · (1 + Σ factor), min, max )

sequential numbers are plain values or counts where each step applies to the running value in code order. max is a yes/no flag set when any source holds.

Effective siege party of the defenders

Consumer DefaultSiegeEventModel::GetEffectiveSiegePartyForSide (Native)
Base 0
Combine rule custom
Clamp none

The attackers' effective siege party is always the besieger camp's leader party. For the defenders, each party in the besieged settlement's siege that has a leader hero scores the raw Engineering of its effective engineer (0 without one). The highest score wins; on a tie the first party keeps it. When every score is 0 the defenders have no effective siege party, so defender-side terms that need it do not apply.

Source Stage Value Conditions Verdict
Engineering skill level add Engineering of the party's effective engineer siege=defender; role=Engineer works

IL: GetEffectiveSiegePartyForSide.

Bombardment

Hit chance

The chance that one ranged engine shot hits its target. Callers roll a random number below the result.

Consumer DefaultSiegeEventModel::GetSiegeEngineHitChance (Native)
Base engine_hit_chance
Combine rule explained_number
Clamp min 0
hit_chance = max(0, (engine_hit_chance − wall_defense) · (1 + Σ factor))
Source Kind Value Stage Scaling Conditions Verdict
Fortifications (town) building add -wall_defense settlement=town;siege=attacker;siege_engine=target_ranged_engines works
Fortifications (castle) building add -wall_defense settlement=castle;siege=attacker;siege_engine=target_ranged_engines works
Dreadful Besieger (Engineering, primary) perk 0.1 factor bonus role=Governor;siege=defender;siege_engine=target_ranged_engines differs
Pavise (Crossbow, secondary) perk 0.3 factor bonus role=Governor;settlement=under_siege;siege=defender;siege_engine=ballista differs
Foreman (Engineering, primary) perk 0.1 factor bonus role=Engineer;siege_engine=onager|trebuchet|fire_onager works
Salvager (Engineering, primary) perk 0.2 factor bonus role=Engineer;siege_engine=ballista|fire_ballista works
Dungeon Architect (Engineering, primary) perk -0.25 factor bonus role=Engineer;siege=attacker;siege_engine=target_ranged_engines. In this row siege=attacker names the side that holds the perk (the besiegers); the shot is fired by the defenders. differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetSiegeEngineHitChance.

Code order: base, wall penalty, the defender-only block (Dreadful Besieger, Pavise), then the engineer factors (Foreman, Salvager, Dungeon Architect).

Worked example. A ballista with Salvager against level 3 walls:

A besieger ballista with a hit chance of 0.4 (an example value) fires at the defenders' ranged engines of a town with level 3 walls; the besieger party's engineer has Salvager. Inputs: engine hit chance 0.4.

Step Source Stage Change Running value
Base Siege bombardment hit chance of a ranged engine shot base 0.4000
1 Fortifications (town) add -0.1500 0.2500
2 Salvager factor +20% +0.0500 0.3000
Result Siege bombardment hit chance of a ranged engine shot 0.3000

With these inputs, siege bombardment hit chance of a ranged engine shot is 0.3000.

Worked example. The wall penalty pushes a weak engine below zero:

A besieger engine with a hit chance of 0.1 (an example value) fires at the defenders' ranged engines of a town with level 3 walls. Inputs: engine hit chance 0.1.

Step Source Stage Change Running value
Base Siege bombardment hit chance of a ranged engine shot base 0.1000
1 Fortifications (town) add -0.1500 -0.0500
Clamp minimum 0 clamp +0.0500 0.0000
Result Siege bombardment hit chance of a ranged engine shot 0.0000

With these inputs, siege bombardment hit chance of a ranged engine shot is 0.0000 (limited from -0.0500).

Damage

The damage of one shot, subtracted from the target engine's or the wall's hit points.

Consumer DefaultSiegeEventModel::GetSiegeEngineDamage (Native)
Base engine_damage
Combine rule explained_number
Clamp none
damage = engine_damage · (1 + Σ factor)
Source Kind Value Stage Scaling Conditions Verdict
Wall Breaker (Engineering, primary) perk 0.25 factor bonus role=Engineer;siege=attacker;siege_engine=target_wall works
Make Them Pay (Tactics, primary) perk 0.25 factor bonus role=Engineer;settlement=under_siege;siege=attacker;siege_engine=target_ranged_engines works
Make Them Pay (Tactics, secondary) perk 0.25 factor bonus role=Governor;settlement=under_siege;siege=defender;siege_engine=target_ranged_engines works
Masterwork (Engineering, primary) perk 0.01 factor bonus * max(0, leader_skill - 250) role=Engineer;siege_engine=target_wall_or_ranged_engines differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetSiegeEngineDamage.

Worked example. A trebuchet shot at the walls with Wall Breaker and Masterwork:

A besieger trebuchet with damage 100 (an example value) fires at the walls; the besieger party's engineer has Wall Breaker and Masterwork, and the party leader has Engineering 300. Inputs: engine damage 100.

Step Source Stage Change Running value
Base Bombardment damage of a ranged siege engine shot base 100.0000
1 Masterwork factor +50% +50.0000 150.0000
2 Wall Breaker factor +25% +25.0000 175.0000
Result Bombardment damage of a ranged siege engine shot 175.0000

With these inputs, bombardment damage of a ranged siege engine shot is 175.0000.

Rate of fire

Consumer DefaultSiegeEventModel::GetRangedSiegeEngineReloadTime (Native)
Base engine_rate_of_fire_per_day
Combine rule explained_number
Clamp none
rate          = engine_rate_of_fire_per_day · (1 + Σ factor)
reload_minutes = round(1440 / rate)

The method returns the reload time in minutes, not the rate, so a factor shortens the reload time by 1 / (1 + factor).

Source Kind Value Stage Scaling Conditions Verdict
Clockwork (Engineering, primary) perk 0.25 factor bonus role=Engineer;siege_engine=ballista|fire_ballista works
Architectural Commissions (Engineering, primary) perk 0.25 factor bonus role=Engineer;siege_engine=onager|trebuchet|fire_onager works

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetRangedSiegeEngineReloadTime.

Worked example. A ballista with Clockwork:

A ballista with a campaign rate of fire of 4 shots per day (an example value) on a side whose effective siege party's engineer has Clockwork. Inputs: engine rate of fire per day 4.

Step Source Stage Change Running value
Base Campaign rate of fire of a ranged siege engine base 4.0000
1 Clockwork factor +25% +1.0000 5.0000
Result Campaign rate of fire of a ranged siege engine 5.0000

With these inputs, campaign rate of fire of a ranged siege engine is 5.0000.

Collateral casualties of a bombardment hit

Consumer DefaultSiegeEventModel::GetColleteralDamageCasualties (Native)
Base 1
Combine rule sequential
Clamp none
casualties = 1 + (1 if Terror holder wins its roll)
Source Kind Value Stage Scaling Conditions Verdict
Terror (Crossbow, primary) perk 0.2 add bonus role=PartyLeader works

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetColleteralDamageCasualties; TaleWorlds.CampaignSystem.CampaignBehaviors.SiegeEventCampaignBehavior: BombardHitEngineCasualties, KillRandomTroopsOfEnemy.

Siege engines

Construction progress

The fraction of an engine built per hour (1 = built).

Consumer DefaultSiegeEventModel::GetConstructionProgressPerHour (Native)
Base available_man_day_power / (man_day_cost * 24)
Combine rule explained_number
Clamp none
progress = available_man_day_power / (man_day_cost · 24) · (1 + Σ factor)
Source Kind Value Stage Scaling Conditions Verdict
Faster siege engine production (Engineering skill effect) skill effect 0.001 factor bonus * skill role=Engineer works
Siege Workshop (town) building factor building_amount settlement=town;siege=defender works
Siege Workshop (castle) building factor building_amount settlement=castle;siege=defender works
Sweatshops (Steward, secondary) perk 0.2 factor bonus role=Quartermaster differs
Improved Tools (Engineering, primary) perk 0.2 factor bonus role=Engineer works
Scaffolds (Engineering, primary) perk 0.1 factor bonus role=Engineer;siege_engine=non_ranged works
Torsion Engines (Engineering, primary) perk 0.1 factor bonus role=Engineer;siege_engine=ranged works
Salvager (Engineering, secondary) perk 0.001 factor bonus * militia role=Governor;siege=defender works
Calculating trait: besieger siege engine construction term factor trait_effect hero=army_or_party_leader_calculating_trait;siege=attacker works
Valor trait: besieger siege camp preparation term factor trait_effect hero=army_or_party_leader_valor_trait;siege=attacker;siege_engine=preparations works

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetConstructionProgressPerHour, GetAvailableManDayPower.

Code order: base, skill effect, Siege Workshop, governor skill call, Sweatshops, Improved Tools or Scaffolds / Torsion Engines, Salvager, then the besiegers' trait terms.

Worked example. A besieger engine before the camp is built, so Improved Tools applies and Scaffolds / Torsion Engines do not:

A besieger side with 400 healthy men (available man-day power 20) builds an engine with a man-day cost of 10 (an example value) while the siege camp is still unbuilt; its engineer has Engineering 200 and Improved Tools, and the camp leader party's quartermaster has Sweatshops. Inputs: available man day power 20, man day cost 10.

Step Source Stage Change Running value
Base Siege engine construction progress per hour base 0.0833
1 Improved Tools factor +20% +0.0167 0.1000
2 Sweatshops factor +20% +0.0167 0.1167
3 Faster siege engine production factor +20% +0.0166 0.1333
Result Siege engine construction progress per hour 0.1333

With these inputs, siege engine construction progress per hour is 0.1333.

Hit points

The maximum hit points of a siege engine.

Consumer DefaultSiegeEventModel::GetSiegeEngineHitPoints (Native)
Base engine_base_hit_points
Combine rule explained_number
Clamp none
hit_points = engine_base_hit_points · (1 + Σ factor)
Source Kind Value Stage Scaling Conditions Verdict
Siege Engineer (Engineering, primary) perk 0.3 factor bonus role=Governor;siege=defender works
Siegeworks (Engineering, primary) perk 0.1 factor bonus role=Engineer;siege_engine=ranged works
Carpenters (Engineering, primary) perk 0.33 factor bonus role=Engineer;siege=attacker;siege_engine=non_ranged works

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetSiegeEngineHitPoints.

Prebuilt ballistas in a new besieger camp

Consumer DefaultSiegeEventModel::GetPrebuiltSiegeEnginesOfSiegeCamp (Native)
Base 0
Combine rule sequential
Clamp none
Source Kind Value Stage Scaling Conditions Verdict
Battlements (Engineering, primary) perk 1.0 add 1 role=Engineer;siege=attacker differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetPrebuiltSiegeEnginesOfSiegeCamp.

Prebuilt catapults in a besieged fortification

Consumer DefaultSiegeEventModel::GetPrebuiltSiegeEnginesOfSettlement (Native)
Base 0
Combine rule sequential
Clamp none
catapults = ceil(Σ building_amount) + (1 if the governor has Siegeworks)
Source Kind Value Stage Scaling Conditions Verdict
Siege Workshop (town) building add ceil(building_amount) settlement=town;siege=defender works
Siege Workshop (castle) building add ceil(building_amount) settlement=castle;siege=defender works
Siegeworks (Engineering, secondary) perk 1.0 add 1 role=Governor;settlement=fortification;siege=defender differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetPrebuiltSiegeEnginesOfSettlement.

Fire engines in the siege production menu

Consumer DefaultSiegeEventModel/<GetAvailableAttackerRangedSiegeEngines>d__21::MoveNext (Native)
Base 0
Combine rule max
Clamp none

A yes/no flag: the fire variants are listed when the party's effective engineer holds Stonecutters (secondary) or Siege Engineer (secondary). The attacker list is ballista, fire ballista, onager, fire onager, trebuchet; the defender list is ballista, fire ballista, catapult, fire catapult. Both lists apply the same test.

Source Kind Value Stage Scaling Conditions Verdict
Stonecutters (Engineering, secondary) perk n/a override 1 party=main_party;role=Engineer;siege=attacker;siege_engine=fire_ballista|fire_onager differs
Stonecutters (Engineering, secondary) perk n/a override 1 party=main_party;role=Engineer;siege=defender;siege_engine=fire_ballista|fire_catapult differs
Siege Engineer (Engineering, secondary) perk n/a override 1 party=main_party;role=Engineer;siege=attacker;siege_engine=fire_ballista|fire_onager differs
Siege Engineer (Engineering, secondary) perk n/a override 1 party=main_party;role=Engineer;siege=defender;siege_engine=fire_ballista|fire_catapult differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel+<GetAvailableAttackerRangedSiegeEngines>d__21: MoveNext; TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel+<GetAvailableDefenderSiegeEngines>d__22: MoveNext.

Walls

Wall hit points

Consumer DefaultWallHitPointCalculationModel::CalculateMaximumWallHitPointInternal (Native)
Base wall_base_hit_points
Combine rule sequential
Clamp none
hp  = wall_base_hit_points
hp += hp · bonus        (governor has Engineering Guilds)
Source Kind Value Stage Scaling Conditions Verdict
Fortifications (town) building base wall_base_hit_points settlement=town works
Fortifications (castle) building base wall_base_hit_points settlement=castle works
Engineering Guilds (Engineering, secondary) perk 0.25 multiply 1 + bonus role=Governor;settlement=fortification works

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultWallHitPointCalculationModel: CalculateMaximumWallHitPointInternal, CalculateMaximumWallHitPoint.

Worked example. Level 3 walls with an Engineering Guilds governor:

A town with level 3 walls (base 67000 wall hit points) whose governor has Engineering Guilds. Inputs: wall base hit points 67000.

Step Source Stage Change Running value
Base Maximum wall hit points of a fortification base 67000.0000
1 Fortifications (town) base 67000.0000 +0.0000 67000.0000
2 Engineering Guilds multiply ×1.25 +16750.0000 83750.0000
Result Maximum wall hit points of a fortification 83750.0000

With these inputs, maximum wall hit points of a fortification is 83750.0000.

Engine destruction

Crew casualty chance

The chance that a destroyed siege engine causes casualties on its own side.

Consumer DefaultSiegeEventModel::GetCasualtyChance (Native)
Base 1
Combine rule sequential
Clamp none
chance = 1.0 + Σ add
Source Kind Value Stage Scaling Conditions Verdict
Camp Building (Engineering, secondary) perk -0.2 add bonus role=Engineer differs
Siege Medic (Medicine, secondary) perk 0.3 add -bonus role=Surgeon differs
Battle Hardened (Medicine, secondary) perk -0.25 add bonus role=Governor;siege=defender differs

IL: TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetCasualtyChance.

Worked example. A destroyed defender engine with all three perks:

A defender siege engine is destroyed; the defenders' effective siege party has an engineer with Camp Building and a surgeon with Siege Medic, and the town governor has Battle Hardened.

Step Source Stage Change Running value
Base Chance that a destroyed siege engine kills its crew base 1.0000
1 Camp Building add -0.2000 0.8000
2 Siege Medic add -0.3000 0.5000
3 Battle Hardened add -0.2500 0.2500
Result Chance that a destroyed siege engine kills its crew 0.2500

With these inputs, chance that a destroyed siege engine kills its crew is 0.2500.

Crew casualties

Consumer SiegeEventCampaignBehavior::OnSiegeEngineDestroyed (Native)
Base 2
Combine rule sequential
Clamp none
if random ≤ crew_casualty_chance(destroyed engine's side):
    casualties = 2
    casualties = casualties · 2      (Pick Them Off The Walls holder wins its roll)
    casualties = round_random(casualties · (1 + trait_effect))      (Valor of the destroyed side's leader)
Source Kind Value Stage Scaling Conditions Verdict
Pick Them Off The Walls (Tactics, primary) perk 0.25 multiply 2 role=Engineer;settlement=under_siege;siege=attacker differs
Pick Them Off The Walls (Tactics, secondary) perk 0.25 multiply 2 role=Governor;settlement=under_siege;siege=defender differs
Valor trait: crew casualties when a siege engine is destroyed term multiply 1 + trait_effect hero=army_or_party_leader_valor_trait works

IL: TaleWorlds.CampaignSystem.CampaignBehaviors.SiegeEventCampaignBehavior: OnSiegeEngineDestroyed, KillRandomTroopsOfEnemy; TaleWorlds.CampaignSystem.GameComponents.DefaultSiegeEventModel: GetSiegeEngineDestructionCasualties.

Troop experience when an engine is built

SiegeEventCampaignBehavior::OnSiegeEngineBuilt also grants Apprenticeship (Engineering, primary) troop experience. It is described with the other roster XP grants on Battles.

Tooltip vs game

Perk Game number What the game does
Dreadful Besieger Hit chance defender shots at enemy ranged engines only
Pavise Hit chance plain ballista only, not the fire ballista
Dungeon Architect Hit chance protects the besieger's ranged engines only
Masterwork Damage perk and Engineering read on the party leader; wall and ranged-engine shots only
Sweatshops Construction progress besieger camp leader party; also speeds the defenders
Battlements Prebuilt ballistas constant 1, bonus never read
Siegeworks Prebuilt catapults constant 1, bonus never read
Stonecutters, Siege Engineer Fire engines player's party only
Camp Building Crew casualty chance destroyed engine's crew only
Siege Medic Crew casualty chance lowers the crew casualty chance
Battle Hardened Crew casualty chance destroyed defender engines only
Pick Them Off The Walls Crew casualties destroyed engines only, after the crew casualty roll

Crossbow, Engineering, Medicine, Steward, Tactics.

Changelog