Bannerlord mechanics

Party and map

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

Every game number of the party and campaign-map models that a skill, perk, feat, policy or building touches, at full precision for game v1.5.7: map speed, wages and recruitment, party size, healing and casualties, troop experience, food, spotting and tracking, carry capacity, armies, morale and encounters. Ship-based terms and the at-sea speed path are on Naval campaign. Plain-language versions per skill: Athletics, Riding, Scouting, Medicine, Steward, Leadership, Tactics, Trade, Roguery, Charm, Engineering, Bow, Crossbow, One Handed, Two Handed, Polearm, Throwing.

Module status: NavalDLC extends most of these models (it calls the default method first and adds terms only at sea, except where a section says otherwise). StoryMode extends the party size limit and the troop recruitment cost in the story campaign only; SandBox and BirthAndDeath change no land formula.

Conventions

Most numbers here are the game's standard modifier sum:

result = clamp( (base + Σ adds) · (1 + Σ factors), min, max )

Other combine rules: sequential (each term applied in code order to a plain float), custom (formula given in the section).

Roles name the hero whose perk or skill is read: PartyLeader (the party's leader), Scout, Quartermaster, Surgeon (the clan role holder of the party, else the effective party leader), Governor (the governor of the settlement), ClanLeader, ArmyCommander (the army leader party's leader), Personal (the hero himself, or the main hero where noted). "At sea" means the party is currently at sea.

Verdicts: works = does what the tooltip says, or more — broader effects are noted; differs = narrower, different or extra conditions/values than the tooltip (the reason follows the table); unused = never read by the game; ui_only = only shown in the interface; dead = the code never runs in a campaign (the reason is given). A "skill level" source reads the skill value itself, with no skill effect or perk in between. NavalDLC terms are on Naval campaign.

Party map speed

The map speed of a mobile party, in map units per hour. Live consumer NavalDLCPartySpeedCalculationModel::CalculateFinalSpeed (CalculateFinalSpeed); on land the result is exactly the default model's: NavalDLC CalculateBaseSpeed hands land parties to the default CalculateBaseSpeed → CalculateLandBaseSpeed, and NavalDLC CalculateFinalSpeed calls the default and adds nothing when the party is not at sea. At sea NavalDLC replaces the base with its own ship-based base; that path is on Naval campaign.

MobileParty::CalculateSpeedForPartyUnified builds the base with CalculateBaseSpeed (optional arguments off or zero) and passes it to CalculateFinalSpeed. A party attached to its army's leader party reuses the leader's cached base number, so army members share the leader's base terms.

Formula

base     = 4.6 · (200 / (200 + total_men)) ^ 0.4
speed    = max(1, (base + overburdened_effect) · (1 + Σ land factors + Σ final factors))

Order does not change the land result: all factors sum before they apply.

Variables used by the terms:

Land terms (CalculateLandBaseSpeed), in code order

  1. Strong (Athletics): foot share of the party times the perk bonus.
  2. Cavalry ratio 0.3 · mounted_men / total_men (0 when either is 0).
  3. Mounted footmen ratio 0.15 · mounted_footmen / total_men.
  4. Wet weather (GetWeatherEffectOnTerrainForPosition is Wet): two factors, −0.3 × the cavalry term and −0.3 × the mounted footmen term.
  5. Nomadic Traditions (Riding): mounted_footmen_modifier · bonus, only when the modifier is > 0. The wet-weather penalty uses the unscaled modifier.
  6. Cargo: -0.02 · min(cargo_weight, capacity) / capacity, when that min is > 0.
  7. Overburdened: added to the base (see the sub-number below).
  8. Sweeping Wind (Riding).
  9. Over party size: party_size_limit / total_men - 1 when total_men > party_size_limit; ×0.5 when the party's clan is the deserters clan.
  10. Herding: herding_modifier, skipped for villager parties.
  11. Shepherd (Riding): herding_modifier · bonus, halving the herding penalty.
  12. Wounded: wounded_modifier.
  13. Over prisoner limit: prisoner_limit / own_prisoners - 1 when the party's own prisoners exceed its limit; not for caravans.
  14. Prisoners: 1 / ((10 + total_men + attached_prisoners) / (10 + total_men)) ^ 0.33 - 1; not for caravans.
  15. High morale: 0.05 · (morale - 70) / 30 when morale > 70.
  16. Low morale: -0.1 · (1 - morale / 30) when morale < 30.
  17. Difficulty: difficulty_speed_bonus, main party only.
  18. Caravan: +0.1.
  19. Disorganized: −0.4.

