Naval campaign
Every campaign-map game number that NavalDLC adds or changes and that a skill, perk, feat or policy touches, at full precision for game v1.5.7: party speed at sea, ship crew, cargo at sea, spotting at sea, wages and food at sea, raids, fishing, embark and recall times, getting away from an engagement, ship salvage and shipyards, governor income from ships, and the Nord naval feats. Land formulas are on Party and map; village production and militia terms of NavalDLC are on Settlements. Plain-language versions per skill: Shipmaster, Boatswain, Mariner, Steward, Roguery.
Module status: only what NavalDLC adds or changes needs NavalDLC; the base raid hit damage, No Rest for the Wicked, Efficient Campaigner's raid food loot and the default inventory, food, spotting, wage and cohesion terms are in the base game. NavalDLC models extend the default models (call the default method first, then add terms) unless a section says replaces. SandBox and BirthAndDeath change none of these formulas; StoryMode's only extension here is the party size limit, in the story campaign.
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 add, added to the base. A sub-number added to the base adds its own result the same way.Σ factors: every percentage factor, summed and applied once; factors do not multiply each other.min,max: the lower and upper limits, applied last.- Adds and factors within 1e-5 of 0 are skipped.
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, Navigator, FirstMate (the party's clan role holders, else the effective party leader), Governor (the governor of the named town; for most governor perks the governor must be in that town; sites that read the governor directly have no presence check and say so), Personal. "At sea" means the party is currently sailing. Terrain names are the map face terrain types: OpenSea, CoastalSea, River, UnderBridge.
Verdicts in the tables:
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.
Party speed at sea
Live consumer NavalDLCPartySpeedCalculationModel (CalculateFinalSpeed). The pipeline is the same as on land (base number, then final number; an attached army member reuses its leader party's base): see Party map speed. At sea NavalDLC's base step discards the land base and uses the sea base below. NavalDLC's final step then runs the default final step (its terms guarded by "not at sea" are skipped; Snow or Blizzard −0.1 has no at-sea guard and still applies) and adds the at-sea terms below.
Formula
base_sea = 4 party has no ships
base_sea = 0.5 · (mean_ship_speed + slowest_ship_speed) otherwise
speed = clamp( (base_sea + overburdened_sea + shallow_draft_bonus + storyline)
· (1 + Σ base factors + Σ default final factors + Σ sea final factors), 1, 10 )
mean_ship_speed: sum of each ship's campaign speed over the ships of the party and every attached party, divided by their count.slowest_ship_speed: the lowest of those. Ship campaign speed comes from hull, upgrades and figurehead; no skill touches it.overburdened_sea: the at-sea overburdened sub-number below, only when cargo exceeds capacity.shallow_draft_bonus: the shallow-draft term below.storyline: 1 for the main party while the naval storyline is active, else 0.Σ base factors: crew, fleet size and disorganized factors ofCalculateNavalBaseSpeed.- Clamp: a minimum of 1 at the end of the sea base step and of the default final step; a maximum of 10 at the end of the at-sea branch. Land parties have no upper limit.
- A party at sea with no ships returns base 4 at once: no crew, overburden, fleet size or disorganized terms, and no shallow-draft term. The final terms still apply.
Adds (overburden, shallow draft, storyline) enter the base, so every factor scales them.
Base terms (CalculateNavalBaseSpeed), in code order
- Base: 4 without ships, else
0.5 · (mean_ship_speed + slowest_ship_speed). - Ghost Ship (Shipmaster, secondary): fishing parties only, factor from the governor of the fishing village's bound town.
- Undermanned:
-0.4 · (1 - crew / skeletal_crew)whencrew < skeletal_crew(see Ship crew and Skeletal crew). - Overmanned:
crew_capacity / crew - 1whencrew > crew_capacity;crew_capacityis the sum of each ship's total crew capacity over the party's and attached parties' ships. - Overburdened at sea: added to the base when
cargo_weight > capacity. - Over fleet size:
-fleet_size_penaltywhen the party and attached parties have more than 3 ships. - Disorganized: −0.4.
- Minimum 1.
Sea final terms (CalculateFinalSpeed), in code order
-
Terrain:
OpenSea+0.448; elseRiver+0.5.CoastalSeaandUnderBridgeget neither. -
Shallow draft (party with own ships): each own ship whose hull can navigate shallow water contributes
+0.066 · campaign_speedonCoastalSea,RiverorUnderBridgeand-0.066 · campaign_speedon any other face; other hulls contribute 0. The sum divided by the party's own ship count is added to the base. Attached parties' ships do not count. Steps 3 to 8 are skipped for a party on a raft or a ferry (naval auto travel). -
River Raider (Shipmaster, primary): on
CoastalSea,RiverorUnderBridge, factor-0.448 · bonus. -
Nord ship movement feat: on
CoastalSea,RiverorUnderBridge, factor equal to the feat value (0.1). -
Sailing speed skill effect (Shipmaster): navigator's skill × 0.0005.
-
Old Salt's Touch (Shipmaster, primary).
-
Favorable Tide (Shipmaster, primary).
-
Storyline: +1 added to the base for the main party while the naval storyline is active.
-
Wind: factor
wind_boost · (1 + sum_of_factors), wheresum_of_factorsis the sum of every factor already on the number (base factors, default final factors and steps 1-7). Fair Winds and Shock and Awe are left out of the boost on a raft or a ferry. -
Maximum 10.
Wind boost
CalculateWindBoostForParty (CalculateWindBoostForParty):
angle = |bearing rotation − wind rotation| in degrees
wind_boost = 0 wind length 0
wind_boost = clamp(wind_length · (1 − angle / 120) · 1.5, 0, 1.5) + Fair Winds bonus angle < 120
wind_boost = Shock and Awe bonus (0 without the perk) angle ≥ 120
factor = wind_boost · (1 + sum_of_factors)
- Wind is the map weather's wind at the party position;
wind_lengthis its strength. - The angle is not wrapped to 0-180, so some headings near the 0/360 seam count as against the wind.
Sources
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Sea base speed without ships | override | 4 |
Party: at sea, no ships | works | CalculateNavalBaseSpeed |
| Ship campaign speed | override | 0.5 * (mean_ship_speed + slowest_ship_speed) |
Party: at sea | works | CalculateNavalBaseSpeed |
| Ghost Ship (Shipmaster, secondary) | factor | bonus, bonus = 0.2 |
Party: fishing party; role: governor | works | CalculateNavalBaseSpeed |
| Undermanned ships | factor | -0.4 * (1 - crew / skeletal_crew) |
Party: at sea; crew below skeletal crew | works | GetUnderSkeletalCrewEffect |
| Overmanned ships | factor | crew_capacity / crew - 1 |
Party: at sea; crew above capacity | works | GetOverCrewSizeEffect |
| Overburdened at sea | add | overburdened_effect |
Party: at sea | works | CalculateNavalBaseSpeed |
| Over fleet size | factor | -fleet_size_penalty |
Party: at sea; more than 3 ships | works | CalculateNavalBaseSpeed |
| Disorganized at sea | factor | -0.4 |
Party: at sea, disorganized | works | CalculateNavalBaseSpeed |
| Open sea | factor | 0.448 |
Party: at sea; terrain: open sea | works | CalculateFinalSpeed |
| River sailing | factor | 0.5 |
Party: at sea; terrain: river | works | CalculateFinalSpeed |
| Shallow draft hulls | add | shallow_draft_bonus |
Party: at sea; shallow-draft ships | works | CalculateFinalSpeed |
| River Raider (Shipmaster, primary) | factor | -0.448 * bonus, bonus = -0.03 |
Party: at sea, not on a raft or ferry; role: navigator; terrain: coastal sea, river or under bridge | works | CalculateFinalSpeed |
| Nord ship movement feat | factor | 0.1 |
Culture: Nord; party: at sea, not on a raft or ferry; terrain: coastal sea, river or under bridge | differs | CalculateFinalSpeed |
| Sailing speed increased (Shipmaster skill effect) | factor | bonus, 0.0005 per skill point |
Party: at sea; role: navigator | works | CalculateFinalSpeed |
| Old Salt's Touch (Shipmaster, primary) | factor | bonus, bonus = 0.02 |
Party: at sea, not on a raft or ferry; role: navigator | works | CalculateFinalSpeed |
| Favorable Tide (Shipmaster, primary) | factor | bonus, bonus = 0.05 |
Party: at sea, not on a raft or ferry; role: navigator | works | CalculateFinalSpeed |
| Wind | factor | wind_boost * (1 + sum_of_factors) |
Party: at sea | works | CalculateWindBoostForParty |
| Fair Winds (Shipmaster, primary) | factor | bonus * (1 + sum_of_factors), bonus = 0.1 |
Party: at sea, not on a raft or ferry; role: navigator | differs | CalculateWindBoostForParty |
| Shock and Awe (Shipmaster, secondary) | factor | bonus * (1 + sum_of_factors), bonus = 0.1 |
Party: at sea, not on a raft or ferry; role: navigator | differs | CalculateWindBoostForParty |
| Naval storyline speed (Gunnar's Skill) | add | 1 |
Party: main party, at sea, not on a raft or ferry | works | CalculateFinalSpeed |
| Sea speed cap | cap | 10 |
Party: at sea | works | CalculateFinalSpeed |
Differences from the tooltips:
- Nord ship movement feat: the feat text says 20% ship speed in rivers and coastal seas; the feat value is 0.1, so +10%.
- Fair Winds: the +10% is part of the wind boost, so it is multiplied by
1 + sum_of_factorsinstead of being a flat +10%. Only for headings under 120 degrees from the wind. - Shock and Awe: same scaling as Fair Winds; only for headings of 120 degrees or more from the wind with a non-zero wind. The unwrapped angle makes some headings near the seam count as against the wind.
- River Raider stays
works: the coastal penalty is the missing +0.448 open-sea factor, and the perk adds 3% of it (-0.448 · -0.03= +0.01344) on coastal sea, under bridge and also on rivers, which already get +0.5. - Old Salt's Touch, the Shipmaster skill effect and every other factor added before the wind step enlarge the wind factor.
- Ghost Ship (secondary) needs the governor of the fishing village's bound town to have the perk and be in that town.
Worked example
A party with three ships (mean campaign speed 5, slowest 4) on open sea, running before the wind (non-perk wind boost 0.3), with a Shipmaster 0 navigator holding Old Salt's Touch, Favorable Tide and Fair Winds. Factors before the wind step sum to 0.518. Inputs: mean ship speed 5, slowest ship speed 4, wind boost 0.3, sum of factors 0.518.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Ship campaign speed | override | 4.5000 | |
| 1 | Fair Winds | factor +15.18% | +0.6831 | 5.1831 |
| 2 | Favorable Tide | factor +5% | +0.2250 | 5.4081 |
| 3 | Old Salt's Touch | factor +2% | +0.0900 | 5.4981 |
| 4 | Open sea | factor +44.8% | +2.0160 | 7.5141 |
| 5 | Wind | factor +45.54% | +2.0493 | 9.5634 |
| Result | Party map speed | 9.5634 |
With these inputs, party map speed is 9.5634.
- Base:
0.5 · (5 + 4)= 4.5000. Ship campaign speed replaces the land base. - Wind:
0.3 · (1 + 0.518)= +45.54%; Fair Winds is part of the same boost,0.1 · (1 + 0.518)= +15.18%. - The Shipmaster skill effect contributes 0 at Shipmaster 0. All five factors are summed and applied once to 4.5000: 9.5634, inside the 1 to 10 clamp.
Fleet size speed penalty
Consumer NavalDLCPartySpeedCalculationModel::CalculateNavalBaseSpeed (CalculateNavalBaseSpeed). Sequential float, computed only when ships > 3, entered into party speed as factor -penalty. No clamp.
penalty = 0.2 / (1 + e ^ (−0.5 · ((ships − 3) − 3)))
penalty = penalty · (1 + Shore Master bonus) navigator has Shore Master (secondary)
penalty = penalty · (1 + Fleet Commander bonus) leader has Fleet Commander (primary)
ships: number of ships of the party plus every attached party.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Shore Master (Shipmaster, secondary) | multiply | 1 + bonus, bonus = -0.3 |
Party: at sea; role: navigator | works | CalculateNavalBaseSpeed |
| Fleet Commander (Shipmaster, primary) | multiply | 1 + bonus, bonus = -0.3 |
Party: at sea; role: party leader | works | CalculateNavalBaseSpeed |
The two perks multiply each other (0.7 × 0.7), they do not add to −60%.
Worked example
A fleet of 6 ships (party plus attached parties) whose navigator has Shore Master and whose leader has Fleet Commander. Inputs: ships 6.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Fleet size speed penalty (sea) | base | 0.1000 | |
| 1 | Shore Master | multiply ×0.7 | -0.0300 | 0.0700 |
| 2 | Fleet Commander | multiply ×0.7 | -0.0210 | 0.0490 |
| Result | Fleet size speed penalty (sea) | 0.0490 |
With these inputs, fleet size speed penalty (sea) is 0.0490.
With 6 ships the exponent is 0, so the base penalty is half of 0.2: 0.1000. The two perks bring it to 0.0490 instead of 0.1000.
Ship crew count
Consumer NavalDLCPartySpeedCalculationModel::CalculateNavalBaseSpeed (CalculateNavalBaseSpeed). Integer, read only by the Undermanned and Overmanned speed factors.
crew = members (+ prisoners with Chain to Oars) Undermanned check
crew = members Overmanned check
members: all members of the party plus each attached party.prisoners: all prisoners of the party when its leader has Chain to Oars, plus that of each attached party that has the perk itself (GetSkeletalCrewCount, summed per party).
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Chain to Oars (Shipmaster, secondary) | add | prisoners |
Party: at sea; role: party leader | differs | GetSkeletalCrewCount |
- Chain to Oars: prisoners count toward the skeletal crew only in the campaign speed check (Undermanned); the Overmanned check counts members only. Ship deployment in naval battles uses the skeletal crew without prisoners.
Skeletal crew requirement
Consumer NavalDLCPartySpeedCalculationModel::CalculateNavalBaseSpeed (CalculateNavalBaseSpeed). Standard modifier sum, then rounded; used only for the Undermanned speed factor.
skeletal_crew = round( skeletal_crew_capacity · (1 + Fleet Commander bonus) )
skeletal_crew_capacity: sum of each ship's skeletal crew capacity over the party's and attached parties' ships.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Fleet Commander (Shipmaster, secondary) | factor | bonus, bonus = -0.2 |
Party: at sea; role: party leader | differs | CalculateNavalBaseSpeed |
- Fleet Commander (secondary): the tooltip says the skeleton crew requirement of any ship in the party; the lower requirement applies only to the campaign speed check. Ship deployment in naval battles reads each ship's skeletal crew capacity unreduced.
Cargo at sea
Overburdened effect at sea
Sub-number added to the sea speed base when cargo_weight > capacity. Consumer NavalDLCPartySpeedCalculationModel::GetOverburdenedEffect (GetOverburdenedEffect); its only caller is CalculateNavalBaseSpeed. The land version is on Overburdened effect.
overburdened_sea = (−1 · excess_weight / capacity) · (1 + Σ factors)
excess_weight = cargo_weight − capacity
cargo_weight: total weight carried by the party plus attached parties.capacity: the party's inventory capacity at sea (whole number), computed without attached parties (their ships are still added, see below).
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Overburdened at sea | override | -1 * excess_weight / capacity |
Party: at sea | works | GetOverburdenedEffect |
| Veteran's Wisdom (Boatswain, secondary) | factor | bonus, bonus = -0.2 |
Party: at sea; role: first mate | works | GetOverburdenedEffect |
The sea base is −1 per unit of excess ratio, against −0.4 on land. The land perks Energetic and Unburdened are never reached at sea.
Inventory capacity at sea
Live consumer NavalDLCInventoryCapacityModel::CalculateInventoryCapacity (CalculateInventoryCapacity). NavalDLC calls the default and, when the at-sea flag is true, adds the ships' cargo. The default terms and the land-only terms (spare mounts, pack animals, Forced Labor, Caravan Master) are on Inventory capacity.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Ship cargo capacity | add | ship_inventory_capacity |
Party: at sea | works | CalculateInventoryCapacity |
ship_inventory_capacity: sum of each ship's cargo capacity over the party's ships and every attached party's ships. The attached parties' ships are added even when the caller asks for the party alone.
Item cargo weight
Consumer NavalDLCInventoryCapacityModel::GetItemEffectiveWeight (GetItemEffectiveWeight). Standard modifier sum per item; the party's total weight carried sums them.
- Not at sea: the default model, which gives 0 for any item with a horse component and the item weight otherwise.
- At sea: base by item kind (mount 50, pack animal 30, livestock 20, any other item its own weight), then the perk factors below.
- At sea NavalDLC also adds 50 cargo weight per mounted non-hero troop to the party's total weight carried; that is outside this per-item number.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Mount weight at sea | override | 50 |
Item: mount; party: at sea | works | GetItemEffectiveWeight |
| Pack animal weight at sea | override | 30 |
Item: pack animal; party: at sea | works | GetItemEffectiveWeight |
| Livestock weight at sea | override | 20 |
Item: livestock; party: at sea | works | GetItemEffectiveWeight |
| Naval Horde (Boatswain, secondary) | factor | bonus, bonus = -0.3 |
Item: mount; party: at sea; role: first mate | works | GetItemEffectiveWeight |
| Optimization (Boatswain, secondary) | factor | bonus, bonus = -0.3 |
Item: pack animal or livestock; party: at sea; role: first mate | works | GetItemEffectiveWeight |
| Gilded Purse (Boatswain, secondary) | factor | bonus, bonus = -0.15 |
Item: trade good; party: at sea; role: first mate | works | GetItemEffectiveWeight |
Spotting at sea
Seeing range base
Consumer NavalDLCMapVisibilityModel::GetPartySeeingRangeBase (GetPartySeeingRangeBase). Sequential float; it is the base of the spotting range.
seeing_base = 12 by day, 6 at night default model
seeing_base = seeing_base · 0.5 at sea, on a raft or ferry
seeing_base = seeing_base + 3 at sea, night, navigator has Night Raider
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Raft state seeing range | multiply | 0.5 |
Party: at sea, raft or ferry | works | GetPartySeeingRangeBase |
| Night Raider (Shipmaster, primary) | add | 3 |
Party: at sea; role: navigator; time: night | differs | GetPartySeeingRangeBase |
- Night Raider: the −50% bonus is never read; a flat +3 is added. That equals 50% of the default 6-point night penalty, but it is a constant, and a raft's or ferry's halved base still gets the full +3. Sea only, as the tooltip shows.
Spotting range at sea
Live consumer NavalDLCMapVisibilityModel::GetPartySpottingRange (GetPartySpottingRange). NavalDLC calls the default (land terms on Party spotting range) and adds the at-sea factors; the default maximum of 60 still clamps.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Raven Eye (Shipmaster, primary) | factor | bonus, bonus = 0.2 |
Party: at sea; role: navigator | works | GetPartySpottingRange |
| Spotting at sea | factor | 0.3 |
Party: at sea | works | GetPartySpottingRange |
| Storm spotting penalty | factor | -0.4 |
Party: at sea, inside a storm | works | GetPartySpottingRange |
- Storm: the first active storm whose effect radius contains the party applies −0.4 and the loop stops, so overlapping storms count once.
Food and wages at sea
Food consumption at sea
Live consumer NavalDLCMobilePartyFoodConsumptionModel::CalculateDailyFoodConsumptionf (CalculateDailyFoodConsumptionf). The value is negative (food lost per day); negative factors shrink consumption. Default terms and the maximum of −0.01 are on Party food consumption.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Food consumption reduction at sea | factor | -0.2 |
Party: at sea | works | CalculateDailyFoodConsumptionf |
| Smooth Operator (Boatswain, secondary) | factor | bonus, bonus = -0.3 |
Party: at sea; role: first mate | works | CalculateDailyFoodConsumptionf |
Daily wage at sea and convoys
Live consumer NavalDLCPartyWageModel::GetTotalWage (GetTotalWage). NavalDLC calls the default (terms and the minimum of 0 on Party daily wage) and adds factors only at sea.
mounted_wage_share = Σ wage of non-hero mounted troops / base_wage
non_mariner_wage_share = Σ wage of non-hero non-mariner troops / base_wage
- Wage per troop stack is the troop's wage times its count; the count is all troops, or only healthy troops when the quartermaster has Aid Corps.
base_wage: the base number of the default wage.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Wage reduction at sea | factor | -0.2 |
Party: at sea | works | GetTotalWage |
| Convoy wage cut at sea | factor | -0.8 |
Party: at sea, caravan | works | GetTotalWage |
| Optimization (Boatswain, primary) | factor | bonus * non_mariner_wage_share, bonus = -0.1 |
Party: at sea; role: first mate | works | GetTotalWage |
| Naval Horde (Boatswain, primary) | factor | bonus * mounted_wage_share, bonus = -0.3 |
Party: at sea; role: first mate | works | GetTotalWage |
| Aid Corps (Steward, primary) | base | 0 |
Party: at sea; role: quartermaster | differs | GetTotalWage |
- A sea convoy gets −0.2 and −0.8, a total of −1.0 before perks; the default minimum of 0 holds, so its wage is 0.
- Aid Corps (at-sea site): here it only switches the two share sums to healthy troops, which shrinks the Optimization and Naval Horde shares. It does not reduce wages in this model.
Raids
Raid hit damage
Live consumer NavalDLCRaidModel::CalculateHitDamage (CalculateHitDamage). Hourly damage to the raided village. NavalDLC calls the default DefaultRaidModel::CalculateHitDamage (CalculateHitDamage) and adds terms per raiding party. No clamp.
damage = ((troops ^ 0.5 + 5) / 900 · hours) · (1 + Σ factors)
party_share = party members / side total troops
troops: attacker side troop count.hours: campaign tick length in hours.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| No Rest for the Wicked (Roguery, secondary) | factor | bonus, bonus = 0.05 |
Role: party leader | works | CalculateHitDamage |
| Nord hostile action speed feat | factor | 0.2 * party_share |
Culture: Nord | works | CalculateHitDamage |
| Shield Breaker (Mariner, secondary) | factor | bonus * party_share, bonus = 0.25 |
Party: at sea; role: party leader | differs | CalculateHitDamage |
- No Rest for the Wicked stays
worksand is broader: it is added once per raiding party whose leader has the perk, so it stacks in an army. - Nord hostile action speed feat: a lone Nord raider gets +20%; in a mixed army only its troop share counts. Land and sea.
- Shield Breaker (secondary): since v1.5.7 the half is an Add of 0.25, so the tooltip shows "+0.3% naval raid speed". For each raiding party at sea the game builds a separate number with base 0, adds 0.25 to it and, the result not being 0, adds it times the party's troop share as a factor: a lone raider at sea gets +25%.
Raid loot multiplier
Live consumer NavalDLCRaidModel::GetRaidLootMultiplier (GetRaidLootMultiplier). Sequential since v1.5.7: base 1, plus the Mercy trait of the army leader's hero (else the party leader), plus 0.5 for a party at sea. RaidEventComponent::Update gives each looted item to the looting party with chance 0.5 · multiplier; the attacker side leader party's multiplier also scales the hearth gold and production rewards of the raid.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Mercy trait: raid loot | add | trait_effect |
Hero: army or party leader mercy trait | works | GetRaidLootMultiplier |
| Raiding party at sea | add | 0.5 |
Party: at sea | works | GetRaidLootMultiplier |
| Brute Force (Mariner, secondary) | factor | bonus, bonus = 0.2 |
unused |
- Mercy trait:
trait_effectis +0.4 at Mercy -2 and +0.2 at -1. - Raiding party at sea: +0.5, the value of Brute Force's primary half, for every raiding party at sea; the game no longer checks the perk. Brute Force (secondary) is never read (
unused).
Raid food loot
Consumer RaidEventComponent::Update (Update), base game. Each raid tick a raiding party picked by a random troop index loots one item roll: the village loses 1, and with chance 0.5 · raid_loot_multiplier the party receives 1 unit, +1 for food when its leader has Efficient Campaigner. The loot-item-in-raid helper adds the same +1 for food.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Efficient Campaigner (Steward, primary) | add | 1 |
Role: party leader | differs | Update |
| Efficient Campaigner (Steward, primary) | add | 1 |
Role: party leader | works | LootItemInRaid |
The +1 is a constant; it equals the perk bonus. Efficient Campaigner differs: the Update check takes no environment, so the +1 also applies to raids from the sea (the same component runs naval raids), although the half is land only; the LootItemInRaid check gives nothing to a party at sea.
Fishing
Catch chance while sailing
Consumer NavalFishingCampaignBehaviour::OnHourlyTickParty (OnHourlyTickParty). Hourly: chance = Master Angler bonus; a random roll below the chance adds one fish to the party. The perk is the only source of the chance. The half is naval only (the tooltip shows it), so the party's perk check fails on land; v1.5.7 dropped the code's own at-sea test.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Master Angler (Shipmaster, primary) | add | bonus, bonus = 0.25 |
Role: navigator | works | OnHourlyTickParty |
Fishing parties per village
Consumer FishingPartyCampaignBehavior::GetIdealFishingPartyCount (GetIdealFishingPartyCount). Integer.
count = min(2, hearth_level + 1) + round(Corsair's Edge bonus) governor of the village's bound town has the perk
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| The Corsair's Edge (Shipmaster, secondary) | add | bonus, bonus = 1.0 |
Role: governor | works | GetIdealFishingPartyCount |
Fishing party catch
Consumer FishingPartyCampaignBehavior::CatchFish (CatchFish), called hourly. Custom:
c = random roll uniform [0, 1)
c = c + c · Master Angler bonus governor of the village's bound town has the perk
catch = min( randomly rounded c, trunc(free_capacity / (fish_weight + 0.1)) )
free_capacity: the fishing party's inventory capacity minus its weight carried.fish_weight: weight of the fish item.- Fish are added only when
catch > 0.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Master Angler (Shipmaster, secondary) | multiply | 1 + bonus, bonus = 0.15 |
Party: fishing party; role: governor | works | CatchFish |
| Fishing party free cargo space | cap | floor(free_capacity / (fish_weight + 0.1)) |
Party: fishing party | works | CatchFish |
The governor here is read directly, with no presence check.
Daily village fish
Consumer NavalFishingCampaignBehaviour::OnDailyTickSettlement (OnDailyTickSettlement). Base 0 plus the perk; when the rounded result is above 0, that many fish are added to the village each day.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Night Raider (Shipmaster, secondary) | add | bonus, bonus = 5.0 |
Role: governor | differs | OnDailyTickSettlement |
- Night Raider (secondary): read from the governor of the village's trade-bound town, not the governor of the settlement the village belongs to, so castle villages depend on the trade town's governor. There is no coastal check: any village with a trade-bound town gets the fish.
Transitions
Disembark time
Consumer NavalDLCPartyTransitionModel::GetTransitionTimeDisembarking (GetTransitionTimeDisembarking). NavalDLC replaces the default method. Hours:
time = 0 raft or ferry
time = 2 · (1 + Unflinching) otherwise
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Raft disembark | override | 0 |
Party: raft or ferry | works | GetTransitionTimeDisembarking |
| Unflinching (Shipmaster, primary) | factor | bonus, bonus = -0.5 |
Party: at sea; role: party leader | works | GetTransitionTimeDisembarking |
Worked example
A party (not on a raft or ferry) disembarking while its leader has Unflinching.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Disembark transition time (hours) | base | 2.0000 | |
| 1 | Unflinching | factor -50% | -1.0000 | 1.0000 |
| Result | Disembark transition time (hours) | 1.0000 |
With these inputs, disembark transition time (hours) is 1.0000.
Ship recall time
Consumer NavalDLCPartyTransitionModel::GetFleetTravelTimeToSettlement (GetFleetTravelTimeToSettlement). NavalDLC replaces the default method. Hours:
reach = clamp(distance ^ 0.95 / 35 · (1 + Shore Master), 3, 48) distance > 0, else 0
time = min(48, reach + arrival_hours) anchor moving, or anchor position valid
time = 48 otherwise
distance: map distance from the settlement to the anchor position, or to its target position while it moves; 0 when the moving anchor already heads to this settlement.arrival_hours: hours until the anchor's arrival time while it moves, else 0.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Anchor reach duration | override | min(48, min(48, max(3, distance ^ 0.95 / 35)) + arrival_hours) |
Ship: anchor valid or moving | works | GetAnchorReachDurationInHours |
| Shore Master (Shipmaster, primary) | factor | bonus, bonus = -0.5 |
Role: party leader; ship: anchor valid or moving | works | GetFleetTravelTimeToSettlement |
Getting away from an engagement
Consumer NavalDLCTroopSacrificeModel::CanPlayerSideTryToGetAwayWithTheirShipStats (CanPlayerSideTryToGetAwayWithTheirShipStats). The ship damage the player side takes to get away; the player can get away when it is below the player side's total ship hit points. It is used when the game picks ships to leave behind and when it checks whether the player can get away.
D = own_ship_hp · min(enemy_ship_hp / own_ship_hp, 3) ^ 1.3 · 0.1
D = D · (1 + Σ factors) when D > 0
D = D − 0.5 · D navigator has Ghost Ship
D = D − D · clamp(own_base_speed / enemy_base_speed, 1, 5) · 0.1 own_base_speed > enemy_base_speed
can get away = D < own_ship_hp
own_ship_hp,enemy_ship_hp: sum of ship hit points over the ships of the player side and the opposite side.own_base_speed,enemy_base_speed: base speed result of the main party and of the enemy leader party.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Reduce ships' received damage (Boatswain skill effect) | factor | bonus * skill, −0.0025 per skill point |
Party: main party; role: first mate | works | CanPlayerSideTryToGetAwayWithTheirShipStats |
| Ghost Ship (Shipmaster, primary) | multiply | 0.5 |
Party: main party; role: navigator | differs | CanPlayerSideTryToGetAwayWithTheirShipStats |
| Speed advantage when getting away | multiply | 1 - min(5, max(1, own_base_speed / enemy_base_speed)) * 0.1 |
Party: main party | works | CanPlayerSideTryToGetAwayWithTheirShipStats |
- Ghost Ship (primary): the tooltip gives a 20% chance to avoid leaving ships behind; the bonus is never read. The game halves the ship damage needed to get away with a constant 0.5.
- The speed term cuts 10% to 50% and applies only when the main party is faster.
Worked example
The player side has 1000 ship hit points against 2000 on the enemy side; the first mate has Boatswain 100, the navigator Ghost Ship, and the main party's base speed is 1.2 times the enemy leader party's. Inputs: own ship hp 1000, enemy ship hp 2000, own base speed 1.2, enemy base speed 1.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Ship damage taken by the player side to get away | base | 246.2289 | |
| 1 | Reduce ships' received damage | factor -25% | -61.5572 | 184.6717 |
| 2 | Ghost Ship | multiply ×0.5 | -92.3359 | 92.3358 |
| 3 | Speed advantage when getting away | multiply ×0.88 | -11.0803 | 81.2555 |
| Result | Ship damage taken by the player side to get away | 81.2555 |
With these inputs, ship damage taken by the player side to get away is 81.2555.
- Base: the enemy has twice the hit points, so
1000 · 2 ^ 1.3 · 0.1= 246.2289. - All three reductions multiply, so their order does not change the result: 81.2555, well below the 1000 own ship hit points, so the player side can get away.
Ships and shipyards
Salvage repair from a discarded ship
Consumer ShipRepairCampaignBehavior::OnShipDestroyed (OnShipDestroyed). Only when a ship is discarded by a mobile party whose leader has Shipwright's Hand.
pool = discarded ship hit points · 0.5
repair = min(pool, missing hit points of the ship) each party ship in list order, pool reduced by repair, stop when pool ≤ 0
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Shipwright's Hand (Boatswain, primary) | add | ship_hit_points * 0.5 |
Role: party leader | works | OnShipDestroyed |
The total restored is the smaller of the pool and the party ships' total missing hit points. The perk's bonus value (0) is not read.
Shipyard production chance
Consumer ShipProductionCampaignBehavior::DailyTickTown (DailyTickTown). Daily, for a town with a port, not under siege and with no map event: base 0.5 plus the perk. When the town has fewer ships than its maximum and a random roll is below the result, ships are built until the maximum or 10 ships.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Streamlined Operations (Boatswain, secondary) | factor | bonus, bonus = 0.2 |
Role: governor; settlement: town with port, not under siege | works | DailyTickTown |
With the perk: base 0.5 plus a factor of 0.2.
Governor gold from ships
Consumers ShipTradeCampaignBehavior::OnShipRepaired (OnShipRepaired) and ShipTradeCampaignBehavior::OnShipOwnerChanged (OnShipOwnerChanged). Each is base 0 plus one perk; the rounded result is given to the governor hero. Both are skipped when the governor is the main hero and the ship owner's leader is the main hero.
| Source | Number | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|---|
| Master Shipwright (Boatswain, secondary) | Gold per ship repaired in the town | add | bonus, bonus = 30.0 |
Role: governor; settlement: town | works | OnShipRepaired |
| Merchant Prince (Boatswain, secondary) | Gold per ship traded with the town | add | bonus, bonus = 500.0 |
Role: governor; settlement: town | works | OnShipOwnerChanged |
- Master Shipwright counts every party's ship repaired in that town.
- Merchant Prince counts only trades (a ship bought from or sold to the town); the governor is the one of the old owner settlement (bought from the town) or the new owner settlement (sold to the town).
Garrison recruits from convoys
Consumer ShipTradeCampaignBehavior::OnSettlementEntered (OnSettlementEntered). A caravan that can navigate at sea enters a town whose governor has Shipwright's Hand (no presence check):
count = min(garrison_wage_room / basic_troop_wage, round(bonus)) integer division
garrison_wage_room= garrison wage payment limit − the garrison's current total wage − 5; nothing happens when it is belowbasic_troop_wage, the wage of the faction's basic troop.count > 0adds that many of the faction's basic troop to the garrison, creating the garrison if missing.
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Shipwright's Hand (Boatswain, secondary) | add | min(garrison_wage_room / basic_troop_wage, round(bonus)), bonus = 1.0 |
Party: caravan; role: governor; settlement: town | differs | OnSettlementEntered |
| Garrison wage budget | cap | floor(garrison_wage_room / basic_troop_wage) |
Party: caravan; settlement: town | works | OnSettlementEntered |
- Shipwright's Hand (secondary): the tooltip states no wage limit; the recruit is added only when the garrison's wage room allows it.
Building progress from convoys
Consumer NavalNimbleSurgeCampaignBehaviour::OnSettlementEntered (OnSettlementEntered). Sequential: the current building's progress gets +bonus (Favorable Tide's secondary value, 1), then the game checks whether the building is complete. Daily construction power feeds the same progress from other code (Settlements).
| Source | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|
| Favorable Tide (Shipmaster, secondary) | add | bonus, bonus = 1 |
Party: caravan; role: governor | differs | OnSettlementEntered |
- Favorable Tide (secondary): adds the perk's +1 to the current building's progress, but at most once per day per caravan and settlement, which the tooltip does not say. It fires for a caravan that can navigate at sea entering any fortification whose governor has the perk (no presence check) with a building in progress. There is no port check.
Nord naval feats
Feat values are set in NavalCulturalFeats::InitializeAll (InitializeAll).
| Feat | Number | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|---|
| Nord ship movement feat | Party speed | factor | 0.1 |
Party: at sea; terrain: coastal sea, river or under bridge | differs | CalculateFinalSpeed |
| Nord army cohesion feat | Army daily cohesion change | factor | -0.3 |
Army leader party: not at sea, has the feat | differs | CalculateDailyCohesionChange |
| Nord hostile action speed feat | Raid hit damage | factor | 0.2 * party_share |
Raiding party has the feat | works | CalculateHitDamage |
- Ship movement: the text says 20% ship speed in rivers and coastal seas; the game adds +10%.
- Hostile action: the Nord hostile action loot bonus feat (factor 0.3 on loot from defeated caravans and villager parties) is on Loot share.
- Army cohesion: the text says Nord armies lose 30% more cohesion on land. The daily cohesion change is negative (base −2 plus negative terms), so the −0.3 factor shrinks the loss by 30% instead.
NavalDLCArmyManagementCalculationModelcalls the default first; the default terms are on Daily cohesion change.
Other NavalDLC terms on shared numbers
These numbers are defined on Party and map, Battles and Settlements; the NavalDLC models and behaviours add the perk terms below.
| Source | Number | Stage | Value | Conditions | Verdict | IL |
|---|---|---|---|---|---|---|
| Arr! (Mariner, primary) | Bribe chance | add | 0 |
Role: personal; victim: pirate | differs | GetBribeChance |
| Arr! (Mariner, primary) | Forcing bandits to join | override | 1 |
Party: main party, at sea; role: personal | works | CanPlayerForceBanditsToJoin |
| Arr! (Mariner, secondary) | Battle experience gain | factor | bonus, bonus = 0.15 |
Role: party leader; troops: mariner | works | CalculateXpGainFromBattles |
| Pirate Hunter (Mariner, secondary) | Battle experience gain | factor | bonus, bonus = 0.1 |
Role: party leader; troops: regular | works | CalculateXpGainFromBattles |
| Rolling Thunder (Mariner, secondary) | Prisoner conformity per hour | factor | bonus, bonus = 0.5 |
Role: party leader; victim: pirate | works | GetConformityChangePerHour |
| Efficient Captain (Boatswain, primary) | Troop upgrade cost | factor | bonus, bonus = -0.3 |
Role: party leader; troops: mariner | works | GetGoldCostForUpgrade |
| Popular Captain (Boatswain, primary) | Troop recruitment cost | factor | bonus, bonus = -0.3 |
Role: party leader; troops: mariner | works | GetTroopRecruitmentCost |
| Resilience (Boatswain, primary) | Battle-end hero healing | add | bonus * missing_hp, bonus = 0.3 |
Role: personal | differs | GetBattleEndHealingAmount |
| Resilience (Boatswain, secondary) | Daily healing of wounded regulars | factor | bonus, bonus = 0.3 |
Role: first mate | works | GetDailyHealingForRegulars |
| Veteran's Wisdom (Boatswain, primary) | Daily hero skill experience | add | bonus * leader_level, bonus = 10.0 |
Role: party leader | works | OnDailyTickParty |
| Salvage (Boatswain, primary) | Kingdom influence gain | add | ship_hit_points * 0.01 |
Role: party leader | works | OnShipDestroyed |
| Salvage (Boatswain, secondary) | Town trade tax | add | round(bonus), bonus = 40.0 |
Party: caravan; role: governor; settlement: town | works | OnSettlementEntered |
| Merchant Fleet (Boatswain, secondary) | Kingdom influence gain | add | bonus, bonus = 5.0 |
Role: governor; settlement: fortification | works | OnShipCreated |
| Windborne (Shipmaster, secondary) | Disorganized duration | factor | bonus, bonus = -0.5 |
Role: navigator | works | GetDisorganizedStateDuration |
| Ghost Ship (Shipmaster, primary) | Troops lost breaking into a besieged settlement | factor | -bonus, bonus = 0.2 |
Role: navigator | works | GetLostTroopCountForBreakingInBesiegedSettlement |
| Ghost Ship (Shipmaster, primary) | Troops lost breaking out of a besieged settlement | factor | -bonus, bonus = 0.2 |
Role: navigator; settlement: breaking out from the port | differs | GetLostTroopCountForBreakingOutOfBesiegedSettlement |
| Master and Commander (Shipmaster, primary) | Troop experience | add | bonus, bonus = 1.0 |
Party: at sea; role: party leader | differs | HourlyTickParty |
| Stormrider (Shipmaster, primary) | Troop experience | add | bonus, bonus = 30.0 |
Party: at sea, not main party; role: party leader | differs | OnPartyEnteredStorm |
| Stormrider (Shipmaster, primary) | Troop experience | add | bonus, bonus = 30.0 |
Party: main party; role: party leader | differs | TickEvent |
| Fair Winds (Shipmaster, secondary) | Village hearth change | factor | bonus, bonus = 0.1 |
Role: governor; settlement: port | works | CalculateHearthChange |
| Raven Eye (Shipmaster, secondary) | Town loyalty | add | bonus, bonus = 1.0 |
Party: fishing party; role: governor | works | OnDropOff |
| The Helmsman's Shield (Shipmaster, secondary) | Settlement prosperity | add | bonus, bonus = 1.0 |
Party: fishing party; role: governor | works | OnDropOff |
| Naval Fighting Training (Mariner, secondary) | Veteran militia chance | factor | bonus, bonus = 0.1 |
Role: governor; settlement: port | works | CalculateVeteranMilitiaSpawnChance |
- Arr! (primary, bribe chance): it adds its bonus of 0, which the game skips, so the bribe chance is unchanged. At sea the same perk is the only way for the player to force bandits to join; the default rule is skipped at sea.
- Resilience (primary): applies after any battle with a winner to heroes of every involved party, losers included, and heals 30% of all missing hit points, not only those lost in that battle. No at-sea check and no environment lookup: it also heals after land battles, although the half is sea only.
- Ghost Ship (primary, break-out): never applies; a party breaking out is inside the town and on land until it sets sail afterwards, and the half is sea only.
- Veteran's Wisdom (primary): only while the party is at sea (the perk check takes the party's environment, and the half is sea only); each companion of the party's clan in the roster gets
10 · leader levelexperience in one random naval skill (Mariner, Boatswain or Shipmaster). - Salvage: the primary gives the leader
ship hit points · 0.01influence for a discarded ship (its bonus of 0 is not read). The secondary's 40 denars go to the town's trade tax (owner clan income), not to the governor; no presence check. - Merchant Fleet (secondary): the influence goes to the settlement owner, not the governor; no presence check.
- Master and Commander (primary): hourly at sea, not on a raft or ferry and not in a map event; the experience is added once per troop stack, not per troop.
- Stormrider (primary): experience once per troop stack, not per troop. The perk is checked when a party enters a storm, at most once per day; the main party has its own path with the same check.
- Fair Winds (secondary): a village whose bound fortification has a port; a factor on a negative hearth change makes it more negative.
- Naval Fighting Training (secondary): towns with a port and villages whose bound settlement has a port; castles are not covered.
- Village production (Blessings of the Sea, Port Authority, Maritime Weal Edict, Bolster the Militia) and militia (Accuracy Training, Bolster the Militia) terms of NavalDLC are on Settlements.
Changelog
- v1.5.7 (2026-11-12): re-verified against v1.5.7. Raft and ferry (naval auto travel) skip the navigator speed terms; Overmanned counts members only (Chain to Oars moved to GetSkeletalCrewCount); Unflinching gives 1 hour; Shore Master halves the anchor reach time; Arr!, Pirate Hunter and Popular Captain apply; Stormrider checks the perk for the main party; perk environments replace the at-sea checks. Shield Breaker adds +25% raid damage at sea weighted by troop share; every raiding party at sea gets +0.5 raid loot multiplier and Brute Force (secondary) is never read; the Mercy trait adds raid loot; Shipwright's Hand counts the garrison's wage room; Favorable Tide reads its bonus.
- v1.4.8 (2026-11-11): First version from IL.