Create or update hundreds of items at once from a spreadsheet — or let an AI fill the rows.
Importing Items from CSV
Making a hundred items one at a time in the item editor is slow. With Import CSV you fill a spreadsheet — by hand, from another game's data, or by asking an AI to write the rows — and bring every item in at once. You see every row checked before anything is saved.
The same file can also update items you already have: a row whose id already exists changes that item instead of making a new one.
Where to find it#
Database → Items → Items tab. Two buttons sit next to + New Item at the top:
- CSV template downloads a blank template: every column as a header, plus two example rows (a sword and a potion).
- Import CSV opens the importer. You can also download the template and the column guide from inside it.
Importing items#
- Click CSV template (or Import CSV → Download CSV template) and open the file in Excel, Google Sheets, LibreOffice or a text editor.
- Delete the two example rows, or keep them as a guide, then add one row per item. Only name and type are required for a new item. Leave any other cell blank to use the item editor's default.
- Save the file as CSV. Comma-, semicolon- and tab-separated files all work, and so do UTF-8 and the Windows encoding Excel writes.
- Click Import CSV, then Choose CSV file…. You can also paste the CSV straight into the box.
- Click Check CSV. Every row gets a label: Create (a new item), Update (an existing id) or Skip (the row has an error, and the reason is shown next to it). Nothing has been saved at this point.
- Fix any rows with errors and check again. You can also go ahead without them, because rows with errors are skipped.
- Click Import N items. A summary shows how many items were created and updated, and lists any row that couldn't be saved.
- Open a few of the new items in the item editor to add icons, sprites, effects and abilities (see the gotchas below).
Let an AI write the rows#
The importer is built so an AI can do the typing:
- In Import CSV, click Download column guide (for AI). The guide explains every column and lists your project's own rarity, weapon type, armor type, element and skill ids, so the AI can only pick values that exist.
- Give your AI the template and the guide, and ask for what you want. For example: "Using this column guide, fill this CSV template with 100 items for a desert region: 30 weapons, 30 armor pieces across tiers 2–5, 20 potions and food, 20 crafting materials. Keep the header row exactly as it is."
- Paste the result into Import CSV and click Check CSV. Any mistake (a misspelled type, a rarity that doesn't exist) shows up as a plain-language error on its row, with a suggestion like did you mean "weapon_sword"?
How rows are matched#
| The row's id… | What happens |
|---|---|
| Matches an item you already have | That item is updated. Only the cells you filled in change, and a blank cell keeps the item's current value. |
| Is new | A new item is created. Blank cells take the item editor's defaults. |
| Is blank | An id is made from the name (Iron Sword → iron_sword). If that id already exists, the row updates that item, and the preview warns you. |
Each id can appear only once per file. A second row with the same id is flagged as an error.
Columns#
Header names are not case-sensitive, and spaces work as well as underscores (Max Stack = max_stack). A few other common names are also recognised, such as price for value and stack_size for max_stack. Any column the importer doesn't know is listed as ignored in the preview.
| Column | Editor field | What it does |
|---|---|---|
id | ID | Unique item id. An id that already exists UPDATES that item; a new id creates one. Blank = made from the name (Iron Sword → iron_sword). |
name | Name | Display name. Required for new items. |
description | Description | Tooltip text. Wrap in quotes if it contains commas or line breaks. |
type | Type | Item type id (e.g. weapon_sword, armor_chest, potion, raw_resource). The editor's type name also works. Required for new items. |
tier | Tier | Shorthand for min_tier (1–100). Blank on a new item = 1. |
min_tier | Min Tier | Lowest tier this item spawns at. Base stats are the stats AT this tier. |
max_tier | Max Tier | Highest tier this item spawns at. Blank = same as min tier. |
rarity | Rarity | Rarity id or name from Database → Items → Rarity. Blank = no rarity. |
value | Value (silver) | What the item is worth in silver. Shops derive buy and sell prices from it. Blank = unpriced (shops fall back to market / tier). |
weight | Weight | Carry weight of one item. Default 1. |
max_stack | Max Stack | How many fit in one bag slot. Default 1. |
tradeable | Tradeable | yes/no. No = bound: cannot be traded, mailed or sold to players. Default yes. |
max_durability | Max Durability | Durability when new. 0 = never breaks. Default 100. |
durability_loss_on_use | Durability Loss on Use | Durability lost each use / swing. Default 1. |
durability_loss_on_hit | Durability Loss on Hit Taken | Durability lost each time the wearer is hit. Default 1. |
equip_slot | Equip Slot | Where it equips (head, chest, legs, boots, cape, accessory, main_hand, off_hand, tool, pet, mount). Armor types already imply their slot — leave blank for them. |
weapon_type | Weapon Type | Weapons: weapon type id or name from Items → Weapons → Weapon Types (sets its attacks and grip). |
two_handed | Two-Handed | yes/no. Blank = use the weapon type's grip. |
armor_type | Armor Type | Armor: armor type id or name from Items → Armor → Armor Types. |
element | Element | Element id or name the item deals / grants. Blank = none. |
guard_rate | Guard Rate | Shields: % of a frontal hit blocked while guarding (0–100). Blank = can't guard. |
rune_slots | Rune Slots | Rune sockets on this gear (0–12). Default 0. |
cosmetic | Cosmetic | yes/no. Worn in the wardrobe: no stats, only changes the look. Default no. |
footstep_sound | Footstep Sound | Footwear: default, metal, soft, heavy or silent. Blank = guessed from the item. |
stat_attack | Attack | Physical attack bonus while equipped. Blank = 0 on a new item, unchanged on an update. |
stat_defense | Defense | Physical defense bonus while equipped. Blank = 0 on a new item, unchanged on an update. |
stat_magic_power | Magic Power | Magic attack bonus. Blank = 0 on a new item, unchanged on an update. |
stat_magic_resist | Magic Resist | Magic defense bonus. Blank = 0 on a new item, unchanged on an update. |
stat_max_hp | Max HP | Extra maximum health. Blank = 0 on a new item, unchanged on an update. |
stat_max_mp | Max MP | Extra maximum mana. Blank = 0 on a new item, unchanged on an update. |
stat_max_stamina | Max Stamina | Extra maximum stamina. Blank = 0 on a new item, unchanged on an update. |
stat_move_speed | Move Speed | Movement speed bonus. Blank = 0 on a new item, unchanged on an update. |
stat_attack_speed | Attack Speed | Attack speed bonus. Blank = 0 on a new item, unchanged on an update. |
stat_crit_chance | Crit Chance | Critical hit chance bonus. Blank = 0 on a new item, unchanged on an update. |
stat_crit_damage | Crit Damage | Critical hit damage bonus. Blank = 0 on a new item, unchanged on an update. |
stat_carry_capacity | Carry Capacity | Extra carry weight. Blank = 0 on a new item, unchanged on an update. |
stat_throw_range | Throw Range | Throwables: range in tiles (0 = self-use only). Blank = 0 on a new item, unchanged on an update. |
stat_tame_rate_bonus | Tame Rate Bonus | Taming items: added tame chance, 0–1 (0.1 = +10%). Blank = 0 on a new item, unchanged on an update. |
req_level | Required Level | Player level needed to equip / use. 0 or blank = none. |
req_skill | Required Skill | Skill id or name needed to equip / use (from Database → Skills). |
req_skill_level | Required Skill Level | Level needed in req_skill. |
hunger_restore | Hunger Restore | Food: hunger restored when eaten. |
thirst_restore | Thirst Restore | Drinks: thirst restored when drunk. |
warmth | Warmth | Armor: warmth when worn. Food: body-temperature change when eaten. |
heat_resist | Heat Resist | Armor: heat resistance when worn. |
bag_slots | Bag Slots | Bags only: extra bag slots granted when used (0–500). |
fuel_value | Fuel Value | Fuel given when burned in a station. 0 = not fuel. |
ingredient_keys | Ingredient Keys | Recipe ingredient keys this item satisfies, separated by | (e.g. "ore|metal"). |
Cell formats#
- yes/no columns accept yes, no, true, false, 1 and 0.
- Numbers may use a decimal point or a decimal comma (
1.5or1,5). - Choice columns (
type,equip_slot,footstep_sound) take the value's id or the name the editor shows, soweapon_swordandSwordboth work. - Project columns (
rarity,weapon_type,armor_type,element,req_skill) take the id or name of a row you've already made in your project. - Lists (
ingredient_keys) separate their entries with a vertical bar. - A cell containing a comma, a quote or a line break must be wrapped in double quotes, and a quote inside the cell is written twice (
""). Spreadsheet programs do this for you.
Gotchas#
- Icons and sprites aren't imported. Status effects, abilities, light, throwing, chest, rune, upgrade and building settings aren't either. Set them in the item editor after the import. An update never touches them, so re-importing a file won't wipe the art you added.
- Matching ids update items. An id that already exists overwrites that item's filled-in cells. Check the Will column in the preview before you confirm.
- Validation errors skip the row and don't stop the import. The row number in each message is the spreadsheet row (the header is row 1). Typical errors are an unknown item type, a word in a number column, a rarity or weapon type that doesn't exist in your project,
max_tierbelowmin_tier, andbag_slotson an item that isn't a bag. - Warnings don't block the import. For example,
weapon_typeset on a potion still imports, but has no effect. tieris shorthand formin_tier. Fill in only one of them.- Armor takes its slot from its type. Leave
equip_slotblank for armor items. - Big files are fine. The importer checks and saves the file 100 rows at a time. If an import stops partway, the rows before that point are already saved. Re-import the same file and those rows simply update.
- Getting the items into your game. A local playtest server picks up imported items right away. A hosted or VPS server gets them the next time you Publish.
- Pet, mount and pet-egg links aren't in the CSV. Set them in the item editor.