维护提醒

BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。

全站通知:

模组:商店

来自星露谷物语维基
跳到导航 跳到搜索

目录

此页面解释如何编辑商店数据。

数据

格式

您可以通过编辑 Data/Shops 素材来创建或更改商店。此文件内含一个“字符串 → 数据模型”查询,其中:

字段 效果
Items 添加到商店库存的物品。此字段为包含如下字段的数据模型所组成的列表。
字段 效果
通用字段 参见物品生成字段以了解商店物品支持的通用物品字段。

注意:

  • 若设为返回多个物品的物品查询,则所有物品都会加入商店库存。
  • MinStackMaxStack 字段适用于购买物品后,且不影响价格或 Stock 上限。
  • 若玩家找到了皮埃尔丢失的存货单,则皮埃尔的杂货店 Condition 字段的季节限制会被忽略。
Price (可选)从商店购买该物品需要多少金。默认为此物品的正常价格,或 0(若 TradeItemId 非空)。
TradeItemId
TradeItemAmount
(可选)限定性或非限定性物品ID和物品数量,用于以物易物地购买此物品。两字段分别默认为无物品和 1。

若同时指定了这两个两字段,则玩家必须同时满足它们的要求才能获取商品。

ApplyProfitMargins (可选)是否将价格乘以难度修饰器,这会为更高的利润率降低价格。这可以是true(始终应用),false(从不应用),或者null(对某些物品如树苗应用)。这在任何数量修饰器之前应用。默认为null
IgnoreShopPriceModifiers (可选)是否对此物品忽略商店的 PriceModifiers 字段。这对于物品的等价字段无影响。默认为 false。
AvailableStockModifiers
PriceModifiers
(可选)应用于 AvailableStockPrice数量修饰器

注意:价格修饰器会与商店的 PriceModifiers 字段叠加(除非设置 IgnoreStorePriceModifiers 为 true)。

AvailableStockModifierMode
PriceModifierMode
(可选)AvailableStockModifiersPriceModifiers 有多个修饰器时的叠加模式。默认为 Stack
AvoidRepeat (可选)如果商店已存在同种物品,是否不将此物品添加到商店。若物品ID时随机化的,则会选取一个尚未添加到商店的值,如果可能的话。默认为 false。
UseObjectDataPrice (可选)若此数据产出一个物体且 Price 被忽略,是否使用 Data/Objects 中的原始价格而不是计算后的卖给玩家的售价。
AvailableStock (可选)一天之内能购买此物品的最大数量。默认为无限。
AvailableStockLimit (可选)若设置了 Stock,此库存上限如何应用于多人模式。这不影响配方。

可用的取值为:

value 效果
Global 所有玩家共享同一个上限。例如,如果T Stock1 且某个玩家当天购买了此物品,则其他玩家都不能再购买此物品。
Player 每个玩家有独立的上限。例如,若 Stock1,则每个玩家都可以买一个。
None 此上限仅适用于商店菜单的当前实例。若您退出并重新打开此商店,则此物品会重现,且有相同的库数量。主要用于在某些条件下添加的物品。

默认为 Global

PerItemCondition (可选)一个游戏状态查询,指示其他字段产出的物品是否应当添加(例如,用于过滤 ALL_ITEMS 等物品查询返回的结果)。默认为总是添加。
ActionsOnPurchase (可选)一个动作列表,当玩家购买此物品时就会触发这些动作。这些动作每次购买时都会运行一次。默认为空。

下面代码可用于在购买指定物品时开启一个对话主题

"ActionsOnPurchase": [
    "AddConversationTopic {{ModId}}_PurchasedItem 5"
]
SalableItemTags (可选)上下文标签的一个列表,其中列出了玩家能够卖给此商店的物品。默认为空。
Owners (可选)商店菜单界面中显示的肖像和对话,显示此商店已关门的信息(前提是设置了 ClosedMessage)。

Action OpenShop 地块属性指定了 [owner tile area],则会使用此地块区域内的第一个符合店主条件的 NPC;若没有匹配的 NPC,则商店不会打开。若忽略 Owners,则商店无论周围有没有 NPC 都会打开,且不会显示肖像和对话。

此字段为包含如下字段的数据模型所组成的列表:

字段 效果
Name 下面内容之一:
  • 欲使用此商店所必需的 NPC 的内部名称。
  • AnyOrNone 表示无论商店区域内是否有 NPC 都可以使用此商店。
  • Any 表示商店区域内至少要有一个 NPC。
  • None 表示商店区域内不能有任何 NPC。
Id (可选)当前店主列表项的ID。只需要在此商店的店主列表中唯一即可。默认为 Name 的值。
Condition (可选)一个游戏状态查询,指示是否可以使用当前店主列表项。若忽略,则总是可用。
Portrait (可选)下面之一:
  • 欲显示其肖像的 NPC 的内部名称;
  • 欲显示贴图的素材名称;
  • 空字符串(或其他既非 NPC 又非素材名称的字符串),表示禁用肖像。

