Crafting and trade
Every skill, perk and feat that changes trade prices, trade rumors, smithing stamina, crafting orders, refining, part research and crafted weapon quality, at full precision for game v1.5.7.
Module overrides: no official module (SandBox, StoryMode, NavalDLC, BirthAndDeath) overrides DefaultTradeItemPriceFactorModel, DefaultPartyTradeModel or DefaultSmithingModel, or replaces CraftingCampaignBehavior or CraftingOrder. The disguised trader greeting is part of SandBox itself (SandBox.CampaignBehaviors.TradersCampaignBehavior).
Skill guides with these perks: Trade, Crafting, Roguery, Scouting, Riding, Steward, Athletics.
Verdicts: works = does what the tooltip says, or more — broader effects are noted; differs = narrower, different or extra conditions/values than the tooltip; unused = never read by the game; ui_only = only shown in the interface.
Roles: "party leader" perks are read on the client party's leader hero; "quartermaster" perks on the party's quartermaster; "clan leader" perks on the party leader's clan leader; "personal" perks on the hero doing the action (the trading party's leader, the crafting hero, the shown character).
Trade
Trade penalty and prices
The buy price is max(1, ceil(value · base · (1 + penalty))) and the sell price max(1, floor(value · base / (1 + penalty))); the trade penalty starts at 0.06, adds war, equipment, animal, village and caravan terms, is multiplied for caravan or missing clients and divided by 1 + trade penalty reduction, then takes the perk factors.
The market base factor, every term, its order and examples are on Prices and profit markers. This section adds the perk sites, the equipment term, Silver Tongue, Trickle Down and the rumor perks.
IL: DefaultTradeItemPriceFactorModel, DefaultPartyTradeModel.
Perk and feat factors on the trade penalty
trade_penalty: consumer DefaultTradeItemPriceFactorModel::GetTradePenalty, base 0.06, combine rule custom, no clamp. The factors apply to the running penalty p:
penalty = p · (1 + Σ factors)
p: the penalty after the added terms, the client multipliers and the Trade skill divisor.Σ factors: the sum of every factor below whose conditions hold. They are summed, not multiplied one after another.- Client party required: every factor (perks and the Aserai feat) needs a client party. With no client party none applies.
- No clamp.
The Trade skill effect "Trade penalty Reduction" (party leader, 0.002 per Trade point, works) is applied before the factors, in DefaultPartyTradeModel::GetTradePenaltyFactor: p is multiplied by 1 / (1 + 0.002 · Trade), using the party leader's Trade skill (or the effective party leader for the skill). With no client party the multiplier is 1.
| Source | Half | Bonus | Role | Conditions | Verdict |
|---|---|---|---|---|---|
| Appraiser (Trade) | primary | −0.15 | party leader | selling an item that is not a trade good | works |
| Whole Seller (Trade) | primary | −0.15 | party leader | selling a trade good | works |
| Granary Accountant (Trade) | primary | −0.2 | party leader | selling food that is a trade good | works |
| Tradeyard Foreman (Trade) | primary | −0.2 | party leader | selling pottery, tools, jewelry or cotton (the Raw Silk item) | works |
| Distributed Goods (Trade) | secondary | −0.15 | quartermaster | buying from a village | works |
| Local Connection (Trade) | secondary | −0.15 | quartermaster | selling an item with a horse component | works |
| Insurance Plans (Trade) | secondary | −0.25 | quartermaster | buying food | works |
| Rapid Development (Trade) | secondary | −0.25 | quartermaster | buying clay, iron, silver or cotton (the Raw Silk item) | works |
| Village Network (Scouting) | primary | −0.1 | party leader | merchant is a village of the client's map faction | differs |
| Rumor Network (Scouting) | primary | −0.05 | party leader | merchant is a town of the client's map faction | works |
| Deeper Sacks (Riding) | secondary | −0.1 | party leader | item is mountable | works |
| Arenicos' Horses (Steward) | secondary | −0.2 | party leader | item is mountable | works |
| Arenicos' Mules (Steward) | secondary | −0.2 | quartermaster | item is a pack animal | works |
| Arms Dealer (Roguery) | primary | −0.2 | party leader | selling an item with a weapon component | works |
| Smuggler Connections (Roguery) | secondary | −0.5 | party leader | client is the main party; the main hero has the perk; the merchant's faction has a crime rating above 0 against the main hero | works |
| Aserai trader feat | — | −0.1 | client party | the client party has the feat | works |
Reading the table:
- Rows without "buying" or "selling" apply to both directions.
- Appraiser: "equipment" is every item that is not a trade good, so horses and other animals that are not trade goods are included (broader than the tooltip).
- Granary Accountant is checked only for trade goods: food that is not a trade good is not covered.
- Since v1.5.7 every perk factor here goes through the client party's role holder with the party's battle environment; the
HasPerkpre-checks of v1.4.8 are gone, with the same result. - Local Connection reads every item with a horse component: mounts, pack animals and livestock, not only horses.
- Rapid Development: only the quartermaster needs the perk; v1.5.7 dropped the v1.4.8 extra check on the clan leader.
- Village Network
differs: the tooltip says villages of your own culture; the game tests that the client's map faction equals the village's map faction, with no culture check. The map faction is the clan when the client is not in a kingdom (same for Rumor Network). - Arms Dealer covers every item with a weapon component, including shields and ammunition.
- Smuggler Connections applies to buying and selling.
- The Aserai trader feat adds a constant −0.1; the feat's own effect value is not read. Every item, both directions.
Edge cases:
- The +2.0 for buying a pack animal from a caravan tests the item's category (Pack Animal), while the +0.8 pack-animal sell term tests whether the horse component is a pack animal.
- The caravan-merchant block runs after the village block, not instead of it. Only one of the two can be true for a given merchant.
Equipment selling term and Artisan Smith
equipment_sell_penalty: an inner sum inside GetTradePenalty, added to the trade penalty as one term. Combine rule explained number, no clamp.
equipment_sell_penalty = (1.5 + 0.25 · max(0, item_tier − 1)) · (1 + Artisan Smith)
item_tier: the item's fractional tier, not the integer tier.- When it is built: selling an item that is not a trade good, not an animal and has no horse component, and the client party is not a caravan. Otherwise the term is not added at all.
Artisan Smith: −0.5, only when the item is a weapon crafted by the player and the client party's leader has the perk. The weapon does not have to be crafted by that leader.
| Source | Half | Bonus | Stage | Conditions | Verdict |
|---|---|---|---|---|---|
| Artisan Smith (Crafting) | primary | −0.5 | factor on the equipment term | selling a player-crafted weapon; client not a caravan; party leader has the perk | differs |
Artisan Smith differs: the tooltip says −50% trade penalty, but the factor scales only the equipment term 1.5 + 0.25 · max(0, item_tier − 1). The start value 0.06, the war, village and caravan terms and the perk factors are not halved.
Worked example.
The party leader has Artisan Smith and sells a player-crafted tier-3 weapon in a town; the client party is not a caravan. Inputs: item tier 3.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Equipment selling trade-penalty term | base | 2.0000 | |
| 1 | Artisan Smith | factor -50% | -1.0000 | 1.0000 |
| Result | Equipment selling trade-penalty term | 1.0000 |
With these inputs, equipment selling trade-penalty term is 1.0000.
Without the perk the term is the base of 2.0000; with it the trade penalty gains 1.0000 instead.
Silver Tongue
Silver Tongue (Trade, secondary, quartermaster, bonus 0.15; tooltip "+15% better trade deals from caravans and villagers") has two sites. Verdict differs on both.
Caravans (item_buy_price, DefaultTradeItemPriceFactorModel::GetPrice, min 1):
price = ceil(item_value · base_price_factor · (1 + trade_penalty))
price = ceil(price · (1 − Silver Tongue)) buying from a caravan only
price = max(price, 1)
- Applies only when buying from a caravan, and the client party's quartermaster has the perk.
- Selling to a caravan is not affected, which the tooltip does not say.
- It multiplies the finished price, not the trade penalty, so it stacks multiplicatively with every penalty factor.
Villagers (villager_buy_price, VillagerCampaignBehavior::village_farmer_buy_products_on_condition):
- The dialog shows the sum over the villager party's non-pack-animal items of
price · count, withprice = ceil(price · (1 − Silver Tongue))when the main party has the perk. - The buy option is offered only when the main hero's gold is at least the discounted total and the total is above 0.
- The purchase itself charges the normal price, without the perk. The discount is display only: you pay full price.
IL: GetPrice, VillagerCampaignBehavior.
Trickle Down
Trickle Down (Trade, primary, party leader, bonus 1.0; tooltip "+1 relationship with merchants if 10.000 or more denars are spent on a single deal"). Site: notable_relation, InventoryLogic::DoneLogic, stage add, value floor(bonus). Verdict differs.
- When the trade screen closes, in a town, with an inventory owned by a hero who has the perk, the game sums what was spent on trade goods bought in this trade session.
- Only trade-good purchases count. Equipment, mounts and other items that are not trade goods are ignored, which the tooltip does not say.
- If the sum is at least 10000, the owner gains
floor(1.0)relation with every merchant notable of the town. - The holder is the inventory owner character.
IL: InventoryLogic.
Trade rumors: Traveling Rumors and Toll Gates
How rumors are stored and shown is on Trade rumors. The two rumor perks are feature flags: their bonus value is not read.
trade_rumors (TradeRumorsCampaignBehavior::OnSettlementEntered, base 0, sequential): a qualifying party entering a town with market data records one rumor per trade good (buy and sell price, 10 days) for that town, replacing the town's older rumors, at most once per day per town.
| Source | Half | Stage | Conditions | Verdict |
|---|---|---|---|---|
| Main party enters a town | — | override 1 | entering party is the main party; no perk needed | works |
| Traveling Rumors (Trade) | primary | override 1 | entering party is a caravan owned by a hero of the player clan; the main hero has the perk | works |
workshop_trade_rumors (TradeRumorsCampaignBehavior::AddDailyTradeRumors, base 0, sequential): once a day.
| Source | Half | Stage | Conditions | Verdict |
|---|---|---|---|---|
| Toll Gates (Trade) | primary | override | the main hero has the perk | works |
- With Toll Gates, every town where the main hero owns a workshop gets one rumor per trade good (10 days).
- A town and item category pair that already has a rumor is skipped.
- The one random daily rumor (random town and item, 10 + random(10) days) is independent of the perk.
IL: TradeRumorsCampaignBehavior.
Trade screen markers
The marker rules are on Prices and profit markers. The perk halves that enable them are ui_only; their bonus is never read.
| Source | Half | Game number | Conditions | Verdict |
|---|---|---|---|---|
| Appraiser (Trade) | secondary | inventory_profit_marker |
trade mode; player-side item; the main hero has Appraiser or Whole Seller | ui_only |
| Whole Seller (Trade) | secondary | inventory_profit_marker |
same | ui_only |
| Caravan Master (Trade) | secondary | inventory_price_marker |
merchant-side item; current settlement a town, castle or village; the main hero has Caravan Master or Market Dealer | ui_only |
| Market Dealer (Trade) | secondary | inventory_price_marker |
same | ui_only |
IL: SPItemVM.
Trading while disguised (SandBox)
disguised_trader_conversation_available (SandBox.CampaignBehaviors.TradersCampaignBehavior::conversation_weaponsmith_talk_start_normal_on_condition, base 1, sequential): whether a trader offers the normal greeting.
| Source | Half | Stage | Conditions | Verdict |
|---|---|---|---|---|
| Main hero disguised | — | override 0 | the main hero is disguised | works |
| Smuggler Connections (Roguery) | primary | override 1 | the main hero is disguised; the disguise contact has already been made; the main hero has the perk | works |
- Only traders offer this greeting.
- Not disguised: the normal greeting is available.
- Disguised: available only once the disguise contact has been made and with Smuggler Connections, with the "a friend of a friend" greeting.
Smithing
All smithing perks are personal: they are read on the hero at the forge (the selected crafting hero), not on the party leader.
Stamina
Each action costs crafting stamina. All three costs are standard modifier sums, truncated toward zero after the factor.
| Game number | Consumer | Base | Source | Half | Bonus | Stage | Verdict |
|---|---|---|---|---|---|---|---|
smithing_stamina_cost |
DefaultSmithingModel::GetEnergyCostForSmithing |
10 + 5 · item tier | Practical Smith (Crafting) | primary | −0.5 | factor | works |
smelting_stamina_cost |
DefaultSmithingModel::GetEnergyCostForSmelting |
10 | Practical Smelter (Crafting) | primary | −0.5 | factor | works |
refining_stamina_cost |
DefaultSmithingModel::GetEnergyCostForRefining |
6 | Practical Refiner (Crafting) | primary | −0.5 | factor | works |
cost = trunc(base · (1 + factor))
- Smithing uses the integer item tier. The cost is subtracted from the crafting hero's stamina in both free build and order mode.
- Smelting: 10 becomes 5 with the perk. Refining: 6 becomes 3, for every recipe.
Worked example.
A hero with Practical Smith smiths a tier-5 weapon. Inputs: item tier 5.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Smithing stamina cost | base | 35.0000 | |
| 1 | Practical Smith | factor -50% | -17.5000 | 17.5000 |
| Result | Smithing stamina cost | 17.5000 |
With these inputs, smithing stamina cost is 17.5000.
The game then truncates 17.5000 toward zero before subtracting it from stamina.
crafting_stamina_hourly_recovery (CraftingCampaignBehavior::GetStaminaHourlyRecoveryRate, base 5, custom, integer):
rate = 5 + round(0.025 · Crafting)
rate = rate + round(rate · Stamina) with the Athletics perk
stamina = min(max_stamina, stamina + rate) each hour, only while the hero is in a settlement
max_stamina = 100 + round(0.5 · Crafting)
| Source | Half | Bonus | Stage | Conditions | Verdict |
|---|---|---|---|---|---|
| Crafting skill stamina recovery term | — | 0.025 · Crafting | add, rounded | — | works |
| Stamina (Athletics) | primary | 0.5 | multiply 1 + bonus, rounded |
personal | works |
- The hourly recovery applies only while the hero is in a settlement.
crafting_max_stamina (CraftingCampaignBehavior::GetMaxHeroCraftingStamina, base 100, custom, integer) is the max_stamina above.
| Source | Half | Bonus | Stage | Conditions | Verdict |
|---|---|---|---|---|---|
| Crafting skill level | — | 0.5 · Crafting | add, rounded | personal | works |
- It caps the hourly recovery, is the stamina of a hero's new crafting record and is shown in the crafting hero tooltip.
- No module replaces
CraftingCampaignBehavior.
IL: DefaultSmithingModel, CraftingCampaignBehavior.
Refining and smelting yields
The refining recipes the hero at the forge can use. Each perk recipe is a sequential game number with an override site. Material tiers: Iron1 is crude iron, Iron3 iron, Iron4 steel, Iron5 fine steel, Iron6 Thamaskene steel; the game code gives Iron2 no name.
| Game number | Recipe | Without the perk | Perk | Half | Verdict |
|---|---|---|---|---|---|
charcoal_refining_output |
Wood ×2 → Charcoal | Charcoal ×1 | Efficient Charcoal Maker (Crafting) | primary | works |
crude_iron_refining_output |
Iron ore ×1 + Charcoal ×1 → Iron1 (crude iron) | Iron1 ×2 | Efficient Iron Maker (Crafting) | primary | works |
steel_refining_recipe |
Iron3 ×2 + Charcoal ×1 → Iron4 (steel) ×1 + Iron1 (crude iron) ×1 | not available | Steel Maker (Crafting) | primary | works |
fine_steel_refining_recipe |
Iron4 ×2 + Charcoal ×1 → Iron5 (fine steel) ×1 + Iron1 ×1 | not available | Steel Maker 2 (Crafting) | primary | works |
thamaskene_steel_refining_recipe |
Iron5 ×2 + Charcoal ×1 → Iron6 (Thamaskene steel) ×1 + Iron1 ×1 | not available | Steel Maker 3 (Crafting) | primary | works |
- Efficient Charcoal Maker replaces the default charcoal recipe with Wood ×2 → Charcoal ×3; the default one is skipped.
- Efficient Iron Maker makes the crude iron recipe yield ×3. The recipe still consumes 1 charcoal.
- Every steel recipe also consumes 1 charcoal, which the tooltips do not mention.
- Two recipes need no perk: Iron1 ×1 + Charcoal ×1 → Iron2 ×1, and Iron2 ×2 + Charcoal ×1 → Iron3 (iron) ×1 + Iron1 ×1.
- All recipes in the order the forge lists them: charcoal, crude iron, Iron2, iron, then the three Steel Maker recipes.
- None of these perks' bonus values (0) is read; the tooltips carry no value.
IL: GetRefiningFormulas.
Part research
Smithing and smelting give research points toward unlocking new parts of the item's template.
smithing_part_research_gain (DefaultSmithingModel::GetPartResearchGainForSmithingItem, base 1, custom):
gain = 1 + floor(0.1 · item_value · (1 + Curious Smith + free_build))
item_value: the crafted item's value.free_build: 0.1 in free build mode, 0 in crafting order mode.- The constant 1 is outside the factor.
| Source | Half | Bonus | Stage | Conditions | Verdict |
|---|---|---|---|---|---|
| Curious Smith (Crafting) | primary | 1.0 | factor on the value term | personal | differs |
| Free-build smithing research bonus | — | 0.1 | factor on the value term | weapon made in free build | works |
Curious Smith differs: the tooltip says +100% learning rate, but the factor scales only 0.1 · item_value; the constant +1 is not doubled.
smelting_part_research_gain (DefaultSmithingModel::GetPartResearchGainForSmeltingItem, base 1 + round(0.02 · item_value), explained number):
gain = trunc((1 + round(0.02 · item_value)) · (1 + Curious Smelter))
| Source | Half | Bonus | Stage | Conditions | Verdict |
|---|---|---|---|---|---|
| Curious Smelter (Crafting) | primary | 1.0 | factor on the whole gain | personal | works |
Unlike smithing, the smelting factor scales the constant 1 as well. The gain goes to the smelted item's template.
Worked example.
A hero with Curious Smelter smelts a weapon worth 600, so round(0.02 x 600) = 12 value points. Inputs: smelt value points 12.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Part research gain from smelting | base | 13.0000 | |
| 1 | Curious Smelter | factor +100% | +13.0000 | 26.0000 |
| Result | Part research gain from smelting | 26.0000 |
With these inputs, part research gain from smelting is 26.0000.
Crafted weapon quality
When a weapon is finished (free build and order mode alike), the game rolls a quality from six weighted entries, then applies the design-tier cap.
Skill margin
crafted_quality_skill_margin (DefaultSmithingModel::GetModifierQualityProbabilities, base −design_difficulty, explained number, clamp [−300, 300]):
x = clamp(Crafting − design_difficulty, −300, 300)
design_difficulty: the difficulty of the weapon design; no skill input.
| Source | Half | Bonus | Stage | Verdict |
|---|---|---|---|---|
| Smithing level (Crafting skill effect) | — | 1.0 per point | add | differs |
Smithing level differs: the tooltip calls it the max difficulty that can be smithed without penalty, but no threshold exists. x drives continuous sigmoid weights, so Poor and Inferior results stay possible at a skill equal to or above the difficulty.
Worked example.
A Crafting 200 hero smiths a design of difficulty 150. Inputs: design difficulty 150.
| Step | Source | Stage | Change | Running value |
|---|---|---|---|---|
| Base | Crafted weapon quality skill margin | base | -150.0000 | |
| 1 | Max difficulty of weapon that can be smithed without penalty | add | +200.0000 | 50.0000 |
| Result | Crafted weapon quality skill margin | 50.0000 |
With these inputs, crafted weapon quality skill margin is 50.0000.
Quality weights
S(x, m) = exp(0.018 · (x − m)) / (1 + exp(0.018 · (x − m)))
Poor 0.36 · (1 − S(x, −70))
Inferior 0.45 · (1 − S(x, −55))
Common S(x, 25)
Fine 0.36 · S(x, 40)
Masterwork 0.27 · S(x, 70)
Legendary 0.18 · S(x, 115)
- The raw weights are divided by their sum.
crafted_quality_probability_fine,_masterworkand_legendaryare the normalized Fine, Masterwork and Legendary probabilities after the perk steps below (combine rule custom).
Perk steps
The three quality perks run in this order. Each step adds its bonus to its target quality's weight. Every other entry that is not on the step's excluded list loses bonus / (6 − (n + 1)), going through the list from Poor to Legendary, where n is the number of entries on the excluded list. An entry cannot drop below 0: the missing amount is taken from the next entry instead. All weights are then renormalized.
- The bonus is absolute probability, not a relative factor: Experienced Smith adds 0.1 to the Fine weight, not 10% of it.
| Step | Perk (Crafting, primary) | Bonus | Target | Excluded |
|---|---|---|---|---|
| 1 | Experienced Smith | 0.1 | Fine | Masterwork, Legendary |
| 2 | Master Smith | 0.075 | Masterwork | Legendary; Fine if Experienced Smith is held |
| 3 | Legendary Smith | 0.05 + max(Crafting − 275, 0) / 5 · 0.01 | Legendary | Fine if Experienced Smith is held; Masterwork if Master Smith is held |
So Experienced Smith takes bonus / 3 from each of Poor, Inferior and Common. The excluded list of the later steps depends on which earlier perks the hero holds.
| Source | Half | Game number | Stage | Scaling | Conditions | Verdict |
|---|---|---|---|---|---|---|
| Experienced Smith | primary | fine | add | bonus | — | works |
| Master Smith | primary | masterwork | add | bonus | — | differs |
| Master Smith | primary | fine | add | −bonus / (6 − (n + 1)) | hero lacks Experienced Smith | differs |
| Legendary Smith | primary | legendary | add | bonus + max(skill − 275, 0) / 5 · 0.01 | — | differs |
| Legendary Smith | primary | fine | add | −bonus / (6 − (n + 1)) | hero lacks Experienced Smith | differs |
| Legendary Smith | primary | masterwork | add | −bonus / (6 − (n + 1)) | hero lacks Master Smith | differs |
- Master Smith
differson Masterwork: a rolled Masterwork becomes Fine when the design's average piece tier is below 3.5, which the tooltip does not state. If the weapon's modifier group has no Masterwork modifier, no modifier is applied. - Master Smith and Legendary Smith
differson the lower qualities: the tooltips do not say the perks lower other qualities. Without Experienced Smith, Fine is not excluded and loses weight when Masterwork or Legendary gains; without Master Smith, Masterwork loses weight when Legendary gains. - Legendary Smith
differson Legendary: a rolled Legendary is downgraded below average piece tier 4.5, and the skill term is continuous, 0.002 per point above 275, not 1% per full 5 points.
Design-tier cap
The cap runs after the roll. The probability list itself is unchanged.
| Average piece tier of the design's used pieces | Rolled Legendary becomes | Rolled Masterwork becomes |
|---|---|---|
| below 3.5 | Fine | Fine |
| at least 3.5, below 4.5 | Masterwork | Masterwork (unchanged) |
| at least 4.5 | Legendary (unchanged) | Masterwork (unchanged) |
- Fine is never capped. Below 3.5 the effective Fine outcome is the Fine, Masterwork and Legendary probabilities together.
- The cap itself does what it says (
works).
IL: GetModifierQualityProbabilities, CraftingVM.
Crafting orders
Each town keeps 6 order slots. A new town order takes its difficulty from its slot (crafting_order_difficulty, CraftingCampaignBehavior::GetTownOrderDifficulty, custom):
difficulty = band + prosperity / 500
| Slot | band |
|---|---|
| 0 | random 40 to 79 |
| 1 | random 80 to 119 |
| 2 | random 120 to 159 |
| 3 | random 160 to 199 |
| 4 | random 200 to 240 |
| 5 | the main hero's Crafting |
prosperity: the town's prosperity.- Custom orders created without a difficulty (
GetRandomOrderDifficulty) pick one of the 6 bands at random, so 1 in 6 also uses the main hero's Crafting. - Slots are filled at game start, daily and when an order is replaced.
A hero can take an order when (crafting_order_available, CraftingOrder::IsOrderAvailableForHero):
Crafting + 50 ≥ difficulty
- Checked only by the crafting screen (which heroes may take the order) and its tooltips; orders are completed only there.
| Game number | Source | Stage | Value | Conditions | Verdict |
|---|---|---|---|---|---|
crafting_order_difficulty |
Crafting skill level | base | skill + prosperity / 500 (slot 5) |
main hero | works |
crafting_order_available |
Crafting skill level | override | 1 when Crafting + 50 ≥ difficulty | personal | works |
All three Crafting reads are the raw skill. No module replaces CraftingCampaignBehavior or CraftingOrder.
IL: GetTownOrderDifficulty, GetRandomOrderDifficulty, CraftingOrderSlots, IsOrderAvailableForHero.
Crafting order relations
CraftingCampaignBehavior::CompleteOrder, after a successful order. Custom orders give neither bonus.
| Source | Half | Bonus | Game number | Conditions | Verdict |
|---|---|---|---|---|---|
| Experienced Smith (Crafting) | secondary | 2.0 | notable_relation |
town order that is not a lord order | works |
| Steel Maker 3 (Crafting) | secondary | 4.0 | lord_relation |
lord order | works |
- The bonus, as a whole number, is added to the relation between the crafting hero and the order owner. It is the crafter's relation, not necessarily the player's.
- Positive changes pass through the diplomacy model's relation increase factor and randomized rounding.
IL: CompleteOrder.
Attribute and focus perks
PerkActivationHandlerCampaignBehavior::OnPerkOpened adds these once, when the perk is unlocked. Each adds a hard-coded 1; the perk's bonus is never read (it has the same value). A perk reset removes the point again.
| Perk (Crafting, primary) | Bonus | Game number | Change | Verdict |
|---|---|---|---|---|
| Controlled Smith | 1.0 | hero_control |
+1 Control | differs |
| Vigorous Smith | 1.0 | hero_vigor |
+1 Vigor | differs |
| Enduring Smith | 1.0 | hero_endurance |
+1 Endurance | differs |
| Fencer Smith | 1.0 | hero_focus_one_handed, hero_focus_two_handed |
+1 focus point to One Handed and to Two Handed | differs |
differs here means only that the value is a literal 1, not the bonus; the result matches the tooltip.
IL: PerkActivationHandlerCampaignBehavior.
Sharpened Edge and Sharpened Tip
The two tier-10 Crafting perks change swing and thrust strike magnitude of player-crafted weapons and are read on the wielder. They are covered in Combat damage.
Inventory weight display
Form Fitting Armor (Athletics, primary, personal, bonus −0.15) has two ui_only sites on the inventory screen.
| Game number | Consumer | Formula | Conditions | Verdict |
|---|---|---|---|---|
inventory_character_total_weight |
SPInventoryVM::RefreshCharacterTotalWeight |
round(weapons_weight + armor_weight · (1 + bonus), 1) |
the shown character has the perk | ui_only |
item_tooltip_equipment_weight |
ItemMenuVM::SetGeneralComponentTooltip |
item_weight · (1 + bonus) |
the character has the perk; the compared equipment slot holds an item; the item is armor | ui_only |
- The total-weight multiplier scales only the armor weight, not the weapons weight.
IL: SPInventoryVM, ItemMenuVM, tooltip weight closure.
Changelog
- v1.5.7 (2026-11-12): re-verified against v1.5.7. Rapid Development (secondary) needs only the quartermaster; Granary Accountant, Tradeyard Foreman and Arenicos' Horses are read on the party leader role.
- v1.4.8 (2026-11-11): Raw Crafting skill reads added (maximum stamina, order difficulty, order availability).
- v1.4.8 (2026-11-11): First version from IL.