
这是《园艺大师》的官方模组创建指南。游戏文件中的“Mod”文件夹内包含易于阅读的PDF版本。 基础概念 本节将解释模组的结构和加载方式。虽然整体概念相当简单,但其描述较为抽象。因此,建议你查看“工具与资源”部分以获取更快速实用的信息。 什么是模组? 修改《园艺大师》的官方方法是创建一个“.mpck”打包文件(如何创建请参见工具部分),该文件包含所有数据,包括名称和图片等元数据。本质上,模组是独立的专用文件,只需将其放置在“Mods”目录中即可独立安装,与其他模组互不干扰。### 模组结构解析 每个模组本质上是对《园艺大师》所交互的虚拟文件系统进行的修改,无论是添加新内容还是替换旧内容。实际上,模组与官方游戏数据并无区别。 当游戏启动时,会将所有打包文件加载到虚拟文件系统中,并对每个文件进行跟踪,以便在需要时进行访问。需要注意的是,官方数据包会优先加载,之后才会应用模组。 ### 模组示例 以下是一个在虚拟文件系统中添加巨型螃蟹的模组可能包含的文件结构(具体细节稍后详述): 根目录 data.xml 纹理 mega-crab.png 声音 mega-crab.wav mega-crab-hurt.因此,大多数内容不应通过清单加载。 文本字符串所有文本均在本地化文件(每种语言一个)中提供,包含JSON格式的数据。数据格式如下: <名称>:{ Value: <值>, Comment: <注释>, Revision: <数字> }, 名称 = 条目的唯一标识名称。 值 = 文本字符串。 注释 = 供处理该文件的人员参考的说明。 修订版本 = 相对于主文件(en-US)的版本信息,用于官方翻译。在进行模组制作时,你可能无需担心此元信息。 如果玩家所选语言中不存在请求的字符串(没有该名称的字符串),游戏将回退到主语言英语(en-US)。如果字符串完全不存在,将显示名称以表示字符串完全缺失。 添加语言:游戏可使用的语言由其找到的语言文件决定。若要添加新语言,需制作一个包含语言文件的模组,并将该文件放置在【Localization】文件夹中。 语言文件需采用特定的名称格式,包含标识符和字符集:【<标识符>_<字符集>.json】。例如,文件名称为【en-US_latin.json】时,表示该文件为使用拉丁字符的美式英语(en-US)。 标识符:标识符可任意设置,但理想情况下应遵循BCP47标准,使用语言(ISO-639)和地区(ISO-3166)代码。这样可以根据操作系统语言自动设置默认语言。示例标识符: ● en-US(美式英语) ● sv-SE(瑞典语) ● ja-JP(日语) 字符集 字体并非包含所有字符,可能专门用于最佳呈现特定类型的字符。因此,每种语言都指定了在游戏中呈现所需的字符集。 目前支持的字符集: ● latin(多种西方语言) ● japan(日语) ● hangul(韩语) ● chn(简体中文) 图像 要在语言选择器中显示某种语言,需要为其准备一个图像,因为图像用于表示每种语言(从而摆脱对特定字体的依赖)。该图像的标识符应为“lang/<小写标识符>”,例如德语的标识符为“lang/de-de”。 纹理可放置在虚拟文件系统的任意位置。有关如何加载图像的信息,请参见【清单】部分。 修改文本:若要修改或向现有语言添加特定文本条目,必须在原始语言文件所在目录中提供一个差异文件。差异文件的文件扩展名为“.diff.json”。例如,若原始语言文件为“Localization/en-US_latin.json”,则相应的差异文件为“Localization/en-US_latin.diff.json”。 提供差异文件后,其中的任何字符串都将添加到原始语言中(如果已存在,则覆盖现有字符串)。多个模组可以修改相同的语言,它们将按照标准的模组加载顺序进行覆盖。 注意:建议对新字符串进行命名空间处理,以防止未来发生冲突。例如,MySuperCoolMod_Item_Tulip_Name。 注意:如果您替换原始语言文件而非使用差异文件,可能会导致与其他模组或未来游戏更新不兼容。 进阶概念 第2部分 清单 虽然大多数资源是通过在data.xml中查找路径来加载的,但有些资源必须在清单文件中提供,以便游戏知道加载什么以及如何加载。这主要用于基础游戏数据,如用户界面纹理和音乐。 清单文件具有相应的扩展名“.manifest”。每行使用“<标识符> <路径>”格式指定一个标识符和资源路径。 要将清单文件添加到您的模组,您需要在模组的根目录添加一个名为“mod.manifest”的文件。其中所有受支持的资源都将被加载。这同样是一条不会被后续模组覆盖的魔法路径。你可以在【魔法路径】部分找到更多此类路径。 特殊资源类型: 纹理路径后可附带可选参数。强烈建议查看基础包中的清单以了解其实际应用。 ● 源矩形 <x, y, 宽度, 高度>(使用“-”表示完整纹理)。当需要从同一图像文件中定义多个纹理时非常有用。 ● 动画帧 <列数, 行数>。指定纹理被分割成的列数和行数。 ● 帧边距。与动画帧配合使用,为每个帧添加安全边距,会使帧的尺寸按给定像素数量有效减小。用于当多个动画或纹理嵌入到单个纹理中时,确保纹理不会相互渗透。因此,0或1的值应该足够。 ● 帧率。动画默认应以每秒多少帧的速度播放。 不同天气的歌曲会被自动识别,只要它们的标识符以sun或rain开头。 Steam创意工坊制作Steam创意工坊的模组时,实际制作过程无需有太多不同。不过,Steam会为每个下载的工坊模组创建一个独特的目录: /Steam/steamapps/workshop/content/1928540/【mod_id】 这些模组目录不允许加载目录,但你仍然可以在普通的模组目录中进行开发。此外,Steam模组将按照订阅日期的顺序加载,玩家最新订阅的模组会最后应用。如果模组文件夹中有任何模组,它们将在创意工坊模组之后应用。 工具 所有工具都可以在游戏文件的【Tools】目录中找到。 【ModMaster】:此工具可以创建打包文件,并打开它们进行检查和解包。 【UnpackThis】:此视图允许您检查任何现有的打包文件,包括官方文件和模组文件。它主要用于将内容解包到目录中,可用于查看文件的结构并访问其内容进行编辑。覆盖机制:当多个包包含路径相同的文件时,最后加载的包会覆盖之前包中该特定文件。由于基础游戏会最先读取,因此制作某些模组非常简单,例如替换纹理资源。 因此,最好将模组特有的文件放在一个具有唯一名称的目录中,为这些文件添加命名空间。这能降低模组之间相互覆盖文件并导致不兼容的风险。 有些文件不应添加命名空间,你可以在“魔法路径”及后续章节中找到相关内容。 覆盖示例:假设基础游戏文件“Base.mpck”中有以下结构,包含两个纹理和一个音效: 根目录 - 纹理 - health-bar.png - alert-icon.png - 音频 - congratulations.wav 现在考虑以下模组“MyMod”。mpck”。 根目录 纹理 alert-icon.png我的超级模组(作者:罗伯特) 音频 congratulations.wav当模组加载时,它会覆盖警报图标,将文件访问路径从“Base.mpck”重新路由至“MyMod.mpck”。但该模组不会影响音效,因为音效被命名空间隔离在“我的超级模组(作者:罗伯特)”中。 开发目录尽管模组文件易于分享和安装,但在开发过程中每次修改都创建文件会很麻烦。因此,你可以使用目录作为打包文件的替代,这样能快速迭代工作。模组完成后,只需将目录打包,模组文件就可用于分发了。以下两个模组的效果是相同的。区别在于一个已打包,另一个为目录形式: MyMod.mpck MyMod data.xml Texture tiny-crab.png 注意:目录不包含打包文件的元数据,例如名称或图片,因此不适合常规分发。 模组标识符 每个模组都有一个独特的标识符,用于将其与其他模组区分开。这能确保游戏可以将各个模组的内容分开,并且当玩家更改模组设置(例如移除模组或重新排序某些模组)时,存档不会损坏。 如果游戏启动时存在两个相同的标识符,将不允许玩家进行游戏,并会显示违规模组列表。标识符建议 创建模组(请参见工具部分)时,您需要输入一个具有最小长度的唯一标识符,因此该工具已将标识符冲突的风险降至最低。 作为模组制作者,您可以做的是选择一个专属于您的良好命名空间,以将两个模组发生冲突的风险降至几乎为零。例如,官方示例模组以【inDirectionGames】开头。 示例标识符: inDirectionGames.NewTulipVariant inDirectionGames.Animal.RemoveTheGoldfish inDirectionGames.2023.PinkCursor 客观来看,在仅使用英文字母、数字和句点且随机生成的情况下,上述每个标识符与另一个模组发生冲突的概率均低于10^-51。高级概念 掌握基础部分后,你可以创建资源替换模组,而本节将介绍如何进行改变游戏玩法的修改。 数据条目 游戏使用名为“data.xml”的XML文件来定义其内容和运行方式。这些文件应位于每个包的根目录下,属于不会被其他包覆盖的特殊路径(详见特殊路径部分)。 强烈建议使用提供的编辑器(见工具部分)来编辑数据文件,因为其中包含多种类型的值,在此处学习或记录会非常繁琐。 条目ID 每个条目都有一个聚合ID,其中包含其对应模块(通常每个包一个)的信息以及该模块内的唯一编号。因此,它们由两部分组成: ● 模块 ● 编号 两个ID若要等效,它们的值必须相同。因此,多个数据包可以使用相同的编号,只要它们具有不同的模块即可。 注意:ID值以压缩整数形式存储。因此,对于模块非零的条目,实际上必须使用编辑器。 当游戏启动时,模块为0的条目将在运行时根据其加载顺序分配一个模块。这使模组作者能够轻松添加数据,而无需跟踪其他模组模块。 如果两个数据包包含具有相同ID的相同条目类型,则加载的最新数据包将覆盖其他数据包,就像资源一样。这在修改现有内容时很有用。添加内容 若要添加新条目,只需将其添加到模组的数据文件中,它们就会被加载。强烈建议在添加内容时使用0模块,因为这能确保你无需与其他作者协调条目编号。不过,如果你有充分理由使用特定模块,仍可进行指定,但需注意其兼容性影响。 修改内容 修改现有条目的方式与添加新条目相同。不同之处在于,你需要指定所编辑条目的模块和ID。由于基础游戏带有预定义的静态ID,因此这些条目很容易修改。目前无法仅修改条目的单个属性(例如物品的成本),因此必须复制整个条目。这很容易通过从基础游戏中复制(或其他方式)来完成。 移除 也可以移除条目,不过过程有些迂回,而且通常不是一个好选择。移除条目的操作方式与修改条目相同,但数据需要放在模组根目录下的“data-remove.xml”文件中。 你只需指定要移除的条目的ID即可(尽管编辑器会自动添加所有字段)。 注意:移除条目更有可能导致游戏崩溃,因为其他条目可能依赖于它(尤其是其他模组)。 资源路径 条目中引用的资源,例如动物纹理,几乎总是通过文件系统自动加载。基本上,条目本身会指明其资源路径。

