Modding:Items

From Stardew Valley Wiki
Revision as of 14:12, 30 January 2022 by Lumisteria (talk | contribs)
Jump to navigation Jump to search

Index

This page explains how the game stores and parses item data. This is an advanced guide for mod developers.

Introduction

Overview

Items are divided into several types:

type summary
objects The default type for items in inventories or placed in the world.
big craftables Craftable items which can be placed in the world and are two tiles tall.
boots Items that can be equipped in the player's footwear slot.
clothing Cosmetic items that can be equipped in the player's pants and shirt slots.
furniture Decorative items which can be placed in the world, including chairs which the player can sit on.
hats Items that can be equipped in the player's hat slot.
tools Items that can be swung or used by the player to perform some effect.
weapons Tools that can be used by the player to damage monsters.

For each item type, the game has two files in its Content folder (which can be unpacked for editing):

  • a data asset for the text data for its items (names, descriptions, prices, etc);
  • and a spritesheet for the in-game item icons.

Each item has a ParentSheetIndex field which is its position in the item type's spritesheet, starting at 0 in the top-left and incrementing by one as you move across and then down. For example, hat #0 is the first sprite in Characters/Farmer/hats. The ParentSheetIndex is also used to identify the item itself; since spritesheet indexes aren't unique (e.g. there's both a hat #10 and object #10), code needs to check the type too like item is Weapon weapon && weapon.ParentSheetIndex == 4.

See the sections below for details on each item type.

Get a list of items

With SMAPI installed, you can run the list_items console command in-game to view/search items and their IDs.

Define a custom item

Every item must be assigned a unique ParentSheetIndex within its type, and that index must fit within the item type's spritesheet.

Adding custom items to the data assets and spritesheets directly is not recommended, since it's very easy to conflict with other mods or cause game errors. Instead you should create a content pack for Json Assets, which coordinates dynamic item ID assignment so multiple custom item mods can work together.

Common data

Categories

Each item also has a category (represented by a negative integer). In code, you can get an item's category value from item.Category, and its translated name from item.getCategoryName(). Here are the valid categories:

value internal constant English translation
-2 Object.GemCategory Mineral
-4 Object.FishCategory Fish
-5 Object.EggCategory Animal Product
-6 Object.MilkCategory Animal Product
-7 Object.CookingCategory Cooking
-8 Object.CraftingCategory Crafting
-9 Object.BigCraftableCategory
-12 Object.mineralsCategory Mineral
-14 Object.meatCategory Animal Product
-15 Object.metalResources Resource
-16 Object.buildingResources Resource
-17 Object.sellAtPierres
-18 Object.sellAtPierresAndMarnies Animal Product
-19 Object.fertilizerCategory Fertilizer
-20 Object.junkCategory Trash
-21 Object.baitCategory Bait
-22 Object.tackleCategory Fishing Tackle
-23 sellAtFishShopCategory
-24 Object.furnitureCategory Decor
-25 Object.ingredientsCategory Cooking
-26 Object.artisanGoodsCategory Artisan Goods
-27 Object.syrupCategory Artisan Goods
-28 Object.monsterLootCategory Monster Loot
-29 Object.equipmentCategory
-74 Object.SeedsCategory Seed
-75 Object.VegetableCategory Vegetable
-79 Object.FruitsCategory Fruit
-80 Object.flowersCategory Flower
-81 Object.GreensCategory Forage
-95 Object.hatCategory
-96 Object.ringCategory
-98 Object.weaponCategory
-99 Object.toolCategory
Console commands 
With the Console Code mod installed, you can run this command in the SMAPI console to see a list of objects by category:
cs return string.Join(`\n`, Game1.objectInformation.Keys.Select(key => new StardewValley.Object(key, 1)).GroupBy(item => item.Category, item => item.Name).OrderByDescending(p => p.Key).Select(p => $`{p.Key}: {string.Join(`, `, p.OrderBy(name => name))}`));

Context tags

A context tag is an arbitrary label attached to items, which can produce various effects in-game.

Every item has built-in tags for metadata like the item name, quality, and category. Further context tags are defined in Data/ObjectContextTags, which consists of a string→string dictionary (where the key is the item's internal name, and the value is a comma-delimited list of tags to add):

  "Chanterelle": "color_brown, forage_item, forage_item_cave, forage_item_secret, season_fall",

Context tags have a variety of effects in-game:

feature effects
fish ponds Context tags determine what the fish will produce and other elements. See Fish pond tags for more info.
special orders Contexts tags are used in special orders to determine what are the valid items for the quest objective(s).
dyeing Contexts tags are used to determine the color of dye an item produces.

The debug listtags console command lists all the tags of the item being held.

Objects

Objects are the default type for items in inventories or placed in the world.

They have their data in Data/ObjectInformation, their icon sprites in Maps/springobjects, and their code in StardewValley.Object. See a table of sprites and their corresponding indexes.

Data format

The object data in Data/ObjectInformation consists of an integer→string dictionary with entries like this:

  "18": "Daffodil/30/0/Basic -81/Daffodil/A traditional spring flower that makes a nice gift."

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with the fields listed below. Fields 0–5 are used by rings and most other objects; fields 6–11 are only used for food buffs. The objects with keys 516–534 (Ring.ringLowerIndexRange through Ring.ringUpperIndexRange) and 801 (wedding ring) are hardcoded as rings.

index field effect
all objects
0 name The internal item name (and display name in English).
1 price The gold price of the item when sold by the player.
2 edibility A numeric value that determines how much health (edibility × 2.5) and energy (edibility × 1.125) is restored. An item with an edibility of -300 can't be eaten.

This is ignored for rings.

3 type and category
  • For a ring: the value Ring. Rings have a hardcoded category of -96 (Object.ringCategory).
  • For other objects: the item's type (string) and category (negative integer), separated by a space like Fish -4.
4 display name The translated item name.
5 description The translated item description.
food & drink only
6 miscellaneous
  • For a food or drink item, set this to food or drink respectively. This enables the remaining fields, and changes which animation/sound is played when the player consumes the item. Any other value is ignored.
  • For a geode item (535, 536, 537, or 749) is broken, a space-delimited list of object IDs. There's a roughly 50% chance that the geode item will drop one of these items (the other drops are hardcoded).
7 buffs The bonuses to apply to the player's attribute when the item is consumed. This consists of a space-delimited list of these numbers:
index buff
0 farming
1 fishing
2 mining
3 unused
4 luck
5 foraging
6 unused
7 max energy
8 magnetism
9 speed
10 defense
11 attack
8 buff duration How long the buffs provided by the previous field last. This is converted into in-game minutes using the formula (duration × 0.7) / 60. The buff duration number shown in-game will always be one second less than the calculated value.

Notes

  • Items that have a number in the "Crafting" field show buggy information in-game (e.g., Bean Hotpot prior to version 1.4). Items that have a number in the "Attack" field display the Attack icon and a number, but no description. It's unclear how these buffs work (if at all).
  • Named buffs (like Oil of Garlic, Life Elixir, or Tipsy) are implemented in code and can't be set in the food buff fields.
  • The spritesheet and data have items that can't normally be found in the player inventory (like twigs and lumber), and some sprites have no corresponding item data. There are also multiple entries for weeds and stone corresponding to different sprites, but the player can only normally obtain one stone item (index 390) and no weeds items.

Big craftables

Big craftables are objects which can be placed in the world and are two tiles tall (instead of one like objects).

They have their data in Data/BigCraftableInformation, their in-game sprites in TileSheets/Craftables, and their code in StardewValley.Object (with the bigCraftable.Value = true flag).

Data format

The big craftables data in Data/BigCraftableInformation consists of an integer→string dictionary with entries like this:

  "19": "Oil Maker/50/-300/Crafting -9/Makes gourmet truffle oil./true/true/0/Oil Maker"

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with these fields:

index field effect
0 name The internal item name (and display name in English).
1 price The gold price when sold by the player.
2 edibility See edibility for object data. Always set to -300 (inedible) for vanilla items.
3 type and category See type and category for object data. Always set to Crafting -9 for vanilla items.
4 description The translated item description shown in-game.
5 outdoors Whether the item can be placed outdoors (true or false).
6 indoors Whether the item can be placed indoors (true or false).
7 fragility How the item is removed by tools. Possible values:
fragility effect
0 Pick up with any tool.
1 Destroyed if hit with an axe, hoe, or pickaxe. Any other tool will pick it up.
2 Indestructible. The item can't be removed once placed.
8 is lamp Whether the item is a lamp and produces light when it's dark. This can be true (mark as lamp) or any other value (ignored).
9 display name The translated display name (in non-English assets only).

Notes

  • Many of the items in the data asset aren't implemented in-game. They may be completely absent from the game, or they may be unused as craftables and instead appear in object data or furniture data.

Boots

Boots are items that can be equipped in the player's footwear slot.

They have their data in Data/Boots, their in-game sprites in Maps/springobjects (item sprite) and Characters/Farmer/shoeColors (shoe color), and their code in StardewValley.Objects.Boots.

Data format

The boots data in Data/Boots consists of an integer→string dictionary with entries like this:

  "511": "Dark Boots/Made from thick black leather./250/4/2/7"

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with these fields:

index field effect
0 name The internal item name (and display name in English).
1 description The translated item description shown in-game.
2 price Unused. The actual price is calculated as (added defence × 100) + (added immunity × 100).
3 added defense A defense bonus applied to the player while equipped.
4 added immunity An immunity bonus applied to the player while equipped.
5 color index The index of the boot color in the Characters/Farmer/shoeColors spritesheet.
6 display name The translated item name shown in-game (for non-English assets only).

Clothing

Clothing consists of cosmetic items that can be equipped in the player's pants and shirt slots.

They have their data in Data/ClothingInformation, their in-game sprites in Characters/Farmer/pants & Characters/Farmer/shirts, and their code in StardewValley.Objects.Clothing.

Data format

The clothing data in Data/ClothingInformation consists of an integer→string dictionary with entries like this:

  "1282": "Tomato Shirt/Tomato Shirt/A shirt that answers the big question: 'Tomatoes are'... (but the rest is smudged)./282/-1/50/255 0 0/false/Shirt/Sleeveless"

For each entry in the data asset, the key is the item's ParentSheetIndex (offset by 1000 for shirts) and the value is a slash-delimited string with these fields:

index field effect
0 name The internal item name (and display name in English).
1 display name The translated item name shown in-game.
2 description The translated item description shown in-game.
3 male index The sprite index in the clothing spritesheet for male characters.
4 female index The sprite index in the clothing spritesheet for female characters, or -1 to use the male index.
5 price The price when purchased from shops.
6 default color The default color, specified in space-delimited RGB with each channel being an integer from 0 (no color) to 255 (full color). For example, 255 0 0 for full red.
7 dyeable Whether the clothing can be dyed (true or false).
8 Type The clothing type. One of Pants, Shirt, or Accessory (unimplemented).
9 extra data A comma-delimited list of tags attached to the item (unrelated to context tags). The values recognized by the game are Prismatic (adds a shifting rainbow effect) and Sleeveless (disables drawing the sleeve color over the player's arms).

Furniture

Furniture are decorative items which can be placed in the world, including chairs which the player can sit on.

They have their data in Data/Furniture, their in-game sprites in TileSheets/furniture, and their code in StardewValley.Objects.Furniture.

Data format

The furniture data in Data/Furniture consists of an integer→string dictionary with entries like this:

  "18": "Country Chair/chair/-1/-1/4/750"

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with these fields:

index field effect
0 name The internal item name (and display name in English).
1 type The furniture type. Possible values:
type meaning
0 chair
1 bench
2 couch
3 armchair
4 dresser
5 long table
6 painting
7 lamp
8 decor
9 other
10 bookcase
11 table
12 rug
13 window
14 fireplace
15 bed
16 torch
17 sconce
2 tilesheet size The furniture sprite size on the tilesheet, measured in tiles. This can be <width> <height> (e.g. 1 2), or -1 to use the default size for the type.
3 bounding box size The size of the hitbox when the furniture is placed in-game, measured in tiles. The bounding box will be anchored to the bottom-left corner and extend upwards and rightwards. This can be <width> <height> (e.g. 1 2), or -1 to use the default size for the type.
4 rotations The number of rotations possible (1, 2, or 4).
5 price The price when purchased from a shop.
6 display name The translated furniture name (in non-English data assets only).

Hats

Hats are items that can be equipped in the player's hat slot.

They have their data in Data/Hats, their in-game sprites in Characters/Farmer/hats, and their code in StardewValley.Objects.Hat.

Data format

The hat data in Data/Hats consists of an integer→string dictionary with entries like this:

  "5": "Official Cap/Looks like it belonged to a postman or policeman. Either way, it's still very soft and smells okay./false/true"

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with these fields:

index field effect
0 name The internal item name (and display name in English).
1 description The translated item description shown in-game.
2 show real hair Whether to show the player's hairstyle as-is when the hat is worn (true), or change the hairstyle to fit the hat (false).
3 skip hairstyle offset Whether to ignore the current style when positioning the hat (one of true or false). For example, the eye patch sets true since its position isn't affected by the hair, but the butterfly bow sets false to adjust its position on top of your hair.
4 display name The translated item name shown in-game (for non-English assets only).

Hats have a hard-coded category of -95 (Hats.cs::Load)

Tools

Tools are items that can be swung or used by the player to perform some effect (e.g. dig dirt, chop trees, etc).

They have their in-game sprites in TileSheets/Tools, and their code in StardewValley.Tool and various subclasses like StardewValley.Tools.Axe.

Data format

Tools are currently hardcoded and can't be edited by content packs.

Weapons

Weapons are tools that can be used by the player to damage monsters.

They have their data in Data/Weapons, their in-game sprites in TileSheets/weapons, and their code in StardewValley.Tools.MeleeWeapon and StardewValley.Tools.Slingshot.

Data format

The weapon data in Data/Weapons consists of an integer→string dictionary with entries like this:

  "12": "Wooden Blade/Not bad for a piece of carved wood./3/7/1/0/0/0/0/3/-1/0/.02/3"

For each entry in the data asset, the key is the item's ParentSheetIndex and the value is a slash-delimited string with these fields:

Melee weapons
index field effect
0 name The internal weapon name (and display name in English).
1 description The translated item description shown in-game.
2
3
min damage
max damage
The minimum and maximum damage caused when hitting a monster with this weapon.
4 knockback How far the target is pushed when hit, as a multiplayer relative to a base weapon like the Rusty Sword (e.g. 1.5 for 150% of Rusty Sword's weight).
5 speed How fast the player can swing the weapon. Each point of speed is worth 40ms of swing time relative to 0. This stacks with the player's weapon speed.
6 added precision Reduces the chance that a strike will miss.
7 added defence Reduces damage received by the player.
8 type The weapon type. One of 0 (stabbing sword), 1 (dagger), 2 (club or hammer), or 3 (slashing sword).
9
10
base mine level
min mine level
The base and minimum mine level, which affect mine container drops.
11 added area of effect Slightly increases the area of effect.
12 critical chance The chance of a critical hit, as a decimal value between 0 and 1.
13 critical damage A multiplier applied to the damage for critical hit.
14 display name The translated item name (in non-English assets only).
Slingshots
index field effect
0 name The internal weapon name (and display name in English).
1 description The translated item description shown in-game (for non-English assets only).
2–8 unused
9
10
base mine level
min mine level
The base and minimum mine level, which affect mine container drops.
11–13 unused
14 display name The translated item description shown in-game (for non-English assets only).

Weapons have a hardcoded category of -98 (Object.weaponCategory).

Slingshot notes

  • The base slingshot has ParentSheetIndex 32 in the weapon data, which increases by one for each upgrade level (up to 34 in the weapon data, though only 32 and 33 are obtainable without mods).
  • Slingshot damage is calculated dynamically regardless of the weapon data.

Mine container drops

When the player breaks a container in the mines, there's a chance it will drop a weapon. Here's how the weapon to drop is chosen[1]:

  1. Match weapons whose minimum mine level (field 10) is less than the current mine level.
  2. From that list, match weapons with a probability check based on the gap between the base mine level (field 9) and current mine level. The probability is a bell curve centered on the base mine level:
    level difference probability
    0 100%
    5 92%
    10 71%
    15 46%
    20 25%
    25 4%
    The difference applies in both directions; for example, two weapons whose base levels are 5 below and 5 above the current level both have a 92% chance. (The probability is calculated with a Gaussian function e-(current mine level - base mine level)2 / (2 * 122).)
  3. Find the weapon with the smallest gap between the current and base mine levels, and add it to the list. (If the item was also selected in step 2, it has two chances to drop.)
  4. From the remaining list of weapons, randomly choose one to drop.

See also

References

  1. See Utility.getUncommonItemForThisMineLevel in the game code.