Bannerlord mechanics

Gossip rumors

Bannerlord v1.4.8 · checked 2026-11-10 · updated 2026-11-12

The opening line of a villager or townsperson in a settlement scene, at full precision for game v1.4.8. For a plain-language version, see the town gossip guide.

The behavior is SandBox.CampaignBehaviors.CommonVillagersCampaignBehavior, with no override in NavalDLC or StoryMode. The snippet tables and worked examples are computed by the Python model in src/bannerlord/gossip/; the condition tables are copied from the IL reading. Trade rumors in item tooltips are a separate system, see Trade rumors.

Who talks

Dialog town_or_village_start ({CONVERSATION_SCRAP}), condition conversation_town_or_village_start_on_condition:

Pools

Exactly one pool is used, first match wins:

Speaker / state Pool
child (age < BecomeTeenagerAge) 8 fixed rhymes about faction rulers
the culture's beggar / female beggar 14 fixed beggar stories
any notable here has an active issue with a non-empty IssueAsRumorInSettlement not yet told those issue rumors only
otherwise the general pool

Issue types with a rumor text:

An unclaimed issue therefore crowds out all other gossip in that settlement.

Four boxes checked left to right. Step 1: a child, 8 lines to pick from. Step 2: a beggar, 14 lines to pick from. Step 3: an adult while an untold issue rumor is here, number of lines varies. Step 4: an adult with no untold issue rumor here, number of lines varies.

Which pool of lines a speaker draws from.

Speaker Untold issue rumors here Pool Lines in pool
A child 2 Children's rhymes 8
A beggar 2 Beggar stories 14
An adult, untold issue rumor here 1 Issue rumors varies
An adult, no untold issue rumor here 0 General pool varies
Fixed value Amount
Children's rhymes 8
Beggar stories 14
Town prosperity for the middle tier 2000
Town prosperity for the high tier 5000
Loyalty assumed in villages 50
Maximum age of a world event that is gossiped about, in days 60
Rendered characters that identify a line 12

General pool

Every line whose condition holds is added; one is then drawn at random (see Selection).

Notation used in the tables below:

Seasons and economy

Condition Gist
in the tavern: spring / summer + male speaker / winter drinking lines
in the tavern, empire culture hermits on Mount Erithrys
in the tavern retrain skills at the tournament master
always "Heaven watch over us."
villager: prosp High full bellies
villager: prosp < Mid, by season (spring, summer, autumn) thin cow, not enough hands, thin harvest
villager: prosp < Mid can't pay rent
villager: by season ploughing / harvest soon / butchering / sewing
townsfolk: prosp Low hard times
townsfolk: prosp High and loyalty < 50 crowded markets
townsfolk: prosp High and loyalty < 60 prices high and rising
townsfolk: Aserai, summer, prosp Low heat, well running low
townsfolk: non-Aserai, winter / autumn, prosp Low coughing children / lean autumn
loyalty < 20 or town in rebellious state (village: its bound town) foreign troublemakers; secret meetings

The townsfolk "pittance wage" line requires prosp < 0 and is unreachable.

Trade tips

The only price-bearing gossip. Steps:

  1. Market: this town; in a village, its TradeBound town (else its Bound town).
  2. Targets: other towns with map distance < EstimatedAverageCaravanPartySpeed · 24 (≈ one day of caravan travel).
  3. For each trade good in this settlement's stock, cheapest category here first (Town.GetItemCategoryPriceIndex):
    1. best = the target with the highest buy price for the item.
    2. diff = best sell price − market buy price. Prices are computed with no client party: penalty 0.012.
    3. If diff > 1: add a tip "{relative} took {item} to {best} and made {diff} profit".
  4. Stop after 4 tips.

Unlike tooltip trade rumors, these are live prices and need no perk, but they cover only towns within about a day and only goods in stock here. best is chosen by the target's buy price, not its sell price.

At most 4 trade tips go into the general pool, each only if the profit is more than 1. Goods are checked in this order, cheapest category here first.

Goods Bought here for Sells there for Town Profit Result
Grain 20 31 Sargot 11 Added to the pool
Fur 30 31 Jalmarys 1 Dropped: profit is not above the minimum
Pottery 38 55 Ortysia 17 Added to the pool
Wine 45 68 Pravend 23 Added to the pool
Iron 52 66 Epicrotea 14 Added to the pool
Silver 90 120 Marunath 30 Never reached: the tip limit was already full

Both prices are computed with no client party, so the trade penalty is 0.012.

Step by step for the table:

  1. Grain: diff = 31 − 20 = 11 > 1, tip 1.
  2. Fur: diff = 31 − 30 = 1, not > 1, no tip.
  3. Pottery: diff = 55 − 38 = 17, tip 2.
  4. Wine: diff = 68 − 45 = 23, tip 3.
  5. Iron: diff = 66 − 52 = 14, tip 4; the limit of 4 is reached.
  6. Silver: never checked, although its diff of 30 is the largest.

Lords and order