默认为 Name 字段的 NPC 的肖像(若有)。

若绘制此肖像,则绘制相应贴图素材的左上角 64x64 区域。 注意:可以把 Name 字段设为 None 以禁止使用任何肖像。

Dialogues (可选)若选中当前店主,则此字段为可能的对话的列表。每天都会重新随机选取商店界面中的对话。每个对话都是包含如下字段的数据模型:
字段 效果
Id 当前对话的唯一字符串ID
Dialogue 欲显示的对话文本,可以使用模板字符串。返回的文本会自动按照对话格式被解析。

您也可以使用空字符串(例如 "Dialogue": "")以移除小对话框。

RandomDialogue (可选)一个对话文本的列表,将从中随机选取文本。其格式与 Dialogue 相同。若设置此字段,则 Dialogue 可以留空且会被忽略。列表中的每一项都等概率被选中,且选中后将持续一天。例如:
"RandomDialogue": [
    "[LocalizedText Strings\StringsFromCSFiles:ShopMenu.cs.11469]",
    "[LocalizedText Strings\StringsFromCSFiles:ShopMenu.cs.11470]",
    "[LocalizedText Strings\StringsFromCSFiles:ShopMenu.cs.11471]"
]
Condition (可选)一个游戏状态查询,用于指示此对话是否可用。若忽略,则总是可用。

可以为空列表("Dialogues": []),以禁用对话文本。若忽略,默认为通用的 "Have a look at my wares" 文本。

ClosedMessage (可选)一个模板字符串,用于“商店关门”类的消息。

请单开一个列表项来使用此字段。 如果您在某个店主列表项中同时使用此字段,则那个列表项会无法使用。

RandomizeDialogueOnOpen (可选)若 Dialogues 有多个匹配的对话项,是否每次打开商店时重新随机选取一个(true),或在同一天内保持不变。
Currency (可选)结算货币。可用的取值为 0(金)、1(星星币)、2(齐币)、4(齐钻)。默认为 0。对于以物易物,参见 TradeItemId
ApplyProfitMargins (可选)Items 下的 ApplyProfitMargins 字段的默认取值(若设置)。可以为 true(总应用)、false(总不应用)或 null(仅对树苗等特殊物品应用)。此字段会在应用数量修饰器之前被调用。默认为 null
StackSizeVisibility (可选)如何默认地在商店列表中绘制堆叠数量。若忽略,则使用默认商店逻辑(通常等价于 Show)。

可用的取值为:

value 效果
Hide 总是隐藏堆叠数量。
Show 总是显示堆叠数量。
ShowIfMultiple 若堆叠数量大于 1 才显示堆叠数量。

在某些情况下,此字段会被忽略(例如,配方不能拥有堆叠数量)。

OpenSound (可选)打开商店菜单时播放的声音提示ID。默认为 dwop
PurchaseSound (可选)当物品以正常方式被购买时播放的声音提示ID。默认为 purchaseClick
purchaseRepeatSound (可选)直接购买一组物品(例如,PC 端为按住右键)时播放的声音提示ID。默默认为 purchaseRepeat
PriceModifiers (可选)应用于商店中商品价格的数量修饰器。参见 Items 下的 PriceModifiers
PriceModifierMode (可选)当 PriceModifiers 字段有多个修饰器同时作用时,应用于它们的叠加模式。仅影响特定字段,而不会影响 Items 下面的价格修饰器。默认为 Stack
VisualTheme (可选)应用于商店界面的视觉主题。若忽略,则使用默认主题。会使用第一个匹配成功的主题。所有字段都是可选的,若忽略,默认为默认主题。

此字段为包含如下字段的数据模型所组成的列表:

字段 效果
Condition (可选)一个游戏状态查询,指示此主题是否应当被应用。默认为总是应用。
WindowBorderTexture
WindowBorderSourceRect
(可选)贴图集素材名称及其中的像素区域,用于商店窗口边缘。默认为 LooseSprites\Cursors 中 (384, 373) 为起点的、尺寸为 18×18 的区域。
PortraitBackgroundTexture
PortraitBackgroundSourceRect
(可选)贴图集素材名称及其中的像素区域,用于 NPC 肖像背景。默认为 LooseSprites\Cursors 中以 (603, 414) 为起点的、尺寸为 74×74 的区域。
DialogueBackgroundTexture
DialogueBackgroundSourceRect
(可选)贴图集素材名称及其中的像素区域,用于 NPC 对话背景。默认为 Maps\MenuTiles 中以 (0, 256) 为起点的、尺寸为 60×60 的区域。
DialogueColor
DialogueShadowColor
(可选)对话文本的贴图文本颜色。参见颜色格式。默认为游戏的标准文本颜色。
ItemRowBackgroundTexture
ItemRowBackgroundSourceRect
(可选)贴图集素材名称及其中的像素区域,用于物品列表的背景。默认为 LooseSprites\Cursors 中以 (384, 396) 为起点、尺寸为 15x15 的区域。
ItemRowBackgroundHoverColor (可选)当光标悬浮于商店库存之上,应用于那行物品背景的颜色色调。White 表示不添加色调。参见颜色格式。默认为 Wheat
ItemRowTextColor (可选)物品文本的贴图文本颜色。参见颜色格式。默认为游戏的标准文本颜色。
ItemIconBackgroundTexture
ItemIconBackgroundSourceRect
(可选)贴图集素材名称及其中的像素区域,用于物品图标的背景。默认为 LooseSprites\Cursors 中以 (296, 363) 为起点、尺寸为 18x18 的区域。
ScrollUpTexture
ScrollUpSourceRect
(可选)贴图集素材名称及其中的像素区域,用于滚动条上方的上箭头图标。默认为 LooseSprites\Cursors 中以 (421, 459) 为起点的、尺寸为 11x12 的区域。
ScrollDownTexture
ScrollDownSourceRect
(可选)贴图集素材名称及其中的像素区域,用于滚动条下方的下箭头图标。默认为 LooseSprites\Cursors 中以 (421, 472) 为起点的、尺寸为 11x12 的区域。
ScrollBarFrontTexture
ScrollBarFrontSourceRect
(可选)贴图集素材名称及其中的像素区域,用于滚动条滑块的图标。默认为 LooseSprites\Cursors 中以 (435, 463) 为起点的、尺寸为 6×10 的区域。
ScrollBarBackTexture
ScrollBarBackSourceRect
(可选)贴图集素材名称及其中的像素区域,用于滚动条的背景。默认为 LooseSprites\Cursors 中以 (403, 383) 为起点的 6x6 的图标。
CustomFields 此商店的自定义字段

示例

您可以添加或替换一整个商店。例如,下面的内容包添加了一个在夏天售卖冰淇凌、全年售卖河豚的商店:

{
    "Format": "2.7.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"
                        }
                    ]
                }
            }
        }
    ]
}

您也可以通过定位商店的 Items 字段来添加、替换、编辑或重排指定商店中物品。例如,下面的代码移除鳟鱼汤(物品 #219)并在鱼饵(物品 #685)上方添加河豚。

{
    "Format": "2.7.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" }
            ]
        }
    ]
}

原版商店ID

原版游戏的商店也定义在 Data/Shops(除了一小部分特例,例如梳妆台和家庭装修)。

参见 Data/Shops 以获取完整列表,但为了方便起见,此处列出主要的商店ID:

商店 ID
废弃的屋子 HatMouse
探险家公会 AdventureShop(常规商店)
AdventureGuildRecovery (物品寻回服务)
赌场 Casino
克林特的铁匠铺 Blacksmith(常规商店)
ClintUpgrade(工具升级)
沙漠商人 DesertTrade
矮人的商店 Dwarf
哈维的诊所 Hospital
冰淇淋摊 IceCreamStand
姜岛度假村 ResortBar
姜岛商人 IslandTrade
Joja超市 Joja
科罗布斯的商店 ShadowShop
玛妮的牧场 AnimalShop
皮埃尔的杂货店 SeedShop
罗宾的木匠商店 Carpenter
星之果实餐吧 Saloon
桑迪的绿洲商店 Sandy
旅行货车 Traveler
威利的鱼店 FishShop

主要节日商店:

节日商店 ID
月光水母起舞 Festival_DanceOfTheMoonlightJellies_Pierre
复活节 Festival_EggFestival_Pierre
冰雪节 Festival_FestivalOfIce_TravelingMerchant
冬日星盛宴 Festival_FeastOfTheWinterStar_Pierre
花舞节 Festival_FlowerDance_Pierre
夏威夷宴会 Festival_Luau_Pierre
夜市(装饰品船) Festival_NightMarket_DecorationBoat
夜市(魔法船) Festival_NightMarket_MagicBoat_Day1
Festival_NightMarket_MagicBoat_Day2
Festival_NightMarket_MagicBoat_Day3
万灵节 Festival_SpiritsEve_Pierre
星露谷展览会 Festival_StardewValleyFair_StarTokens

下面两个其实是特殊的商店:

物品 ID
目录 Catalogue
家具目录 Furniture Catalogue

打开自定义商店

您可以在地图上放置一个 Action OpenShop 地块属性,当玩家点击它时,就会打开指定 ID 的商店。

在 C# 代码中,您可以使用 Utility.GetShopStock("shop id here") 获取自定义商店的库存物品,使用 Utility.TryOpenShopMenu("shop id", …) 打开商店菜单,以及使用 shopMenu.AddForSale(…) 向已打开的目录添加临时物品。已打开商店的 ID 存储在商店菜单的 ShopId 字段中。