Party and map
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 )
base: the start value the model passes in.Σ adds: every flat term, added to the base. A sub-number added as a whole adds its own clamped result to the base the same way.Σ factors: every percentage factor term, summed and applied once; factors do not multiply each other.min,max: the at-least and at-most limits, applied last.- Flat and percentage terms skip values within 1e-5 of 0.
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))
total_men: party size (members) of the party and all attached parties.overburdened_effect: the overburdened sub-number below, 0 unlesscargo_weight > capacity. It is added to the base, not used as a factor, so every factor scales it.Σ land factors: the percentage factor terms ofCalculateLandBaseSpeed, in code order below.Σ final factors: the percentage factor terms ofCalculateFinalSpeed, in code order below.- Clamp: at least 1, set at the end of
CalculateLandBaseSpeedand again at the end ofCalculateFinalSpeed. Land parties have no upper limit.
Order does not change the land result: all factors sum before they apply.
Variables used by the terms:
mounted_men: the number of men with a horse, summed over the party and attached parties.footmen: the number of men without a horse, summed the same way.mounted_footmen = min(footmen, spare mounts in the item rosters).herd: pack animals + livestock +max(0, spare mounts − mounted_footmen).cargo_weight: the total weight carried, summed.capacity: the inventory capacity (whole number) plus attached parties' inventory capacity.party_size_limit: the party size limit, summed over the party and attached parties.attached_prisoners: number of prisoners, summed.own_prisoners: this party's own number of prisoners;prisoner_limit: its prisoner limit.morale:MobileParty.Morale.herding_modifier = GetHerdingModifier(total_men, herd): 0 whenherd ≤ total_men, −0.8 whentotal_menis 0, elsemax(-0.8, -0.3 · (herd - total_men) / total_men).mounted_footmen_modifier = 0.15 · mounted_footmen / total_men.wounded_modifier: the wounded sub-number below.difficulty_speed_bonus:DifficultyModel.GetPlayerMapMovementSpeedBonusMultiplier, main party only, applied only when > 0.
Land terms (CalculateLandBaseSpeed), in code order
- Strong (Athletics): foot share of the party times the perk bonus.
- Cavalry ratio
0.3 · mounted_men / total_men(0 when either is 0). - Mounted footmen ratio
0.15 · mounted_footmen / total_men. - Wet weather (
GetWeatherEffectOnTerrainForPositionis Wet): two factors, −0.3 × the cavalry term and −0.3 × the mounted footmen term. - Nomadic Traditions (Riding):
mounted_footmen_modifier · bonus, only when the modifier is > 0. The wet-weather penalty uses the unscaled modifier. - Cargo:
-0.02 · min(cargo_weight, capacity) / capacity, when that min is > 0. - Overburdened: added to the base (see the sub-number below).
- Sweeping Wind (Riding).
- Over party size:
party_size_limit / total_men - 1whentotal_men > party_size_limit; ×0.5 when the party's clan is the deserters clan. - Herding:
herding_modifier, skipped for villager parties. - Shepherd (Riding):
herding_modifier · bonus, halving the herding penalty. - Wounded:
wounded_modifier. - Over prisoner limit:
prisoner_limit / own_prisoners - 1when the party's own prisoners exceed its limit; not for caravans. - Prisoners:
1 / ((10 + total_men + attached_prisoners) / (10 + total_men)) ^ 0.33 - 1; not for caravans. - High morale:
0.05 · (morale - 70) / 30when morale > 70. - Low morale:
-0.1 · (1 - morale / 30)when morale < 30. - Difficulty:
difficulty_speed_bonus, main party only. - Caravan: +0.1.
- Disorganized: −0.4.
Final terms (CalculateFinalSpeed), in code order
- 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.
- 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).
- 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
- Snow or Blizzard weather (
GetWeatherEventInPosition): −0.125. No at-sea guard. - Night, not at sea: −0.25 plus Night Runner (Scouting). Day, not at sea: Day Traveler (Scouting).
- Uncanny Insight (Scouting):
0.001 · (skill - 200)for scout Scouting above 200, no upper cap, not at sea. - Forced March (Scouting): morale > 75, not at sea.
- Tracker (Scouting, secondary):
DefaultBehavioris EngageParty, the target party is not at sea and its faction is at war with ours. - 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.
- 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:
- Strong: the tooltip reads as a flat +5%; the game multiplies the bonus by
footmen / total_men. - Forest Kin: "infantry" is any non-mounted troop (foot archers included), wounded counted; the forest factor becomes −0.1, net +0.1 against the −0.2 baseline.
- Tracker: needs the EngageParty behaviour and a target that is not at sea and at war with the party's faction.
- The Aserai desert feat is implemented as skipping the −0.1 desert factor; the table records it as +0.1 so it cancels the desert term. Its effect bonus is not read.
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)
wounded: the number of wounded in the member rosters of the party and attached parties.- Returns 0 when
wounded ≤ total_men / 4(integer division); returns −0.5 whentotal_menis 0.
| 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.
- Base:
4.6 · (200 / 300) ^ 0.4= 3.9113. - Overburdened adds -0.2000 to the base: 3.7113.
- Factors: Pathfinder +2%, cavalry ratio
0.3 · 40 / 100= +12%, high morale0.05 · (85 - 70) / 30= +2.5%; sum +16.5%. - 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))
- Wounded troops are paid:
Numberincludes them. - A hero is not paid when he is his clan's leader, or when in the main party he is a player-clan hero with Occupation Lord. Paid in Promise changes each other hero's wage to round(troop wage · (1 + bonus)).
- Deep Pockets and Picked Shots take their troops' wage out of the total, run it through their own number, truncate to int and add it back, before the factors.
- The model's
GetCharacterWagemaps tier 0..6 to 1, 2, 3, 5, 8, 12, 17, else 23, ×1.5 for Occupation Mercenary. The link from the character's troop wage to this method is not verified. - Clamp: at least 0.
- Garrison block: the garrison terms apply to a garrison party in a fortification. Shares such as
ranged_wage / total_wageturn a percentage on one troop type into a factor on the whole wage. - Generosity trait (last factor): the party leader's, or for a leaderless garrison the town governor's when he is in the settlement;
trait_effect= −0.1 at Generosity −2, −0.05 at −1.
| 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:
- Aid Corps: wounded troops are still paid. The branch reads the troop count and the wounded count and discards both; the regular wage always uses the full troop count. Under NavalDLC the perk only shrinks the shares used by the at-sea Boatswain factors.
- Cavalry Tactics: also true when the owning clan's leader has the perk (the perk has a ClanLeader half), so the governor need not hold it.
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
horse_cost: 150 when level < 26, else 500; only when the troop's equipment has a horse and the item cost is not excluded.mercenary_add = 2 · (level_cost + horse_cost)for Occupation Mercenary, Gangster or Caravan Guard: the base ×3, horse included.- Perk and feat factors and the lower limit of 1 apply only when the buyer hero is not null. The party-leader perks are read through the buyer's party (its leader); Sword For Barter and Slick Negotiator from the buyer himself.
| 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.
- Slick Negotiator, Sword For Barter (primary): count gangsters and caravan guards as well as mercenaries.
- A buyer without a party gets none of the party-leader perks.
- StoryMode: in the story campaign the model extends the cost. While the tutorial is not completed, the tutorial placeholder volunteer costs a flat 50, replacing the whole result: no perk or feat factor (Frugal included) and no lower limit. Every other troop gets the base model's cost. IL: StoryModePartyWageModel:
GetTroopRecruitmentCost.
Troop upgrade cost
Live consumer NavalDLCPartyTroopUpgradeModel::GetGoldCostForUpgrade (GetGoldCostForUpgrade).
cost = (target_cost - source_cost) / divisor · (1 + Σ factors)
target_cost,source_cost: the troop recruitment cost with no buyer, rounded: no item cost, so only the level table and the mercenary ×3; no horse, perks, feats or lower limit.divisor: 3 when the source troop's Occupation is Mercenary or Gangster, else 2.- No clamp.
| 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)
- A party whose leader hero has a clan and that is not a caravan gets
CalculateBaseMemberSize(kingdom ruler +20, clan tier, leader perks, policies) and the Steward skill effect. The leader perks are read through the hero's party (its party leader), so a hero without a party gets none of them; Ultimate Leader is read from the hero himself. - Clan tier term:
25 · tierfor the clan leader,15 · tierotherwise, 0 below tier 1. - Caravans owned by the main hero: +10 (30 elite); 33 (46 elite) when the caravan can navigate at sea. Caravans owned by a notable:
10 · notable_power_step, step 1 for Power < 100, 2 for < 200, 3 otherwise. Villager parties: +40. - At sea (the caller passes the party's at-sea state), every ship's crew capacity bonus is a factor.
| 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.
- StoryMode: in the story campaign the model extends the limit (NavalDLC extends it in turn). The conspiracy caravan of an active story quest gets that quest's caravan party size, and a party created by the Defeat the Conspiracy quest gets 600; both replace the whole default result, so no perk, skill effect or ship crew factor applies to them. Every other party gets the base model's limit. IL: StoryModePartySizeLimitModel:
GetPartyMemberSizeLimit.
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
town_bonus: +200 for towns.- Buildings with a garrison capacity effect count for fortifications only.
| 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 |
- Village Network: only the initial roster when a villager party is created, not an ongoing limit. The governor's presence is not checked.
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)
regulars: the number of regular troops;troops: party size;food_types: the number of different food types carried.- A non-mobile party gets 0.
- The starving path skips every other term except the raft term (
-0.25 · regularsin raft state). - The fortification +10 applies in any fortification that is not a hideout, even under siege or raid.
- Skill effect: Medicine of the Surgeon at
0.01 · skillfor non-garrison parties; for a town garrison, the governor's Medicine at0.001 · skill. - No clamp.
| 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:
- A Good Days Rest, Good Lodging: excluded in hideouts and in settlements under siege, raided or being raided.
- Bush Doctor: applies only outside any settlement (or in a hideout), stationary within distance² < 2 of the last visited village, and not while that village is raided; not inside a village.
- Helping Hands:
floor(troops / 10)counts heroes and wounded. - Pristine Streets: excluded while the party or town is under siege or raid.
- Medicine governor effect: only town garrisons; castle garrisons get no Medicine healing bonus.
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 |
- A Good Days Rest, Good Lodging: excluded in hideouts (no siege or raid test for heroes).
- Bush Doctor: same gates as for regulars.
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
trait_effect: the healed hero's Valor trait, −0.05 at Valor 1 and −0.1 at Valor 2.- v1.4.8 applied Self Medication in
Hero.Healfor every heal (DefaultPartyHealingModel::GetHeroesEffectedHealingAmount); v1.5.7 removed that method, so prisoner heroes and other healing get neither term.
| 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 |
- Self Medication: only heroes healing in a party's member roster get it, not prisoner heroes.
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).
- Preventive Medicine: only after map events with a winner.
- Walk It Off (secondary): attacker side only, whether it won or lost.
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 |
dead: no game code reads it. The only call is NavalDLC's delegating override (NavalDLCPartyHealingModel::GetSurgeryChance), which nothing calls.
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
surgeon: own Surgeon's Medicine0.01 · skill · battle_factor,battle_factor1.0 in player map events, else 0.25.doctors_oath: when the enemy party has Doctor's Oath, the enemy Surgeon's Medicine0.01 · skill · battle_factor,battle_factor1.0 in player map events, else 0.1.- Heroes only:
+0.01 · armor_sum,-0.01 · age, factor +50 (odds ×51). - Early returns: survival 1 when the damage type is 2 and the damage cannot kill, for a hero when the BattleDeath campaign option is off, for the player character when BattleDeath is 1. Without a mobile party: a hero prisoner gets
1 - 0.0035 · age, everyone else 0.
| 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 |
- Doctor's Oath: the perk's bonus is never read; the enemy surgeon's survival skill effect is used instead, cut to 10% in AI map events. That term is added once per casualty.
- Physician of People: it multiplies the survival odds
Sinstead of adding 30% recovery chance. - Surgeon survival skill effect: cut to 25% in map events without the player, and added to the odds
S, not to a survival percentage. - Cheat Death: applies to every hero of the surgeon's party, not only the player.
- StoryMode: in the story campaign the killed-or-unconscious and hero death models extend these models without Medicine terms. They give a death chance of 0 to the Elder Brother, Radagos and his henchman until the main story is completed, and in missions to agents during the tutorial when their side has more than 4 members; everyone else gets the base model. IL: StoryModeAgentDecideKilledOrUnconsciousModel, StoryModeHeroDeathProbabilityCalculationModel.
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)
- Perk adds use the perk's per-troop experience, which is the bonus rounded, and need the party to be active. Since v1.5.7 the code has no at-sea test: the land-only halves switch off at sea through the perk environment.
- AI lord party, non-hero troop, not in an army led by the main party, not in a map event, owner not in the player clan:
10 + 2 · tier, or15 + 3 · tierwhen the party leader is the clan leader. Player-clan parties never get this term.
| 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:
- Drills: round(0.1) = 0, so the perk adds 0 XP.
- Seven Veterans:
GetPerkExperiencesForTroopsdoes not list the perk and returns 0, so it adds 0 XP. - Bulls Eye: the governor's presence is not checked.
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).
- Trusted Commander: applies when the map event is a player simulation or any AI-only battle (broader than the tooltip).
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))
members: the number of all members;prisoners: the number of prisoners.- Clamp: at most −0.01: consumption never falls below 0.01 per day.
- Generosity trait of the party leader (last term):
trait_effect= +0.1 at Generosity 1 and 2, so a generous leader's party eats more.
| 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).
- Promises: bandit prisoners count in the numerator while the denominator is the member count only, so 100 regular members and 100 bandit prisoners give −50% on the whole party.
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 |
- Breeder: needs more than one animal, not in the description.
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))
- The Scouting skill effect adds
0.06 · skillmap units for every party, at sea too. - Battanian forest feat, Water Diviner, Night Runner, Day Traveler, Vantage Point and Mounted Scouts apply only when the party has an effective scout.
- Clamp: at most 60.
| 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:
- Spotting distance skill effect: the tooltip says percent; the game adds map units to the base.
- Mounted Scouts: counts only members whose default formation class is Cavalry (horse archers excluded), wounded included; the test is ratio ≥ 0.5.
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)
men: the observed party's army size when it leads an army, else its own party size.forest_term: −0.3 when the observed party stands on Forest, plus-0.3 · bonuswith Keen Sight; else 0.
| 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 |
- Keen Sight: tests the spotted party's terrain, so it halves the forest hiding penalty of parties the main party looks at; it is not a penalty for the main party in forests. Main party only.
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 detection radius skill effect: the tooltip shows a percent; the value is the whole distance. Applies at sea too.
- Ranger (primary): main party only.
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 |
- Tracker (primary): the extended life is capped at 28.
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 |
- Ranger (secondary): main party only, and it lowers detection difficulty by 10% instead of adding 10% detection chance.
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:
- Above 240: tracks of enemy parties are drawn in a red palette instead of the default one.
- Above 270: a track's title is the party's name instead of the default title.
- No module overrides
DefaultMapTrackModel.
| 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))
troops: the number of healthy members (plus attached parties when requested). Arenicos' Horses adds round(troops · bonus) and Forced Labor the healthy prisoners (own party only); both are land-only halves read with the party's environment.mountsandpack_animal_capacitycount only when the at-sea flag is false.- Clamp: at least 10.
| 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.
- Caravan Master: skipped at sea (the at-sea flag skips its block), which the tooltip does not state.
- Forced Labor: only the party's own prisoners count, and Arenicos' Horses does not scale them.
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)
army_factor: 1 when the army leader is the main party, else 0.25.- Internal counts run over the leader party's attached parties. Each
(count + 1) / 2term is at least-0.5 · army_factoreven when no party qualifies.
| 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)
- 0 when both leaders share a clan.
policy_f,perk_f,feat_feach start at 1 and sum their terms: each is its own(1 + Σ)multiplier.size_ratiois 0.6 for AI callers and 0.4 when the caller is the main party.
| 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
generosity: −1 when the party leader's Generosity is −1 or −2.trait: on positive recent events the leader's Generosity, +0.1 at 1 and +0.2 at 2; on negative recent events the army leader's (else party leader's) Valor, −0.1 at 1 and −0.2 at 2.
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).
- Increase morale of the parties under your command (Leadership skill effect): reads only the party's own effective leader, not the parties under the holder's command that the tooltip names.
- Peasant Leader (primary): raises the whole party's campaign morale by the bonus times the tier 1-3 share, not the battle morale of tier 1-3 troops.
- Warrior's Diet (secondary): also removes the penalty for two food types, and it applies at sea although the half is land only.
- Efficient Captain (secondary,
differs): +5 while the party's anchor is at its current port settlement, but the half is sea only and entering a town or castle sets a party with land navigation capability not at sea, so only parties without land navigation get it.
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))
strength_ratio: party strength / other party strength. 1 when the party's strength is ~0; 0 when the other's is ~0 or the party is at least as strong.threshold,k: villager 0.3, −10; caravan 0.52, −10; bandit 0.2, −15.
| 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).
- Scarface: also raises the bribe chance, beyond the surrender chance the tooltip names; this part passes environment Any, so it applies at sea although the half is land only.
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 |
- Scarface: always reads the main hero; the surrender part is skipped at sea, matching its land-only half.
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 |
- Partners in Crime: does not count at sea.
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 |
- Silver Tongue: the discount is only displayed and gates the option; the purchase charges the full price.
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 |
- The press-into-service menu takes its starting progress from the take-food fields.
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).
- Toll Gates: caravans without land navigation capability are excluded.
Changelog
- v1.5.7 (2026-11-12): re-verified against v1.5.7. Party perks read through the perk effect environment (at-sea halving and switch-offs moved to the perk tooltips); land base speed 4.6; forest −0.2, snow −0.125, Battanian feat × 0.2, high morale value 60, settlement prisoner limit +40 flat; Vantage Point reads its primary half; Self Medication moved to member-hero healing; personality trait terms and the movement speed option added.
- v1.4.8 (2026-11-11): Raw skill reads added (surgery chance, track detection, track color and title, villager extortion wait).
- v1.4.8 (2026-11-11): First version from IL.