模组:机器

来自Stardew Valley Wiki
跳到导航 跳到搜索

目录

此页面解释如何在游戏数据中添加/编辑机器。这是面向模组开发者的高级指南。

定义

“机器”是指一种可放置物体,它会基于Data/Machines中的规则进行输入和/或输出。机器无需既能输入又能输出(例如太阳能板仅输出、不输入)。有些物体看上去不像是机器,但实际上是机器(例如孵化器蘑菇树桩)。

数据格式

可以通过编辑Data/Machines素材文件以添加/编辑机器逻辑。

此文件内含一个“字符串 → 数据模型”查询,其中:

物品处理规则

字段 效果
OutputRules 此机器的输出规则组成的列表。若指定多条规则,则使用第一条匹配成功的规则。此字段为包含如下字段的数据模型组成的列表:
字段 效果
Id 当前机器的当前规则的唯一字符串ID,不与当前机器的其他规则重名即可(可以与其他机器的规则重名)。
Triggers 应用此输出规则需满足的条件。此字段可以列出任意数量的触发条件;若满足其中某一条件,则会应用此输出规则。

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

字段 效果
Id 当前触发条件的唯一字符串ID
Trigger (可选)应用此输出规则需满足的条件。默认为ItemPlacedInMachine。可用的取值为:
  • ItemPlacedInMachine:当某一物品被放入机器时应用此输出规则。这是最常见的触发条件。
  • OutputCollected:当此机器的前一输出被收集时应用此输出规则。使用此触发条件,则机器的输入物品自动设为之前输出的物品,而不会真的需要/消耗输入物品。例如,此触发条件主要用于重新装载宝石复制机
  • MachinePutDown:当此机器被放置到地上时应用此输出规则。例如,此触发条件用于启动虫饵盒
  • DayUpdate: 若此机器未在生成产品,则在新的一天开始时应用此输出规则。例如,这被用于汽水机

可以指定多个值,例如"Trigger": "DayUpdate, MachinePutDown, OutputCollected"

RequiredItemId (可选)对输入物品限定性或非限定性物品ID的要求。适用于TriggerItemPlacedInMachineOutputCollected的情形。默认为允许所有物品ID。
RequiredTags (可选)对输入物品上下文标签的要求。适用于TriggerItemPlacedInMachineOutputCollected的情形。输入物品必须具有此字段列出的所有上下文标签才能启用此输出规则。可向标签添加!以实现反向筛选(例如"RequiredTags": [ "bone_item", "!fossil_item" ]筛选非化石的骨头物品)。
RequiredCount (可选) 对输入物品的堆叠数量的要求。适用于适用于TriggerItemPlacedInMachineOutputCollected的情形。默认为 1 。
Condition (可选)一个游戏状态查询,用于指示是否启用输出规则。若TriggerItemPlacedInMachineOutputCollected的情形,则可使用仅适用于物品的状态查询。默认为总是启用。
OutputItem 此机器产出的物品组成的列表。若存在多个匹配成功的物品,则会随机从中抽取一个,除非指定了UseFirstValidOutput(使用第一个匹配的物品)。此字段为包含如下字段的数据模型所组成的列表。
字段 效果
通用字段 参见物品生成字段以获取机器输出支持的通用物品字段。

说明:

  • ItemIdRandomItemId设为返回多个物品的物品查询,则会随机从中抽取一个。
  • ItemIdRandomItemId可以酌情添加下面列出的特殊标记,这些标记会在ID被解析前自动替换为相应的值。例如,可以使用FLAVORED_ITEM Wine DROP_IN_ID来创建输入物品对应的果酒。
    标记 替换为
    DROP_IN_ID 放入机器的物品的限定性物品ID。
    DROP_IN_PRESERVE 若放入机器的物品是风味物品,例如苹果果酒或金枪鱼鱼籽,则返回其原料的非限定性物品ID(例如,苹果果酒的原料ID为苹果的ID)。否则返回0
    NEARBY_FLOWER_ID 距此机器5个地块以内的某朵花的ID,若没有花,返回-1。例如,蜂房的产出物品为FLAVORED_ITEM Honey NEARBY_FLOWER_ID
  • ObjectInternalName字段可以酌情包含{0},此标记会被替换为输入物品的内部名称。这用于防止不同风味的物品发生堆叠(例如,苹果果酒和蓝莓果酒)。
  • Condition字段会检查输入物品(而非输出物品)是否满足相应条件。