1. 压缩包文件选择器。点击此按钮可选择要打开的压缩包文件。打开后,该按钮会显示文件路径,但仍可点击以选择新文件。 2. 压缩包信息。显示压缩包的元数据,包括任何包含的图像。 3. 压缩包内容。列出压缩包中包含的所有文件。 4. 解压缩。点击此按钮可将文件解压缩到目录结构中。 打包功能:您可能已经猜到了:此视图将指定目录打包成压缩包文件,可供作为模组使用。

1. 目录选择器。选择最终要打包的目录。选择后会显示路径,但仍可点击以选择其他目录。 2. 信息。需要填写这些模组信息才能打包目录。有关输出切换的更多信息见下文。 3. 图片选择器。虽然非必需,但强烈建议为模组添加图片。点击图片可打开文件选择器。 4. 打包内容。将包含在打包文件中的所有文件列表。 5. 打包。点击此按钮将指定目录打包为打包文件。 输出:打包时,你可以选择创建本地打包文件或将数据直接上传至Steam创意工坊。选择【本地文件】作为输出时,生成的文件将存储在与打包目录相同的位置。如果你想自行安装模组,或在Steam创意工坊之外分发模组供他人安装,请选择此选项。 选择【Steam创意工坊】作为输出时,不会存储文件。相反,数据会立即上传至创意工坊。上传功能需要Steam处于运行状态,且已登录拥有该游戏的账户! 如果此打包内容是对现有模组的更新,你可以指定一个模组ID进行更新。该ID可在创意工坊中找到,初次上传时也会记录该ID(未提供ID时)。 你还可以为创意工坊指定标签,以便他人找到你的模组。强烈推荐这样做,因为这也会影响游戏内模组浏览器中的可见性! DataStudio是制作本游戏所使用的编辑器。它允许你编辑每种数据类型的条目。此外,它还集成了字符串编辑和翻译功能。 要开始编辑或创建条目,你需要创建或打开一个数据文件(data.xml)。这可以通过“文件”菜单完成,你也可以将路径指定为第一个程序参数来立即打开它。