Final terms (CalculateFinalSpeed), in code order

  1. Custom party: when the party is a custom party and its custom base speed is not ~0, the incoming number is replaced by a new one with that base. Every land term and the land lower limit are discarded; the final terms below still apply.
  2. Terrain, one branch by the face terrain:
    • Forest: −0.2. With Forest Kin (Scouting) on the effective scout and at least 75% of member troops non-mounted, the −0.2 becomes −0.1. Battanian forest feat: an extra battanian_forest_feat_bonus · 0.2 (the feat's effect bonus).
    • Else Water, River, UnderBridge, Bridge or Fording, not at sea: −0.3.
    • Else Desert or Dune: −0.1, skipped when the party has the Aserai desert feat; Desert Born (Scouting) on top.
    • Else Plain or Steppe: Pathfinder (Scouting).
  3. Snow or Blizzard weather (GetWeatherEventInPosition): −0.125. No at-sea guard.
  4. Night, not at sea: −0.25 plus Night Runner (Scouting). Day, not at sea: Day Traveler (Scouting).
  5. Uncanny Insight (Scouting): 0.001 · (skill - 200) for scout Scouting above 200, no upper cap, not at sea.
  6. Forced March (Scouting): morale > 75, not at sea.
  7. Tracker (Scouting, secondary): DefaultBehavior is EngageParty, the target party is not at sea and its faction is at war with ours.
  8. Call To Arms (Tactics): the party is in an army, is not its leader party, is not attached to it, and the army leader has the perk; the land-only half follows the army leader party's environment.
  9. Increased global movement speed campaign option: +0.25.

Sources

Source Stage Value Conditions Verdict IL
Strong (Athletics, secondary) factor bonus * footmen / total_men, bonus = 0.05 Role: party leader differs GetFootmenPerkBonus
Cavalry ratio factor 0.3 * mounted_men / total_men — works GetCavalryRatioModifier
Mounted footmen ratio factor 0.15 * mounted_footmen / total_men — works GetMountedFootmenRatioModifier
Wet weather cavalry and mounted footmen penalty factor -0.3 * (0.3 * mounted_men / total_men + 0.15 * mounted_footmen / total_men) — works CalculateLandBaseSpeed
Nomadic Traditions (Riding, primary) factor mounted_footmen_modifier * bonus, bonus = 0.3 Role: party leader works CalculateLandBaseSpeed
Cargo weight factor -0.02 * min(cargo_weight, capacity) / capacity — works GetCargoEffect
Overburdened add overburdened_effect — works CalculateLandBaseSpeed
Sweeping Wind (Riding, secondary) factor bonus, bonus = 0.02 Role: party leader works CalculateLandBaseSpeed
Over party size limit factor party_size_limit / total_men - 1 — works GetOverPartySizeEffect
Herding (spare mounts, pack animals, livestock) factor herding_modifier Party: not villager works GetHerdingModifier
Shepherd (Riding, primary) factor herding_modifier * bonus, bonus = -0.5 Role: party leader works CalculateLandBaseSpeed
Wounded troops factor wounded_modifier — works CalculateLandBaseSpeed
Over prisoner limit factor prisoner_limit / own_prisoners - 1 Party: not caravan works GetOverPrisonerSizeEffect
Prisoners carried factor 1 / ((10 + total_men + attached_prisoners) / (10 + total_men)) ^ 0.33 - 1 Party: not caravan works GetSizeModifierPrisoner
High morale factor 0.05 * (morale - 70) / 30 — works CalculateLandBaseSpeed
Low morale factor -0.1 * (1 - morale / 30) — works CalculateLandBaseSpeed
Game difficulty (player map speed bonus) factor difficulty_speed_bonus Party: main party works CalculateLandBaseSpeed
Caravan party factor 0.1 Party: caravan works CalculateLandBaseSpeed
Disorganized factor -0.4 Party: disorganized works CalculateLandBaseSpeed
Custom party fixed base speed override custom_base_speed Party: custom party works CalculateFinalSpeed
Forest terrain factor -0.2 Terrain: forest works CalculateFinalSpeed
Forest Kin (Scouting, primary) factor 0.2 * (1 + bonus), bonus = -0.5 Role: scout; terrain: forest differs CalculateFinalSpeed
Battanian forest speed feat factor battanian_forest_feat_bonus * 0.2 Terrain: forest works CalculateFinalSpeed
Fording (water, river, bridge, fording, under bridge) factor -0.3 Party: not at sea; terrain: water or river or under bridge or bridge or fording works CalculateFinalSpeed
Desert terrain factor -0.1 Terrain: desert or dune works CalculateFinalSpeed
Aserai desert feat factor 0.1 Terrain: desert or dune works CalculateFinalSpeed
Desert Born (Scouting, primary) factor bonus, bonus = 0.05 Role: scout; terrain: desert or dune works CalculateFinalSpeed
Pathfinder (Scouting, primary) factor bonus, bonus = 0.02 Role: scout; terrain: plain or steppe works CalculateFinalSpeed
Snow or blizzard weather factor -0.125 — works CalculateFinalSpeed
Night travel factor -0.25 Party: not at sea; time: night works CalculateFinalSpeed
Night Runner (Scouting, primary) factor bonus, bonus = 0.05 Role: scout; time: night works CalculateFinalSpeed
Day Traveler (Scouting, primary) factor bonus, bonus = 0.02 Role: scout; time: day works CalculateFinalSpeed
Uncanny Insight (Scouting, primary) factor bonus * (skill - 200), bonus = 0.001 Role: scout works CalculateFinalSpeed
Forced March (Scouting, primary) factor bonus, bonus = 0.025 Role: scout works CalculateFinalSpeed
Tracker (Scouting, secondary) factor bonus, bonus = 0.02 Party: engaging hostile party; role: scout differs CalculateFinalSpeed
Call To Arms (Tactics, primary) factor bonus, bonus = 0.1 Party: in army; role: army commander works CalculateFinalSpeed
Campaign option: increased global movement speed factor 0.25 Party: increased movement speed option works CalculateFinalSpeed

NavalDLC sources (at sea, see Naval campaign): Disorganized at sea, Fair Winds (Shipmaster, primary), Favorable Tide (Shipmaster, primary), Ghost Ship (Shipmaster, secondary), Naval storyline speed (Gunnar's Skill), Nord ship movement feat, Old Salt's Touch (Shipmaster, primary), Open sea, Over fleet size, Overburdened at sea, Overmanned ships, River Raider (Shipmaster, primary), River sailing, Sailing speed increased (Shipmaster skill effect), Sea base speed without ships, Sea speed cap, Shallow draft hulls, Ship campaign speed, Shock and Awe (Shipmaster, secondary), Undermanned ships, Wind.

Differences from the tooltips:

Overburdened effect

Sub-number added to the speed base when cargo_weight > capacity. Consumer DefaultPartySpeedCalculatingModel::GetOverburdenedEffect (GetOverburdenedEffect).

overburdened_effect = (-0.4 · excess_weight / capacity) · (1 + Σ factors)
excess_weight       = cargo_weight - capacity

NavalDLC GetOverburdenedEffect is marked replaces, but CalculateLandBaseSpeed calls the default method non-virtually, so the default stays live on land. The NavalDLC version (base -1 · excess_weight / capacity, Veteran's Wisdom) is used only at sea.

Source Stage Value Conditions Verdict IL
Energetic (Athletics, primary) factor bonus, bonus = -0.2 Role: party leader works GetOverburdenedEffect
Unburdened (Scouting, primary) factor bonus, bonus = -0.2 Role: scout works GetOverburdenedEffect

Energetic and Unburdened are land-only halves; at sea this method is never reached.

Wounded factor

Sub-number used as a speed factor. Consumer DefaultPartySpeedCalculatingModel::GetWoundedModifier (GetWoundedModifier).

wounded_modifier = max(-0.8, -0.05 · wounded / total_men) · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Sledges (Medicine, primary) factor bonus, bonus = -0.5 Role: surgeon works GetWoundedModifier

Worked example

A land party of 100 men, 40 of them mounted, morale 85, overburdened effect -0.2, on a plain with a Pathfinder scout. The overburdened effect lowers the base first, then the three factors add up to +16.5% and apply once to the lowered base.

Bar chart of party map speed on land, term by term. Base from party size 3.9113; Overburdened flat add -0.2000; Pathfinder perk factor +2% of 3.7113 adds +0.0742; Cavalry ratio factor +12% of 3.7113 adds +0.4454; High morale factor +2.5% of 3.7113 adds +0.0928. Party map speed 3.7113 × 1.165, minimum 1, equals 4.3237. Axis 0 to 5.

A land party on a plain with a Pathfinder scout. Each factor adds its share of the base after flat adds. Inputs: men in the party 100, men on horses 40, morale 85, overburdened effect -0.2.

Step Term Value Change Running value
Base Party map speed 3.9113
Flat add Overburdened -0.2000 -0.2000 3.7113
Factor Pathfinder +2% +0.0742 3.7855
Factor Cavalry ratio +12% +0.4454 4.2309
Factor High morale +2.5% +0.0928 4.3237
Factors summed, applied once 3.7113 × 1.165 +16.5% 4.3237
Clamp minimum 1 4.3237

The same party, source by source:

A land party on a plain with a Pathfinder scout. Inputs: total men 100, mounted men 40, morale 85, overburdened effect -0.2.

Step Source Stage Change Running value
Base Party map speed base 3.9113
1 Overburdened add -0.2000 3.7113
2 Pathfinder factor +2% +0.0742 3.7855
3 Cavalry ratio factor +12% +0.4454 4.2309
4 High morale factor +2.5% +0.0928 4.3237
Result Party map speed 4.3237

With these inputs, party map speed is 4.3237.

  1. Base: 4.6 · (200 / 300) ^ 0.4 = 3.9113.
  2. Overburdened adds -0.2000 to the base: 3.7113.
  3. Factors: Pathfinder +2%, cavalry ratio 0.3 · 40 / 100 = +12%, high morale 0.05 · (85 - 70) / 30 = +2.5%; sum +16.5%.
  4. 3.7113 × 1.165 = 4.3237, above the minimum of 1.

Wages and recruitment

Party daily wage

Live consumer NavalDLCPartyWageModel::GetTotalWage (GetTotalWage). NavalDLC calls the default GetTotalWage and adds terms only at sea; the land result is the default's.

total_wage = Σ non-hero elements troop_wage · count  +  Σ paid heroes troop_wage
base_wage  = total_wage with bandit wages and tier ≥ 4 ranged wages replaced (Deep Pockets, Picked Shots)
wage       = max(0, base_wage · (1 + Σ factors))
Source Stage Value Conditions Verdict IL
Aid Corps (Steward, primary) add 0 Role: quartermaster differs GetTotalWage
Barracks (castle) factor building_effect Party: garrison; settlement: castle works GetTotalWage
Castellan's office factor building_effect Party: garrison; settlement: castle works GetTotalWage
Slacken garrison (castle daily project) factor building_effect Party: garrison; settlement: castle works GetTotalWage
Barracks (town) factor building_effect Party: garrison; settlement: town works GetTotalWage
Aserai increased wage feat factor aserai_wage_feat_bonus — works GetTotalWage
Empire garrison wage feat factor empire_garrison_wage_feat_bonus Party: garrison; settlement: fortification works GetTotalWage
Hunter Clan (Bow, secondary) factor bonus, bonus = -0.15 Party: garrison; role: governor; settlement: castle works GetTotalWage
Picked Shots (Crossbow, primary) factor bonus * high_tier_ranged_wage / total_wage, bonus = -0.5 Role: party leader; troop tier: at least 4; troops: ranged works GetTotalWage
Peasant Leader (Crossbow, secondary) factor bonus * ranged_wage / total_wage, bonus = -0.2 Party: garrison; role: governor; settlement: fortification works GetTotalWage
Military Tradition (One Handed, secondary) factor bonus, bonus = -0.05 Party: garrison; role: governor; settlement: fortification works GetTotalWage
Standard Bearer (Polearm, secondary) factor infantry_wage_share * bonus, bonus = -0.2 Party: garrison; role: governor; settlement: fortification works GetTotalWage
Cavalry Tactics (Riding, secondary) factor mounted_wage_share * bonus, bonus = -0.5 Party: garrison; role: governor differs GetTotalWage
Deep Pockets (Roguery, secondary) factor bandit_wage_share * bonus, bonus = -0.2 Role: party leader; troops: bandit works GetTotalWage
Contractors (Steward, primary) factor bonus * mercenary_wage / total_wage, bonus = -0.25 Role: quartermaster works GetTotalWage
Drill Sergeant (Steward, secondary) factor bonus, bonus = -0.05 Party: garrison; role: governor; settlement: fortification works GetTotalWage
Efficient Campaigner (Steward, secondary) factor bonus, bonus = -0.25 Party: in army; role: quartermaster works GetTotalWage
Frugal (Steward, primary) factor bonus, bonus = -0.05 Role: quartermaster works GetTotalWage
Master of Warcraft (Steward, primary) factor bonus, bonus = -0.25 Map state: besieging; role: quartermaster works GetTotalWage
Price of Loyalty (Steward, primary) factor bonus * (skill - 250), bonus = -0.005 Role: quartermaster works GetTotalWage
Stiff Upper Lip (Steward, secondary) factor bonus, bonus = -0.2 Party: garrison; role: governor; settlement: castle works GetTotalWage
Content Trades (Trade, secondary) factor bonus, bonus = -0.5 Map state: in settlement; role: party leader works GetTotalWage
Mercenary Connections (Trade, secondary) factor bonus * mercenary_wage / base_wage, bonus = -0.25 Role: party leader works GetTotalWage
Sword For Barter (Trade, secondary) factor bonus * caravan_guard_wage / base_wage, bonus = -0.15 Role: quartermaster works GetTotalWage
Berserker (Two Handed, secondary) factor bonus, bonus = -0.1 Party: garrison; role: governor; settlement: fortification works GetTotalWage
Military Coronae factor 0.1 Faction: kingdom policy active works GetTotalWage
Paid in Promise (Steward, primary) multiply 1 + bonus, bonus = -0.25 Role: party leader works GetTotalWage
Generosity trait: party wages factor trait_effect Hero: party leader generosity trait works GetTotalWage

NavalDLC sources (at sea): Aid Corps (Steward, primary), Convoy wage cut at sea, Naval Horde (Boatswain, primary), Optimization (Boatswain, primary), Wage reduction at sea.

Differences from the tooltips:

Worked example

A kingdom lord's party waiting in a town, its quartermaster with Frugal and its leader with Content Trades, under the Military Coronae policy. Inputs: total wage 500.

Step Source Stage Change Running value
Base Party daily wage base 500.0000
1 Frugal factor -5% -25.0000 475.0000
2 Content Trades factor -50% -250.0000 225.0000
3 Military Coronae factor +10% +50.0000 275.0000
Result Party daily wage 275.0000

With these inputs, party daily wage is 275.0000.

Each factor takes its share of the same base (500.0000), so the order does not matter: the daily wage is 275.0000.

Troop recruitment cost

Live consumer NavalDLCPartyWageModel::GetTroopRecruitmentCost (GetTroopRecruitmentCost).

level_cost = 10 (level ≤ 1), 20 (≤ 6), 50 (≤ 11), 100 (≤ 16), 200 (≤ 21), 400 (≤ 26), 600 (≤ 31), 1000 (≤ 36), else 1500
cost       = level_cost + horse_cost + mercenary_add
cost       = max(1, cost · (1 + Σ factors))        only with a buyer hero
Source Stage Value Conditions Verdict IL
Recruit horse equipment add horse_cost — works GetTroopRecruitmentCost
Mercenary, gangster or caravan guard troop add 2 * (level_cost + horse_cost) Troops: mercenary gangster caravan guard works GetTroopRecruitmentCost
Khuzait recruit and upgrade feat factor khuzait_recruit_feat_bonus Troops: mounted works GetTroopRecruitmentCost
Renowned Archer (Bow, secondary) factor bonus, bonus = -0.3 Role: party leader; troops: ranged works GetTroopRecruitmentCost
Slick Negotiator (Charm, primary) factor bonus, bonus = -0.2 Role: personal works GetTroopRecruitmentCost
Piercer (Crossbow, secondary) factor bonus, bonus = -0.2 Role: party leader; troops: ranged works GetTroopRecruitmentCost
Chink in the Armor (One Handed, secondary) factor bonus, bonus = -0.2 Role: party leader; troops: infantry works GetTroopRecruitmentCost
Hardy Frontline (Polearm, secondary) factor bonus, bonus = -0.2 Role: party leader; troops: infantry works GetTroopRecruitmentCost
Frugal (Steward, secondary) factor bonus, bonus = -0.15 Role: party leader works GetTroopRecruitmentCost
Head Hunter (Throwing, secondary) factor bonus, bonus = -0.2 Role: party leader; troop tier: at least 2 works GetTroopRecruitmentCost
Sword For Barter (Trade, primary) factor bonus, bonus = -0.2 Role: personal; troops: mercenary gangster caravan guard works GetTroopRecruitmentCost
Show of Strength (Two Handed, secondary) factor bonus, bonus = -0.2 Role: party leader; troops: infantry works GetTroopRecruitmentCost

NavalDLC sources: Popular Captain (Boatswain, primary), mariner troops, through the buyer's party (see Naval campaign).

StoryMode source (story campaign only): Tutorial placeholder volunteer cost, override 50.

Troop upgrade cost

Live consumer NavalDLCPartyTroopUpgradeModel::GetGoldCostForUpgrade (GetGoldCostForUpgrade).

cost = (target_cost - source_cost) / divisor · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Khuzait recruit and upgrade feat factor khuzait_recruit_feat_bonus Troops: mounted works GetGoldCostForUpgrade
Renowned Archer (Bow, secondary) factor bonus, bonus = -0.3 Role: party leader; troops: ranged works GetGoldCostForUpgrade
Contractors (Steward, primary) factor bonus, bonus = -0.25 Role: quartermaster works GetGoldCostForUpgrade
Sound Reserves (Steward, primary) factor bonus, bonus = -0.1 Role: quartermaster works GetGoldCostForUpgrade

NavalDLC sources: Efficient Captain (Boatswain, primary).

Bandit upgrade permission

DefaultPartyTroopUpgradeModel::DoesPartyHaveRequiredPerksForUpgrade (DoesPartyHaveRequiredPerksForUpgrade). Boolean: true unless the source troop is bandit-culture and the target is not; then the party must have Veteran's Respect (secondary). NavalDLC delegates.

Source Stage Value Conditions Verdict IL
Veteran's Respect (Leadership, secondary) override 1 Role: party leader works DoesPartyHaveRequiredPerksForUpgrade

Party size

Party member size limit

Live consumer NavalDLCPartySizeLimitModel::GetPartyMemberSizeLimit (CalculateMobilePartyMemberSizeLimit). NavalDLC gives storyline quest parties a fixed size, naval bandit-clan parties their template's upper troop limit, and naval patrols their own limit; every other party gets the default unchanged.

The default dispatches: garrison → garrison limit below, patrol party → patrol limit, other mobile parties → CalculateMobilePartyMemberSizeLimit, non-mobile → 0.

limit = (20 + Σ adds) · (1 + Σ ship crew factors)
Source Stage Value Conditions Verdict IL
Imposing Stature (Athletics, secondary) add bonus, bonus = 5.0 Party: not caravan; role: party leader works CalculateBaseMemberSize
Merry Men (Bow, primary) add bonus, bonus = 5.0 Role: party leader works CalculateBaseMemberSize
Authority (Leadership, secondary) add bonus, bonus = 5.0 Role: party leader works CalculateBaseMemberSize
Leader of the Masses (Leadership, primary) add bonus * towns, bonus = 5.0 Role: clan leader works CalculateBaseMemberSize
Talent Magnet (Leadership, primary) add bonus, bonus = 10.0 Role: party leader works CalculateBaseMemberSize
Ultimate Leader (Leadership, primary) add (skill - 250) * bonus, bonus = 1.0 Role: party leader works CalculateBaseMemberSize
Uplifting Spirit (Leadership, secondary) add bonus, bonus = 10.0 Role: party leader works CalculateBaseMemberSize
Prestige (One Handed, secondary) add bonus, bonus = 15.0 Role: party leader works CalculateBaseMemberSize
Mounted Scouts (Scouting, secondary) add bonus, bonus = 5.0 Role: party leader works CalculateBaseMemberSize
Horde Leader (Tactics, primary) add bonus, bonus = 10.0 Role: party leader works CalculateBaseMemberSize
Hope (Two Handed, secondary) add bonus, bonus = 5.0 Role: party leader works CalculateBaseMemberSize
Noble Retinues add 40 Faction: kingdom policy active; hero: clan leader works CalculateBaseMemberSize
Royal Guard add 60 Faction: kingdom policy active; hero: kingdom ruler works CalculateBaseMemberSize
Increase party size (Steward skill effect) add bonus * skill, bonus = 0.25 per point Role: quartermaster works CalculateMobilePartyMemberSizeLimit
Player caravan size add caravan_size Party: caravan works CalculateMobilePartyMemberSizeLimit
Clan tier party size add 15 * clan_tier — works GetTierEffectInternal
Kingdom ruler party size add 20 Hero: kingdom ruler works CalculateBaseMemberSize
Notable-owned party size add 10 * notable_power_step Party: caravan works CalculateMobilePartyMemberSizeLimit
Villager party size add 40 Party: villager works CalculateMobilePartyMemberSizeLimit
Ship crew capacity bonus factor ship_crew_bonus Party: at sea works CalculateMobilePartyMemberSizeLimit

StoryMode sources (story campaign only): Conspiracy caravan size (story quest), override conspiracy_caravan_size, party: conspiracy caravan; Defeat the Conspiracy quest party size, override 600, party: conspiracy quest party.

The Steward skill effect gives 0.25 · skill of the Quartermaster.

Worked example

A party led by a clan member who is not the clan leader, in a tier 3 clan, with Authority and a quartermaster at Steward 100.

Step Source Stage Change Running value
Base Party member size limit base 20.0000
1 Authority add +5.0000 25.0000
2 Increase party size add +25.0000 50.0000
3 Clan tier party size add +45.0000 95.0000
Result Party member size limit 95.0000

With these inputs, party member size limit is 95.0000.

The clan tier term is 15 · 3, since the leader is not the clan leader; the Steward effect is 0.25 · 100. All terms are adds, so the limit is their sum: 95.0000.

Garrison size limit

DefaultPartySizeLimitModel::CalculateGarrisonPartySizeLimit (CalculateGarrisonPartySizeLimit). NavalDLC delegates.

limit = 200 + 0.2 · owner_clan_leader_leadership + town_bonus + governor perks + buildings
Source Stage Value Conditions Verdict IL
Barracks (castle) add building_effect Settlement: castle works AddSettlementProjectBonuses
Fortifications (castle) add building_effect Settlement: castle works AddSettlementProjectBonuses
Barracks (town) add building_effect Settlement: town works AddSettlementProjectBonuses
Fortifications (town) add building_effect Settlement: town works AddSettlementProjectBonuses
Veteran's Respect (Leadership, primary) add bonus, bonus = 20.0 Role: governor; settlement: fortification works AddGarrisonOwnerPerkEffects
Corps-a-corps (One Handed, secondary) add bonus, bonus = 30.0 Role: governor; settlement: fortification works AddGarrisonOwnerPerkEffects
Increase garrison size (Leadership skill effect) add bonus * skill, bonus = 0.2 per point Party: garrison; role: clan leader works CalculateGarrisonPartySizeLimit
Town garrison bonus add 200 Settlement: town works CalculateGarrisonPartySizeLimit

Prisoner size limit

DefaultPartySizeLimitModel::GetPartyPrisonerSizeLimit (CalculateMobilePartyPrisonerSizeLimitInternal). NavalDLC delegates.

mobile party:     10 + healthy_members / 2 + leader perks
settlement party: 60 + 40 when the settlement has a town or castle + buildings with a prison capacity effect

healthy_members / 2 is integer division (NumberOfHealthyMembers is an int). The main-party cheat adds +5000.

Source Stage Value Conditions Verdict IL
Fortifications (castle) add building_effect Settlement: castle works AddSettlementProjectPrisonerBonuses
Guard house (castle) add building_effect Settlement: castle works AddSettlementProjectPrisonerBonuses
Fortifications (town) add building_effect Settlement: town works AddSettlementProjectPrisonerBonuses
Guard house (town) add building_effect Settlement: town works AddSettlementProjectPrisonerBonuses
Stamina (Athletics, secondary) add bonus, bonus = 5.0 Role: party leader works AddMobilePartyLeaderPrisonerSizePerkEffects
Manhunter (Roguery, secondary) add bonus, bonus = 10.0 Role: party leader works AddMobilePartyLeaderPrisonerSizePerkEffects
Vantage Point (Scouting, secondary) add bonus, bonus = 10.0 Role: party leader works AddMobilePartyLeaderPrisonerSizePerkEffects
Terror (Two Handed, secondary) add bonus, bonus = 10.0 Role: party leader works AddMobilePartyLeaderPrisonerSizePerkEffects
Healthy party members (prisoner limit) add floor(healthy_members / 2) — works GetCurrentPartySizeEffect
Town or castle (prisoner limit) add 40 Settlement: fortification works CalculateSettlementPartyPrisonerSizeLimitInternal

Assumed lord party size

DefaultPartySizeLimitModel::GetAssumedPartySizeForLordParty (GetAssumedPartySizeForLordParty), the AI's estimate of a lord's party size. a standard modifier sum starting at 20; when the hero has a clan, the same CalculateBaseMemberSize terms as the member limit plus the Steward skill effect with the hero's own Steward skill; returned truncated to a whole number. The leader perks of CalculateBaseMemberSize reach this number too, but only for a hero with a party. NavalDLC delegates.

Source Stage Value Conditions Verdict IL
Noble Retinues add 40 Faction: kingdom policy active; hero: clan leader works CalculateBaseMemberSize
Royal Guard add 60 Faction: kingdom policy active; hero: kingdom ruler works CalculateBaseMemberSize
Increase party size (Steward skill effect) add bonus * skill, bonus = 0.25 per point — works GetAssumedPartySizeForLordParty
Clan tier party size add 15 * clan_tier — works GetTierEffectInternal
Kingdom ruler party size add 20 Hero: kingdom ruler works CalculateBaseMemberSize

Villager party initial size

DefaultPartySizeLimitModel::FindAppropriateInitialRosterForMobileParty (FindAppropriateInitialRosterForMobileParty). Custom, per party-template stack:

stack_size = stack_min                                                   when size_ratio ≤ 0
           = random_round(stack_min + (stack_max - stack_min) · size_ratio)  otherwise
villager stack with Village Network = Round(stack_size · (1 + bonus))

size_ratio = GetInitialPartySizeRatioForMobileParty; above 1 it asserts and uses stack_max. NavalDLC delegates.

Source Stage Value Conditions Verdict IL
Village Network (Scouting, secondary) multiply 1 + bonus, bonus = 0.1 Party: villager; role: governor differs FindAppropriateInitialRosterForMobileParty

Healing and casualties

Daily healing of wounded regulars

Live consumer NavalDLCPartyHealingModel::GetDailyHealingForRegulars (GetDailyHealingForRegulars). The value is a count of troops healed per day, not a rate.

prisoners:        1
starving:         -0.25 · regulars   (garrison of a starving settlement: -random_round(0.1 · regulars))
otherwise:        (5 + 10 in a fortification + raft term) · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Base daily regular healing add 5 Party: not starving works GetDailyHealingForRegulars
Prisoner regulars daily healing add 1 Party: prisoners works GetDailyHealingForRegulars
Raft state (regulars) add -0.25 * regulars Party: raft works GetDailyHealingForRegulars
Resting in a fortification (regulars) add 10 Map state: in settlement; settlement: fortification works GetDailyHealingForRegulars
Starvation (regulars) add -0.25 * regulars Party: starving works GetDailyHealingForRegulars
A Good Days Rest (Athletics, primary) factor bonus, bonus = 0.1 Map state: in settlement; role: party leader; settlement: not hideout, not under siege or raid differs GetDailyHealingForRegulars
Walk It Off (Athletics, primary) factor bonus, bonus = 0.1 Map state: moving; party: not garrison or militia; role: party leader works GetDailyHealingForRegulars
Best Medicine (Medicine, primary) factor bonus, bonus = 0.15 Role: surgeon works GetDailyHealingForRegulars
Bush Doctor (Medicine, secondary) factor bonus, bonus = 0.2 Map state: stationary; role: surgeon differs GetDailyHealingForRegulars
Good Lodging (Medicine, primary) factor bonus, bonus = 0.2 Map state: in settlement; role: surgeon; settlement: not hideout, not under siege or raid differs GetDailyHealingForRegulars
Helping Hands (Medicine, primary) factor bonus * floor(troops / 10), bonus = 0.02 Role: surgeon works GetDailyHealingForRegulars
Perfect Health (Medicine, primary) factor bonus * food_types, bonus = 0.05 Role: surgeon works GetDailyHealingForRegulars
Pristine Streets (Medicine, secondary) factor bonus, bonus = 0.2 Map state: in settlement; role: surgeon; settlement: not under siege or raid, town differs GetDailyHealingForRegulars
Triage Tent (Medicine, primary) factor bonus, bonus = 0.3 Map state: stationary; party: not garrison or militia; role: surgeon works GetDailyHealingForRegulars
Walk It Off (Medicine, primary) factor bonus, bonus = 0.15 Map state: moving; party: not garrison or militia; role: surgeon works GetDailyHealingForRegulars
Rearguard (Scouting, primary) factor bonus, bonus = 0.2 Party: in army; role: party leader works GetDailyHealingForRegulars
Healing rate increase (Medicine skill effect) factor bonus * skill, bonus = 0.001 per point Party: garrison; role: governor; settlement: town differs GetDailyHealingForRegulars
Healing rate increase for troops (Medicine skill effect) factor bonus * skill, bonus = 0.01 per point Party: not garrison; role: surgeon works GetDailyHealingForRegulars

NavalDLC sources (at sea): Resilience (Boatswain, secondary).

Differences from the tooltips:

Worked example

A party camped on the map outside any settlement, its surgeon at Medicine 100 with Triage Tent.

Step Source Stage Change Running value
Base Daily healing of wounded regular troops base 0.0000
1 Base daily regular healing add +5.0000 5.0000
2 Triage Tent factor +30% +1.5000 6.5000
3 Healing rate increase for troops factor +100% +5.0000 11.5000
Result Daily healing of wounded regular troops 11.5000

With these inputs, daily healing of wounded regular troops is 11.5000.

The base add sets the running value to 5.0000. Each factor then adds its share of that value: Triage Tent +1.5000, the surgeon's Medicine skill effect (0.01 · 100) +5.0000. The party heals 11.5000 troops per day.

Daily hero healing

DefaultPartyHealingModel::GetDailyHealingHpForHeroes (GetDailyHealingHpForHeroes). NavalDLC delegates. Hit points per day for every hero of the party.

prisoner heroes:                    20
no party:                           11
starving outside a settlement:      -19
otherwise:                          (11 + 8 in a fortification) · (1 + Σ factors)

A non-mobile party gets 0. The skill effect is the Surgeon's Medicine at 0.005 · skill, for every mobile party including garrisons and militia. The result feeds the per-hero amount below.

Source Stage Value Conditions Verdict IL
Starvation (heroes) override -19 Party: starving works GetDailyHealingHpForHeroes
Base daily hero healing add 11 — works GetDailyHealingHpForHeroes
Prisoner heroes daily healing add 20 Party: prisoners works GetDailyHealingHpForHeroes
Resting in a fortification (heroes) add 8 Map state: in settlement; settlement: fortification works GetDailyHealingHpForHeroes
A Good Days Rest (Athletics, primary) factor bonus, bonus = 0.1 Map state: in settlement; role: party leader; settlement: not hideout differs GetDailyHealingHpForHeroes
Walk It Off (Athletics, primary) factor bonus, bonus = 0.1 Map state: moving; party: not garrison or militia; role: party leader works GetDailyHealingHpForHeroes
Best Medicine (Medicine, primary) factor bonus, bonus = 0.15 Role: surgeon works GetDailyHealingHpForHeroes
Bush Doctor (Medicine, secondary) factor bonus, bonus = 0.2 Map state: stationary; role: surgeon differs GetDailyHealingHpForHeroes
Good Lodging (Medicine, primary) factor bonus, bonus = 0.2 Map state: in settlement; role: surgeon; settlement: not hideout differs GetDailyHealingHpForHeroes
Pristine Streets (Medicine, secondary) factor bonus, bonus = 0.2 Map state: in settlement; role: surgeon; settlement: town works GetDailyHealingHpForHeroes
Triage Tent (Medicine, primary) factor bonus, bonus = 0.3 Map state: stationary; party: not garrison or militia; role: surgeon works GetDailyHealingHpForHeroes
Walk It Off (Medicine, primary) factor bonus, bonus = 0.15 Map state: moving; party: not garrison or militia; role: surgeon works GetDailyHealingHpForHeroes
Healing rate increase for heroes (Medicine skill effect) factor bonus * skill, bonus = 0.005 per point Role: surgeon works GetDailyHealingHpForHeroes

Per-hero healing amount

PartyHealCampaignBehavior::HealMemberHeroes (HealMemberHeroes). The party's hero healing rate is divided per tick and accumulated; once the accumulator reaches 1, each member hero not at full health heals:

r      = floor(accumulator) · (1 + Self Medication + trait_effect)
amount = r rounded up or down at random by its fraction
Source Stage Value Conditions Verdict IL
Self Medication (Medicine, primary) factor bonus, bonus = 0.3 Role: personal differs HealMemberHeroes
Valor trait: hero healing factor trait_effect Hero: valor trait works HealMemberHeroes

Battle-end hero healing

Live consumer NavalDLCPartyHealingModel::GetBattleEndHealingAmount (GetBattleEndHealingAmount). Base 0 plus the adds below; missing_hp = maximum hit points - current hit points. The only caller, PartyHealCampaignBehavior::OnBattleEndCheckPerkEffects, runs for map events with a winner and heals every hero of every involved party by the rounded result.

Source Stage Value Conditions Verdict IL
Preventive Medicine (Medicine, secondary) add bonus * missing_hp, bonus = 0.3 Role: personal differs GetBattleEndHealingAmount
Walk It Off (Medicine, secondary) add bonus, bonus = 10.0 Role: personal differs GetBattleEndHealingAmount

NavalDLC sources: Resilience (Boatswain, primary) (no at-sea check).

Siege bombardment surgery chance

DefaultPartyHealingModel::GetSiegeBombardmentHitSurgeryChance (GetSiegeBombardmentHitSurgeryChance). Plain float: 0, plus Siege Medic. SiegeEventCampaignBehavior::KillRandomTroopsOfEnemy wounds round(casualties · chance) of each party's bombardment casualties instead of killing them. NavalDLC delegates.

Source Stage Value Conditions Verdict IL
Siege Medic (Medicine, primary) add bonus, bonus = 0.5 Role: surgeon works GetSiegeBombardmentHitSurgeryChance

Surgery chance

DefaultPartyHealingModel::GetSurgeryChance, NavalDLC delegates (GetSurgeryChance): 0.0015 · Medicine of the party's effective surgeon, 0 without one.

Source Stage Value Conditions Verdict IL
Medicine skill level add 0.0015 * skill Role: surgeon dead GetSurgeryChance

Casualty survival

DefaultPartyHealingModel::GetSurvivalChance(party, character, damageType, canDamageKill, enemyParty) (GetSurvivalChance). NavalDLC delegates. Read by the map-event simulation and by SandboxAgentDecideKilledOrUnconsciousModel in missions.

S        = (1 + 0.02 · level + surgeon + doctors_oath + hero armor + hero age) · (1 + Σ factors)
death    = clamp(1 / S · (1 + Σ death factors), 0, 1)
survival = 1 - death
Source Stage Value Conditions Verdict IL
Doctor's Oath (Medicine, primary) add 0.01 * skill * battle_factor Role: surgeon differs GetSurvivalChance
Casualty survival chance (Medicine skill effect) add bonus * skill * battle_factor, bonus = 0.01 per point Role: surgeon differs AddSurgeonSurvivalBonus
Hero age (survival) add -0.01 * age Hero: hero works GetSurvivalChance
Hero armor (survival) add 0.01 * armor_sum Hero: hero works GetSurvivalChance
Troop level (survival) add 0.02 * level — works GetSurvivalChance
Physician of People (Medicine, secondary) factor bonus, bonus = 0.3 Role: surgeon; troop tier: at most 2 differs GetSurvivalChance
Hero survival multiplier factor 50 Hero: hero works GetSurvivalChance

Death chance (casualty_death_chance, GetSurvivalChance), heroes only:

Source Stage Value Conditions Verdict IL
Cheat Death (Medicine, secondary) factor bonus, bonus = -0.5 Role: surgeon works GetSurvivalChance
Game difficulty (clan member death chance) factor clan_death_multiplier Hero: player clan works GetSurvivalChance

Troop experience

Daily troop experience

DefaultPartyTrainingModel::GetEffectiveDailyExperience(party, troopRosterElement) (GetEffectiveDailyExperience). NavalDLC delegates. Per roster element (troop type); OnDailyTickParty multiplies by the troop count for non-hero entries.

xp = (0 + Σ adds) · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
A Good Days Rest (Athletics, secondary) add bonus, bonus = 10.0 Map state: in settlement; role: party leader; troops: on foot works GetEffectiveDailyExperience
Walk It Off (Athletics, secondary) add bonus, bonus = 3.0 Map state: moving; role: party leader; troops: on foot works GetEffectiveDailyExperience
Bulls Eye (Bow, secondary) add round(bonus), bonus = 3.0 Party: garrison; role: governor works GetEffectiveDailyExperience
Trainer (Bow, secondary) add round(bonus), bonus = 3.0 Role: party leader; troops: ranged works GetEffectiveDailyExperience
Renowned Marksmen (Crossbow, primary) add round(bonus), bonus = 2.0 Role: party leader; troops: ranged works GetEffectiveDailyExperience
Combat Tips (Leadership, primary) add round(bonus), bonus = 2.0 Role: party leader works GetEffectiveDailyExperience
Raise The Meek (Leadership, primary) add round(bonus), bonus = 4.0 Role: party leader; troop tier: at most 2 works GetEffectiveDailyExperience
Military Tradition (One Handed, primary) add bonus, bonus = 2.0 Role: party leader; troops: infantry works GetEffectiveDailyExperience
Drills (Polearm, secondary) add round(bonus), bonus = 0.1 Role: party leader differs GetEffectiveDailyExperience
Forced March (Scouting, secondary) add bonus, bonus = 2.0 Map state: moving; role: party leader works GetEffectiveDailyExperience
Unburdened (Scouting, secondary) add bonus, bonus = 2.0 Map state: moving; role: party leader works GetEffectiveDailyExperience
Drill Sergeant (Steward, primary) add round(bonus), bonus = 2.0 Role: quartermaster works GetEffectiveDailyExperience
Seven Veterans (Steward, primary) add 0 Role: quartermaster differs GetEffectiveDailyExperience
Saddlebags (Throwing, secondary) add round(bonus), bonus = 1.0 Role: party leader; troops: infantry works GetEffectiveDailyExperience
Lord party daily training add 10 + 2 * tier Party: ai lord party works GetEffectiveDailyExperience
No Rest for the Wicked (Roguery, primary) factor bonus, bonus = 0.2 Role: party leader; troops: bandit works GetEffectiveDailyExperience

Differences from the tooltips:

Shared battle experience

DefaultPartyTrainingModel::GenerateSharedXp(troop, xpAmount, party) (GenerateSharedXp). NavalDLC delegates.

shared = int(xp_amount · (1 + Σ factors) - xp_amount)

Only the extra XP from the factors. MapEventParty::CommitXpGain takes the shared amount from the troop's excess XP, then from its own gain, and pools it with MobilePartyHelper.PartyAddSharedXp. Lead by Example is land only; Leader of the Masses and Make a Difference are halved at sea, as their tooltips show.

Source Stage Value Conditions Verdict IL
Lead by Example (Leadership, secondary) factor bonus, bonus = 0.1 Role: party leader; troops: mounted works GenerateSharedXp
Leader of the Masses (Leadership, secondary) factor bonus, bonus = 0.05 Role: party leader works GenerateSharedXp
Make a Difference (Leadership, secondary) factor bonus, bonus = 0.1 Role: party leader; troops: ranged works GenerateSharedXp

Battle experience gain

Live consumer NavalDLCPartyTrainingModel::CalculateXpGainFromBattles (CalculateXpGainFromBattles).

xp = gained_xp · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Trusted Commander (Leadership, secondary) factor bonus, bonus = 0.2 Mission: simulation; role: party leader works CalculateXpGainFromBattles

NavalDLC sources: Arr! (Mariner, secondary) for mariner troops, Pirate Hunter (Mariner, secondary) for regular troops (party leader; sea only, see Naval campaign).

Daily hero skill experience

MobilePartyTrainingBehavior::OnDailyTickParty (OnDailyTickParty). Raw XP passed to the hero's skill XP once per daily tick: with Trainer (Bow, primary), the member hero with the lowest Bow skill (leader included, ties keep the first) gets the bonus as Bow XP. How the game then scales it is not covered by the perk.

Source Stage Value Conditions Verdict IL
Trainer (Bow, primary) add bonus, bonus = 6.0 Role: party leader works OnDailyTickParty

NavalDLC sources: Veteran's Wisdom (Boatswain, primary).

Donated item experience

DefaultItemDiscardModel::GetXpBonusForDiscardingItem(item, count) (GetXpBonusForDiscardingItem). No module overrides it.

xp = (PlayerCanDonateItem(item) ? tier_xp : 0) · count
tier_xp by ItemObject.Tier index: 0 → 75, 1 → 150, 2 → 250, 3-5 → 300, other → 35

PlayerCanDonateItem is the perk gate: weapons need Giving Hands, armor needs Paid in Promise (secondary), other items never. GetXpBonusForDiscardingItems sums over a roster and floors.

Source Stage Value Conditions Verdict IL
Giving Hands (Steward, primary) override 1 Item: weapon; role: quartermaster works PlayerCanDonateItem
Paid in Promise (Steward, secondary) override 1 Item: armor; role: quartermaster works PlayerCanDonateItem
Donated item tier base tier_xp — works GetXpBonusForDiscardingItem

Food

Party food consumption

Live consumer NavalDLCMobilePartyFoodConsumptionModel::CalculateDailyFoodConsumptionf (CalculateDailyFoodConsumptionf). The value is negative (food lost per day), so negative factors shrink consumption.

base        = -max(1, members + floor(prisoners / 2)) / 20
consumption = min(-0.01, base · (1 + Σ factors))
Source Stage Value Conditions Verdict IL
Spartan (Athletics, secondary) factor bonus, bonus = -0.2 Role: party leader works CalculatePerkEffects
Strong Legs (Athletics, secondary) factor bonus, bonus = -0.2 Party: garrison; role: governor; settlement: under siege works CalculatePerkEffects
Promises (Roguery, primary) factor bonus * (bandit_members + bandit_prisoners) / members, bonus = -0.5 Role: party leader; troops: bandit differs CalculatePerkEffects
Foragers (Scouting, primary) factor bonus, bonus = -0.1 Role: scout; terrain: forest or steppe works CalculatePerkEffects
Master of Planning (Steward, primary) factor bonus, bonus = -0.4 Map state: besieging; role: quartermaster works CalculatePerkEffects
Price of Loyalty (Steward, primary) factor bonus * (skill - 250), bonus = -0.005 Role: quartermaster works CalculatePerkEffects
Sound Reserves (Steward, secondary) factor bonus, bonus = -0.1 Map state: in siege event; role: quartermaster works CalculatePerkEffects
Stiff Upper Lip (Steward, primary) factor bonus, bonus = -0.1 Party: in army; role: quartermaster works CalculatePerkEffects
Warrior's Diet (Steward, primary) factor bonus, bonus = -0.1 Role: quartermaster works CalculatePerkEffects
Generosity trait: party food consumption factor trait_effect Hero: party leader generosity trait works CalculatePerkEffects

NavalDLC sources (at sea): Food consumption reduction at sea, Smooth Operator (Boatswain, secondary).

Animal breeding

FoodConsumptionBehavior::CheckAnimalBreeding (CheckAnimalBreeding). Daily random roll below bonus with Breeder (a land-only half) and more than one livestock, pack animal or mount. On success it adds round(max(1, animals / 50)) of one random animal item. No other term.

Source Stage Value Conditions Verdict IL
Breeder (Riding, primary) override bonus, bonus = 0.01 Role: party leader differs CheckAnimalBreeding

Spotting and tracking

Party spotting range

Live consumer NavalDLCMapVisibilityModel::GetPartySpottingRange (GetPartySpottingRange).

base  = 12 by day, 6 at night
range = min(60, (base + Σ adds) · (1 + Σ factors))
Source Stage Value Conditions Verdict IL
Vantage Point (Scouting, primary) factor bonus, bonus = 0.25 Map state: stationary; role: scout works GetPartySpottingRange
Spotting distance (Scouting skill effect) add bonus * skill, bonus = 0.06 per point Role: scout differs GetPartySpottingRange
Battanian forest speed feat factor 0.15 Terrain: forest works GetPartySpottingRange
Eagle Eye (Bow, secondary) factor bonus, bonus = 0.1 Role: party leader works GetPartySpottingRange
Day Traveler (Scouting, secondary) factor bonus, bonus = 0.1 Role: scout; time: day works GetPartySpottingRange
Mounted Scouts (Scouting, primary) factor bonus, bonus = 0.1 Role: scout differs GetPartySpottingRange
Night Runner (Scouting, secondary) factor bonus, bonus = 0.3 Role: scout; time: night works GetPartySpottingRange
Water Diviner (Scouting, primary) factor bonus, bonus = 0.1 Role: scout; terrain: plain or steppe works GetPartySpottingRange

NavalDLC sources (at sea): Raven Eye (Shipmaster, primary), Spotting at sea, Storm spotting penalty. NavalDLC also changes the base at sea (×0.5 on a raft or ferry, +3 at night with Night Raider).

Differences from the tooltips:

Hideout spotting distance

DefaultMapVisibilityModel::GetHideoutSpottingDistance (GetHideoutSpottingDistance). Always the main party's range. NavalDLC delegates.

distance = main_party_seeing_range · 1.2 · (1 + Rumor Network)
Source Stage Value Conditions Verdict IL
Rumor Network (Scouting, secondary) multiply 1 + bonus, bonus = 0.3 Party: main party; role: scout works GetHideoutSpottingDistance

Spotted party visibility ratio

DefaultMapVisibilityModel::GetPartySpottingRatioForMainPartySeeingRange (GetPartySpottingRatioForMainPartySeeingRange), applied to the main party's seeing range against one observed party. NavalDLC delegates.

ratio = min(1, max(0, 1.1 - 0.5 · 2.7182817 ^ (-men / 200))) · (1 + forest_term)
Source Stage Value Conditions Verdict IL
Keen Sight (Scouting, primary) add -0.3 * bonus, bonus = -0.5 Party: main party; role: scout; terrain: forest differs GetPartySpottingRatioForMainPartySeeingRange
Observed party in forest add -0.3 Terrain: forest works GetPartySpottingRatioForMainPartySeeingRange
Observed party size multiply min(1, max(0, 1.1 - 0.5 * 2.7182817 ^ (-men / 200))) — works GetPartySpottingRatioForMainPartySeeingRange

Track spotting distance

DefaultMapTrackModel::GetMaxTrackSpottingDistanceForMainParty (GetMaxTrackSpottingDistanceForMainParty). No module overrides DefaultMapTrackModel.

distance = (0 + 0.1 · skill) · (1 + Ranger)
Source Stage Value Conditions Verdict IL
Track detection radius (Scouting skill effect) add bonus * skill, bonus = 0.1 per point Party: main party; role: scout differs GetMaxTrackSpottingDistanceForMainParty
Ranger (Scouting, primary) factor bonus, bonus = 0.2 Party: main party; role: scout differs GetMaxTrackSpottingDistanceForMainParty

Track information level

DefaultMapTrackModel::GetTrackDescription (GetTrackDescription). floor(0.04 · skill) = number of tooltip lines shown for a track (max 10). Only builds tooltip text.

Source Stage Value Conditions Verdict IL
Track information level (Scouting skill effect) add floor(bonus * skill), bonus = 0.04 per point Party: main party; role: scout ui_only GetTrackDescription

Lines by level: at least 1 party size, 2 time, 3 party speed, 4 mounted troops, 6 prisoners, 7 pack animals, 8 enemy party yes/no, 9 party culture, 10 party name. The party type is shown at levels 5 to 9; at 10 the party name replaces it.

Track life

DefaultMapTrackModel::GetTrackLife (GetTrackLife), in hours.

fraction = min(1, (0.5 + 0.5 · random + 0.007 · men) / 2) · (0.5 on Snow, else 1)
fraction = min(1, fraction · (1 + Tracker))     main party has Tracker (land-only half: the main party not at sea)
life     = Round(28 · fraction)

random is a random roll; men: members and prisoners (party size) of the party leaving the track.

Source Stage Value Conditions Verdict IL
Tracker (Scouting, primary) multiply 1 + bonus, bonus = 0.2 Role: scout differs GetTrackLife
Snow terrain (track life) multiply 0.5 Terrain: snow works GetTrackLife

Track detection difficulty

DefaultMapTrackModel::GetTrackDetectionDifficultyForMainParty (GetTrackDetectionDifficultyForMainParty).

d = -75 + 100 · track_age / 28 + 100 · distance / spotting_range + max(0, 100 - track_size) · night_factor
d = d - d · Ranger                                main party has Ranger (secondary; land-only half)

track_age: hours since the track was made; night_factor: 10 at night, else 1.

Source Stage Value Conditions Verdict IL
Track size and night (detection difficulty) add max(0, 100 - track_size) * night_factor — works GetTrackDetectionDifficultyForMainParty
Ranger (Scouting, secondary) multiply 1 - bonus, bonus = 0.1 Party: main party; role: scout differs GetTrackDetectionDifficultyForMainParty

Track detection

MapTracksCampaignBehavior::QuarterHourlyTick (QuarterHourlyTick). Every quarter hour, every undetected track within the track spotting distance is detected when:

track detection difficulty < Scouting

Scouting: raw skill of the main party's effective scout. Without a scout, or at 0 Scouting, no track is detected. No module replaces MapTracksCampaignBehavior.

Source Stage Value Conditions Verdict IL
Scouting skill level override detected when difficulty < Scouting Party: main party; role: scout works QuarterHourlyTick

Track color and title

DefaultMapTrackModel::GetTrackColor and TrackTitle (GetTrackColor, TrackTitle), raw Scouting of the main party's effective scout:

Game number Source Stage Value Conditions Verdict
track_enemy_color Scouting skill level override on above 240, enemy tracks Party: main party; role: scout ui_only
track_title_party_name Scouting skill level override on above 270 Party: main party; role: scout ui_only

Finding mounts

FindingItemOnMapBehavior::DailyTickParty (DailyTickParty). Daily per party: when a random roll is below bonus, the party has Beast Whisperer and stands on Steppe or Plain, one random mountable merchandise item is added. No other term.

Source Stage Value Conditions Verdict IL
Beast Whisperer (Scouting, primary) base bonus, bonus = 0.05 Role: scout; terrain: plain or steppe works DailyTickParty

Carry capacity

Inventory capacity

Live consumer NavalDLCInventoryCapacityModel::CalculateInventoryCapacity (CalculateInventoryCapacity). The second argument is the at-sea flag; the three int arguments are not read.

capacity = max(10, (10 + 20 · troops + 20 · mounts + pack_animal_capacity) · (1 + Σ factors))
Source Stage Value Conditions Verdict IL
Arenicos' Horses (Steward, primary) add 20 * round(troops * bonus), bonus = 0.1 Role: quartermaster works CalculateInventoryCapacity
Forced Labor (Steward, primary) add 20 * prisoners Role: quartermaster differs CalculateInventoryCapacity
Base carry capacity add 10 — works CalculateInventoryCapacity
Pack animals carry capacity add pack_animal_capacity Party: not at sea works CalculateInventoryCapacity
Spare mounts carry capacity add 20 * mounts Party: not at sea works CalculateInventoryCapacity
Healthy troops carry capacity add 20 * troops — works CalculateInventoryCapacity
Caravan Master (Trade, primary) factor bonus, bonus = 0.3 Party: not at sea; role: quartermaster differs CalculateInventoryCapacity

NavalDLC sources (at sea): Ship cargo capacity.

Pack animal capacity

Sub-number added to inventory capacity, computed only when the at-sea flag is false (CalculateInventoryCapacity).

pack_animal_capacity = 100 · pack_animals · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Deeper Sacks (Riding, primary) factor bonus, bonus = 0.2 Party: not at sea; role: party leader works CalculateInventoryCapacity
Beast Whisperer (Scouting, secondary) factor bonus, bonus = 0.1 Party: not at sea; role: party leader works CalculateInventoryCapacity
Arenicos' Mules (Steward, primary) factor bonus, bonus = 0.2 Party: not at sea; role: quartermaster works CalculateInventoryCapacity

Armies

Daily cohesion change

Live consumer NavalDLCArmyManagementCalculationModel::CalculateDailyCohesionChange (CalculateDailyCohesionChange).

change = (-2 + Σ internal adds) · (1 + Σ factors)
Source Stage Value Conditions Verdict IL
Low-morale parties (cohesion) add -(low_morale_parties + 1) / 2 * army_factor — works CalculateCohesionChangeInternal
Parties in army (cohesion) add -parties * army_factor — works CalculateCohesionChangeInternal
Small parties (cohesion) add -(small_parties + 1) / 2 * army_factor — works CalculateCohesionChangeInternal
Starving parties (cohesion) add -(starving_parties + 1) / 2 * army_factor — works CalculateCohesionChangeInternal
Camp Building (Engineering, primary) factor bonus, bonus = -0.5 Party: in army; role: army commander; siege side: attacker works CalculateDailyCohesionChange
Horde Leader (Tactics, secondary) factor bonus, bonus = -0.05 Role: army commander works CalculateDailyCohesionChange

NavalDLC sources: Nord army cohesion feat. The feat applies when the leader party is not at sea; its text says Nord armies lose 30% more cohesion on land, but the −0.3 factor on a negative change shrinks the loss by 30%.

Influence cost to call a party

DefaultArmyManagementCalculationModel::CalculatePartyInfluenceCost(armyLeaderParty, party) (CalculatePartyInfluenceCost). NavalDLC delegates.

cost = int(0.65 · relation_f · strength_f · random_factor · distance_f · size_f · policy_f · perk_f · feat_f · 20)
Source Stage Value Conditions Verdict IL
Sturgian army influence cost feat factor sturgian_feat_bonus — works CalculatePartyInfluenceCost
Vlandian army influence feat factor vlandian_feat_bonus — works CalculatePartyInfluenceCost
Inspiring Leader (Leadership, primary) factor bonus, bonus = -0.2 Role: army commander works CalculatePartyInfluenceCost
Lord's Privy Council factor 0.2 Faction: kingdom policy active works CalculatePartyInfluenceCost
Marshals factor -0.1 Faction: kingdom policy active works CalculatePartyInfluenceCost
Royal Commissions factor -0.3 Faction: kingdom policy active; hero: kingdom ruler works CalculatePartyInfluenceCost
Senate factor 0.1 Faction: kingdom policy active works CalculatePartyInfluenceCost
Call To Arms (Tactics, secondary) multiply 1 + bonus, bonus = -0.15 Role: army commander works CalculatePartyInfluenceCost
Distance to the called party multiply 1 + (min(10 * map_diagonal, max(1, distance)) / map_diagonal) ^ 0.67 — works CalculatePartyInfluenceCost
Called lord random factor multiply random_factor — works CalculatePartyInfluenceCost
Relation with the called lord multiply 1 - min(100, max(0, relation)) ^ 0.5 / 20 + max(0, min(100, -relation)) ^ 0.5 / 10 — works CalculatePartyInfluenceCost
Called party size ratio multiply 0.5 + (1 - (size_score - size_ratio) / (1 - size_ratio)) — works CalculatePartyInfluenceCost
Called party strength multiply 0.5 + min(1000, strength) / 100 — works CalculatePartyInfluenceCost

Cohesion boost influence cost

DefaultArmyManagementCalculationModel::CalculateTotalInfluenceCostInternal (CalculateTotalInfluenceCostInternal). NavalDLC delegates.

cost = ceil(Σ party call costs · (1 + Σ factors) · percentage / 100)

CalculateTotalInfluenceCost multiplies this by 0.25 (truncated) unless the army is the main party's.

Source Stage Value Conditions Verdict IL
Encirclement (Tactics, secondary) factor bonus, bonus = -0.1 Role: army commander works CalculateTotalInfluenceCostInternal
Royal Commissions factor -0.3 Faction: kingdom policy active works CalculateTotalInfluenceCostInternal

Morale and disorganization

Party morale

Live consumer NavalDLCPartyMoraleModel::GetEffectivePartyMorale (GetEffectivePartyMorale). No clamp in this method.

morale = 50 + generosity + recent_events · (1 + trait) + 0.1 · leadership + starvation + unpaid wages + perks + food variety + over size

In code order: generosity, recent events, Leadership skill effect (the party's effective leader only; an army leader's skill does not reach other army parties), starvation −30, unpaid wages -20 · unpaid_wages, perks, food variety, over size -(over_limit ^ 0.5) (militia and villagers skipped). Peasant Leader is the only factor.

Food variety by ItemRoster.FoodVariety: 0-1 → −2, 2 → −1, 3 → 0, 4 → 1, 5 → 2, 6 → 3, 7 → 5, 8 → 6, 9 → 7, 10 → 8, 11 → 9, 12 → 10, 13+ → 10. Skipped for starving parties.

Source Stage Value Conditions Verdict IL
Warrior's Diet (Steward, secondary) override 0 Role: party leader differs CalculateFoodVarietyMoraleBonus
Self Promoter (Charm, secondary) add bonus, bonus = 1.0 Role: party leader; settlement: under siege works GetMoraleEffectsFromPerks
Gourmet (Steward, primary) add food_variety_morale Role: quartermaster works CalculateFoodVarietyMoraleBonus
Logistician (Steward, primary) add bonus, bonus = 4.0 Role: quartermaster works GetMoraleEffectsFromPerks
Increase morale of the parties under your command (Leadership skill effect) add bonus * skill, bonus = 0.1 per point Role: party leader differs GetMoraleEffectsFromSkill
Food variety (morale) add food_variety_morale Party: not starving works CalculateFoodVarietyMoraleBonus
Over party size limit (morale) add -(over_limit ^ 0.5) — works GetPartySizeMoraleEffect
Recent events morale add recent_events_morale — works GetEffectivePartyMorale
Starvation (morale) add -30 Party: starving works GetEffectivePartyMorale
Unpaid wages (morale) add -20 * unpaid_wages — works GetEffectivePartyMorale
Peasant Leader (Crossbow, primary) factor bonus * low_tier_troops / total_troops, bonus = 0.1 Role: party leader differs GetMoraleEffectsFromPerks
Generosity trait: flat party morale add trait_effect Hero: party leader generosity trait works GetEffectivePartyMorale
Generosity trait: morale gained from recent events add recent_events_morale * trait_effect Hero: party leader generosity trait; party: recent events morale positive works GetEffectivePartyMorale
Valor trait: morale lost from recent events add recent_events_morale * trait_effect Hero: army or party leader valor trait; party: recent events morale negative works GetEffectivePartyMorale

NavalDLC sources: Efficient Captain (Boatswain, secondary).

Disorganized duration

Live consumer NavalDLCPartyImpairmentModel::GetDisorganizedStateDuration (GetDisorganizedStateDuration), in hours.

duration = 6 · (1 + Σ factors)

The last factor is the Calculating trait of the army leader (else the party leader): +1.0 at Calculating −2, +0.5 at −1.

Source Stage Value Conditions Verdict IL
Foragers (Scouting, secondary) factor bonus, bonus = -0.15 Role: party leader works GetDisorganizedStateDuration
Swift Regroup (Tactics, primary) factor bonus, bonus = -0.15 Role: party member works GetDisorganizedStateDuration
Calculating trait: disorganized duration factor trait_effect Hero: army or party leader calculating trait works GetDisorganizedStateDuration

NavalDLC sources (at sea): Windborne (Shipmaster, secondary).

Encounters and visits

Bribe chance

Live consumer NavalDLCEncounterModel::GetBribeChance (GetBribeChance).

chance = min(1, (1 - 1 / (1 + 2.7182817 ^ (k · (strength_ratio - threshold)))) · (1 + Scarface))
Source Stage Value Conditions Verdict IL
Scarface (Roguery, primary) factor bonus, bonus = 0.3 Hero: main hero; role: personal; victim: bandit villager or caravan party differs GetBribeChance

NavalDLC sources: Arr! (Mariner, primary) (adds 0).

Surrender chance

DefaultEncounterModel::GetSurrenderChance (GetSurrenderChance). NavalDLC delegates.

chance = 1 - 1 / (1 + 2.7182817 ^ (k · (strength_ratio - threshold)))
chance = min(1, chance · (1 + Scarface))     main party not at sea, main hero has Scarface

threshold, k: villager 0.23, −13; caravan 0.3, −10; bandit −15 with threshold 0.2 at sea, 0.005 for the deserters clan, else 0.1. Same early returns as the bribe chance.

Source Stage Value Conditions Verdict IL
Scarface (Roguery, primary) multiply min(1, chance * (1 + bonus)), bonus = 0.3 Hero: main hero; party: not at sea; role: personal; victim: bandit villager or caravan party works GetSurrenderChance

Forcing bandits to join

Live consumer NavalDLCEncounterModel::CanPlayerForceBanditsToJoin (CanPlayerForceBanditsToJoin). Boolean: the main hero has Partners in Crime. At sea NavalDLC checks Arr! (Mariner) instead.

Source Stage Value Conditions Verdict IL
Partners in Crime (Roguery, primary) override 1 Hero: main hero; party: not at sea; role: party leader differs CanPlayerForceBanditsToJoin

Villager bribe amount

VillagerCampaignBehavior::CalculateConversationPartyBribeAmount (CalculateConversationPartyBribeAmount).

demand = min(2000, floor(0.2 · (goods_value + trade_gold)))
demand = Round(demand · (1 + Salt the Earth))     after the 2000 cap

Gold paid is min(trade_gold, demand); items make up the rest.

Source Stage Value Conditions Verdict IL
Salt the Earth (Roguery, primary) multiply 1 + bonus, bonus = 0.2 Party: main party; role: party leader; victim: villager party works CalculateConversationPartyBribeAmount

Villager goods price

VillagerCampaignBehavior::village_farmer_buy_products_on_condition (village_farmer_buy_products_on_condition). Sum over non-pack-animal items of price · count, with Silver Tongue ceil(price · (1 - bonus)).

Source Stage Value Conditions Verdict IL
Silver Tongue (Trade, secondary) multiply 1 - bonus, bonus = 0.15 Party: villager; role: quartermaster differs village_farmer_buy_products_on_condition

Villager extortion wait

VillagerCampaignBehavior::taking_food_from_villagers_wait_on_condition and press_into_service_confirm_on_condition (VillagerCampaignBehavior): hours of the wait menu after forcing a villager party.

take food        = 12 − trunc(Roguery / 30)
press into service = 24 − trunc(Roguery / 15)

Roguery: the highest raw Roguery among the main party's heroes. No limit. No module replaces VillagerCampaignBehavior.

Game number Source Stage Value Conditions Verdict
villager_take_food_wait_hours Roguery skill level add -floor(skill / 30) Party: main party works
villager_press_into_service_wait_hours Roguery skill level add -floor(skill / 15) Party: main party works

Town trade tax per visit

CaravansCampaignBehavior::OnSettlementEntered (OnSettlementEntered) and VillagerCampaignBehavior::OnSettlementEntered. Each producer adds the bonus rounded to the town's accumulated trade tax when a party enters a town. The governor's presence is not checked.

Source Stage Value Conditions Verdict IL
Toll Gates (Trade, secondary) add bonus, bonus = 30.0 Party: caravan; role: governor; settlement: town differs OnSettlementEntered
Traveling Rumors (Trade, secondary) add bonus, bonus = 20.0 Party: villager; role: governor; settlement: town works OnSettlementEntered

NavalDLC sources: Salvage (Boatswain, secondary).

Changelog