《咒语力量:埃欧的征服》模组制作方法 先决条件: 1. 了解如何使用Windows文件资源管理器。 2. 拥有可用于编辑模组文件的文本编辑器。 3. 掌握JSON文件的正确格式化知识。 模组位置: 所有《咒语力量:埃欧的征服》模组均位于用户文档文件夹下的【我的游戏\Spellforce - Conquest of Eo\Content】目录中。

Content文件夹不会默认创建,需要手动创建。 模组结构 你创建的每个模组都是Content文件夹内的一个独立文件夹。 命名 模组的命名很重要,因为所有模组都需要放在Content文件夹内,所以要相应地选择名称。建议的命名方式是使用能标识你的前缀,或者如果你有域名的话,使用反向域名表示法。 例如:用户名.模组名 → JDoe.MyMod 务必选择一个独特的名称,以避免与其他模组重名。 内容包信息 为了让游戏能够检测到模组,在名为{foldername}的文件夹内必须有一个名为{foldername}.asset.json的文件。有关此文件内容的描述,请参见相应章节。

你的mod文件夹中的所有其他文件和文件夹都属于mod内容的一部分。 当前支持的文件类型: .csv:用于翻译的文本文件 .png:图像文件 .odl:用于创建新数据条目的自定义文件格式 .odlo:用于覆盖现有条目数据的自定义文件格式 内容管理系统概述: 本节包含关于《咒语力量:征服埃欧》整个内容系统如何运作的重要信息,所有mod开发者都必须阅读。 《咒语力量:征服埃欧》中内容管理系统的基本理念是,将有来自不同来源(基础游戏、DLC、mod)的多个内容包,它们共同构成一个虚拟文件系统,用于提供游戏的所有内容。虚拟文件系统 所有内容包将其文件贡献到同一个【命名空间】,游戏随后从已知的位置和类型加载这些文件。 例如:开始新战役时的 archetype 选择,会从该虚拟文件系统的任意位置加载【CampaignStartArchetype】类型的数据对象。基础游戏包【com.ownedbygravity.sf.base】提供了三个基础 archetype 文件: Campaigns/MainCampaign/Setups/ArchetypeAlchemist.asset Campaigns/MainCampaign/Setups/ArchetypeNecromancer.asset Campaigns/MainCampaign/Setups/ArchetypeRunesmith.asset 而 DLC【Demon Scourge】(com.ownedbygravity.sf.dlc1)提供了 demonologist archetype,文件路径为: Campaigns/MainCampaign/Setups/ArchetypeDemonologist.assetodlo文件必须从任何导出文档中移除,否则会导致游戏崩溃。 { "instanceID": 145574 } 或 { "m_FileID": 125144, "m_PathID": 0 } .odlo文件格式 基础说明请参见.odl文件格式。 覆盖文件的作用是修改游戏中现有资源的特定数值。其基本结构与.odl文件相同,但未在.odlo文件中出现的属性将保留被覆盖对象的原始数值。 要使.odlo文件生效,覆盖文件的路径需与原始文件相同,并添加.odlo扩展名。 示例: Units/Unit Progression/Default Progression.asset.odlo 将对文件 Units/Unit Progression/Default Progression应用覆盖。资源 .odlo文件中设置的资源类型必须与你想要覆盖的类型相匹配。在上面所示的示例中,资源类型为【UnitProgressionDefinition】。 建议使用游戏模组菜单中的【Expose for Override】功能,并删除所有你不想覆盖的属性,以确保文件格式正确。 模组示例.levelingchoice:如果我想增加升级时可用选择的数量,可以通过在模组菜单中对【Units/Unit Progression/Default Progression.asset】使用【expose for override】来创建一个.odlo文件,并添加以下行: 【UnitProgressionDefinition】 { "NumberOfProvidedRewards": 25 } 使用此文件将使游戏覆盖【Default Progression】中的【NumberOfProvidedRewards】。资源,且不更改任何其他属性。 本地化系统 本地化系统基于将标识符映射到文本的概念,并为每种语言设置不同的数据库。 语言代码 当前支持的语言代码如下: 双字母代码 EN、DE、RU 带连字符的四字母代码 zh-CN、zh-TW 请为您的语言使用标准语言代码(ISO 639),以避免混淆并提高兼容性。 应优先使用双字母代码而非四字母代码。 示例:使用DE而非de-DE 本地化标识符数据库 特定语言的标识符数据库通过以下方式创建: 在您的模组目录的Localization文件夹中创建一个文本文件,文件以.{语言代码}.csv结尾 示例:MyMod.EN.csv 文件中的每一行CSV文件由ID、分号和游戏中显示的实际文本组成。 示例:#Dwarf_MoleRider.NameId;Moleriders 如果某个ID多次出现,显示文本将根据包顺序被最新的内容覆盖。 作为备用方案,如果某个包有英文本地化但没有当前所选语言的本地化,游戏中将显示英文本地化内容。 本地化示例 基础游戏文件 Localization/com.ownedbygravity.sf.base.EN.csv #Dwarf_MoleRider.NameId;Moleriders 模组文件 Localization/myloca_1.EN.csv NewItem.Name;The awesome item NewItem.Description;The description for an awesome item #Dwarf_MoleRider.NameId;Moldy Riders 模组文件 Localization/myloca_1.DE.csv NewItem.Name;Der coole Gegenstand NewItem.描述:该酷炫物品的说明 若语言为英语,显示文本将为 #Dwarf_MoleRider.NameId -> 发霉骑手 NewItem.Name -> 超棒物品 NewItem.Description -> 超棒物品的说明 #Dwarf_MoleRider.NameId取自最新加载的文件。由于myloca_1.EN.csv在基础游戏本地化之后加载,因此使用该文件中的内容。 NewItem.Name和NewItem.Description取自myloca_1.EN.csv,因为它们在基础本地化文件中不存在,且.EN.csv与当前语言代码匹配。 myloca_1.DE.csv被完全忽略,因为它与英语的语言代码EN不匹配。 本地化文本文件规则:使用Excel直接打开此。CSV文件或许很诱人,但会破坏一切,因为默认的Excel设置与我们的文件格式不匹配!所有位于【】和{}内的内容均为宏,【严禁翻译】。 首行必须以Id;Text开头。 文件不得包含字节顺序标记(BOM)。 文件必须是UTF-8文本文件。 输入n可添加换行符。 文本中严禁使用分号。 列必须用分号(;)分隔。 每行至少需要包含两列。 本地化文本宏{}替换{}是会被游戏替换的替代值。根据ID的不同,可使用的宏也不同。 基本用法是通过文本标识符来确定此处应输入哪个“变量”。示例:{who} 或 {value} 您可以在文本中任意重新放置 { } 条目,如果您的语言需要不同的顺序,无需保持它们出现的顺序。 某些变量可以包含子条目(例如:物品工具提示),您可以使用 {a.b} 或 {a.b.c} 语法并知道它们的名称来单独访问这些子条目。 变量可以使用 {name:format} 语法进行额外格式化。可以组合使用以下多种格式。 p {value:p} 如果 value 是数字,该数字将乘以 100 并添加一个 % 符号。 示例:value 为 0.12 时,{value:p} 将输出“12%”。 +- {value:+-} 如果 value 是数字,正数前将带有一个加号。 示例:value 为 3 时,{value:+-} 将输出“+3”。c 若数值为数字,将根据数字的正负号添加【bonus】或【malus】颜色宏。 示例:数值为3时,{value:c}将输出“【bonus】3【/】”。若数值为-2,{value:c}将输出“【malus】-2【/】” i 与{value:c}相同,但颜色反转。因此正数将显示为【malus】,负数将显示为【bonus】 r {value:r}若数值为负数,则输出∞ 示例:数值为-1时输出“∞”。数值为2时输出“2” n {value:r}若数值为负数,添加【malus】颜色 示例:数值为1时输出“1”,数值为-2时输出“【malus】-2【/】” +fs {name:+fs}若名称解析后不为空文本,则在名称前添加一个空格。 示例“Hello{name:+fs}, how are you?”如果名称是戴夫,文本将包含“你好 戴夫,你好吗?”。 如果名称为空,文本将包含“你好,你好吗?”。 +bs {name:+bs} 会在名称不为空文本时,在名称后添加一个空格。 示例“Hello {name:+fs}, how are you?” 如果名称是戴夫,文本将包含“你好 戴夫 ,你好吗?”。 如果名称为空,文本将包含“你好 ,你好吗?”。你可以通过查看.odl文件的内容来识别可用的替换项,例如物品工具提示。 [ ] 宏[ ] 宏有两种不同形式 简单宏→[iarmor] 分组宏→[bonus]+3伤害[/] 有许多预定义的宏。目前无法通过模组添加更多宏。查看附带文档macros.xlsx以获取所有现有宏和TextMeshPro富文本的列表。 游戏内模组工具 当你在【文档】-【我的游戏】-【Spellforce - Conquest of Eo】路径下创建Content文件夹并启动游戏后,主菜单右上角会出现一个新按钮。 点击该按钮即可进入模组菜单。资源 游戏会将所有四个职业原型视为同一“文件夹”内容,因此当DLC启用时会加载全部四个原型,未启用时则仅加载前三个。 资源名称、路径与标识 资源的名称及其路径在模组开发中起着重要作用。 完整路径和文件名(除非另有说明,否则包含扩展名)构成了数据对象的“标识”。 如果在另一个包中遇到与其他文件具有相同标识的文件,内容包顺序将始终选择最新的资源,从而覆盖原始文件。 示例: com.ownedbygravity.sf.base包中有一个文件名为 Campaigns/MainCampaign/Setups/ArchetypeAlchemist.asset,若你在模组中添加一个具有相同标识的文件,你的文件将覆盖原始文件。内容包顺序 内容包有明确的加载顺序,若你想覆盖现有数据,此顺序至关重要。 加载顺序由内容包信息文件中的信息决定。 内容包将按以下条件排序: 1. 硬性依赖 2. 软性依赖 因此,模组可通过依赖其他模组来调整自身加载顺序(若有需要)。当硬性依赖和软性依赖相同时,将以内容包名称作为排序的决胜条件。 存档兼容性 新生成的存档会依赖某个模组加载,需满足以下两种情况: 1. 存档包含该模组的内容。若你的模组有任何内容被写入存档,请查看资产名称、路径及标识。 2. 例如:你添加了新物品或使用了。若要覆盖现有物品,存档将依赖于该模组,且在没有该模组的情况下无法加载。内容包信息文件已将IsDependencyForSavegames设置为true。内容包信息布局:内容包信息文件是一个定义良好的JSON,包含以下内容:{ "HardDependencies": [ { "Package": "com.ownedbygravity.sf.base" } ], "SoftDependencies": [ { "Package": "com.ownedbygravity.sf.dlc1" } ], "IsDependencyForSavegames": false }。属性:名称:内容:HardDependencies:内容包必须存在才能正常工作的依赖项。软依赖项:内容包的依赖项,这些依赖项可能存在,以便内容包可以在该依赖项之后加载,但不需要该依赖项。例如:某个模组应在所有DLC之后加载,但不需要这些DLC。 是否为存档依赖项:false→默认;true→当此模组处于激活状态时创建的存档,在加载时应始终将此模组写为加载要求。 .odl文件格式:此格式可用于仅使用文本编辑器在游戏中创建或替换资源。目前,您可以使用此格式创建/替换/修改约400种类型的数据资源。建议从游戏中导出现有资源,以便查看和修改数据。这仅包括上述所示的数据,不包括网格、动画和纹理。标识 导入的.odl文件的标识不包含.odl文件扩展名,以便于覆盖现有数据。 示例: Campaigns/MainCampaign/Setups/ArchetypeAlchemist.asset.odl 将被导入虚拟文件系统为 Campaigns/MainCampaign/Setups/ArchetypeAlchemist.asset 基本格式 文件包含资源类型名称,后跟包含其属性的json文档。 确保json文档格式正确,不缺少或多余逗号非常重要,否则游戏将无法解析文件。详情请查看mods.log。 .odl文件示例 CampaignStartArchetype { "DisplayName": { "Key": "#ArchetypeAlchemist."显示名称,对象ID,全局唯一标识符部分1:960871039,全局唯一标识符部分2:1078022271,全局唯一标识符部分3:1851887267,全局唯一标识符部分4:-61869183,可序列化本地标识符:11400000,描述,键:#ArchetypeAlchemist.Description,对象ID,全局唯一标识符部分1:960871039,全局唯一标识符部分2:1078022271,全局唯一标识符部分3:1851887267,全局唯一标识符部分4:-61869183,可序列化本地标识符:11400000,存档图标,内容路径:Campaigns/MainCampaign/Setups/ArchetypeAlchemist_SavegameIcon.可选择的职业类型:true 位置: 内容路径:"Campaigns/MainCampaign/Setups/CampaignStart_Alluvyan.asset" 制作: 内容路径:"Campaigns/MainCampaign/Setups/StartCrafting_Alchemist.asset" 主要学派: 内容路径:"Campaigns/MainCampaign/Setups/StartSchool_Nature.asset" 次要学派: 内容路径:"Campaigns/MainCampaign/Setups/StartSchool_Enchantment.asset" 塔楼: 内容路径:"Campaigns/MainCampaign/Setups/CampaignStart_Tower_03.asset" 特定类型/模式 本地化标识 导出的本地化标识如下所示: 键:"#ArchetypeAlchemist."在您自己的.odl文件中使用时,唯一重要的属性是【Key】属性。您可以对其进行简化,以提高编辑内容时的可读性。 { "Key": "#ArchetypeAlchemist.DisplayName" } 内容路径 内容路径用于引用虚拟文件系统中的另一个对象。(参见资产名称、路径和标识) { "ContentPath": "Campaigns/MainCampaign/Setups/StartSchool_Enchantment.asset" } Unity引用 目前.old / .文件不支持对Unity对象的引用。