Condition Gist
owner Honor > 0 fair hearing in court
owner Mercy < 0 and Generosity < 0, prosp ≤ Mid taxes
town, security < 40: owner Mercy > 0 / Honor < 0 / Honor > 0 too soft / takes a cut / honest but can't stop it
town, security < 40, prosp High the rich are not the honest
owner Mercy + Generosity < 0, prosp ≥ Mid mean but there's meat on the table
ruler Honor < 0 and Calculating < 0, prosp ≤ Mid ruler can't control passions
loyalty < 40 "the Heavens aren't pleased with the one on the throne"
≥ 2 bandit parties within 5 × encounter-joining radius: town with security < 50 / village whose trade town has security < 50 bandits beyond the walls / beyond the fields

World events

Game action logs younger than 60 days:

Log Condition Line
VillageStateChanged → BeingRaided another village of this faction "{enemy} raiding across the border"
VillageStateChanged → Looted village of this faction "{enemy} burned and pillaged {village}"
DeclareWar / MakePeace this faction is either side war / peace with {enemy}
DestroyMobileParty this faction's lord destroyed or was destroyed by a party, both sides hero-led victory / defeat
ChangeSettlementOwner bandit clan took a hideout closer than the average distance between the two closest towns "{bandits} moved into {hideout}"
ChangeSettlementOwner by siege PreviousClan == this settlement's MapFaction "{enemy} took {fortress} by storm"

The siege line compares a clan with the settlement's map faction, which is a kingdom whenever the owner clan belongs to one; it fires only for settlements of independent clans.

Notables

For every hero in the settlement without a party, plus the owner:

Hero Lines
anyone with Σ|Mercy, Valor, Generosity, Calculating, Honor| ≥ 2 "{name}… {informal reputation}"; for lords prefixed by blessed / neutral / "Heavens protect us" from Mercy + Honor + Generosity
gang leader by Mercy, Generosity − Mercy, Honor + Generosity + Mercy: debt collector, protector, thugs, "did my cousin a good turn"
merchant in a town with workshops about the most profitable workshop: hiring, cutting costs, firing, making money, by traits
headman / artisan, relation to owner ≥ 10 prosp Low: "owner is doing what they can"; prosp High: "credit the owner"
headman / artisan / preacher Honor > 0: righteous; Mercy > 0 and prosp ≤ Mid: helps the poor; Mercy ≤ 0, town, not in tavern: gambling relative; owner Honor ≥ 0, relation > 0, town, not in tavern: trust the authorities; relation < −10, town, not in tavern: "a fish rots from the head"
rural notable Honor < 0, Generosity ≤ 0, Mercy ≤ 0: boundary stones; Generosity < 0, Mercy ≤ 0: skinflint; Calculating > 0, Generosity ≤ 0: takes a third; Generosity > 0: fair compensation; Calculating < Mercy: helps relatives; Honor > 0, Generosity < 0: honest old goat; Generosity + Mercy + Calculating > 0: keeps seed grain

"Relation" is the notable's relation with the owner.

Selection

State kept by the behavior:

On conversation start:

  1. If CampaignTime.Now != _lastEnteredTime: set _lastEnteredTime = Now and clear _rumorsGiven.
  2. key = |agent.GetHashCode()|.
  3. If key is in _rumorsGiven: fallback line, stop.
  4. pool = the pool from Pools.
  5. Repeat pool.Count times:
    1. r = pool[RandomInt(pool.Count)], drawn with replacement.
    2. id = the first 12 characters of r's rendered text.
    3. If id is not among the values of _rumorsGiven: set _rumorsGiven[key] = id, say r, stop.
  6. Fallback line.

Consequences:

Symbols of the miss probability:

Worked example, n = 10, k = 1:

  1. One draw lands on a told line with probability 1 − 1/10 = 0.9.
  2. All 10 draws do: 0.9^10 = 0.3487.
  3. So the agent says the fallback line with probability 0.3487 although one rumor remains.

Line chart of the chance of the fallback line, from 0% to 40%, against untold lines left in the pool, from 1 to 10, for pools of 5, 10 and 20 lines. With 1 untold line the chance is 33%, 35% and 36%; with 2 it is 8%, 11% and 12%; with 3 it is 1%, 3% and 4%; from 5 untold lines on it is below 1% for all three.

Chance that every draw lands on a line already told, so the speaker says the fallback line.

With 5 lines in the pool:

Untold lines Chance of the fallback line
1 0.3277
2 0.0778
3 0.0102
4 0.0003
5 0

With 10 lines in the pool:

Untold lines Chance of the fallback line
1 0.3487
2 0.1074
3 0.0282
4 0.006
5 0.001
6 0.0001
7 0
8 0
9 0
10 0

With 20 lines in the pool:

Untold lines Chance of the fallback line
1 0.3585
2 0.1216
3 0.0388
4 0.0115
5 0.0032
6 0.0008
7 0.0002
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0

Unregistered dialog

conversation_townsfolk_ask_asses_prices_on_condition and conversation_townsfolk_ask_asses_prices_on_consequence exist but are not registered as a dialog; the consequence is empty.

Game code

IL decoded from game v1.4.8:

Changelog