Gossip rumors
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:
- the speaker's occupation is
VillagerorTownsfolk, the player is inside the settlement, and the speaker is not escorting the player; - each agent gives at most one rumor, and no rumor text is repeated, until the dedupe resets (see Selection);
- otherwise the agent opens with a fallback line ("Excuse me, … Is there anything you need?", the tavern or the children variant).
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:
- SandBox: FamilyFeud, NotableWantsDaughterFound, RivalGangMovingIn.
- CampaignSystem: ArtisanCantSellProductsAtAFairPrice, ArtisanOverpricedGoods, ExtortionByDeserters, HeadmanNeedsGrain, HeadmanNeedsToDeliverAHerd, LandLordCompanyOfTrouble, LandlordNeedsAccessToVillageCommons, NearbyBanditBase.
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:
season: 0 spring … 3 winter, computed asDayOfYear / DaysInSeason.prosp:ProsperityLevel, Low 0 / Mid 1 / High 2. Town: prosperity ≥ 2000 is Mid, ≥ 5000 is High. Village: from the hearth level.loyalty: town loyalty; 50 in villages.owner: the leader of the owner clan.ruler: the leader of the map faction.
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:
- Market: this town; in a village, its
TradeBoundtown (else itsBoundtown). - Targets: other towns with map distance <
EstimatedAverageCaravanPartySpeed · 24(≈ one day of caravan travel). - For each trade good in this settlement's stock, cheapest category here first (
Town.GetItemCategoryPriceIndex):best= the target with the highest buy price for the item.diff=bestsell price − market buy price. Prices are computed with no client party: penalty 0.012.- If
diff > 1: add a tip "{relative} took {item} to {best} and made {diff} profit".
- 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:
- Grain:
diff= 31 − 20 = 11 > 1, tip 1. - Fur:
diff= 31 − 30 = 1, not > 1, no tip. - Pottery:
diff= 55 − 38 = 17, tip 2. - Wine:
diff= 68 − 45 = 23, tip 3. - Iron:
diff= 66 − 52 = 14, tip 4; the limit of 4 is reached. - Silver: never checked, although its
diffof 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:
_lastEnteredTime: the campaign time of the last reset._rumorsGiven: a map from agent key to the id of the rumor that agent told.
On conversation start:
- If
CampaignTime.Now != _lastEnteredTime: set_lastEnteredTime = Nowand clear_rumorsGiven. key=|agent.GetHashCode()|.- If
keyis in_rumorsGiven: fallback line, stop. pool= the pool from Pools.- Repeat
pool.Counttimes:r=pool[RandomInt(pool.Count)], drawn with replacement.id= the first 12 characters ofr's rendered text.- If
idis not among the values of_rumorsGiven: set_rumorsGiven[key] = id, sayr, stop.
- Fallback line.
Consequences:
- The dedupe resets at the first conversation after campaign time has moved; it is not saved.
- Two lines starting with the same 12 rendered characters count as the same rumor, so at most one of them is told until the reset.
- Draws are with replacement: with
kuntold lines left out ofn, the agent fails with probability(1 − k/n)^nand uses the fallback even though a rumor remains.
Symbols of the miss probability:
n:pool.Count, the number of lines in the speaker's pool, told or not.k: the number of lines in the pool whoseidis not yet among the values of_rumorsGiven.1 − k/n: the chance that a single draw lands on a line already told.- The power
n: one factor per draw.
Worked example, n = 10, k = 1:
- One draw lands on a told line with probability
1 − 1/10 = 0.9. - All 10 draws do:
0.9^10 = 0.3487. - 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:
- CommonVillagersCampaignBehavior.il: the whole behavior:
AddTownspersonAndVillagerDialogs,conversation_town_or_village_start_on_condition,RumorIdentifier,GetPossibleIssueRumors,GetBeggarStories,get_TradeRumorDistanceand the unregisteredconversation_townsfolk_ask_asses_prices_*pair. - GetPossibleRumors.il:
GetPossibleRumors, the general pool. - GetPossibleRumors.lambdas.il: the compiler-generated lambdas of
GetPossibleRumors. - GetProsperityLevel.il:
Town.GetProsperityLevelandVillage.GetProsperityLevel. - SettlementComponent.GetProsperityLevel.il: the base
SettlementComponent.GetProsperityLevel. - LogEntry.GetAsRumor.il:
GetAsRumorofLogEntry,ChangeSettlementOwnerLogEntry,DeclareWarLogEntry,DestroyMobilePartyLogEntry,MakePeaceLogEntryandVillageStateChangedLogEntry.
Changelog
- v1.4.8 (2026-11-11): Rewritten as deep dive; facts unchanged.
- v1.4.8 (2026-11-10): Moved into the site; content unchanged.