Choices and grants
This page is the reference for choices, the questions a player answers when they take a homebrew item, and grants, the things an item hands out with it, with a checked example of each kind.
Many things a character takes come with a question: a background asks which languages they speak, a feat which ability to raise, a magic sword which kind of weapon it is. In a pack, each question is a choice in the item's choices list. When a player takes the item, in the character builder, at Level Up or from + From pack on the sheet, RollQuest asks every question in the choices window and only adds the item once each is answered. A grant is the other half: something that arrives with the item on its own, such as a spell a feat always gives, a feature a class level brings, or the contents of an equipment pack.
Plan: writing homebrew is on Pro. Players answer choices wherever they take the item.
A choice, field by field
Every choice has these fields, plus the ones its kind needs:
| Field | What it holds |
|---|---|
id |
The choice's ID, unique on the item, such as tide_language. The answer is saved under it. |
kind |
One of the nine kinds below. |
prompt |
The question, shown as the heading in the choices window, such as Choose 1 language. The wording decides nothing else: only a choice that declares "decisionKind": "subclass", or whose id ends in subclass as RollQuest's own subclass choices do, is filed under Subclass (see A whole new class). |
pick |
How many to pick. 1 if you leave it out. |
The examples on this page are rows from one 5.5e pack, with "derivedFrom": "5-5e-core". Paste any of them into your own pack's items.

