Items
itemTypesItems are the objects players can carry, equip, and use. The AI creates new items during play, but every item handed out at the start of a game - by a trait, story start, skill, or Item Settings - must be defined here first.
"Items that exist in the world"
- Editor location
- Files → World → Items
- Editor type
- Edit in Studio + View JSON
- API endpoint
/sections/itemTypes.json/sections/itemTypes.md- Size limits
items.*.description— 4,000items(entire section) — 250,000
Schema
{
"itemTypes": {
"<key>": {
"name": "string",
"category": "string",
"description": "string",
"bonuses": [
{
"type": "resource | stat | attribute | skill",
"variable": "string",
"value": "number"
}
],
"imageFocusX": "number",
"imageFocusY": "number",
"imageUrl": "string",
"imageZoom": "number",
"slot": "string",
"mediaContent": "string",
"needsMediaGeneration": "boolean"
}
}
}Example
{
"itemTypes": {
"Iron Longsword": {
"name": "Iron Longsword",
"category": "Weapon",
"description": "A well-balanced military sword of standard construction. Reliable and unadorned.",
"bonuses": [
{ "type": "stat", "variable": "damage", "value": 3 },
{ "type": "skill", "variable": "athletics", "value": 5 }
],
"slot": "Weapon"
}
}
}Equippable item (weapon — has slot and bonuses):
A readable item (a book, letter, or scroll) can carry mediaContent, and has no slot or bonuses:
{
"Petitioner's Ledger": {
"name": "Petitioner's Ledger",
"category": "Readable",
"description": "A clothbound journal showing wear at the spine and corners. The ink on the visible pages has faded unevenly, as if the book has been opened to the same passages many times.",
"bonuses": [],
"mediaContent": "Entry, third week of the rains. Two more petitions today, both refused at the gate before they reached the council. The clerks now sort them by district before forwarding -- meaning Lower District grievances never leave the antechamber. I have begun keeping copies. If anyone asks, I am compiling a clerical reference."
}
}Fields
name
Display name of the item, shown to players. Required; see Keys and name.
category
Must match a value in itemSettings.itemCategories; Voyage warns on any other value.
slot
Optional. The slot must belong to an itemSettings.itemSlots entry with the same category as the item; Voyage warns on any other value. A slot named after its category is a catch-all that accepts any item of that category. Slot and category matching ignores case and whitespace. For most items slot and category match; armor is the usual exception, using category: "Armor" with a body-region slot such as "head", "chest", "hands", or "feet".
mediaContent
Optional string holding the text a player sees when they read the item. Author it to control the exact contents; leave it empty and the engine generates the text the first time a player reads the item, then stores it on the item. Readability comes from the player's read action, not from a special item category.
description
Flavor text describing the item, shown to the player.
bonuses
Stat bonuses applied while equipped and removed on unequip; use [] for none. Each bonus is { type, variable, value }: attribute, skill, and resource bonuses add to the named target; stat bonuses accept only damage (each point is +10% outgoing damage) or armor (each point reduces incoming damage by 0.1%, capped at 90%).
imageUrl
Optional string. URL of the item's artwork, shown on its Inventory and Equipped cards. Voyage's item generator produces 512x512 squares; an upload should be at least 600x600. In the editor you can upload your own image, generate one from a prompt, or pick one you used recently -- all three set this URL.
imageFocusX
Positions the visible window over the source image along the horizontal axis, as a percentage: 0 holds the left edge, 50 centres it, 100 holds the right edge. Saved by the crop control rather than typed by hand, and applied wherever Voyage shows the image.
imageFocusY
Positions the visible window over the source image along the vertical axis, as a percentage: 0 holds the top edge, 50 centres it, 100 holds the bottom edge. Saved by the crop control rather than typed by hand, and applied wherever Voyage shows the image.
imageZoom
Scales the image inside its frame, as a percentage of the unzoomed fit: 100 fills the frame with no magnification, 150 shows it at one and a half times, cropping to the area picked by the focus fields. Saved by the crop control rather than typed by hand, and applied wherever Voyage shows the image.
Bonus types
| type | variable | effect |
|---|---|---|
skill | skill name - must match a key in skills | adds to skill roll |
attribute | attribute name - must match a name in attributeSettings.attributeNames | adds to attribute score |
resource | resource name - must match a key in resourceSettings | adds to resource max |
stat | damage | +10% damage output per point (1 damage = +10%, 10 damage = +100%). Use small values. |
stat | armor | reduces incoming damage by armor / 1000 per point (each point = 0.1% reduction), capped at 90%. 900 armor reaches the cap; values above 900 are wasted. Use small values. |
Note:
"armor"and"damage"are the only validstatvalues.
Note: Custom stats (dodge, crit rate, block, initiative, etc.) have no native schema field. If you want a dodge or parry mechanic, document the rule in the item's
descriptionand reinforce it inaiInstructions.generateActionInfo. No engine math backs it: the AI makes every judgment call.
Warning:
bonus.variablevalues are cross-checked against the relevant collection. The validator flags an attribute bonus with"variable": "strenght"(typo).
Item stacking
Currency items (whose name matches itemSettings.currencyName) stack by name and category only - the engine ignores bonus values when merging currency stacks. Non-currency items must match all properties to stack. Two swords with different bonus values are separate inventory entries even if both are named "Iron Sword." Items do not need to be equipped to be used, but only equipped items grant mechanical bonuses.
Keys and name
The outer key is the entry's id, and the engine resolves references by key. It must be identical to the inner name, character for character, and Voyage rejects a world where the two differ. Among the keyed sections that carry a name, quests is the exception: its key is free.
Items in triggers
Triggers count, give and take item types: player-item compares how many of an item type is held, and item-add and item-remove give and take one. All three name the item type by its key, never its name; see the trigger reference for a shop purchase.
Authoring tips
Description prose
The description is what the AI uses when the item appears in play — it should read like a narrator would say it, not like a tooltip. "A well-balanced military sword, standard issue for the city guard" gives the AI setting context and narrative flavor. "Deals 1d8 piercing damage" does nothing useful because the AI already knows how swords work. Keep descriptions short and evocative; the mechanics live in bonuses.
Pre-defining items matters most for starting gear and any item with specific mechanical bonuses you need to be precise about; items the AI creates in play get bonuses it judges fit the situation.
Equippable item rules
Equippable items must have a slot field. Non-equippable items (consumables, currency, miscellaneous) omit it.
Skill and attribute bonuses on equippable items are common — cloaks, boots, and gloves granting +1 to stealth or perception are standard practice. Not all equippable items need to use the armor stat type.
Armor formula and tier values
The formula reduces incoming damage by armor / 1000 per point — a value of 100 means 10% reduction. Values above 900 are wasted.
Level-difference damage reduction
When attacker and defender are at different level values, the engine grants additional damage reduction to the higher-level side on top of armor. The per-level step diminishes (5% at +1, 4.5% at +2, ..., 0.5% at +10) and is clamped at +11; cumulative cap is 27.5% at a 10-level gap.
| Level diff | Per-step | Cumulative |
|---|---|---|
| 1 | 5.0% | 5.0% |
| 2 | 4.5% | 9.5% |
| 3 | 4.0% | 13.5% |
| 4 | 3.5% | 17.0% |
| 5 | 3.0% | 20.0% |
| 6 | 2.5% | 22.5% |
| 7 | 2.0% | 24.5% |
| 8 | 1.5% | 26.0% |
| 9 | 1.0% | 27.0% |
| 10 | 0.5% | 27.5% |
| 11+ | 0% (clamped) | 27.5% |
Practical consequence: a high-level NPC shrugs off attacks from lower-level players by up to 27.5%, but the bonus stops growing once the gap reaches 10 levels — so a level-30 NPC takes the same level-based reduction from a level-20 attacker as from a level-1 attacker.
Impact
Every attack carries an impact value (100 = normal) that the AI assigns per attack from how the action is described, following the impact guidance in generateActionInfo (a 50-200 scale by default); the attack's damage is multiplied by impact / 100. It applies to both player and NPC attacks, so a vividly described heavy blow lands harder than a glancing one.
| Impact | Multiplier |
|---|---|
| 50 | 0.5x |
| 100 | 1.0x |
| 150 | 1.5x |
| 200 | 2.0x |
Evasion (defend action)
A character that takes a defend / evade action on a turn reduces the incoming damage of attacks against them that turn. The reduction scales with how well the defend roll succeeds; a reduction of 1.0 or higher fully nullifies the hit (it lands but deals 0). This is an active, per-turn choice driven by the defend roll, not a passive stat — and a successful player defend also degrades the attacking NPC's success roll, which is otherwise a fixed random draw of basic success or better.
Starting items
- Give each character-creation trait (whatever your world calls them -- Race, Class, Background, Profession, Origin, Faction, etc.) its own
startingItems. Players should feel their choices materialize in inventory immediately. - Match the items to the trait's identity. In a D&D-style fantasy world that might mean a sword and shield for a fighter, a spellbook for a wizard, lockpicks for a rogue. In a modern scenario it might be a smartphone and press pass for a journalist, a toolbox for a mechanic, a sidearm and badge for a cop. The pattern is "items signal role at first sight" -- the genre vocabulary is whatever fits your world.
- Avoid giving the same item across multiple traits -- redundant items waste inventory space.