Difference between revisions of "Modding:Shops"
Pathoschild (talk | contribs) (→Open a custom shop: update field name) |
Pathoschild (talk | contribs) (→Vanilla shop IDs: update 1.6 migration wording) |
||
(9 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | |||
− | |||
← [[Modding:Index|Index]] | ← [[Modding:Index|Index]] | ||
Line 7: | Line 5: | ||
==Data== | ==Data== | ||
===Format=== | ===Format=== | ||
− | You can create and change shops by editing the <samp>Data/Shops</samp> asset. This consists of a string → model lookup, where the key is a [[Modding: | + | You can create and change shops by editing the <samp>Data/Shops</samp> asset. This consists of a string → model lookup, where the key is a [[Modding:Common data field types#Unique string ID|unique string ID]] for the shop, and the value is a model with these fields. |
{| class="wikitable" | {| class="wikitable" | ||
Line 22: | Line 20: | ||
|- | |- | ||
| ''common fields'' | | ''common fields'' | ||
− | | See [[Modding: | + | | See [[Modding:Item queries#Item spawn fields|item spawn fields]] for the generic item fields supported by shop items. |
Notes: | Notes: | ||
− | * If set to an [[Modding: | + | * If set to an [[Modding:Item queries|item query]] which returns multiple items, all of them will be added to the shop. |
* The <samp>MinStack</samp> and <samp>MaxStack</samp> fields apply to the item after it's purchased, and have no effect on the price or <samp>Stock</samp> limit. | * The <samp>MinStack</samp> and <samp>MaxStack</samp> fields apply to the item after it's purchased, and have no effect on the price or <samp>Stock</samp> limit. | ||
* If the player found [[Pierre's Missing Stocklist]], season conditions in the <samp>Condition</samp> field are ignored in [[Pierre's General Store]]. | * If the player found [[Pierre's Missing Stocklist]], season conditions in the <samp>Condition</samp> field are ignored in [[Pierre's General Store]]. | ||
Line 84: | Line 82: | ||
| <samp>PerItemCondition</samp> | | <samp>PerItemCondition</samp> | ||
| ''(Optional)'' A [[Modding:Game state queries|game state query]] which indicates whether an item produced from the other fields should be added (e.g. to filter results from item queries like <samp>ALL_ITEMS</samp>). Defaults to always added. | | ''(Optional)'' A [[Modding:Game state queries|game state query]] which indicates whether an item produced from the other fields should be added (e.g. to filter results from item queries like <samp>ALL_ITEMS</samp>). Defaults to always added. | ||
+ | |- | ||
+ | | <samp>ActionsOnPurchase</samp> | ||
+ | | ''(Optional)'' A list of [[Modding:Trigger actions|actions]] to run when the player purchases this item. These are run once per purchase click. Default none. | ||
+ | |||
+ | For example, this can be used to start a [[Modding:Dialogue#Conversation topics|conversation topic]] when it's purchased: | ||
+ | <syntaxhighlight lang="js"> | ||
+ | "ActionsOnPurchase": [ | ||
+ | "AddConversationTopic {{ModId}}_PurchasedItem 5" | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
|} | |} | ||
|- | |- | ||
Line 116: | Line 124: | ||
| ''(Optional)'' One of... | | ''(Optional)'' One of... | ||
* the internal name of the NPC whose portrait to show; | * the internal name of the NPC whose portrait to show; | ||
− | * the asset name of the texture to display. | + | * the asset name of the texture to display; |
+ | * or an empty string (or other value which doesn't match an NPC or texture asset name) to disable the portrait. | ||
+ | |||
+ | Defaults to the portrait for the NPC matching the <samp>Name</samp> field (if any). | ||
− | + | If drawn, it'll use the 64x64 pixel area in the top-left corner of the texture. | |
+ | Note : it is possible that name of "none" prevents any portrait to be used. | ||
|- | |- | ||
| <samp>Dialogues</samp> | | <samp>Dialogues</samp> | ||
Line 128: | Line 140: | ||
|- | |- | ||
| <samp>Id</samp> | | <samp>Id</samp> | ||
− | | The [[Modding: | + | | The [[Modding:Common data field types#Unique string ID|unique string ID]] for this dialogue within the current list. |
|- | |- | ||
| <samp>Dialogue</samp> | | <samp>Dialogue</samp> | ||
| The dialogue text to show, as a [[Modding:Tokenizable strings|tokenizable string]]. The resulting text is parsed using the [[Modding:Dialogue|dialogue format]]. | | The dialogue text to show, as a [[Modding:Tokenizable strings|tokenizable string]]. The resulting text is parsed using the [[Modding:Dialogue|dialogue format]]. | ||
+ | |||
+ | You can use an empty string (like <code>"Dialogue": ""</code>) to remove the little dialogue box. | ||
|- | |- | ||
| <samp>RandomDialogue</samp> | | <samp>RandomDialogue</samp> | ||
Line 151: | Line 165: | ||
| <samp>ClosedMessage</samp> | | <samp>ClosedMessage</samp> | ||
| ''(Optional)'' If set, a [[Modding:Tokenizable strings|tokenizable string]] for a 'shop is closed'-style message to show instead of opening the shop. | | ''(Optional)'' If set, a [[Modding:Tokenizable strings|tokenizable string]] for a 'shop is closed'-style message to show instead of opening the shop. | ||
+ | |||
+ | '''This should not be set except in a separate entry'''. Adding it to an owner entry will prevent it from being used. | ||
|- | |- | ||
| <samp>RandomizeDialogueOnOpen</samp> | | <samp>RandomizeDialogueOnOpen</samp> | ||
Line 331: | Line 347: | ||
===Vanilla shop IDs=== | ===Vanilla shop IDs=== | ||
− | + | The base game's shops are defined in <samp>Data/Shops</samp> too (except a few special cases like [[:Category:Dressers|dressers]] and home renovations). | |
See <samp>Data/Shops</samp> for a full list, but here are the main shop IDs for convenience: | See <samp>Data/Shops</samp> for a full list, but here are the main shop IDs for convenience: | ||
Line 398: | Line 414: | ||
|} | |} | ||
− | + | And the main festival shops: | |
{| class="wikitable sortable" | {| class="wikitable sortable" | ||
|- | |- |
Latest revision as of 19:24, 15 June 2024
← 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.