PreserveType (可选)产出物品的风味物品类型(若适用)。这会在输出物品上设置相应的标识。可用的取值为 JellyJuicePickleRoeAgedRoe 以及 Wine。默认为空。
PreserveId (可选)产出物品的风味物品非限定性物品ID,若适用。例如蓝莓果酒的风味物品ID为蓝莓的物品ID。此字段可以为 DROP_IN,意为使用输入物品的ID。默认为空。
CopyColor (可选)若输入物品是 ColoredObject,是否继承其颜色。这主要影响鱼籽。默认为 false。
CopyPrice (可选)是否继承输入物品的基础售价(应用于 PriceModifiers 之前)。若输入或输出物品至少有一个不是物体类型的((O)),则此字段会被忽略。
CopyQuality (可选)是否继承输入物品的品质(应用于 QualityModifiers 之前)。
PriceModifiers
PriceModifiers
(可选)应用于输出物品价格的修饰器。默认为空。
IncrementMachineParentSheetIndex (可选)当机器正在产出输出品时,对其贴图索引施加的增量。这会与 ShowNextIndexWhenLoadedShowNextIndexWhileWorking 字段叠加。默认为 0。
OutputMethod (可选,专用)决定产出物品的 C# 方法。若设置此字段,则可忽略 ItemId 字段。

此字段的格式必须为 <full type name>: <method name>(例如 StardewValley.Object, Stardew Valley: OutputSolarPanel)。此方法必须为静态方法,并与 MachineOutputDelegate 方法签名相匹配:

/// <summary>Get the output item to produce.</summary>
/// <param name="machine">The machine instance for which to produce output.</param>
/// <param name="inputItem">The item being dropped into the machine, if applicable.</param>
/// <param name="probe">Whether the machine is only checking whether the input is valid. If so, the input/machine shouldn't be changed and no animations/sounds should play.</param>
/// <param name="outputData">The item output data from <c>Data/Machines</c> for which output is being created, if applicable.</param>
/// <param name="overrideMinutesUntilReady">The in-game minutes until the item will be ready to collect, if set. This overrides the equivalent fields in the machine data if set.</param>
/// <returns>Returns the item to produce, or <c>null</c> if none should be produced.</returns>
public static Item GetOutput(Object machine, Item inputItem, bool probe, MachineItemOutput outputData, Farmer player, out int? overrideMinutesUntilReady)

若返回空,则机器不会产出任何物品。

CustomData 欲提供给机器逻辑的数据,若可用。

例如,木桶使用如下方法来为物品设置陈酿速率:

"OutputItem": {
    "OutputMethod": "StardewValley.Objects.Cask, Stardew Valley: OutputCask",
    "CustomData": {
        "AgingMultiplier": 4
    }
}
UseFirstValidOutput (可选)若存在多个匹配成功的 OutputItem 条目,是否使用第一项,而非随机选取。默认为 false。
MinutesUntilReady
DaysUntilReady
(可选)可以收集输出物品的游戏内分钟数或天数。若同时指定这两个字段,则使用天数。若都没有指定,则输出物品会被立刻产出。
InvalidCountMessage (可选)若设置此字段,则会覆盖机器的 InvalidCountMessage 主字段。
RecalculateOnCollect (可选)是否在玩家收集输出物品之前的一瞬间立即重新生成输出物品,类似于蜂房。若新物品为空,则返回原始的输出物品。
AdditionalConsumedItems (可选)一个列表,记录检查 OutputRules 之前所需检查的额外物品。若指定此字段,则要求玩家身上、加料器或箱子库存中必须存在指定物品(依赖于机器时如何被加载的)。

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

字段 效果
ItemId 所需物品的限定性或非限定性物品ID。
RequiredCount (可选)ItemId 物品所需堆叠数量。默认为 1。
InvalidCountMessage (可选)若设置此字段,则会覆盖 InvalidCountMessage 主字段。
AllowFairyDust (可选)玩家是否可以使用仙尘加速机器。默认为 true。
ReadyTimeModifiers (可选)应用于加工时间的修饰器。修饰器条件只能为物品相关的标识,这些标识会被应用在输入物品(而非输出物品)上。
ReadyTimeModifierMode (可选)指示如何叠加多个修饰器的修饰器模式。默认为 Stack

行为调整

