Ruleset Items

Use this page to describe what a party carries: categories, weapons, armor, ammunition, loot, money, starting gear and markets. It is for ruleset authors. Before you start, read Writing Game Mode Rulesets.

Sections on this page:

Armor, weapons, potions, gear, ammunition and money are items. An optional items block declares the words every item of your ruleset is written in, and a catalog with holds: "items" lists the items themselves. Both need Capability API 1.49; the block's rarityCaps and propose, which govern the items the Game Master invents, need 1.51, a value that reads the items a character holds (itemStat) needs 1.52, what an item does to checks while worn or carried, with the block's bonus caps, needs 1.53, what an item asks of its wearer and the abilities it changes need 1.54, a weapon's attack needs 1.55, what an item does in a fight needs 1.56, what a weapon shoots and holds loaded needs 1.57, a weapon's modes, off-hand attack, floor and conditions on a hit need 1.58, what using an item does in a fight, with the charges it holds, needs 1.59, a use that restores a pool needs 1.60, charges regained on a rest or an item that breaks when emptied need 1.61, a use that asks a check first (gate) needs 1.62, loot tables and a creature's loot need 1.63, a loot line that drops coins or a layer that takes coins out needs 1.64, a market, an item's sold place and a service need 1.65, a market day (a purse, buyBack, a seller's stock, a limited count, or a sold that names no place) needs 1.69, a rider that fires on held weapons (weapons) needs 1.70, starting gear (startingGear) needs 1.78, a risky item, a fake or a dishonest seller needs 1.79, and a market's unsold (or a layer's items) needs 1.813.

The items block

The block goes in items at the top level of the file. This is Ember Roads', a little shortened:

"items": {
  "categories": [
    { "id": "weapon", "label": "Weapon" },
    { "id": "armor", "label": "Armor" },
    { "id": "ammunition", "label": "Ammunition" }
  ],
  "rarities": [
    { "id": "common", "label": "Common" },
    { "id": "storied", "label": "Storied" }
  ],
  "tags": [
    { "id": "thrown", "label": "Thrown" },
    { "id": "ranged", "label": "Ranged" },
    { "id": "two_handed", "label": "Two-handed" },
    { "id": "arrow", "label": "Arrow" }
  ],
  "stats": [
    { "id": "bulk", "label": "Bulk", "type": "number", "min": 0, "max": 10, "default": 0 },
    { "id": "guard", "label": "Guard", "type": "number", "min": 0, "max": 4, "default": 0 },
    { "id": "damage", "label": "Damage", "type": "dice", "example": "1d6" },
    { "id": "swing", "label": "Rolls with", "type": "enum", "values": ["brawn", "wits", "heart"], "default": "brawn" },
    { "id": "reach", "label": "Reach", "type": "enum", "values": ["close", "near", "far"], "default": "close" }
  ],
  "slots": [
    { "id": "body", "label": "Body", "count": 1 },
    { "id": "hands", "label": "Hands", "count": 2 }
  ],
  "carry": { "stat": "bulk", "encumberedAbove": { "derived": "load" }, "limit": { "const": 12 } },
  "rarityCaps": [
    { "rarity": "common", "stats": { "guard": 1 }, "bonus": 1 },
    { "rarity": "storied", "stats": { "guard": 3 }, "bonus": 2 }
  ],
  "currencies": [
    {
      "id": "coin",
      "label": "Coin",
      "perWeight": 100,
      "units": [
        { "id": "bit", "label": "bits", "value": 1 },
        { "id": "mark", "label": "marks", "value": 10 },
        { "id": "sovereign", "label": "sovereigns", "value": 100 }
      ]
    },
    {
      "id": "salt",
      "label": "Salt",
      "perWeight": 10,
      "units": [
        { "id": "pinch", "label": "pinches", "value": 1 },
        { "id": "cake", "label": "cakes", "value": 20 }
      ]
    }
  ]
}

An item

An item catalog declares no feeds:

{ "id": "outfitter", "label": "Outfitter", "holds": "items", "entries": [] }

Each entry carries an item instead of rows or a creature:

{
  "id": "hunting-bow",
  "label": "Hunting bow",
  "summary": "Yew, waxed string, and a grip worn smooth by someone else's hand.",
  "item": {
    "category": "weapon",
    "rarity": "common",
    "tags": ["ranged", "two_handed"],
    "stats": { "bulk": 2, "damage": "1d8", "swing": "wits", "reach": "far" },
    "slots": { "hands": 2 },
    "cost": { "amount": 3, "unit": "sovereign" }
  }
}

An item carries no mechanics: what it does is written in its item block.

What reads items

Everything above is checked when the ruleset is imported, and your catalogs of items ship with it. In a game, Game Mode's inventory reads them:

In a Classic or Tactical battle, each of your items with a use does what it says there, and one without is not offered (see Items in Classic and Tactical battles, below). Whatever native says, the sheet can read your items (below), a held weapon is an attack in a ruleset fight, shooting what it draws from the bag, what an item does while worn or carried counts in one (see Armor and worn effects in a fight, below), and an item with a use is used by its own rules, in a fight and outside one (see Using items in a fight and Using items outside a fight, below), and your currencies are the party's money (see Money, below).

Items on the sheet

A value reference can read the items a character holds, with itemStat (Capability API 1.52). Ember Roads adds the guard of the armor a traveller wears to their Guard, which is what a blow has to beat:

{
  "id": "guard",
  "label": "Guard",
  "op": "sum",
  "of": [{ "const": 6 }, { "abilityMod": "wits" }, { "itemStat": { "stat": "guard", "from": "worn", "pick": "sum" } }]
}

Items change in play, so itemStat is held to the same rule as a live read: a pool's or a track's max, the proficiency bonus, binding.max, the carry numbers, and a catalog's scaled column or scaling cannot read it, even through a derived value. Anywhere else a number is read, it can: a derived value, a check's adjust, a skill's cap, a fight's defense, soak or initiative.

A character's items are the ones in their own bag. The player's card (the one named for who the chat plays as, else the first) reads the player's bag, and every other card its own. Only your ruleset's items count, since a plain item has no stats to read. The sheet on screen, a check, the Game Master's sheet block, and a fight as it begins all read what each character holds right then. Outside a game, in the sheet editor or an import review, nobody holds anything and itemStat reads its default.

Checks outside a fight

A check or save the Game Master calls for outside a fight reads more than the sheet: the character's own active conditions, the levels they have reached, what their items do while worn or carried, and what a worn item's requirement costs while they fall short of it. It is the same vocabulary a fight's conditions use (Capability API 1.53 for the item keys and the narrowing).

An item says what it does with worn, which applies while it is on (and bound, where it binds), and carried, which applies while it is only carried. Ember Roads' leather coat creaks when you creep, and a waystone makes caravan folk trust you:

"worn": { "modifiers": [{ "to": "checks", "skills": ["sneak"], "flat": -1 }] }
"carried": { "modifiers": [{ "to": "checks", "skills": ["sway"], "flat": 1 }] }

Each takes the parts of a condition that a check reads:

Ember Roads' ox-hide gauntlets lend a weak grip a drover's:

"worn": { "abilities": { "brawn": { "set": 2 } } }

What an item does in a fight (defense, attacks, speed, the fight's other effects, and the harm and conditions it keeps off) is in Armor and worn effects in a fight; a check outside a fight reads only the parts above. One item applies once however many stacks of it someone holds.

An item may also ask something of whoever wears it, with requires: a value off their sheet (value, any value reference, read as everything in play is), the least it may be (atLeast), and what applies while they fall short (otherwise, in the same vocabulary, except that it cannot change an ability, since what it asks may read one). Up to four. Gravewatch's grave spade is heavy work for a weak warden:

"requires": [
  {
    "value": { "abilityScore": "sinew" },
    "atLeast": 3,
    "otherwise": { "modifiers": [{ "to": "checks", "skills": ["dig"], "flat": -1 }] }
  }
]

A requirement reads the ability as the wearer's items leave it, so gauntlets that set Sinew to 3 meet the spade's.

On a check:

Gravewatch shows the same on a pool: the bound Dawn bell adds a die to Ward, and Rattled takes one off Soothe and Barter.

Typed defenses from conditions, levels, items and sheet rows

combat.conditions[] and combat.levels[] can grant resist, vulnerable, immune (1–30 entries each) and conditionImmunities (1–40 condition ids). They apply while the condition holds or the level's threshold is reached. A newly gained condition immunity ends that condition if already active and prevents applying it again. Immunity wins over resistance; resistance and vulnerability cancel. Multiple resistances never halve damage twice.

resist and immune use the creature form: a damage word or { "type": "bludgeoning", "except": ["magical"] }. Any named tag on the blow bypasses that entry. vulnerable stays plain damage words. The same exception form works on items' worn and carried effects. Declare the exception tags in items.tags and put them on the weapon or spell's qualities. For example, Stoneskin is a condition mapping:

{
  "condition": "stoneskin",
  "resist": [
    { "type": "bludgeoning", "except": ["magical"] },
    { "type": "piercing", "except": ["magical"] },
    { "type": "slashing", "except": ["magical"] }
  ]
}

Armor of invulnerability uses that same resist array inside its worn effect. Protection from Energy can grant resist: ["fire"]; a Brave-like trait can grant conditionImmunities: ["frightened"]. A level can grant resist: ["poison"] at its threshold. Unknown static damage words are reported when combat.damageTypes declares the vocabulary, as for creatures; without that declaration damage words are free text.

For ancestry or catalog traits, combat.sheetHides holds up to eight sources (an empty array is allowed). Each names a sheet list, one text or enum column of that list, and one of the four kinds. For a dwarf whose traits row contains "poison" in a resistance column:

"sheetHides": [{ "list": "traits", "column": "resistance", "kind": "resist" }]

Every row contributes comma-separated words, trimmed and matched without case; empty words are skipped. Adding a row with "fire" adds fire resistance; deleting it removes that source. Resistance and immunity words may include except, as in "bludgeoning except magical silvered". Vulnerabilities and condition immunities are plain words. Unknown declared damage words in sheet text are ignored, as are unknown condition ids; an enum column for condition immunities must declare only condition ids at import. Sheet, battle and Game Master summaries include these defenses and their exceptions.

Weapons in a fight

An item may be a weapon (Capability API 1.55). Its attack is the shape a combat block's attack rows have, with values in place of columns, and a ruleset fight offers it as an attack while the item is worn: held in the hands it takes, and bound where it binds. One put away or only carried offers nothing, and the attack rows and a creature's own actions work exactly as before. Ember Roads' hand axe:

"attack": {
  "budget": "act",
  "toHit": { "abilities": { "stat": "swing" } },
  "damage": { "dice": { "stat": "damage" }, "abilities": { "stat": "swing" }, "type": "cut" },
  "reach": 2,
  "range": { "normal": 10, "long": 20 }
}

Any of those numbers or words may read the item's own stat instead: { "stat": "damage" } is the item's damage, and a stat the item gives nothing is as if the value were not written. abilities and skill read an enum stat whose words are ability or skill ids, and type a text or enum stat. So an item the Game Master invents like= a weapon is a weapon too, fighting with its own stats, held to rarityCaps like any stat (a value you write down is copied as it is). One invented with no slot and no binding is never worn, so it is made without the attack. A small model tends to describe a weapon and leave like= out, so one invented in a category of your weapons with nothing to start from fights as your weapon of that category it is most like by name (a word shared either way, so a crossbow is like a bow), or the first of them, taking any stat that attack reads which the proposal left out, and the answer says so ("It fights as Hand axe does."). The Game Master's proposal form also tells it that a weapon made like one fights like it.

A weapon's tags are what its blows carry. A creature's resist or immune entry may say what gets through it: { "type": "tearing", "except": ["silver"] } is taken in full from a weapon tagged silver, and resisted from anything else. Gravewatch's grave wight is written that way, and its silver coffin nail gets through. Harm that is not a weapon item's names what it carries with qualities (Capability API 1.101), in the same item tags: on a catalog entry's mechanics (a spell) and on a creature action's damage (a deva's mace). 5e's "resistance to bludgeoning, piercing and slashing from nonmagical attacks" is { "type": "slashing", "except": ["magical"] } beside the same for the other two, with magical on its magic weapons' tags and "qualities": ["magical"] on its spells and on the creature attacks the SRD calls magical.

The weapon's details and the Game Master's line say what it does: attack (Action): Brawn to hit, 1d6 + Brawn cut, reach 2 paces, range 10 to 20 paces, with 1d8 with a hand free for Ember Roads' boar spear and at 6 beside Gravewatch's spade.

Ammunition and reloading

A weapon may shoot something, and may keep a loaded count of its own (Capability API 1.57). Ember Roads' hunting bow shoots arrows, and Gravewatch's watch pistol holds one ball, loaded out of the warden's shot and powder:

"ammo": { "tag": "arrow", "recover": 0.5 }
"ammo": { "tag": "shot" },
"clip": { "max": 1, "reload": "act" }

What a fight shoots, loads and picks up is written to the inventory as each step is taken, the way the party's health is, and the journal says what was used. A step whose stack is gone, or holds fewer than the fight counted on, is refused, as a spent item the fight cannot find is. The fight log says every shot, reload and pickup ("Hunting bow: 2 left to shoot.", "Ada loads 1 into Watch pistol: 1 of 1 loaded."), and the item's details and the Game Master's line say what the weapon shoots and holds: ammunition Arrow (1 an attack, 50% picked up after a won fight) and holds 1, reload (Act).

Modes, a second weapon, a floor and conditions on a hit

A weapon may have other ways to make its attack, a partner in the off hand, a least harm it deals and conditions it puts on what it hits (Capability API 1.58). Ember Roads' hunting bow can loose a volley, and Gravewatch's silver coffin nail may be held in each hand and marks what it bites deep:

"modes": [{ "id": "volley", "label": "Volley", "ammo": 2, "toHit": -2, "targets": 2 }]
"offHand": true,
"onHit": [{ "condition": "marked", "atLeast": 2, "rounds": 2 }]
  "offHand": { "budget": "quick", "ability": "full" }

Once its holder has attacked this turn with one weapon marked offHand, each other such weapon they wear offers a second attack on that budget, named "Silver coffin nail, off hand" on the menu. ability is full (the default) or penalty-only, which adds the damage ability only when it takes something away, as 5e's two-weapon fighting does. An off-hand attack is one blow, whatever strikes the main attack buys, and never a strike at somebody walking away. A weapon marked offHand needs the combat block's offHand. fullWhen (Capability API 1.97) is a value off the fighter's sheet: above 0, that fighter's off hand keeps the full ability whatever ability says, as 5e's Two-Weapon Fighting style does.

An entry may also carry save: { "save": <save id>, "difficulty": n }, which the target rolls as the condition would go on, a success keeping it off, and saveEnds: { "save", "difficulty", "at": "turn-start" | "turn-end" | "damaged" }, which makes it last until its holder makes that save at the start or end of each of their turns or on damage above zero (it then has no rounds). Both count as saves against that condition, and against magic when the weapon is magical (Capability API 1.169). 5e's sword of wounding: { "condition": "wounded", "atLeast": 1, "saveEnds": { "save": "con_save", "difficulty": 15, "at": "turn-start" } }.

The weapon's details and the Game Master's line say all of it: modes Volley (2 shots, -2 to hit, up to 2 targets), off hand (Quick), at least 1 on a hit before resistance, +3d6 slashing against Dragon and Marked for 2 rounds when a hit deals 2 or more.

Armor and worn effects in a fight

What an item does while worn or carried may also change a fight (Capability API 1.56), for its holder, alongside their conditions and levels. Each takes the parts of a condition a fight reads:

Gravewatch's cursed widow's ring costs a die on every attack, its bound Dawn bell keeps its bearer from being rattled, and an Ember Roads waystone carried keeps the heat off:

"worn": { "modifiers": [{ "to": "attacks", "flat": -1 }] }
"worn": { "modifiers": [{ "to": "checks", "skills": ["ward"], "flat": 1 }], "conditionImmunities": ["rattled"] }
"carried": { "modifiers": [{ "to": "checks", "skills": ["sway"], "flat": 1 }], "resist": ["burn"] }

A fight reads each item once, named for the stack ("Widow's ring" beside a roll in the log, and on a defense), as a check does; an unmet requirement's otherwise counts in a fight too, so armor too heavy for its wearer can cost speed. An item's details and the Game Master's line say all of it ("While worn: -1 on attacks", "worn: +1 on checks (Ward), immune to Rattled"). Armor that adds to a defense or a soak is an item stat read with itemStat (see Items on the sheet), as Ember Roads' Guard reads the coat worn.

Hardness. Where initiative is a number attacks move, combat.pool.hardness is a fighter's hardness, read off their sheet as the fight begins (their armor's, through itemStat), and a creature gives its own hardness. A spending blow whose dice are below it lands and does nothing: the maker's number still goes back to the base, the log says so ("Ada's Grave spade lands on the warden with 5 dice, below a hardness of 6, and does nothing."), and the menu forecasts no harm for it. Only a ruleset with a style that spends may have it, and a creature written as a sheet takes it from the sheet.

Using items in a fight

An item may be used in a fight (Capability API 1.59): a poultice pressed on a cut, a tonic swallowed, a bell rung. Its use says what using it does in the words a catalog entry's mechanics use (see What a fight reads from mechanics): kind (heal, attack, buff or debuff), amount, damageType, plus, attackRoll, save, applies, temporary, range, area, targets, targetCount, friendlyFire, and since Capability API 1.174 concentration and zone, with the budget it spends, or free. Ember Roads' poultice, and Gravewatch's warming tonic and dawn bell:

"use": { "kind": "heal", "budget": "act", "range": 0, "targets": "ally", "amount": { "dice": "1d4", "flat": 1 }, "consumes": true }
"use": { "kind": "heal", "budget": "quick", "targets": "self", "amount": { "flat": 1 }, "consumes": true }
"stack": 1,
"use": {
  "kind": "debuff",
  "budget": "act",
  "targets": "enemy",
  "save": { "save": "steel", "onSuccess": "negates" },
  "saveDifficulty": 7,
  "applies": [{ "condition": "rattled", "duration": { "rounds": 2 } }],
  "charges": 1
},
"charges": { "max": 3 }
  "charges": { "max": 3, "recharge": { "rests": ["vigil"], "amount": "max" }, "breaksOn": { "die": 20, "atMost": 1 } }
  "gate": { "check": { "skill": "ward" }, "difficulty": 2, "unless": { "value": { "abilityScore": "nerve" }, "atLeast": 3 } }

What a fight uses up and the charges it leaves are written to the inventory as each step is taken, as a weapon's shots are, and the journal says what was used. The fight log says each use ("Poultice: 1 of 2 left.", "Dawn bell: 2 of 3 left."). A party member the Engine plays uses a heal only on somebody hurt, and nobody uses an item to strike at somebody walking away. The item's details and the Game Master's line say what using it does: "Use (Action): heals 1d4 + 1, range 0 paces, used up" and use (Act): Steel 7 save negates it, Rattled, 1 of 3 charges, and the details show the charges left. An item the Game Master invents like= one of yours is used as that one is, charges and all.

Items in Classic and Tactical battles

A ruleset that does not resolve its own fights leaves them to Game Mode's own Classic and Tactical battles, where a model is asked what the inventory's items do when a fight begins. Your items are not guessed at: each one with a use does what that says, on the Engine's own numbers, and the Game Master's guess is asked only for the items that are not yours (and for none with native: false).

The Engine works each item's effect out itself, so what the screen sends never decides what one of your items does.

Loot

A won fight drops loot in every Game Mode game, once, into the party's bags. Without a ruleset it comes from Game Mode's own tables (more and rarer on a harder game), and so it does in a ruleset that declares no loot tables and leaves native on. A ruleset that declares loot tables drops its own items instead, and one with native: false and no tables drops nothing.

lootTables in the items block (Capability API 1.63) lists them, as Gravewatch's grave goods do:

"lootTables": [
  {
    "id": "grave_goods",
    "label": "Grave goods",
    "rolls": "1d2",
    "entries": [
      { "item": "kit/shot-and-powder", "weight": 4, "count": "1d4" },
      { "item": "kit/warming-tonic", "weight": 3 },
      { "item": "kit/litany-page", "weight": 2 },
      { "filter": { "category": "arm" }, "weight": 1 },
      { "coins": "shilling", "weight": 2, "count": "1d6" }
    ]
  }
]

Money

Your currencies are the party's money. A coin is an item in the bags, a stack of each coin like any other, named by its label:

Starting gear

items.startingGear (Capability API 1.78) lists gear a character may take into their bag at the start: a class's kit, a background's, a calling's. It is never given on its own. The inventory shows a Starting gear row, and the player picks a gear, an option for each of its choices and an item from each list, then takes it into the player's bag or a party member's. Gear the character's sheet fits is listed first, then gear without fits (for any character, such as a background's); every gear is offered, because a character's concept is the player's and the Game Master's to agree.

"startingGear": [
  {
    "id": "fighter", "label": "Fighter", "group": "class",
    "fits": { "value": { "field": "level_fighter" }, "atLeast": 1 },
    "lines": [{ "item": "equipment/shield", "equip": true }],
    "choices": [
      {
        "label": "Armor",
        "options": [
          { "label": "Chain mail", "lines": [{ "item": "equipment/chain-mail", "equip": true }] },
          { "label": "Leather armor and a longbow", "lines": [
            { "item": "equipment/leather-armor", "equip": true },
            { "item": "equipment/longbow" }, { "item": "equipment/arrow", "count": 20 }
          ] }
        ]
      },
      { "label": "A martial weapon", "options": [
        { "label": "Pick one", "lines": [{ "oneOf": ["equipment/longsword", "equipment/battleaxe"] }] },
        { "label": "A greataxe", "lines": [{ "item": "equipment/greataxe" }] }
      ] }
    ]
  },
  { "id": "acolyte", "label": "Acolyte", "group": "background", "lines": [{ "coins": "gp", "count": 15 }, { "name": "Vestments" }] }
]

Markets

A market in the items block (Capability API 1.65) says what a place sells and at what price, instead of every shop selling everything at its list price. Gravewatch's, a little shortened:

"market": {
  "prices": [
    { "id": "cheap", "label": "cheap", "times": 0.75 },
    { "id": "fair", "label": "fair", "times": 1, "default": true },
    { "id": "dear", "label": "dear", "times": 1.5 }
  ],
  "places": [
    { "id": "hamlet", "label": "hamlet" },
    { "id": "village", "label": "village" },
    { "id": "town", "label": "market town" },
    { "id": "city", "label": "city" }
  ],
  "sold": [
    { "filter": { "rarity": "rare" }, "place": "town" },
    { "filter": { "category": "arm" }, "place": "village" }
  ],
  "sellers": [
    { "id": "chandler", "label": "chandler", "sells": [{ "category": "coat" }, { "category": "tonic" }] },
    { "id": "smith", "label": "smith", "sells": [{ "category": "arm" }], "place": "village" },
    {
      "id": "chapel",
      "label": "chapel of the Vigil",
      "sells": [{ "category": "page" }],
      "place": "town",
      "only": { "value": { "abilityScore": "nerve" }, "atLeast": 3, "label": "wardens of Nerve 3 or more" }
    }
  ]
}

Where the party is. The Game Master says which place a scene is in and its size with [place: name="Millbrook" size="market town"], the size by its id or label, and leaves the size out for somewhere with no market (a road, the wilds). The Engine answers each tag in place, refusing a size you do not have, and the last place it answered in its own replies the player sees, from the latest conversation start, is the place in force until another is said. A place tag a player types never counts. A regenerated reply reads only what came before the telling it replaces.

Buying. The Game Master buys with [inventory: action="buy" item="Hand axe" count="1" level="dear" seller="smith" who="Ada"], level (the default without it) and seller (any seller here that sells the item, without it) optional. The Engine prices it at the place in force when the reply ends, takes the price out of the buyer's purse (the player's without who=) as a payment is, with change, and puts the item in their bag, or only pays for a service. Either both happen or neither does. The answer says what it cost (price="12 shillings") and what was paid and given back, and a notification shows it. A buy is refused, and changes nothing, with no place said (no-place), a level, item or seller you do not have (unknown-level, unknown-item), no price (not-for-sale), a place too small for the item (not-here), no seller here who sells it (no-seller), a seller whose only the buyer does not meet (not-to-you), a purse that cannot meet it (cannot-afford), or a bag that cannot carry it.

What the Game Master sees. While a scene is at a place with a market, a MARKET block names the place and its size, the price levels, and each seller there with a dozen of what they sell at the default level, cheapest first; anything they sell can be bought by name. Its instructions teach [place:] and buy, and only a ruleset with a market has them.

A market day

A market day (Capability API 1.69) makes a place's shelves change and run out, and lets the party sell back. Gravewatch's, a little shortened:

"places": [
  { "id": "hamlet", "label": "hamlet", "purse": { "amount": 10, "unit": "shilling" } },
  { "id": "town", "label": "market town", "purse": { "amount": 100, "unit": "shilling" } }
],
"buyBack": 0.5,
"sold": [{ "filter": { "rarity": "rare" }, "place": "town", "limited": "1d2" }],
"sellers": [
  { "id": "smith", "label": "smith", "sells": [{ "category": "arm" }], "stock": { "table": "smiths_odd_lot" } }
]

Honest and dishonest sellers

Capability API 1.79 lets an item be risky or a fake, and a seller be dishonest.

"items": { "market": { "sellers": [
  { "id": "fence", "label": "Fence", "sells": [{ "tag": "magical" }], "place": "town", "honest": false, "stock": { "table": "fences_odd_lot" } }
] } }
{ "id": "bag-of-devouring", "label": "Bag of Devouring", "item": { "category": "wondrous", "passesFor": "magic_items/bag-of-holding", "cost": { "amount": 5, "unit": "gp" } } }
{ "id": "wand-of-wonder", "label": "Wand of Wonder", "item": { "category": "wand", "risky": "every wave is a gamble; some effects turn on the one who waves it" } }

Spotting fakes

Capability API 1.802 lets a character tell a fake for what it is, by a check they make or by noticing it before anybody pays. The Engine knows none of the checks by name: the ruleset writes them.

{
  "id": "potion-of-poison",
  "label": "Potion of Poison",
  "item": {
    "category": "potion",
    "passesFor": "magic_items/potion-of-healing",
    "tells": [
      {
        "check": { "value": { "derived": "poisoners_kit_check" } },
        "dc": 13,
        "carries": { "anyOf": ["gear/poisoners-kit"] },
        "says": "a faint bitterness under the sweetness"
      },
      { "check": { "skill": "arcana" }, "dc": 18, "says": "its magic does not feel like healing magic" }
    ],
    "foolsReveal": ["identify"]
  }
}
"items": {
  "namesItAt": 5,
  "revealsFakes": [{ "id": "identify", "label": "Identify" }, { "id": "detect-poison", "label": "Detect Poison and Disease", "items": ["magic_items/potion-of-poison"] }],
  "market": { "sellers": [
    { "id": "fence", "label": "Fence", "honest": false, "sells": [{ "tag": "magical" }],
      "manner": { "check": { "skill": "insight" }, "dc": 13, "advantageIf": [{ "value": { "derived": "knows_trade" }, "atLeast": 1 }], "says": "their eyes slide away when you ask about it" } }
  ] }
}

Using items outside a fight

The same use works outside a fight (Capability API 1.60 for restore; the rest needs nothing new). The inventory's Use button, on one of your items with a use, and the Game Master's [inventory: action="use" item="Poultice" who="Juno"] both do what the item does to whoever carries it, with the Engine's dice:

What happened is said in one line: "Juno uses Poultice: heals 4 (Grit 6/11). 1 left." The Use button sends it to the Game Master in an [item_used] block after "I use my Poultice.", which the chat shows as a badge; the Game Master's own tag is answered with it, measured from where the turn began like its other tags, so a regenerated reply never uses an item twice. An item without a use, or in a game without a ruleset, is still said: "I use my rope."