将显示您当前已安装的模组列表,以及用于退出此菜单或访问模组开发者工具的按钮。

模组开发工具 在此处,你可以查看所有模组和基础包的列表,并使用创建和修改模组的工具。 以com.ownedbygravity.sf开头的包属于基础内容,有助于你创建自己的模组。 包的创建 你可以通过点击【新建包(模组)】按钮来创建新模组。之后,系统会提示你为模组命名一个唯一的名称(如模组布局>命名中所述)。

包裹查看器:点击任意包裹即可查看其内容。

如何公开内容 若资源可公开,您有以下两种选择: 在包中公开内容
点击此按钮,你可以选择一个目标包,在其中创建一个包含该资源所有可修改属性的.odl文件。公开以供覆盖
点击此按钮,你可以选择一个目标包,在其中创建一个包含该资源所有可修改属性的.odlo文件。 如何设置新翻译:当点击模组开发者工具中的【新建翻译】按钮时,系统会提示你输入要添加到游戏中的新语言的语言代码。 一旦在你的Content文件夹中创建了名为translation.yourlanguage的包,你就可以用任意文本编辑器(推荐使用Notepad++)打开Localization子文件夹中的.csv文件。 有关该文件的更多信息,请参阅本地化文本文件规则和本地化文本宏。 mods.log 一旦创建了【文档】我的游戏 Spellforce - Conquest of Eo Content,游戏将创建一个mods。包含模组文件发现信息以及加载过程中可能遇到的错误的日志文件。如果你的模组出现问题,可以查看此文件和Player.log。




换一换 






