字段 效果
OnlyCompleteOvernight (可选)此机器是否必须过夜才能产出物品。若启用此字段且机器加工在当天完成,则会暂停到第二天才会产出物品。默认为 false。
PreventTimePass (可选)一个列表,列出了机器应当暂停的情形。暂停是指机器内部的生产计时器停止。可用的取值为:
取值 效果
Outside
Inside
在室外/室内放置机器时暂停。例如,蜂房不能在室内工作。
Spring
Summer
Fall
Winter
在指定季节暂停。例如,蜂房在冬天不工作。
Sun
Rain
在指定天气暂停。
Always 总是暂停。适用于使用高级逻辑处理计时器的情形。
AllowLoadWhenFull (可选)在最后一个产品加工完成前,玩家是否可以放入新的输入物品(例如宝石复制机)。先前的物品会丢失。默认为 false。
ClearContentsOvernightCondition (可选)一个游戏状态查询,用于指示机器是否应当过夜清空。这会导致当前输出物品丢失。默认为总是不清空。

音频和视觉

字段 效果
LoadEffects
WorkingEffects
(可选)当机器加载物品(LoadEffects)或加工物品(WorkingEffects,基于 WorkingEffectChance 概率)时,显示的视觉效果。两个字段都默认为空。这两个字段为包含如下字段的数据模型所组成的列表:
字段 效果
Condition (可选)一个游戏状态查询,用于指示是否应当播放特效。对于物品相关条件,您可以检查输入物品(Input)或输出物品(Target)。默认为总是播放。
Sounds (可选)欲播放的音频。此字段为包含如下字段的数据模型所组成的列表:
字段 效果
Id 欲播放的声音提示 ID
Delay (可选)在播放前延迟的毫秒数。默认为 0。

默认为没有声音。

ShakeDuration (可选)机器贴图颤动的时长,单位为毫秒。默认为空。
Frames (可选)应用于机器贴图的动画,为相对于基础贴图索引的偏移所组成的列表。默认为空。
Interval (可选)Frames 中的每帧停留的时长。单位为毫秒。默认为 100。
TemporarySprites (可选)欲播放的临时动画贴图。此字段为包含如下字段的数据模型所组成的列表:
字段 效果
Id 当前机器的当前规则的唯一字符串ID(不同机器之间可以重名)。
Texture 动画贴图集的素材名称(在游戏的 Content 文件夹下)。
SourceRect Texture 中第一个动画帧的像素区域,为包含如下字段的数据模型:XYWidthHeight
Condition (可选)一个游戏状态查询,用于指示添加此临时贴图的位置。
PositionOffset (可选)应用于贴图的像素偏移,相对于机器碰撞箱的左上角。为包含如下字段的数据模型:XY。默认为 (0, 0)。
Color (可选)应用于贴图的色调。参见颜色格式White(无)。
AlphaFade
Loops
Rotation
RotationChange
ScaleChange
SortOffset
(可选)参见 temporaryAnimatedSprite 事件命令中的等价字段。默认为 0。
Frames
Scale
(可选)参见 temporaryAnimatedSprite 事件命令 中的等价字段。默认为 1。
Interval (可选)参见 temporaryAnimatedSprite 事件命令 中的等价字段。默认为 100。
Flicker
Flip
(可选)参见 temporaryAnimatedSprite 事件命令 中的等价字段。默认为 false。
WorkingEffectChance (可选)每次新的一天开始时或游戏内的时钟变化时,应用 WorkingEffects 的概率。介于 0(从不)到 1(总是)之间。默认为 0.33。
LightWhileWorking (可选)机器正在加工物品时发出的光。默认为空。

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

字段 效果
Radius (可选)光效覆盖的区域尺寸,为默认半径的倍数(例如 1.5 代表默认半径的 1.5 倍)。默认为 1。
Color (可选)应用于光效的色调。参见颜色格式。默认为 White(无)。
WobbleWhileWorking (可选)机器加工物品时,其贴图是否起伏。默认为 false。
ShowNextIndexWhileWorking
ShowNextIndexWhenReady
(可选)机器正在加工物品ShowNextIndexWhileWorking)或加工完成(ShowNextIndexWhenReady)时,是否显示下一个贴图。默认为 false。

玩家交互信息

此字段仅用于玩家直接与箱子交互的情形,而不适用于加料器Automate(自动化)等模组。