1. 功能选择:数据部分用于查看和修改条目。故事和验证器在单独的部分中介绍。 2. 数据类型:选择你想要更改的数据类型。 3. 条目操作:添加新条目;复制所选条目;删除所选条目;向上/向下移动所选ID(同时移动所有冲突条目);按包含指定字符串的列筛选视图。 4. 条目行:这些是所选数据类型的条目。点击其中一个可将其选中进行编辑,不过某些属性可直接在行中修改。 5. 条目详情:显示所选条目的所有属性,包括可编辑和不可编辑的。这是你对游戏进行主要调整的地方。由于每种类型都具有许多独特属性,因此这里不会涵盖个体值。不过,你会注意到一些常见的属性: ● 条目的唯一ID以蓝色显示在顶部,允许你分别修改模块和编号。记住,添加内容时应使用模块0(参见数据条目部分)。 ● 名称以绿色显示。它们不可编辑,但会显示其将具有的字符串值。实际的键/名称在特定的字符串资源属性中指定。某些条目对于描述或其他文本也有类似的机制。 注意:你必须从“字符串”菜单加载字符串文件,才能显示实际值(参见字符串编辑)。● 其他条目的引用(无论类型是否相同)均以橙色标注,其输入方式与唯一ID相同。若被引用条目的ID发生变化且位于同一数据文件中,此值将自动更新。 故事标签:这是一个用于可视化任务及其关联路径的工具。每个方框都可悬停查看详情,也可选中以显示前后关联的任务。 验证器标签:此工具用于检查条目引用是否正确,例如确保所有信件都已关联到任务。运行该工具可提示可能存在的问题,但部分合理情况(如外部模块)可忽略。目前对模组的支持效果欠佳。在【字符串】选项卡中,你可以加载主字符串文件以及该主文件的任何翻译文件。主编辑器适用于为你的模组创建新字符串,而翻译功能则适用于创建新的翻译内容。