The nine kinds of choice
| kind | Asks for | What the answer does |
|---|---|---|
skillProf |
Skills, languages, tools, or expertise | Raises each picked proficiency on the sheet |
abilityIncrease |
Points to add to ability scores | Adds them to the scores |
feature |
One of a list you write | Adds the picked option's effects, grants and further choices |
power |
Spells from a spell pack | Adds each spell |
spellSwap |
Spells to swap for others | Removes some spells and adds others |
weaponMastery |
Weapons to master (5.5e) | Records the weapons |
baseWeapon |
Which weapon a magic weapon is | Turns the item into that weapon, with a bonus |
feat |
A feat from a feat pack | Adds the feat |
asiOrFeat |
An ability score improvement or a feat | Either of the two above |
There's no separate kind for languages, tools, expertise or saving throws: all of them are skillProf. Spell choices are always power: spell is refused when you create the pack, with a message that says to use power, which works the same way.
skillProf: skills, languages, tools and expertise
{
"kind": "inventoryItem",
"key": "FEAT_TIDE_SCHOLAR",
"spec": {
"subType": "feat",
"id": "FEAT_TIDE_SCHOLAR",
"name": "Tide Scholar",
"meta": { "category": "Homebrew Feat", "description": "A language, a tool and one Expertise." },
"choices": [
{
"id": "tide_language",
"kind": "skillProf",
"prompt": "Choose 1 language",
"from": ["L_PRIMORDIAL", "L_SYLVAN", "L_GIANT", "L_DRACONIC"],
"pick": 1
},
{
"id": "tide_tool",
"kind": "skillProf",
"prompt": "Choose 1 tool proficiency",
"from": ["T_NAVIGATORS_TOOLS", "T_CARTOGRAPHER", "T_VEHICLES_WATER"],
"pick": 1
},
{
"id": "tide_expertise",
"kind": "skillProf",
"prompt": "Choose 1 skill you are proficient in for Expertise",
"from": ["P_ATH", "P_NAT", "P_SUR", "P_PERC"],
"pick": 1,
"tier": 2
}
]
}
}
from: the values the player picks from.P_flags are skills,L_languages andT_tools, as in Effects.tier: 1 for proficiency, 2 for expertise. 1 if you leave it out.- The answer raises each picked value to at least
tier, and never lowers it. Expertise doesn't check the character is already proficient: say so in the prompt, as here. - Every ID in
frommust be one your system has: an unknown one, such as a misspelt skill, is refused when you create the pack (CHOICE_FROM_UNRESOLVED). If a character's sheet is missing a value the system declares, that pick is skipped and the item still arrives, with a message saying what wasn't applied.
abilityIncrease: ability score points
{
"kind": "inventoryItem",
"key": "BOON_STORMBORN",
"spec": {
"subType": "feat",
"id": "BOON_STORMBORN",
"name": "Stormborn",
"meta": { "category": "Homebrew Feat", "description": "+1 to two of Strength, Constitution or Wisdom." },
"choices": [
{
"id": "stormborn_asi",
"kind": "abilityIncrease",
"prompt": "Increase two of STR, CON, WIS by 1 (max 20)",
"from": ["STR", "CON", "WIS"],
"total": 2,
"perAbilityCap": 1
}
]
}
}
from: the abilities the points can go to.total: how many points. The player must place all of them.perAbilityCap: the most on any one ability. 2 if you leave it out.maxScore: optional, the highest a score may reach, such as 30 for an epic boon. Otherwise the system's highest, 20 in 5e and 5.5e. Points over it are lost.- The increase stays if the player rolls their ability scores again later. If the item is removed from the sheet, the increase comes off with it (see Feats, species and backgrounds).
feature: one of a list you write
{
"kind": "inventoryItem",
"key": "FEATURE_TIDE_STANCE",
"spec": {
"subType": "feat",
"id": "FEATURE_TIDE_STANCE",
"name": "Tide Stance",
"meta": { "category": "Homebrew Feat", "description": "Choose a stance." },
"choices": [
{
"id": "tide_stance",
"kind": "feature",
"prompt": "Choose a Tide Stance",
"pick": 1,
"options": [
{
"id": "undertow",
"label": "Undertow",
"description": "+1 AC while wearing armour.",
"effects": [
{ "id": "TIDE_UNDERTOW_AC", "target": "AC_MISC_BONUS", "op": "add", "value": 1, "condition": "=AC_BODY_ARMOR_EQUIPPED", "trigger": "" }
]
},
{
"id": "stormcaller",
"label": "Stormcaller",
"description": "You always have Thunderwave prepared.",
"effects": [],
"autoInclude": [{ "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_THUNDERWAVE", "alwaysPrepared": true }]
},
{
"id": "tidecaller",
"label": "Tidecaller",
"description": "You learn one Druid cantrip of your choice.",
"effects": [],
"choices": [
{
"id": "tidecaller_cantrip",
"kind": "power",
"prompt": "Choose your bonus Druid cantrip",
"packSlug": "5-5e-srd-spells",
"pick": 1,
"alwaysPrepared": true,
"filter": { "class": "Druid", "level": 0 }
}
]
}
]
}
]
}
}
Each option has:
| Field | What it does |
|---|---|
id |
The option's ID. The answer saves it. |
label |
What the player sees, also saved with the answer so it still reads correctly if the pack goes away. |
description |
The text under the option. |
effects |
Effects that join the item's own once this option is picked. Undertow adds 1 to AC while wearing armour. |
autoInclude |
Grants that arrive when this option is picked. Stormcaller grants Thunderwave, always prepared. |
choices |
A further question, asked under the option once it's picked. Tidecaller asks for a Druid cantrip. Only power and skillProf choices work here: other kinds are checked and then ignored. |
On a class level row, a feature choice with "decisionKind": "subclass" is the class's subclass choice: see A whole new class. On any other item it only files the choice under Subclass in the choices window. A homebrew pack can add an option to a built-in feature choice, such as a new cleric domain: see Subclasses and class features.
power: spells
{
"kind": "inventoryItem",
"key": "ITEM_PEARL_OF_THE_DEEP",
"spec": {
"subType": "item",
"id": "ITEM_PEARL_OF_THE_DEEP",
"name": "Pearl of the Deep",
"maxUses": 1,
"uses": 1,
"meta": { "description": "Learn one 2nd-level Wizard spell; cast it once per Long Rest without a slot." },
"effects": [{ "id": "PEARL_LONGREST", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "longRest" }],
"choices": [
{
"id": "pearl_spell",
"kind": "power",
"prompt": "Choose a 2nd-level Wizard spell bound to the pearl",
"packSlug": "5-5e-srd-spells",
"filter": { "class": "Wizard", "level": 2 },
"pick": 1,
"alwaysPrepared": true,
"consumes": { "itemKey": "ITEM_PEARL_OF_THE_DEEP", "amount": 1 }
}
]
}
}
packSlug: the spell pack, required.5-5e-srd-spellsfor 5.5e,5e-srd-spellsfor 5e, or your own pack for homebrew spells.filter.class: only spells whose class list includes this word, such asWizard. A list of words works too.filter.level: only spells of this level, 0 for cantrips. Orfilter.minLevelandfilter.maxLevelfor a range.alwaysPrepared: the spell is always prepared and doesn't count against the character's prepared spells.consumes: casting the spell spends a use of the named item instead of a spell slot. The pearl's own long rest effect gives its use back.- Each picked spell arrives as its own row, prepared. A spell the character already has is skipped. If the filter leaves fewer spells than
pick, the player picks what's there.
spellSwap: swap spells for others
{
"kind": "inventoryItem",
"key": "ITEM_TOME_OF_REWRITING",
"spec": {
"subType": "item",
"id": "ITEM_TOME_OF_REWRITING",
"name": "Tome of Rewriting",
"meta": { "description": "Optionally swap one Wizard spell (level 1 to 3) for another." },
"choices": [
{
"id": "tome_swap",
"kind": "spellSwap",
"prompt": "Optional: replace one of your Wizard spells with another Wizard spell",
"packSlug": "5-5e-srd-spells",
"filter": { "class": "Wizard", "minLevel": 1, "maxLevel": 3 },
"count": 1,
"optional": true
}
]
}
}
count: how many to swap. The player marks that many of their spells to drop, then picks the same number of replacements frompackSlugthat matchfilter.optional:truelets the player swap none.- The replacements must match
filter. The spells dropped needn't.
weaponMastery: weapons to master
{
"kind": "inventoryItem",
"key": "FEAT_ISLAND_DRILLS",
"spec": {
"subType": "feat",
"id": "FEAT_ISLAND_DRILLS",
"name": "Island Drills",
"meta": { "category": "Homebrew Feat", "description": "Master one martial weapon." },
"choices": [
{
"id": "drills_mastery",
"kind": "weaponMastery",
"prompt": "Choose 1 martial weapon to master",
"packSlug": "5-5e-srd-weapons",
"filter": { "category": "Martial" },
"pick": 1
}
]
}
}
- Records the picked weapons, which the sheet then shows beside them, such as Longsword (Sap). Mastery changes no roll.
filter.categorynarrows the list in the choices window, matching part of a weapon's category, such asMartial.
baseWeapon: which weapon is this?
{
"kind": "inventoryItem",
"key": "ITEM_CORAL_BLADE",
"spec": {
"subType": "item",
"id": "ITEM_CORAL_BLADE",
"name": "Coral Blade",
"meta": { "description": "A +1 finesse blade grown from living coral." },
"choices": [
{
"id": "BASE_WEAPON",
"kind": "baseWeapon",
"prompt": "Which weapon is this?",
"packSlug": "5-5e-srd-weapons",
"from": ["WEAPON_RAPIER", "WEAPON_SCIMITAR", "WEAPON_SHORTSWORD"],
"bonus": 1,
"nameTemplate": "Coral {base}, +1"
}
]
}
}
- The item becomes the picked weapon: it takes the weapon's actions, damage, range and properties, sits in the Weapon group on the sheet's Items tab with Attack and Damage, and adds
bonusto both its attack and its damage. Picking Rapier here gives Coral Rapier, +1, and the message after the add says Added Coral Rapier, +1. nameTemplate: the new name, with{base}standing for the weapon's.fromorfilter.categorylimits the weapons offered. Leave both out to offer every weapon inpackSlug.- It's always one weapon: leave
pickout, because the choices window would ask for more and RollQuest accepts only one. Only the firstbaseWeaponchoice on an item counts. - Weapons and armour has a +1 weapon of any kind.
feat: a feat
{
"kind": "inventoryItem",
"key": "ITEM_ISLAND_UPBRINGING",
"spec": {
"subType": "feat",
"id": "ITEM_ISLAND_UPBRINGING",
"name": "Island Upbringing",
"meta": { "category": "Homebrew Feat", "description": "Gain one Origin feat." },
"choices": [
{
"id": "upbringing_feat",
"kind": "feat",
"prompt": "Choose an Origin feat",
"packSlug": "5-5e-srd-feats",
"filter": { "category": "Origin Feat" },
"pick": 1
}
]
}
}
filter.category: only feats whose category includes this, such asOrigin FeatorGeneral Feat.- If the picked feat has choices of its own, they open underneath it.
- The feat arrives as its own row. Its own grants don't arrive with it: a feat taken through a
featchoice doesn't bring the spells or features in itsautoInclude. - A feat the character already has is skipped.
asiOrFeat: an ability score improvement or a feat
{
"kind": "inventoryItem",
"key": "BOON_HARBOUR_TRIAL",
"spec": {
"subType": "feat",
"id": "BOON_HARBOUR_TRIAL",
"name": "Harbour Trial",
"meta": { "category": "Homebrew Feat", "description": "+2 to your scores, or a General feat." },
"choices": [
{
"id": "harbour_asi",
"kind": "asiOrFeat",
"prompt": "Ability Score Improvement: +2 to one score or +1 to two, or take a General feat",
"from": ["STR", "DEX", "CON", "INT", "WIS", "CHA"],
"total": 2,
"perAbilityCap": 2,
"packSlug": "5-5e-srd-feats",
"filter": { "category": "General Feat" },
"pick": 1
}
]
}
}
The choices window shows Option A, the ability score improvement, worked as an abilityIncrease with from, total and perAbilityCap, and Option B, a feat, worked as a feat choice with packSlug and filter. Picking one clears the other.
A feat with a spell choice of its own can't be finished through Option B: offer it through a plain feat choice instead.
Which packs a choice can name
A choice's packSlug, and a grant's, can name:
- your own pack, the one the item is in;
- one of RollQuest's packs for your system, such as
5-5e-srd-spells,5-5e-srd-featsor5-5e-srd-weapons; - another of your packs for the same system, while it's bound to the same game.
weaponMasteryandbaseWeaponare the exception: they take only the item's own pack or one of RollQuest's.
RollQuest's own pickers name RollQuest's packs, so your homebrew spells and feats aren't offered in the class spell lists, a background's feat or the level 4 feat. Offer them with a choice of your own that names your pack.
Answers
- The choices window opens when a player takes an item with choices: in the builder, at Level Up, or from + From pack. See Create a character.
- Every choice must be answered. Confirm stays greyed out until they are, and nothing is added before that. An item asked without all its answers is refused with Missing resolution for choice and the choice's ID.
- The answers are saved on the item, with each option's label, so a feature can say later what was picked.
- The checker reads every choice. A misspelt
kindor a missingidis refused (CHOICE_INVALID), so is afromID the system doesn't have (CHOICE_FROM_UNRESOLVED) or afromkey that isn't in thepackSlugpack (PACK_REFERENCE_UNKNOWN_ITEM), and so is apackSlugthat names nothing (PACK_REFERENCE_UNKNOWN_PACK). It can't tell whether a choice makes sense, such as atotalthat can't be reached, so take every new item once on a test character. - Frozen characters. While the GM has Freeze characters on, a player can't add an item with choices, except one whose only choice is
baseWeapon. The Game Master (GM) still can. See Who can see and change a sheet. - The
/itemchat command can't hand out an item with choices, because nobody is asked the questions.
Grants
autoInclude: rows that come with an item
{
"kind": "inventoryItem",
"key": "FEAT_LANTERN_BEARER",
"spec": {
"subType": "feat",
"id": "FEAT_LANTERN_BEARER",
"name": "Lantern Bearer",
"meta": { "category": "Homebrew Feat", "description": "You always have Light prepared, and you can make a lantern flare once per Long Rest." },
"effects": [],
"autoInclude": [
{ "packSlug": "5-5e-srd-spells", "itemKey": "SPELL_LIGHT", "alwaysPrepared": true },
{ "packSlug": "my-lantern-kit", "itemKey": "FEATURE_LANTERN_FLARE" }
]
}
}
Taking Lantern Bearer also adds Light, always prepared, and Lantern Flare, each as its own row. The rows are locked to the item that granted them.
| Field | What it does |
|---|---|
packSlug |
The pack the row comes from. Required: an entry without it is skipped. Here, RollQuest's spells and this pack, my-lantern-kit. |
itemKey |
The row's key in that pack. |
alwaysPrepared |
For a spell: always prepared, not counted against the prepared spells. |
grantAtLevel |
The class level the row arrives at. Only on a class level row, an option of a class level's choice, or a class contribution: on any other item every entry arrives at once. |
- A row is never granted twice. If the character already has it, it stays as it is, made always prepared if the grant says so.
- A granted row can't have choices of its own, and can't be a class level. Put the question on the item that grants it instead.
- A granted row's own
autoIncludeisn't followed: grants go one step deep. - A retired row isn't granted. See Remove or rename a row.
grantAtLevel is what makes subclasses and classes work: see Subclasses and class features and A whole new class.
bundle: an equipment pack
An item with a bundle stands for several items, such as an explorer's pack. Taking it adds its contents instead of itself:
{
"kind": "inventoryItem",
"key": "GEAR_DELVERS_KIT",
"spec": {
"subType": "item",
"id": "GEAR_DELVERS_KIT",
"name": "Delver's Kit",
"price": { "groupId": "coinage", "minor": 1500 },
"meta": { "description": "An Everburn Lantern, a backpack, 5 torches and 50 feet of rope." },
"bundle": [
{ "itemKey": "ITEM_EVERBURN_LANTERN" },
{ "packSlug": "5-5e-srd-gear", "itemKey": "GEAR_BACKPACK" },
{ "packSlug": "5-5e-srd-gear", "itemKey": "GEAR_TORCH", "qty": 5 },
{ "packSlug": "5-5e-srd-gear", "itemKey": "GEAR_ROPE_HEMP_50FT" }
]
}
}
- Each entry has
itemKeyand, optionally,qty(1 if left out) andpackSlug(this pack if left out). - Contents the character already has are added to the stack: five more torches make the stack bigger.
- The kit itself never appears on the sheet.
- A bundle can't have
choices, and nothing in it can have choices or be a class level or another bundle. - An item in a bundle doesn't bring its own grants: the lantern's Sunburst below only arrives when the lantern is taken on its own.
Uses, and spending another item's uses
maxUses and uses give an item uses, shown as pips under Resources on the Form View. An action with an empty formula gives the player a button that spends one. Print the same number in both, and give the item an effect that brings them back on a rest: see Uses and the rest buttons.
A feature can spend another item's uses instead of having its own, the way a cleric's Channel Divinity options spend Channel Divinity. The lantern has three charges, back at dawn, and grants Sunburst, which spends one:
{
"kind": "inventoryItem",
"key": "ITEM_EVERBURN_LANTERN",
"spec": {
"subType": "item",
"id": "ITEM_EVERBURN_LANTERN",
"name": "Everburn Lantern",
"maxUses": 3,
"uses": 3,
"meta": { "rarity": "Uncommon", "description": "3 charges, all back at dawn. Its Sunburst spends one." },
"effects": [{ "id": "EVERBURN_DAWN", "target": "SELF.uses", "op": "reset", "value": "", "condition": "", "trigger": "sunrise" }],
"autoInclude": [{ "packSlug": "my-lantern-kit", "itemKey": "FEATURE_EVERBURN_SUNBURST" }]
}
}
{
"kind": "inventoryItem",
"key": "FEATURE_EVERBURN_SUNBURST",
"spec": {
"subType": "background",
"id": "FEATURE_EVERBURN_SUNBURST",
"name": "Everburn Sunburst",
"meta": {
"passive": false,
"description": "Spend a charge of your Everburn Lantern: one creature within 30 feet takes 2d6 radiant damage.",
"consumes": { "itemKey": "ITEM_EVERBURN_LANTERN", "amount": 1 },
"targets": { "max": 1 },
"applies": [{ "kind": "damage", "formula": "=2d6", "damageType": "radiant", "actionId": "BURST" }]
},
"actions": [{ "id": "BURST", "label": "Sunburst", "formula": "=2d6", "damageType": "radiant", "tag": "" }],
"effects": []
}
}
meta.consumes.itemKeynames the item whose uses it spends, andamounthow many (1 if left out).- The item it names must have
maxUsesand an effect that brings them back on a rest, or the pack is refused: CONSUMES_INCOHERENT. - When the uses run out, the button is refused with Out of and the item's name. If the character doesn't have the item, the feature spends nothing.
- Don't give the spending feature uses of its own.
Other ways an item can carry more
| Field | What it does | See |
|---|---|---|
meta.toggleable |
The item's effects count only while it's switched on. | Effects |
meta.exclusiveGroup |
Marks which item holds a group, such as concentration. | Effects |
autoApply |
Added to every sheet that has the pack. Meant for game systems: a homebrew add-on pack's autoApply rows only arrive after Apply to N sheets and a re-stamp. |
Put your pack on a table |
spec.contributesTo with spec.option |
Adds an option to a built-in choice. | Subclasses and class features |
classContribution rows |
Add grants and choices to a built-in class level. | Subclasses and class features |
What can go inside what
| Inside | Works | Doesn't |
|---|---|---|
A feature option's choices |
power, skillProf |
Every other kind is ignored. |
A feat picked through feat |
Its skillProf, abilityIncrease, feature and power choices are asked. |
Its autoInclude, and choices inside its feature options. |
A feat picked through asiOrFeat |
Its skillProf, abilityIncrease and feature choices. |
A power choice: the window can't be confirmed. |
An item in a bundle |
The item itself. | Its choices (refused) and its grants. |
A row granted by autoInclude |
The row itself. | Its choices (refused) and its own grants. |
Shaping character creation
The choices above belong to an item. A game system of your own also asks questions when a character is made: the steps of its character builder, listed in its pack's requiredDecisions (see A game system of your own). Three declarations shape what those steps offer, and RollQuest's own Tidewrack system uses all three. The first two go on the steps in a system pack's requiredDecisions: the builder only reads the steps of the game's system pack, so an add-on to 5e or 5.5e can't add or change one.
filterBy: offer only what suits an earlier pick. On a pickFromPacks step, filterBy keeps the options whose meta field matches the item picked at an earlier step. Tidewrack's Choose an Ability step offers only the abilities of the Calling the player picked earlier, at Choose a Calling:
{
"id": "pick_ability",
"label": "Choose an Ability",
"prompt": "Pick one special ability from your own Calling. More come with Calling XP.",
"kind": "pickFromPacks",
"skippable": true,
"satisfiedBy": { "packSlugs": ["tidewrack-abilities"] },
"dependsOn": ["pick_calling"],
"filterBy": { "field": "calling", "fromStep": "pick_calling" },
"maxPicks": 1
}
fieldis themetafield to compare. Each Tidewrack ability carries one, such as"calling": "Knuckle".fromStepis theidof the earlier step. What's compared is the name of the item picked there, or its ownmetafield named byfromField, when you add one.- An option without the field is always offered, so general items can sit beside the filtered ones.
- The earlier step must be another
pickFromPacksstep that this one depends on throughdependsOn, directly or along a chain, so that its pick exists first. - If the player goes back and picks something else at the earlier step, the picks this step no longer offers come off, with anything only they granted. After creation nothing comes off.
maxPicks: how many a step allows. A whole number, 1 or more, on a pickFromPacks step: how many of its options a player may take there, counting what the sheet already holds from that step. At 1, a new pick replaces the one held. A pick of the same kind made later, outside the builder, isn't limited.
applyAtCreation: false: an add-on applied by hand. On an add-on pack (one with a derivedFrom), it keeps the pack off new character sheets. It's for an add-on that belongs on a different kind of sheet from a character, such as Tidewrack's crew sheet, which the whole party shares: its crews pack has "applyAtCreation": false beside "category": "addon" and "derivedFrom": "tidewrack-core". New characters and duplicated sheets don't get it, and Apply to N sheets leaves every sheet alone, saying the pack is applied by hand to the sheet it belongs on.
To apply it, the GM opens that sheet and clicks Add followed by the pack's name (on a Tidewrack crew sheet, the Crews pack's): in the Form View it's in the Edit toolbar, beside Re-run character setup; on a Canvas sheet it's in Sheet options while you edit. Only the GM sees it, and only while the sheet doesn't have the pack yet. It offers an add-on whose derivedFrom is the sheet's game system; a homebrew one must also be bound to the game.
Each of the three would fail without a word in play if it were written wrong, so the check refuses a bad one by name: DECISION_FILTER_INVALID (such as a fromStep the step doesn't depend on), DECISION_MAX_PICKS_INVALID (such as 0) and APPLY_AT_CREATION_INVALID (anything but true or false, or the key on a base pack, which is always applied first).
Related
Effects · Feats, species and backgrounds · Spells · Subclasses and class features · Create a character
