Sieges
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
- Firing side, engine side, destroying side:
siege=attackeris the besiegers,siege=defenderthe besieged settlement. - Effective siege party of a side: the party the siege event treats as that side's lead (the besieger camp's leader party; for the defenders, see Effective siege party of the defenders).
role=Engineermeans its effective engineer holds the perk (or, for the skill effect, its Engineering skill);role=Surgeonandrole=Quartermasterlikewise. role=Governor: the besieged town's governor. Most governor terms here read the governor directly, with no presence check; the notes say where the governor must also be in the town.- A
siege=condition can name the side of the perk holder instead of the side of the shooter; the notes say where it does. - Bombard targets: Wall, RangedEngines (the enemy's ranged siege engines) and People (troops).
- Ranged engines: ballista, fire ballista, onager (mangonel), fire onager, trebuchet, catapult, fire catapult. Non-ranged engines: rams and siege towers.
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:
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.
Combine rules
explained_number numbers are built by the game's standard modifier sum:
result = clamp( (base + Σ add) · (1 + Σ factor), min, max )
Σ add: everyaddterm.Σ factor: everyfactorterm, summed and applied once.
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 |
- No module overrides
DefaultSiegeEventModel. - The chosen party's engineer, surgeon and quartermaster supply the defender-side perks and skill effects of hit chance, damage, rate of fire, engine hit points, construction progress and engine destruction.
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))
engine_hit_chance: the engine type's hit chance for targets Wall and RangedEngines, its anti-personnel hit chance for target People. Any other target throws an error.wall_defense: 0.05 / 0.1 / 0.15 at wall level 1 / 2 / 3, 0 otherwise; only when the attacker fires at ranged engines.Σ factor: the perk factors below.
| 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).
- Wall penalty ("Extra Defender Defense"): only when the firing side is the attacker and the target is RangedEngines. Wall level is the current level of the town's or castle's Fortifications building. Shots at the wall or at troops get no penalty.
- Defender-only block: both governor perks run only when the firing side is the defender.
- Dreadful Besieger (
differs): only defender shots at enemy ranged engines; shots at troops get nothing. No governor presence check. - Pavise (
differs): only the plain ballista; the fire ballista is excluded. The governor must hold the perk and be in the town. - Foreman and Salvager: the firing side's effective engineer; any target, either side.
- Dungeon Architect (
differs): it only protects the besieger's ranged engines. It applies when the defender fires at ranged engines and the attacker's effective engineer holds the perk; a defending holder's engines get nothing. In this rowsiege=attackernames the side that holds the perk (the besiegers); the shot is fired by the defenders. - Clamp: a negative result is replaced by 0. The factor sum multiplies after the wall penalty, so a negative running value stays negative under a positive factor and ends at 0.
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)
engine_damage: the engine type's damage.leader_skill: the Engineering skill of the effective siege party's leader hero.
| 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.
- Wall Breaker, Make Them Pay (primary) and Masterwork need the firing side's effective siege party; Make Them Pay (secondary) reads the besieged town's governor, who must be in the town.
- Make Them Pay: primary on attacker shots at the defenders' ranged engines, secondary on defender shots at the besiegers' ranged engines.
- Masterwork (
differs): the half's role is Engineer, but both the perk and the Engineering skill (minus 250, only above 250) are read on the effective siege party's leader hero. It applies only to shots at the wall or at ranged engines, not at troops. Either side.
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)
engine_rate_of_fire_per_day: the engine type's campaign rate of fire per day.- 1440: minutes per hour × hours per day.
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.
- Both perks apply only when the engine's side has an effective siege party; its effective engineer must hold the perk.
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.
- When a shot hits an enemy ranged engine, a second roll against the shot's hit chance for target People decides whether the engine's crew takes casualties. On success the count above is dealt.
- Terror: the firing party holds the perk and wins a roll below 0.2, giving +1 casualty. The scaling is the expected extra casualties per hit.
- Terror: land only, as the tooltip shows (the party's perk check fails at sea).
- The count is spread over the engine side's involved parties in proportion to their regular members; part of each share is wounded instead of killed, by the siege bombardment surgery chance (Siege Medic, primary).
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)
available_man_day_power: square root of the number of healthy members over all of the side's involved parties.man_day_cost: the engine type's man-day cost.skill: the effective engineer's Engineering skill.building_amount: the Siege Workshop's effect at its level.militia: the besieged settlement's militia.
| 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.
- Skill effect: the building side's effective engineer, when its Engineering is above 0. The defender side also makes a governor skill call, which does nothing: that call only resolves clan leader or governor roles, and this effect's role is Engineer.
- Siege Workshop: defender side only. SiegeEngineSpeed 0.3 / 0.6 / 1.0 (town) and 0.2 / 0.4 / 0.8 (castle) at levels 1-3, as a factor.
- Sweatshops (
differs): the game checks the besieger camp's leader party, whatever side is building. Only that party's quartermaster counts (not "your party" unless it leads the camp), and the bonus also speeds up the defenders' engine construction. - Improved Tools vs Scaffolds / Torsion Engines: Improved Tools applies while the side's siege preparations (the camp) are not yet built and its effective engineer holds the perk. In that case Scaffolds and Torsion Engines are skipped. In every other case they apply, including while the camp is still unbuilt when the engineer does not hold Improved Tools. Scaffolds covers non-ranged engines, Torsion Engines ranged engines.
- Salvager (secondary): defender side; the governor must hold the perk and be in the town. +0.1% per militia.
- Trait terms (attacker side only): the hero is the besieger camp leader's army leader, else the camp leader. Calculating gives
trait_effect+0.1 at +1 and +0.2 at +2 for every engine; Valor gives -0.3 at -2 and -0.15 at -1 for the siege preparations (the camp) only.
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)
engine_base_hit_points: the engine type's maximum hit points.
| 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.
- Siege Engineer: every defender engine type; the besieged town's governor, no presence check.
- Siegeworks: ranged engines of either side; the engine side's effective engineer.
- Carpenters: attacker rams and siege towers; the effective engineer.
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.
- Battlements (
differs): the bonus is never read; when the besieger camp's leader party's effective engineer holds the perk, one ballista is added, a constant 1.
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.
- Empty unless the settlement is a fortification.
- Siege Workshop: CatapultOnSiegeStart 0 / 1 / 1 (town) and 0 / 1 / 2 (castle) at levels 1-3; the summed effect is rounded up.
- The same building also gives BallistaOnSiegeStart 1 / 1 / 2 (town) and 1 / 2 / 3 (castle): prebuilt ballistas of the settlement, which no skill changes.
- Siegeworks (
differs): the bonus is never read; when the governor holds the perk, one catapult is added, a constant 1. No governor presence check.
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.
- Player's party only (
differs): the only callers are SandBox's siege production menu, which passes the player's party. AI engine choice does not read these lists and includes fire engines with no perk check, so an AI holder gains nothing. - A defending player's own party engineer counts, not the town governor.
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)
wall_base_hit_points: 30000 / 50000 / 67000 at wall level 1 / 2 / 3. Wall level is the current level of the town's or castle's Fortifications building.
| 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.
- Engineering Guilds: no governor presence check.
- Edge cases: any wall level other than 1-3 fails an assertion and gives -1.
CalculateMaximumWallHitPointreturns 0 for a settlement without a town.
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.
- Camp Building and Siege Medic: the destroyed engine side's effective siege party (engineer, surgeon). Battle Hardened: defender side only, the besieged town's governor, no presence check.
- Each term is added to 1.0, not multiplied: Camp Building takes 0.2 off the chance.
- Camp Building (
differs): only this crew-casualty roll when the holder side's engine is destroyed. Bombardment of troops has no Engineering term. - Siege Medic, secondary (
differs): it lowers the chance that a destroyed own engine causes any casualties, instead of letting lethal wounds recover. - Battle Hardened, secondary (
differs): it lowers only the chance that a destroyed defender engine causes casualties, not general siege attrition.
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.
- Casualties are dealt only when a random roll is at or below the crew casualty chance of the destroyed engine's side.
- The base 2 is the model's destruction casualties, a constant in the base game.
- ×2 roll: the destroying side's holder wins a roll below the perk's bonus (0.25) and the count is doubled. Primary when the destroying side is the attacker (its effective engineer); secondary when it is the defender (the besieged town's governor, no presence check). The two are exclusive.
- Pick Them Off The Walls (
differs): only the casualties of a destroyed engine are doubled, and only after the crew casualty roll succeeds, not bombardment damage in general. The collateral casualties of a bombardment hit read no perk of this kind. - Valor: the destroyed engine side's effective siege party leader's army leader, else that party's leader;
trait_effectis -0.2 at Valor -2 and -0.1 at -1, and the count is rounded at random. - The count is spread over the destroyed engine side's involved parties; part is wounded instead of killed by the siege bombardment surgery chance.
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 |
Related skill guides
Crossbow, Engineering, Medicine, Steward, Tactics.
Changelog
- v1.5.7 (2026-11-12): re-verified against v1.5.7. Masterwork reads the perk on the party leader; Make Them Pay (secondary) needs the governor present; Terror is land only as its tooltip shows; Calculating and Valor trait terms on besieger engine construction and Valor on crew casualties added.
- v1.4.8 (2026-11-11): How the defenders' effective siege party is chosen (raw Engineering skill).
- v1.4.8 (2026-11-11): First version from IL.