文明六自定义市中心区域建筑模组
文明六自定义市中心区域建筑模组
分享一个文明6市中心区域加成的模组,你也可以深入阅读学习它。
介绍
文明六Sid Meier's Civilization VI 是一款回合制策略游戏,让玩家尝试建立起一个帝国,并接受时间的考验.玩家将创建及带领自己的文明从石器时代迈向信息时代,并成为世界的领导者.
模组 Modification 缩写为 Mod ,简体中文翻译为模组,它是游戏的一种修改或增强程序.比如玩家向游戏中添加了游戏本身不存在的物体使游戏更加有趣.
创意工坊 是 Steam 游戏平台针对特定游戏提供一个 Mod 下载页面,玩家可以下载自己喜欢的 Mod 来增强自己的游戏体验
模组介绍
这个模组名为StringOD of House ,它的作用是,向文明六任意国家的任意已创建城市的市中心区域下新增一个带有各种加成的建筑物,目前添加的建筑为 “少年的出租屋 ”
下载地址
如果你不想学习创建属于自己的 Mod ,你可以直接在Steam上订阅并体验它
模组的存放路径为 %userprofile%\Documents\My Games\Sid Meier's Civilization VI\Mods,你需要解压缩把StringOD 文件夹放在 Mods 目录下.
如果你想学习创建属于自己的 Mod 并向游戏中添加自己更多的想法,请耐心的花费十分钟的时间看完这篇文章.
参考链接
搭建环境
Steam中打开 库点击 库 下面的 游戏 下拉框,勾选 工具
库 下面的 主页 下面的
安装
Sid Meier's Civilization VI Development Tools启动之后选择
ModBuddy
至此,环境搭建完成
创建你的第一个建筑模组
这个时候你应该能看到 Start Page 的页面.
- 创建新的模组选择
New Mod - 更改下面的模组名称
Name最好是英文 - 更改模组的存储位置
Location(当然可以不更改) - 选择右小角的
OK
至此,当你看到一个英文的 Starter Project 页面时说明你的第一个模组创建成功.
开始分析别人的模组
模组介绍
这是上文提到的两个相似的模组,他们都在市中心区域添加了单独的建筑:
God's House - Cheat Mod针对当前城市修改了城市的产量,这其中包含:黄金,信仰,文化,科技,食物,生产力,住房以及宜居度.Player Only Cheat Building针对当前城市修改了城市的产量,这其中包含:黄金,信仰,文化,科技,食物,生产力,住房,宜居度.战略资源包含了:铁,煤,马,硝石,铝,铀.
这两个模组在每一回合都会生产预先设置好的资源.
寻找模组文件
首先,得找到模组的文件路径.我发现从创意工坊下载的模组都是一串数字代替的名字.比如:
1109505115
1122081356这个时候我想到每个模组文件中一定会包含模组在游戏中显示的名字或模组的建筑名称.(用已知字符串搜索整个可能存在这些文件的目录下的每个文件中的内容)
启动 HBuilderX 打开 Steam 的创意工坊目录 ..\SteamLibrary\steamapps\workshop\content\289070,然后在这个目录下的所有文件中查找 包含有 God's House 字符串的文件,根据搜索结果得到模组的目录名称 1395251854
第二个模组的文件路径所使用的搜索字符串是游戏中显示的建筑名称,创意工坊给出的模组名称和模组中显示的名称不一样.最后根据游戏中显示的建筑名称 YoRHa_Core 在整个目录检索到的目录名称为 1956601153.
至此,得到了两个模组的文件路径.
分析文件结构
从文件名称猜测
先对比一下两个模组的文件结构.
1956601153 - YoRHa_Core
Blu.png
YoRHaCore.modinfo
YoRHa_Core_Gameplay.xml
YoRHa_Core_Icons.xml
YoRHa_Core_Text.xml
1395251854 - God's House
GodsHouseCheatMod.modinfo
NewBuilding_Gameplay.xml
NewBuilding_Icons.xml
NewBuilding_Text.xml可以看出感觉这两个模组差不多,唯一不同的是 YoRHa_Core 目录下多了一个 Blu.png 这是一个图片文件,猜测可能是背景图.
从模组的文件名字中能大概猜测到每个文件的作用.
xxx_Gameplay.xml应该是整个模组最主要的部分xxx_Icons.xml应该是该模组在游戏中显示的图标xxx_Text.xml应该是存放文本的文件,比如游戏中显示文字xxx.modinfo应该是用来存储当前模组的基本信息文件
为了进一步确定每个文件的作用和功能就得打开文件读代码.
打开每个文件读代码
在这里就用 YoRHa_Core 这个 Mod 来解释和翻译.
打开文件翻译每对标签的中文翻译.先从最外层往内层翻译.
xxx_Gameplay.xml模组的最重要的游戏数据文件
<!-- 游戏数据, 整个模组的代码都得写在这个里面 -->
<GameData>
<!-- 建筑类名称和类型 Kind为建筑分类, 一般情况下不用改-->
<Types>
<Row Type="BUILDING_YORHA_CORE" Kind="KIND_BUILDING" />
</Types>
<!-- 建筑成本 附加属性 -->
<Buildings>
<!--
BuildingType 这是建筑类型, 一般的和建筑名称可以是一样的(自己命名)
Name 这是建筑名称
PrereqDistrict="DISTRICT_CITY_CENTER" 表示这个模组中的建筑将添加在市中心区域下
PurchaseYield="YIELD_FAITH" 表示当前模组的建筑建造成本必须拥有的信仰值, 实际上也需要生产力
Cost="10" 表示需要多少信仰值才能建造当前模组中提供的建筑
AdvisorType="ADVISOR_GENERIC" 经过翻译是顾问类型为一般, 具体不知道什么意义, 默认不用改
-->
<Row BuildingType="BUILDING_YORHA_CORE" />
</Buildings>
<!-- 建筑加成 建筑每回合生产的资源 -->
<Building_YieldChanges>
<!-- 建筑类型, 建筑生产资源类型为信仰, 生产数值为1 -->
<Row BuildingType="BUILDING_YORHA_CORE" YieldType="YIELD_FAITH" YieldChange="1"/>
</Building_YieldChanges>
<!-- 修改类型 每个建筑可以被附加各种不同的属性需要提前声明才能被引用和赋值 -->
<Modifiers>
<!--
ModifierId 建筑属性ID, 每种加成都需要一个特殊的名字
ModifierType 建筑引用类型 这个必须调用游戏已有的建筑类型
OwnerRequirementSetId 指定只有玩家可以使用, AI不可以
-->
<Row>
<ModifierId>YORHA_CORE_FAITH</ModifierId>
<ModifierType>MODIFIER_SINGLE_CITY_ADJUST_CITY_YIELD_MODIFIER</ModifierType>
<OwnerRequirementSetId>PLAYER_IS_HUMAN</OwnerRequirementSetId>
</Row>
</Modifiers>
<!-- 修改参数 引用修改类型并重新赋值 -->
<ModifierArguments>
<!-- 这里是主要修改部分, 其他部分可以不用管, 每一对 Value 标签中的数字可以随便改, 这就是城市的生产资源 -->
<!-- 信仰 -->
<Row>
<!-- 引用 Modifiers 中的名称 -->
<ModifierId>YORHA_CORE_FAITH</ModifierId>
<!-- 生产收益 -->
<Name>Amount</Name>
<!-- 生产信仰 116 -->
<Value>116</Value>
</Row>
<Row>
<!-- 引用 Modifiers 中的名称 -->
<ModifierId>YORHA_CORE_FAITH</ModifierId>
<!-- 生产收益类型名称 -->
<Name>YieldType</Name>
<Value>YIELD_FAITH</Value>
</Row>
</ModifierArguments>
<!-- 建筑类型引用 -->
<BuildingModifiers>
<!-- 建筑类型名称 和 建筑ID名称 -->
<Row>
<BuildingType>BUILDING_YORHA_CORE</BuildingType>
<ModifierId>YORHA_CORE_FAITH</ModifierId>
</Row>
</BuildingModifiers>
</GameData>xxx_Icons.xml这是一个图标引用文件,主要作用是针对这个模组在生产队列中给建筑提供图标
<!-- 图标命名 引用游戏自带图标 26代表工厂建筑图标 -->
<IconDefinitions>
<Row />
</IconDefinitions>xxx_Text.xml这是一个语言文件,当你的游戏主要语言更改时模组会选择一个已提供的语言进行显示,如果没有就默认显示英文(模组默认支持的语种)
<!-- 在游戏中显示的各种名称和解释以及描述, 针对不同的语种 -->
<LocalizedText>
<!-- 英语 -->
<Row Tag="LOC_BUILDING_YORHA_CORE" Language="en_US">
<Text>Core of YoRHa Android</Text>
</Row>
<!-- 韩语 -->
<Row Tag="LOC_BUILDING_YORHA_CORE" Language="ko_KR">
<Text>요르하 안드로이드 코어</Text>
</Row>
<!-- 简体中文 -->
<Row Tag="LOC_BUILDING_YORHA_CORE" Language="zh_CN">
<Text>YoRHa的机器人核心</Text>
</Row>
</LocalizedText>xxx.modinfo这是一个模组创建完成且在发布时所需要填写的信息文件
<!-- 模组唯一ID -->
<Mod id="b630189f-13ab-4eb7-a131-fc4c32625397" version="1">
<!-- 属性 -->
<Properties>
<!-- 模组名称 在构建模组时名称必须为英文, 但是可以用其他文本编辑器更改成中文, 这是我后来汉化的文件 -->
<Name>YoRHa的机器人核心</Name>
<!-- 描述 -->
<Description>
只添加玩家操作建筑。
这个mod是以下mod的集成:
1. 上帝的房子-欺骗Mod由,僵尸马特。
2. 由Surt Ignir Magnis设计的资源生产建筑。
3. 由 阳光下的少年(StringOD) 汉化, 做出大量调整使得玩家在局域网模式下可以更好的发展
</Description>
<!-- 创建编号 -->
<Created>1577944373</Created>
<!-- 概要 -->
<Teaser>
只添加玩家操作建筑。
这个mod是以下mod的集成:
1. 上帝的房子-欺骗Mod由,僵尸马特。
2. 由Surt Ignir Magnis设计的资源生产建筑。
3. 由 阳光下的少年(StringOD) 汉化, 做出大量调整使得玩家在局域网模式下可以更好的发展
</Teaser>
<!-- 作者 -->
<Authors>Unknown Enemy</Authors>
<!-- 感谢名单 -->
<SpecialThanks>L U N A / R \, Zombie Matt, and Surt Ignir Magnis.</SpecialThanks>
<!-- 兼容版本号 -->
<CompatibleVersions>1.2,2.0</CompatibleVersions>
</Properties>
<!-- 依赖关系 -->
<Dependencies>
<!-- 依赖的模组ID和名称 -->
<Mod id="4873eb62-8ccc-4574-b784-dda455e74e68" title="Expansion: Gathering Storm" />
</Dependencies>
<!-- 整个模组所作出的更改将更新到游戏文件中 -->
<InGameActions>
<UpdateDatabase id="Gameplay">
<File>YoRHa_Core_Gameplay.xml</File>
</UpdateDatabase>
<UpdateIcons id="Icons">
<File>YoRHa_Core_Icons.xml</File>
</UpdateIcons>
<UpdateText id="Text">
<File>YoRHa_Core_Text.xml</File>
</UpdateText>
</InGameActions>
<!-- 需要更新的文件 -->
<Files>
<File>YoRHa_Core_Gameplay.xml</File>
<File>YoRHa_Core_Icons.xml</File>
<File>YoRHa_Core_Text.xml</File>
</Files>
</Mod>至此,每个文件的作用以及具体写法已经了解了.
开始编写模组
至此,我们应该已经创建完成了属于我们的第一个模组.
描述需求
添加一个市中心下的建筑,建造成本为 100 金币,每回合生产3文化值,每个回合建筑生产1个点数艺术家,作家,音乐家工程师,城市每回合产出 100 黄金.
编写模组
打开 Solution Explorer 面板时,我们创建的项目下多了两个文件 xxx_Art.xml 直接删掉这个文件,我也不知道这个文件的作用,GettingStarted.html 这个也可以删掉这是一个帮助页面.为了学习别人的模组最好和别人保持一致.
你可能会感到疑惑,为什么没有出现 xxx.modinfo 文件?
我后来生成模组时发现,这是因为这个文件是在后来构建或者运行模组时编译器自动生成的.
xxx_Gameplay.xml 文件代码编写
直接看代码,先把英文注释翻译为中文.
<GameData>
<!-- 几乎所有的游戏类型都应该首先添加到类型表中。 -->
<!-- 这是引用任何类型的主要方式 -->
<Types></Types>
<!--在这里定义建筑。
关于附加属性和价值的例子,请看建筑物。在这个目录下的所有文件中 /Base/Assets/Gameplay/Data/-->
<Buildings></Buildings>
<Building_YieldChanges></Building_YieldChanges>
<Building_GreatPersonPoints></Building_GreatPersonPoints>
</GameData>这里最有意思的就是第三个注释中提供的文件路径,打开资源浏览器找到这个目录..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\Gameplay\Data.
这个目录下有很多的文件都是英文,猜测应该是游戏中每个分类的数据文件.我是说再写模组时想要修改游戏本身的数据就得需要这些文件.还是得先翻译一下这些英文都是什么意思才行.在当前目录下打开命令行
# 输出当前目录所有文件名到 CivFileList.txt
dir /B > CivFileList.txt然后打开 CivFileList.txt 这个文件,拷贝所有英文到 谷歌或其他翻译词典里面翻译.得到中文翻译:
# 部分翻译
Agendas
Barbarians
Behavior Trees
Beliefs
Buildings
议程
野蛮人
行为树
信仰
建筑先用代码编辑器打开一个与我们写模组最有直接关系的文件 Buildings.xml,没了解过 xml 文件的大兄弟,就可以把它当作 HTML 文件一样看待.主要关注标签的译文和标签内的代码,尤其是出现频率最高的单词比如:xxxName, xxxType 之类的.先通读这两千多行代码,主要关注注释和标签内前几行内容,得先知道这个文件整体结构怎么写的.
到这里,已经了解完了这个文件.至少是靠着翻译读了一遍.看这个文件的目的为了能在自己的模组中添加更多的内容.
打开别人的模组 YoRHaCore 中对应的文件 YoRHa_Core_Gameplay.xml 来复制粘贴到我的模组中然后测试运行,看效果.
- 根据
YoRHa_Core_Gameplay.xml复制粘贴的修改城市每回合黄金产量为 116,每回合产出伟人点数 + 1(艺术家,工程师,音乐家,作家),BUILDING_TestCase建筑每回合产出 3 个文化值.
<?xml version="1.0" encoding="utf-8" ?>
<GameData>
<!-- 几乎所有的游戏类型都应该首先添加到类型表中。 -->
<!-- 这是引用任何类型的主要方式 -->
<Types>
<Row Type="BUILDING_TestCase" Kind="KIND_BUILDING" />
</Types>
<!-- 在这里定义建筑。关于附加属性和价值的例子,请看建筑物。都在这个目录下的所有xml文件中 /Base/Assets/Gameplay/Data/-->
<Buildings>
<Row BuildingType="BUILDING_TestCase" />
</Buildings>
<Building_YieldChanges>
<!-- 建筑每回合生产3个文化值 -->
<Row BuildingType="BUILDING_TestCase" YieldType="YIELD_CULTURE" YieldChange="3"/>
</Building_YieldChanges>
<!-- 伟人点数 -->
<Building_GreatPersonPoints>
<!-- 艺术家 -->
<Row BuildingType="BUILDING_TestCase" GreatPersonClassType="GREAT_PERSON_CLASS_ARTIST" PointsPerTurn="1"/>
<!-- 工程师 -->
<Row BuildingType="BUILDING_TestCase" GreatPersonClassType="GREAT_PERSON_CLASS_ENGINEER" PointsPerTurn="1"/>
<!-- 音乐家 -->
<Row BuildingType="BUILDING_TestCase" GreatPersonClassType="GREAT_PERSON_CLASS_MUSICIAN" PointsPerTurn="1"/>
<!-- 作家 -->
<Row BuildingType="BUILDING_TestCase" GreatPersonClassType="GREAT_PERSON_CLASS_WRITER" PointsPerTurn="1"/>
</Building_GreatPersonPoints>
<Modifiers>
<Row>
<!-- 黄金 -->
<ModifierId>YORHA_CORE_GOLD</ModifierId>
<ModifierType>MODIFIER_SINGLE_CITY_ADJUST_CITY_YIELD_MODIFIER</ModifierType>
<OwnerRequirementSetId>PLAYER_IS_HUMAN</OwnerRequirementSetId>
</Row>
</Modifiers>
<ModifierArguments>
<Row>
<ModifierId>YORHA_CORE_GOLD</ModifierId>
<Name>Amount</Name>
<!-- 城市每回合产出黄金数 -->
<Value>116</Value>
</Row>
<Row>
<ModifierId>YORHA_CORE_GOLD</ModifierId>
<Name>YieldType</Name>
<Value>YIELD_GOLD</Value>
</Row>
</ModifierArguments>
<BuildingModifiers>
<Row>
<BuildingType>BUILDING_YORHA_CORE</BuildingType>
<ModifierId>YORHA_CORE_GOLD</ModifierId>
</Row>
</BuildingModifiers>
</GameData>从游戏提供的代码抽取需要的代码到模组中
写到这里你可以看得出每对标签都对应着每一个文件中的内容,比如:..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\Gameplay\Data 目录下的文件 Buildings.xml 对应着代码中的标签 <Buildings></Buildings>,<Modifiers></Modifiers>.
每对标签中对应的代码其实在原始游戏文件中都已经存在,只不过我们是把我们需要的某个文件中的东西拿出来组成一个新的东西.
比如:Buildings.xml 文件中第 380 行中建筑提供每回合的 2 科技值的生产
<!-- 图书馆 生产2科技-->
<Row BuildingType="BUILDING_LIBRARY" YieldType="YIELD_SCIENCE" YieldChange="2"/>在 ModifierArguments 标签中允许修改建筑属性参数,在Buildings.xml的第 879 行中是对金字塔奇观的建造费用调整,这个值可以是任意的某个值.
<Row>
<!-- PYRAMID ADJUST BUILDER CHARGES 金字塔调整建造费 -->
<ModifierId>PYRAMID_ADJUST_BUILDER_CHARGES</ModifierId>
<Name>Amount</Name>
<Value>1</Value>
</Row>示例:在我上文提到的两个模组中,建筑每回合生产都只是写了一个信仰每回合 + 1.
<Building_YieldChanges>
<Row BuildingType="BUILDING_YORHA_CORE" YieldType="YIELD_FAITH" YieldChange="1"/>
</Building_YieldChanges>可以根据收益类型看出,肯定不止有信仰这一种.首先打开最有可能出现的文件 Buildings.xml ,尝试找一下金币,文化,科技的加成.
- 第 338 行,这是一个剧场奇观.每回合 + 2 的文化
<Row BuildingType="BUILDING_AMPHITHEATER" YieldType="YIELD_CULTURE" YieldChange="2"/>- 第 363 行,这是一个银行建筑,每回合 + 5 黄金
<Row BuildingType="BUILDING_BANK" YieldType="YIELD_GOLD" YieldChange="5"/>- 第 380 行,这是一个图书馆,每回合 + 2 科技值
<Row BuildingType="BUILDING_LIBRARY" YieldType="YIELD_SCIENCE" YieldChange="2"/>至此,这个文件下的代码就是把需要的代码添加到我们创建模组中对应的标签下,如果模组中没有对应添加的标签,那就从你抽取的那个代码的文件中把标签照着添加到你的模组中缺少的文件中.不知道你写的对不对就构建运行进游戏看看,有没有生效,如果没有就是你写的有问题.
xxx_Icons.xml 图标文件编写
这个文件默认是不用改的,除非你不想使用默认的图标.
<!--
For simplicity, reuse an existing icon.
为简单起见,重用现有的图标。
-->
<IconDefinitions>
<!--
Name 是建筑显示的图标名称
Atlas 是图标所属建筑
Index 是图标对应所属建筑的序号
26 是工厂的图标
-->
<Row />
</IconDefinitions>这个目录下的所有文件是针对每个分类下的图标显示 ..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\UI\Icons ,这个 Index="26" 的来历,就在这个目录下的 Icons_Buildings.xml 文件中的 第 41 行.
<Row />如果你想使用其他图标你只需要更改的属性,只有两个 Altas 和 Index 务必要保持这两个一致.
你也可以使用其他类型的单位图标,比如不是建筑的图标.
xxx_Text.xml 模组建筑描述文件编写
这个文件主要存放的是建筑的语言信息,看到这里你也发现了.所有的代码都是英文没有包含一个中文.(除注释之外)
<GameData>
<LocalizedText>
<!--
Tag 是建筑的英文名称, 这样方便在模组中的各个文件互相引用
Language 是语言类型
en_US 是(英语)美国
zh_CN 是(简中)中国
ko_KR 是(韩语)韩国
Text 是这个建筑模组在游戏中显示的名称
-->
<Row Tag="LOC_BUILDING_GAME_STUDIO_NAME" Language="en_US">
<Text>在游戏中显示的建筑名称</Text>
</Row>
<Row Tag="LOC_BUILDING_GAME_STUDIO_DESCRIPTION" Language="en_US">
<Text>模组的描述</Text>
</Row>
<Row Tag="LOC_PEDIA_BUILDINGS_PAGE_BUILDING_GAME_STUDIO_CHAPTER_HISTORY_PARA_1" Language="en_US">
<Text>模组的小故事或者说历史背景</Text>
</Row>
</LocalizedText>
</GameData>xxx_modinfo 模组信息文件编写
这个文件不需要自己创建 ,它会由编译器自动生成.
找到菜单栏中的 PROJECT 中的 XXX Properties... 会打开一个界面,选择左侧的 Mod Info 然后填写你的模组名称和描述以及小故事,还有感谢的人.
在选择左侧的 In-Game Actions 你看到了左边显示的三个Type 和三个 Id 选择第一个 Type 中的 UpdataDatabase ID 为 Gameplay ,这时你会看到右侧会显示一个大框里面显示了一个文件 NewBuilding_Gameplay.xml 文件,选中这个文件然后点击右侧的 Remove 然后在选择 Add 在弹出的新窗口中选择 File 列表框中的你模组对应的那个 xxx_Gameplay.xml 文件,然后点击 OK .然后在依次更新 Icons 文件和 Text 文件.
完成之后保存所有文件,至此就可以构建解决方案和模组了,并测试运行了.
生成你的模组
- 菜单栏中选择
BUILD然后选择Build Solution - 菜单栏中选择
BUILD然后选择Build xxxx
此时,你的模组已经成功生成.你可以打开游戏并在"额外内容中启用你的本地模组".
删除你的模组
在调试模组中经常出现问题,所以我们不得不删除解决方案和模组重新生成.
- 菜单栏中选择
BUILD然后选择Clear Solution - 菜单栏中选择
BUILD然后选择Clear xxxx
这只是删除了你生成的模组文件,你的代码并没有被删除.
至此,你已经学会了如何编写你的第一个模组.