资源 以下是一些有助于开始制作模组的资源。 通用工作流程 以下是创建模组的典型工作流程: 1.(可选)解包位于Data文件夹中的基础游戏文件(Base.mpck)。这样可以让你查看游戏的制作方式。 2.在模组目录中创建你的根模组文件夹,例如“Horticular/Data/Mods/MySuperMod”。这能让你无需打包文件即可测试模组。 3.创建模组数据并将其放置在你的新文件夹中。查看本节中的其他资源,了解如何进行特定更改。 4.通过运行游戏来测试你的模组是否正常工作。它应该会列在从主菜单进入的“模组”页面上。反复测试直至满意! 5.准备好向世界展示你的作品后,打包你的模组文件夹!示例:资源替换 资源替换操作十分简单,只需重建基础游戏的目录结构并添加您自己版本的资源即可。 在此示例中,我们将更改鼠标光标的颜色。 1. 解包基础内容。解包后的目录结构显示,鼠标光标位于“Texture/Base/cursor.png”和“Texture/Base/cursor_large.png”路径下。 2. 在“Horticular/Data/Mods”目录中创建我们的模组根目录“PinkMouseCursor”。 3. 将两张图片修改为粉色,然后以相同名称保存到“PinkMouseCursor/Texture/Base/<名称>”路径下。 示例:翻译 添加新的翻译非常简单。您需要为每种主要语言创建翻译后的文本字符串。玩家将在此处接收指示。 3. 填写游戏模式资源 a. 绘制要使用的图片。 b. 在字符串中添加沙盒名称。 c. 在字符串中添加沙盒描述。 d. 在字符串中添加介绍文本。 4. 在任务表中添加胜利条件 a. 使用字符串资源为任务输入合适的名称和描述。 b. 将其设置为主任务。 c. 将其设置为非仅故事任务。 d. 启用强制追踪,因为这是我们的起始(且唯一)任务。 e. 类型应设为任务。 f. 由于这是第一个(且唯一)任务,因此无依赖项。 g. 添加完成条件,添加一个“数值”条件并为其添加“金钱”值。然后将条件设置为大于或等于,值为1000000。 h.最后,创建一个带有酷炫收尾的结束动作。你可以添加一封邮件,但我们只需使用“ending”命令来触发结束。 魔法路径 以下是需要记住的魔法路径。这些文件不会覆盖其他数据包,且不应使用命名空间。 mod.manifest = 资源加载清单。 data.xml = 游戏数据的修改和添加。 data-remove.xml = 游戏数据的移除。 Localization/<名称>.json = 添加游戏翻译。 Localization/<名称>.diff.json = 为现有语言添加/更改字符串。 命令 游戏在任务完成时可以运行一些命令(参见任务数据条目)。开发者控制台也可运行命令(通过添加“console_enabled=true”作为程序参数或在“settings.ini”中添加一行来启用),按F1键打开。 以下是一些实用命令: help = 显示所有命令;若以“help <命令>”形式运行,则显示指定命令的帮助信息。 set <x> <y> = 将变量x设为值y。 get <x> = 打印变量x的值。 vars = 列出所有变量。 crash = 使游戏崩溃!你还需要为它制作一张图片,以便在语言选择器中显示。 在本示例中,我们将创建一种虚构语言的小样本,并为其添加一张精美的图片。 1. 解压基础内容。主语言文件位于“Localization/en-us_latin.json”。 2. 创建我们的模组根目录:“Horticular/Data/Mods/ExampleTranslation”。 3. 在你的模组中创建一个空的翻译文件:“Localization/te-ST_latin.json”。 4. 翻译字符串。建议使用DataStudio来完成此操作,从步骤1加载主语言文件,并从步骤3加载你的新文件。 5. 创建图片。图片可以放在任何位置,但我们使用与基础游戏相同的目录:“Texture/UI/Language/te_st.png”。 6. 在模组根目录中创建一个清单文件“mod.”“manifest”文件,用于指示游戏加载图像资源。该资源的标识符应为“lang/te-st”。 示例:文本修改 向现有语言添加或修改文本条目,其基本原理与创建翻译时相同。主要区别在于使用差异文件。 在此示例中,我们将把英语的主菜单选项改为大写。 1. 解包基础内容。英语语言文件位于“Localization/en-us_latin.json”。 2. 创建我们的模组根目录:“Horticular/Data/Mods/ExampleUppercaseMenu”。 3. 创建差异文件:“Localization/en-US_latin.diff.json”。 4. 将差异字符串添加到“en-US_latin.diff.json”中。在这里,你可以通过DataStudio手动添加(确保使用相同的名称),或者复制粘贴需要修改的原始条目后进行修改。 示例:新数据条目 添加新条目时,你需要创建一个“data.xml”文件,并在其中填入你想要添加的内容。对于大多数类型,你需要添加名称、描述和资源。 在本示例中,我们将向游戏中添加蓝色郁金香。 1.(可选)解包基础内容。可以将基础游戏中的郁金香作为参考。 2.创建我们的模组根目录:“Horticular/Data/Mods/NewTulipExample”。 3.创建资源“NewTulipExampleData/tulip_blue.png”。注意命名空间目录,以防其他模组也添加蓝色郁金香。在这种情况下,我们可以复制原始资源并将其染成蓝色。 4.通过创建“Localization/en-US_latin.diff.json”并在DataStudio中打开,添加一个名称字符串。我们添加命名空间字符串“ItemData_NewTulipExample_Name”,其值为“蓝色郁金香”。 5. 在模组根目录中使用DataStudio创建“mod.xml”来添加数据条目。我们可以从头开始创建郁金香,但在这种情况下,我们只需复制基础游戏中现有的郁金香。我们还进行以下更改: a. 将成本改为更有趣的数值。 b. 将名称资源更改为我们创建的那个。 c. 将纹理路径更改为蓝色郁金香的路径。 d. 将ID设为0:1【重要!】 e. 将解锁方式设为商店,因此玩家需要从商人处购买。 5. 通过添加一个新的常量行,将项目设为数据,类型设为自动解锁,使郁金香自动解锁。提供ID 0:1(我们的新郁金香)。这会告知游戏自动解锁该物品(不过由于我们已将其设置为商店,这意味着它将变为可购买状态)。在默认的沙盒模式中,这一过程会自动完成,但在故事模式下,你通常需要通过任务来解锁该物品,对于此模组而言,这可能显得过于繁琐。 7. 通过添加一个模式模组条目,将新数据添加到复仇女神模式中。为其指定ID为0:1,并将目标游戏模式设为1:1。现在,复仇女神模式(以及任何依赖它的模式)将包含郁金香和自动解锁条目。 示例:数据修改 修改条目与添加条目的流程相同,不同之处在于你需要指定要覆盖的特定模块。因此,这主要用于修改基础游戏内容。请注意,这会替换整个条目,而不仅仅是特定数值。相关部分: ● 数据条目 ● 模组修改 ● 数据工作室 在本示例中,我们将把看守者的基础速度大幅提高。 1. 解包基础内容,以便我们使用其数据。 2. 创建我们的模组根目录:“Horticular/Data/Mods/FasterKeepersExample”。 3. 将基础游戏data.xml中的看守者条目复制到我们模组根目录下的“data.xml”中(你可能需要使用数据工作室来创建模组数据文件,因为XML标签需要正确无误)。 4. 通过打开我们模组的数据并修改看守者的速度属性来改变速度。注意:我们在此保留ID,因为我们希望覆盖基础游戏内容,而不是创建一种新的看守者。 5. 按类似比例更改动画帧率。例如,如果速度变为原来的2倍,我们可能希望帧率也变为原来的2倍。请注意,特定的动画行也可能有自己的帧率可供更改。 资源部分 2 示例:沙盒模式 此示例添加了一个沙盒游戏模式,你需要尽快赚取100万金币。 这是最复杂的示例,因为它涉及了大多数概念和多种数据类型。因此,对于在较小示例中已涵盖的细节,说明将不再那么详尽。 1. 创建带有data.xml的模组文件夹 2. 在数据中添加游戏模式 a. 我们使用Nemesis(1:1)作为父项,以访问其所有当前和未来的内容。 b. 我们还为该模式添加了自定义图像,以及用于名称和描述的资源名称(稍后填写),这些将显示在沙盒选择器中。 c.确保添加故事排除条件以移除所有与故事相关的内容,否则普通的复仇女神故事将会运行。 d. 我们勾选自动联系人以显示所有联系人。 e. 我们勾选自动解锁池,使所有可解锁内容无需通过任务解锁即可在商店(及其他解锁方式)中获得。 f. 我们勾选自动教程,因为玩家应从一开始就拥有所有教程。 g. 我们还确保设置初始资金,并添加自动物品和自动地面,为玩家提供初始资源。 h. 我们只允许困难难度,因此确保仅勾选该选项。 i. 我们启用大多数功能,但排除指南(教程相关内容)和竞赛。 j. 最后,我们在介绍中添加几个占位符字符串资源。
2026-03-19 22:01:02 发布在
园艺大师 Horticular
说点好听的...
收藏
0
0
