Skip to content
3 Death Saves
Wiki updated as of 0.3.0 (Aug 2026)

Haggling and Pricing

A price in the vignette starts from the item’s base value and passes through the shop’s price modifiers. Haggling sits on top of that as an optional, in-character way for a player to move the numbers.

Each shop has a buy modifier and a sell modifier. The buy modifier scales what the shop charges for its goods, and the sell modifier scales what the shop pays for goods a player offers. Both apply shop-wide and are set in the Pricing section of the Shop Settings app, labelled Price the shop charges and Price the shop pays.

Ranges and defaults for the shop-wide modifiers are listed on the settings reference.

A module can override the price for one buyer, either shop-wide or for a single item, by calling the setActorModifier API. Haggling writes to this same per-actor override when a check wins or loses. There is no override for an item alone, only for an actor or for an actor on one item. A per-actor rate and a per-actor-and-item rate on the same line multiply together. See API and Hooks.

A module listening on peddler.preTrade can write a price directly onto a trade line, which replaces the item’s base value before the shop’s modifiers apply.

Haggling is off until you enable it for a shop in the Shop Settings app. There you build the DC ladder, set the price on a loss, and choose which skills a player may lean on. Each rung of the ladder pairs a target DC with the price multiplier a player earns for clearing it. Add rungs up to the shop’s tier limit; they sort by DC on save. Leaving the skill list blank allows any skill the system offers. A toggle limits haggling to one attempt per visit.

At the confirm screen the player sees a haggle prompt alongside the cart. The player picks a skill and rolls it, and the roll posts to chat with the skill in the flavor text. The result is measured against the ladder, and the highest DC the roll clears sets the discount. A roll that clears no rung loses the exchange. A win lowers what the shop charges that character and raises what the shop pays them. A loss does the opposite. The shopkeeper answers in character inside the vignette, quoting the new percentage, and the confirm screen carries a won-or-failed badge for the rest of the visit.

The skill list comes from the system adapter. For a system without skill presets, or for a check the presets do not cover, add custom roll rows in Shop Settings. Each row pairs a label with a roll formula. A formula the system cannot read is flagged and never offered to players. A formula with no die is flagged too, but the shop still offers it. Custom rows appear in the haggle prompt next to any adapter skills and work in any system.

Currency handling also comes from the system adapter. Totals display in the shop’s currency, and payment is settled across the buyer’s denominations, with change counted out where needed. A trade ends in one of four outcomes: success, insufficient funds, out of stock, or cancelled. In the dialogue tree editor a Transaction node can route each outcome to its own choice, so the shopkeeper reacts differently to an empty purse than to a change of heart. A cancelled branch is always required; outcomes without their own branch fall back to it.