Modding:Shops
← Index
This page explains how to edit shop data.
Data
Format
You can create and change shops by editing the Data/Shops asset. This consists of a string → model lookup, where the key is a unique string ID for the shop, and the value is a model with these fields.
field | effect | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Items | The items to add to the shop inventory. This consists of a list of values with these fields:
| ||||||||||||||||||||||||||||||||||||
SalableItemTags | (Optional) A list of context tags for items which the player can sell to to this shop. Default none. | ||||||||||||||||||||||||||||||||||||
Owners | (Optional) The portrait and dialogue to show in the shop menu UI, or the message to show indicating that the shop is closed if ClosedMessage is set.
When the Action OpenShop tile property specifies This consists of a list of models with these fields:
| ||||||||||||||||||||||||||||||||||||
Currency | (Optional) The currency in which all items in the shop should be priced. The valid values are 0 (money), 1 (star tokens), 2 (Qi coins), and 4 (Qi gems). Default 0. For item trading, see TradeItemId for each item. | ||||||||||||||||||||||||||||||||||||
ApplyProfitMargins | (Optional) The default value for ApplyProfitMargins under Items, if set. This can be true (always apply it), false (never apply it), or null (apply for certain items like saplings). This is applied before any quantity modifiers. Default null. | ||||||||||||||||||||||||||||||||||||
StackSizeVisibility | (Optional) How to draw stack size numbers in the shop list by default. If omitted, the default shop logic is applied (usually equivalent to Show).
The possible values are:
This is ignored in some special cases (e.g. recipes can't have a stack size). | ||||||||||||||||||||||||||||||||||||
OpenSound | (Optional) The audio cue ID to play when the shop menu is opened. Defaults to dwop. | ||||||||||||||||||||||||||||||||||||
PurchaseSound | (Optional) The audio cue ID to play when an item is purchased normally. Defaults to purchaseClick. | ||||||||||||||||||||||||||||||||||||
purchaseRepeatSound | (Optional) The audio cue ID to play when accumulating a stack to purchase (e.g. by holding right-click on PC). Defaults to purchaseRepeat. | ||||||||||||||||||||||||||||||||||||
PriceModifiers | (Optional) Quantity modifiers applied to the sell price for items in this shop. See also PriceModifiers under Items. | ||||||||||||||||||||||||||||||||||||
PriceModifierMode | (Optional) A quantity modifier mode which indicates what to do if multiple modifiers in the PriceModifiers field apply at the same time. This only affects that specific field, it won't affect price modifiers under Items. Default Stack. | ||||||||||||||||||||||||||||||||||||
VisualTheme | (Optional) The visual theme to apply to the shop UI, or omit to use the default theme. The first matching theme is applied. All fields are optional and will fallback to the default theme.
This consists of a list of models with these fields:
| ||||||||||||||||||||||||||||||||||||
CustomFields | The custom fields for this entry. |
Examples
You can add or replace entire shops. For example, this content pack adds a shop that sells ice cream in summer, and pufferfish all year:
{
"Format": "2.3.0",
"Changes": [
{
"Action": "EditData",
"Target": "Data/Shops",
"Entries": {
"Example.ModId_CustomShop": {
"Owners": [
{
"Name": "Any",
"Dialogues": [
// dialogue on sunny summer days
{
"Id": "Example.ModId_SunnySummer",
"Condition": "SEASON Summer, WEATHER Here Sun",
"Dialogue": "Ice-cream is perfect for a day like this."
},
// dialogue any other time
{
"Id": "Example.ModId_Default",
"Dialogue": "Welcome to the only place in town for pufferfish!"
}
]
}
],
"Items": [
// ice-cream in summer, default price
{
"Id": "Example.ModId_IceCream",
"Condition": "SEASON Summer",
"ItemId": "(O)233"
},
// pufferfish for 1000g, limited to one per day per player
{
"Id": "Example.ModId_PufferFish",
"ItemId": "(O)128",
"Price": 1000,
"AvailableStock": 1,
"AvailableStockLimit": "Player"
}
]
}
}
}
]
}
You can also add, replace, edit, or reorder items in a specific shop by targeting the shop's Items field. For example, this removes Trout Soup (item #219) and adds Pufferfish above bait (item #685):
{
"Format": "2.3.0",
"Changes": [
{
"Action": "EditData",
"Target": "Data/Shops",
"TargetField": [ "FishShop", "Items" ],
"Entries": {
"(O)219": null,
"Example.ModId_Pufferfish": {
"Id": "Example.ModId_Pufferfish",
"ItemId": "(O)128",
"Price": 2000
}
},
"MoveEntries": [
{ "Id": "Example.ModId_Pufferfish", "BeforeId": "(O)685" }
]
}
]
}
Vanilla shop IDs
The base game's shops are defined in Data/Shops too (except a few special cases like dressers and home renovations).
See Data/Shops for a full list, but here are the main shop IDs for convenience:
shop | ID |
---|---|
Abandoned house shop | HatMouse |
Adventurer's Guild | AdventureShop (regular shop) AdventureGuildRecovery (item recovery service) |
Casino | Casino |
Clint's blacksmith shop | Blacksmith (regular shop) ClintUpgrade (tool upgrades) |
Desert trader | DesertTrade |
Dwarf's shop | Dwarf |
Harvey's clinic | Hospital |
Ice-cream stand | IceCreamStand |
Island resort | ResortBar |
Island trader | IslandTrade |
Joja Mart | Joja |
Krobus' shop | ShadowShop |
Marnie's ranch | AnimalShop |
Pierre's general store | SeedShop |
Robin's carpenter shop | Carpenter |
Stardrop Saloon | Saloon |
Sandy's Oasis shop | Sandy |
Traveling cart | Traveler |
Willy's fish shop | FishShop |
And the main festival shops:
festival shop | ID |
---|---|
Dance of the Moonlight Jellies | Festival_DanceOfTheMoonlightJellies_Pierre |
Egg Festival | Festival_EggFestival_Pierre |
Festival of Ice | Festival_FestivalOfIce_TravelingMerchant |
Feast of the Winter Star | Festival_FeastOfTheWinterStar_Pierre |
Flower Dance | Festival_FlowerDance_Pierre |
Luau | Festival_Luau_Pierre |
Night Market (decoration boat) | Festival_NightMarket_DecorationBoat |
Night Market (magic boat) | Festival_NightMarket_MagicBoat_Day1 Festival_NightMarket_MagicBoat_Day2 Festival_NightMarket_MagicBoat_Day3 |
Spirit's Eve | Festival_SpiritsEve_Pierre |
Stardew Valley Fair | Festival_StardewValleyFair_StarTokens |
And two special 'shops':
item | ID |
---|---|
Catalogue | Catalogue |
Furniture Catalogue | Furniture Catalogue |
Open a custom shop
You can place an Action OpenShop tile property on the map, which will open the given shop ID when the player clicks it.
In C# code, you can get the inventory for a custom shop using Utility.GetShopStock("shop id here")
, open a shop menu using Utility.TryOpenShopMenu("shop id", …)
, and add temporary items to an open menu using shopMenu.AddForSale(…)
. The ID of the opened shop is stored in the shop menu's ShopId field.