字段 效果
InvalidItemMessage (可选)一个模板字符串,当玩家试图放入机器不接受的物品时就会显示相应的消息。
InvalidItemMessageCondition (可选)一个游戏状态查询,指示是否应当显示 InvalidItemMessage。可以使用针对物品的查询例如 ITEM_TYPE。默认为总是显示。
InvalidCountMessage (可选)一个模板字符串,当输入库存不足时就会显示此信息。此字段可以被 OutputRules 下面的 InvalidCountMessage 覆盖。

可以使用额外的自定义标记:

  • [ItemCount]:还需要多少物品。例如,如果您正在拿着三个物品但实际需要五个物品,则 [ItemCount] 被替换为 2

高级逻辑

字段 效果
InteractMethod (可选)一个 C# 方法。当玩家与机器交互,但机器没有可收获的产品时,就会调用此方法。

此字段的格式必须为 <full type name>: <method name>(例如 StardewValley.Object, Stardew Valley: SomeInteractMethod)。此方法必须为静态方法且与游戏的 MachineInteractDelegate 方法签名相匹配:

/// <summary>The method signature for a custom <see cref="MachineData.InteractMethod"/> method.</summary>
/// <param name="machine">The machine instance for which to produce output.</param>
/// <param name="location">The location containing the machine.</param>
/// <param name="player">The player using the machine.</param>
/// <returns>Returns whether the interaction was handled.</returns>
public static bool InteractWithMachine(Object machine, GameLocation location, Farmer player);
HasInput
HasOutput
(可选)是否强制添加 machine_inputmachine_output 对应的上下文标签。对于大多数机器而言,这并非必须的,因为会根据 OutputRules 字段自动设置标签。默认为 false。
IsIncubator (可选)此机器放在建筑中时是否为孵化器,也就是玩家可以在其中负担。默认为 false。

此字段用于孵化器鸵鸟孵化器。游戏逻辑假定每个建筑中只能有一个这样的机器,因此一般情况下,不要将此字段用于那些可以放在原版畜棚鸡舍中的机器。

StatsToIncrementWhenLoaded
StatsToIncrementWhenHarvested
(可选)将物品放入机器(StatsToIncrementWhenLoaded)或从机器收集产品(StatsToIncrementWhenHarvested)时增加的游戏统计数据。默认为空。此字段为包含如下字段的数据模型所组成的列表:
字段 效果
Id 列表中当前条目的唯一字符串ID
StatName Game1.stats 中的统计数据名。大小写敏感。
RequiredItemId (可选)若设置此字段,则仅当输入/输出物品具有此限定性或非限定性物品ID时才增加相应的统计量。
RequiredTags (可选)若设置此字段,则仅当输入物品具有此处列出的全部上下文标签时,才增加相应的统计量。您可以在标签前添加 ! 表示反向筛选(例如 "RequiredTags": [ "bone_item", "!fossil_item" ] 筛选非化石的骨头物品)。

这既可以用于增加内建的统计数据(例如晶球破开器GeodesCracked),也可用于自定义统计数据。强烈建议您在自定义统计数据前加上唯一字符串ID以避免冲突。

ExperienceGainOnHarvest (可选)从此机器中收获物品的经验点。例如 "Farming 7 Fishing 5" 表示 7 点耕种经验和 5 点钓鱼经验。
CustomFields 此条目的自定义字段

对于 C# 模组

与机器交互

星露谷物语 1.6 添加了两个 Object 字段以供参考。

字段 效果
lastOutputRuleId 若此对象为机器,则此字段为机器使用的输出规则(若有)。
lastInputItem 若此对象为机器,则此字段指示用于启动当前输出所输入的物品(若有)。

添加了一些用于加工物品的方法:

字段 效果
IsMachineWorking() 获取机器是否在加工物品。
ShouldTimePassForMachine(location) 获取机器是否应当在指定区域更新。例如,太阳能板放在室内或在多云的天气放在室外会返回 false。
GetMachineData() 获取 Data/Machines 中对应的机器数据。
PlaceInMachine(…) 尝试使用来自 Data/Machines 的规则来向机器放入一个物品。此方法返回一个布尔值,代表机器是否成功启动。
OutputMachine(…) 尝试根据输入物品和可选的输出规则来设置机器输出。大多数代码应当转而调用 PlaceInMachine 方法。

新增的 MachineDataUtility 类也提供了许多通用机器逻辑,使得 C# 模组与机器数据的交互更直接。例如,您可以检查机器即将产出的物品,而不用真正地更新机器。