四、创建Mod领袖的基础数据(XML基础)

本章节会详细描述Leader(领袖)如何写在XML中,并对每一条属性进行解释。

在项目中部署目录

如果你有读过第三节,你会发现文明6中有诸多数据类型,然而他们大多数也都是由XML组成的,若所有的XML都堆积在一起,会造成一定的混乱,这时我们可以通过在Mod项目中创建文件夹来解决这一问题。

右击Mod项目名称,在弹出的菜单中选择New Folder来创建文件夹
选中文件夹,按F2修改名称,按Delete键删除(文件也可以如此操作)

现在你已经建立好一个文件夹了,我们根据一个Mod的需要还有自己的习惯,来继续建立剩下的内容。

这是建立好的目录结构

这个Mod应该包含领袖与文明的内容,所以我根据我的需要,创建如下结构:

右击对应文件夹即可在该目录中添加新的文件或文件夹
  • Data 数据文件

    • ARX 第三章讲的那个App联动功能,因为官方的ARX就是放在Data目录下,我也就这么放了。

  • GameData 游戏数据文件

    • FrontEnd 游戏开始界面数据文件

    • InGame 游戏运行中的数据文件

  • Localization 游戏语言文件

    • FrontEnd 游戏开始界面所需要的语言文件

    • InGame 游戏运行中所需要的语言文件

你也可以右击文件或文件夹使用菜单中的剪切、复制、删除、重命名

创建并认识数据文件

好了,你已经建立好了文件夹的结构,接下来我们来学习如何向文件夹里面添加一个新的数据文件。

Item就是我们说的文件啦(虽然不叫FIle)

New Item..是创建一个新的文件,我们大多数会使用这个功能,而Existing Item..是添加一个已经存在的文件,我们可以通过这个方式将外部的数据导入其中比如声音、ARX贴图等等……(当然你可以直接把外面的内容拖到对应的文件夹里)。

点击创建新文件菜单后,我们会看到一个添加新文件的向导

通过这个向导,你能看到ModBuddy会有四种文件类型,而这就是制作Mod中非常重要的四种文件格式,我们现在来了解这些都是什么:

  1. Database(SQL):结构化查询语言(Structured Query Language),文明6游戏在运行之后是基于SQLite数据库来存储游戏数据的,所以通过编写这种文件我们可以对游戏中的数据进行增删改查,相较于XML,SQL比较难,但非常灵活,可以实现一些XML不能实现的复杂效果,后面会有案例。(SQLite菜鸟教程)

  2. Database(XML):可扩展标记语言,文明6大部分数据都是存储在XML里的,在游戏运行后,游戏会加载XML并将其转化为SQLite数据库共游戏更快速的搜索查询数据,XML是Mod过程中最简单的内容。(XML菜鸟教程)

  3. Lua Script:Lua语言,通过Lua语言,我们可以直接编写一些编程代码,来实现更加强大复杂的特性与效果,然而Lua也是这里面最难的一部分,因为Lua本身是一门编程语言(Lua菜鸟教程)

  4. Text File:文本文件,就是传统的记事本保存后的文件格式,我们在建立文本文件时可以将后缀改为所需要的文件格式例如ini(在第三章所讲的UpdateAudio需要的soundbank.ini),文本文件还可以记录一些Mod的文字资料和信息,比如readme。

初级Modder注意:应该以UTF-8(8-bit Unicode Transformation Format)编码为准。

我们先从最简单的开始,这里建立一个XML文件,并在Name键入对应的名字,我们需要建立Emiya这个领袖的数据,所以起名叫做FSN_Emiya_Archer_Leader_Data

若不写扩展名,则IDE自动补齐,若写了扩展名,则IDE不做改变直接创建对应文件。

当你创建txt文件时,你可以把后缀改为ini,这样创建的是ini文件,以此类推,若不写后缀名,IDE会自动补齐.txt。(所以可以理解为这四种文件类型本质上是模板)

我们选好了内容并填写好之后,点击Add添加:

如果没有意外,文件会添加到GameData/InGame文件夹下

初步学习XML

恭喜你!在你看了10000多字之后,终于迈向了制作Mod的第一步!

也许你看不懂这个文件,但我现在会为你逐句讲解目前的这几句文件内容,并告诉你如何往里添加新的数据。

<?xml version="1.0" encoding="utf-8"?>
<!-- FSN_Emiya_Archer_Leader_Data -->
<!-- Author: HaoJun0823 -->
<!-- DateCreated: 4/7/2019 1:10:14 AM -->
<GameData>

</GameData>

这是每一个XML被添加时候默认包含的内容,现在我来进行逐行分析:

  • 第1行是每个XML都包含的一句话,请不要修改和移动,应用程序会读取每个XML文件的第一行来判断这个文件的版本(version)和编码格式(encoding),来确保自己能够成功访问。

  • 第2行至第4行是XML被创建时记录的信息,分别是原始文件名称、作者名称和创建日期,如你所见,我们可以通过在<!-- -->里面填写一些内容来实现注释的效果,填写在这里面的内容不会被游戏读取,可以实现提示或者是临时修改的效果。

  • 第5行至第7行为<GameData>标签内容,是所有XML元素的根元素(最上级,可以理解为树的根基),所有的数据都应该写在根元素里面,游戏会读取这里面的数据并进行加载注意每个XML元素的标签都区分大小写,并且以<></>这样成对出现。

科普:<GameData>是Mod中的根元素标签,而官方则是<GameInfo>,我们只需要知道就行了。(有区别但截至2019年4月7日我还不知道)。

若你还不理解上面的这段解释,你可以去上面的菜鸟教程里看一看,或者看一下我下面的这段不严谨的解释,同样,这段代码也可以让你理解一下游戏是怎么读取数据的:

了解XML的基本格式

<游戏数据>
	<单位>
		<行 名称="单位_剑士" 攻击力="35"></行>
		<!-- <行 名称="单位_剑士" 攻击力="35"></行> -->
		<行 名称="单位_弓箭手" 攻击力="60"/>
		<行>
			<名称>单位_枪兵</名称>
			<攻击力>45</攻击力>
		</行>
	</单位>
</游戏数据>

若把上面的内容在详细完善一些,就是Mod中单位如何被添加到游戏中的完美案例了,但是为了方便阅读学习,我删去了部分属性并将其翻译为中文:

  • <游戏数据>就是<GameData>(我翻译成了中文),这就是根元素。

  • <单位>是<游戏数据>的子元素,在单位里,我们会发现有四个<行>元素

  • 第一个<行>元素是基于<></>这种语法实现的,其中包含名称和攻击力两个属性,分别通过=来把数据赋予给这两个属性。

  • 第二个行外层包裹着<!-- -->,所以这是注释,那么就是不会被游戏读取的数据,所以我们不去理他。

  • 第三个行没有</>,不满足我刚才说的那种情况,但实际上这是一种简写,<行 />这种格式也是可以被游戏读取的。

  • 第四个行更加奇怪,和其他不同的是,这里面不包含属性,而是两个和属性相同标签的子元素,这种方式也可以被游戏加载,但是你要注意,这种方式不需要写双引号

科普,字符串一般都有双引号包裹着,<id>"23"</id>这里面的23不是数字,而是字符串,而如果在标签内的属性中写字符串,请使用单引号,如<id=“ ‘23’ ”>(文明6应该不会有这种情况)。

你也得注意,你的代码要有一定的标准,虽然不标准一样可以运行而且不影响效率,但你阅读起来将会十分困难,比如这样:

			<游戏数据><单位>
						<行 名称="测试内容_剑士" 攻击力="35"></行>
						<!-- <行 名称="单位_剑士" 攻击力="35"></行> -->
		<行 名称="啊咧咧_弓箭手" 
		攻击力="60"/>
	<行>			
												<名称>单位_枪兵</名称>
											<攻击力>45</攻击力>
									</行>
</单位>
	
	
</游戏数据>

如此混乱你一定不想看到对吧?所以建议你通过Tab键(长度等同于四个空格)或者是空格键来进行缩进。

当然,你也发现这上面的一些字是有颜色的,我们管这个叫做语法高亮,这绝大多数是证明你写对了的意思,当然也有这种情况:

<游戏数据
	<单位>
		<行 名称=单位_剑士 攻击力=35>/行>
		<!-- <行 名称="单位_剑士" 攻击力="35"></行>
		<行 名称=单位_弓箭手 攻击力="60"/>
		<行>
			<名称>单位_枪兵</名称>
			<攻击力>45</攻击力>
		<行>
	单位
游戏数据>

如你所见,如果一些地方写错了,代码高亮会变得很奇怪,而这段代码缺少了太多的细节,所以是错误的,你只能通过肉眼去修改。

了解Mod是如何载入XML的

现在你明白了这三个单位都有了各自的名称和攻击力,那我再来跟你讲一下这个数据在游戏读取时是如何被载入的。

这个数据应该被加入到InGame的UpdateDatabase动作中(不会请看第三章),我们假定这个动作叫"InGameUnitData",读取顺序属性<LoadOrder>不存在,也不存在任何关联性,这个文件的优先级<Priority>是2。

  1. 游戏被打开,读取FrontEnd的数据。

  2. 游戏配置调整好,也启动了相应的Mod(启动或关闭Mod后游戏会重新读取FrontEnd)。

  3. 游戏开始,加载游戏基础数据。

  4. 游戏加载DLC数据(DLC具有LoadOrder属性)。

  5. 加载所有在FrontEnd被启用的Mod。

  6. 发现这个Mod,读取里面的动作列表。

  7. 发现名为InGameUnitData的UpdateDatabase,游戏认为这里面的文件是游戏数据而不是图标、翻译文件,将遍历里面的文件列表。

  8. 先读取Priority小于2的。

  9. 现在读取这个文件了,游戏直接找到<游戏数据>标签,开始遍历

  10. 发现里面有<单位>,游戏开始搜索自己的数据库,发现了<单位>这张数据表是存在的,开始对应导入。

  11. 游戏发现<单位>标签里面有三行,就会逐行在游戏数据库的<单位>数据表中添加这三行。

  12. 添加若成功检索时没有错误,开始执行下一个文件,若有错误,则尝试回档,若回档失败,则弹出游戏错误提示。

  13. 若上面的过程没有问题,开始读取Prority大于2的内容。

  14. 读取后续的Mod数据。

  15. 游戏数据加载完成,进入游戏。

这下你应该明白游戏为何要把选择界面和游戏进行时分开了吧,因为根据第二点来看,要是把所有数据都加载到一起会引起性能问题。

MOD之间的文件名是可以一样的,不同目录之间的文件名是可以一样的。

这就是文明6如何加载Mod的方式,现在你已经明白这个游戏怎么运作了,接下来,我们该学习如何编写XML了。

编写你的第一个XML

大佬工具-创建新文明

由于大佬工具1.5的存在,我们可以快速的在图形化界面中制作一个领袖,这里我会结合图形化工具和代码来讲解:

大佬工具1.5的初始界面(为什么图标是狗?也许是这是人类最好的朋友?反正是我最好的朋友!)

如你所见这个工具有许多功能,我们会在后面分别讲解,现在我们点击创建新文明。

这是大佬的介绍,1.5版本虽然是测试阶段,但很稳定了。

我们按照大佬的说明点击新建,来选择Leader(还记得我们要做的就是创建领袖吗?)

领袖创建界面的初始界面

大佬工具1.5版本的颜色系统还是风起云涌之前版本的,还是可以用的,还没有新版本的那个颜色多选系统,后面我会讲新版本的颜色系统。

填写你需要的数据(下文我会讲解这些内容的意思),注意右下角那个绿色加号是添加领袖特色的。

截至2019年4月7日我不知道时代文本和同行百分比这两个东西的作用(而且游戏数据里似乎也没使用这两个字段)……知道的大佬告诉我我会补齐,

你会发现我有三个地方是空白的,那些是艺术资源,我们再下面章节再写上,我们现在来点击保存当前按钮,生成代码。

叮~代码生成好了

我们把代码根元素<GameData>中的子元素整个选取复制粘贴到FSN_Emiya_Archer_Leader_Data.xml的<GameData>中。

注意不要把</GameData>覆盖了
带有*的是修改后没保存的文件,你也可以点击这些标签来快速切换文件编辑

现在,我们来逐行分析代码,接下来我会对每一个元素进行讲解,不但会说它们的用途,还有它们的一些注意事项。

<?xml version="1.0" encoding="utf-8"?>
<!-- FSN_Emiya_Archer_Leader_Data -->
<!-- Author: HaoJun0823 -->
<!-- DateCreated: 4/7/2019 1:10:14 AM -->
<GameData>
	<Types>
		<Row Type="LEADER_FSN_ARCHER_EMIYA" Kind="KIND_LEADER"/>
		<Row Type="TRAIT_AGENDA_FSN_ARCHER_EMIYA" Kind="KIND_TRAIT"/>
		<Row Type="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW" Kind="KIND_TRAIT"/>
	</Types>

	<Leaders>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" Name="LOC_LEADER_FSN_ARCHER_EMIYA_NAME" InheritFrom="LEADER_DEFAULT" Sex="Male" SceneLayers="4"/>
	</Leaders>

	<LeaderQuotes>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" Quote="LOC_LEADER_FSN_ARCHER_EMIYA_QUOTE"/>
	</LeaderQuotes>

	<Traits>
		<Row TraitType="TRAIT_AGENDA_FSN_ARCHER_EMIYA" Name="LOC_TRAIT_AGENDA_FSN_ARCHER_EMIYA_NAME" Description="LOC_TRAIT_AGENDA_FSN_ARCHER_EMIYA_DESCRIPTION"/>
		<Row TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW" Name="LOC_TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW_NAME" Description="LOC_LEADER_FSN_ARCHER_EMIYA_UBW_DESCRIPTION"/>
	</Traits>

	<LeaderTraits>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW"/>
	</LeaderTraits>

	<Agendas>
		<Row AgendaType="AGENDA_FSN_ARCHER_EMIYA" Name="LOC_AGENDA_FSN_ARCHER_EMIYA_NAME" Description="LOC_AGENDA_FSN_ARCHER_EMIYA_DESCRIPTION"/>
	</Agendas>

	<HistoricalAgendas>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" AgendaType="AGENDA_FSN_ARCHER_EMIYA"/>
	</HistoricalAgendas>

	<AgendaTraits>
		<Row AgendaType="AGENDA_FSN_ARCHER_EMIYA" TraitType="TRAIT_AGENDA_FSN_ARCHER_EMIYA"/>
	</AgendaTraits>

	<Colors>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_PRIMARY</Type>
			<Color>245,196,96,255</Color>
		</Row>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_SECONDARY</Type>
			<Color>199,16,36,255</Color>
		</Row>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_TEXT</Type>
			<Color>226,228,235,255</Color>
		</Row>
	</Colors>

	<PlayerColors>
		<Row>
			<Type>LEADER_FSN_ARCHER_EMIYA</Type>
			<Usage>Unique</Usage>
			<PrimaryColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_PRIMARY</PrimaryColor>
			<SecondaryColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_SECONDARY</SecondaryColor>
			<TextColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_TEXT</TextColor>
		</Row>
	</PlayerColors>

	<LoadingInfo>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" ForegroundImage="" BackgroundImage="" PlayDawnOfManAudio="1" EraText="LOC_ERA_" LeaderText="LOC_LOADING_INFO_LEADER_FSN_ARCHER_EMIYA"/>
	</LoadingInfo>
	<DiplomacyInfo>
		<Row Type="LEADER_FSN_ARCHER_EMIYA" BackgroundImage=""/>
	</DiplomacyInfo>

</GameData>

这就是刚才大佬工具1.5版本代码生成出来的内容并且粘贴到了FSN_Emiya_Archer_Leader_Data.xml中并且又让我复制出来了,我们先来看第一段:

<Types>与<Row> 类型与行

	<Types>
		<Row Type="LEADER_FSN_ARCHER_EMIYA" Kind="KIND_LEADER"/>
		<Row Type="TRAIT_AGENDA_FSN_ARCHER_EMIYA" Kind="KIND_TRAIT"/>
		<Row Type="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW" Kind="KIND_TRAIT"/>
	</Types>

进阶Modder注意:Types中的Row只应该包含Type和Kind,而Hash是游戏自己生成的。

在文明6中,为了快速确定某一个内容是什么,并且让这个内容的其他数据快速访问,我们需要对这个内容进行标记,例如大佬1.5工具生成的这样。

但是有些内容又不需要标记,比如AGENDA,那我们该如何理解为什么议程不需要标记类型呢?这部分内容会在讲解文明6游戏数据库的时候写。

我们可以看得到,在<Types>这个元素中有三个根元素,都是<Row>,每个包含两个属性,分别是Type和Kind。

Type虽然字面上是类型的意思,但其实可以理解为ID(编码),而KIND则是对应类型,游戏中有大量的类型,例如Building是KIND_BUILDING,UNIT是KIND_UNIT,这些类型可以通过翻查游戏的数据来获得,当然我也提供一个表格方便大家使用。

Kind数据一览

<Row>就是刚才那段中文代码中的<行>,目的是为了让数据库识别,SQLite是关系型数据库,里面的数据表都是一行一行的,就像Excel一样。

<Row>的意思可以理解为添加新的一行,除此之外,还会有<Update><Delete>等标签,这一类稍后会讲。

所以,我们这边可以看得到,现在的<Types>分别是一个领袖和两个特性,而这两个特性分别是议程特性和领袖特性,关于如何制作领袖特性我们稍后再说,现在,我们来继续完善其他内容。

<Leaders> 领袖

	<Leaders>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" Name="LOC_LEADER_FSN_ARCHER_EMIYA_NAME" InheritFrom="LEADER_DEFAULT" Sex="Male" SceneLayers="4"/>
	</Leaders>

领袖特性里的子元素应该有如下内容:

  • LeaderType:如我所说的就像ID一样。

  • Name:这里不是真正的名字,而是一个类似于ID一样,会根据这条进行不同语言的翻译,注意语言相关前缀均为LOC_。

  • InheritFrom:继承于,如果你写的是正常的领袖必填InheritFrom="LEADER_DEFAULT",如果是城邦(没错,城邦也有领袖),你需要绑定其他的,游戏数据有这些信息,资料库中会有这些内容。

  • Sex:性别,"Male"是男,"Female"是女,自己根据需求填写,游戏中一些判断可以通过这个判断。

  • SceneLayers:场景层次,如果是0的话,领袖外交界面背景不会左右移动,游戏官方默认为4。

<LeadersQuotes> 领袖引述

	<LeaderQuotes>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" Quote="LOC_LEADER_FSN_ARCHER_EMIYA_QUOTE"/>
	</LeaderQuotes>

Quote的意思是引言,这里面有一个LeaderType指哪一个领袖要绑定引言,而后面的Quote就是引言对应的文本ID。

Quote可以在文明百科的领袖中看到。

<Traits> 特性

	<Traits>
		<Row TraitType="TRAIT_AGENDA_FSN_ARCHER_EMIYA" Name="LOC_TRAIT_AGENDA_FSN_ARCHER_EMIYA_NAME" Description="LOC_TRAIT_AGENDA_FSN_ARCHER_EMIYA_DESCRIPTION"/>
		<Row TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW" Name="LOC_TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW_NAME" Description="LOC_LEADER_FSN_ARCHER_EMIYA_UBW_DESCRIPTION"/>
	</Traits>

<Traits>如字面意思,就是特性,具有KIND_TRAIT的事物大多数都应该在<Traits>中声明,若没有这一步,Mod加载时会发生错误。

TraitType是指你在Types中声明过的那些内容(注意它们对应的KIND也是KIND_TRAIT),Name是这个特性的名称,而Description就是这个特性的描述,就像我刚才提到的那样,通过UpdateTexts我们可以根据这些文本ID赋予对应的翻译内容。

<LeaderTraits> 领袖特性

	<LeaderTraits>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW"/>
	</LeaderTraits>

当你声明特性之后,你需要声明把特性和领袖绑起来才可以让领袖使用这个特性,LeaderType是你想要绑定的领袖,TraitType是你想为这个领袖所绑定的特性ID。

每个领袖特性可以绑定多个Trait,但你需要注意的是,你必须写两行,就像下面这样:

	<LeaderTraits>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW"/>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" TraitType="TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW2"/>
		</LeaderTraits>

而且你不能保证它们的TraitType是重复的,注意数字是可以写在ID中的。

如果你添加了新的TraitType而还没有声明的话,请一定要记得修改<Traits>和<Types>。

如果<Traits>和<LeaderTraits>这种互相具有依赖关系的内容请按顺序写,如果写反了<LeaderTraits>很可能找不到<Traits>造成游戏加载错误。

<Agendas> 议程

	<Agendas>
		<Row AgendaType="AGENDA_FSN_ARCHER_EMIYA" Name="LOC_AGENDA_FSN_ARCHER_EMIYA_NAME" Description="LOC_AGENDA_FSN_ARCHER_EMIYA_DESCRIPTION"/>
	</Agendas>

议程你可以理解为AI,比如核弹狂等等,可以让领袖有一定的倾向。

一般来说每个领袖都有一个固定的性格议程(如吉尔伽美什的恩奇都联盟),和几个随机的额外的议程(比如倾向科学发展、倾向文化发展、倾向造奇观)等等,玩家只有满足AI领袖的要求,才能够和他们搞好关系,否则的话AI会谴责你,当然,部分倾向也会影响AI的发展策略。

这也是6代宣传所说的提高AI多样性的方式。

在游戏对应领袖的外交界面中可以看到。

议程不需要在<Types>中声明,每个新议程应该有两个属性,一个是AgendaType,是这个议程的ID,另外一个是Name,是这个议程的名称。

核弹狂这个特性每局游戏只可能出现1次,而甘地几率很大,若甘地没有得到,其他领袖也可能得到,没有这个特性的不会使用核弹。

<HistoricalAgendas> 史实议程

	<HistoricalAgendas>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" AgendaType="AGENDA_FSN_ARCHER_EMIYA"/>
	</HistoricalAgendas>

LeaderType是领袖ID,而AgendaType是你想为领袖绑定的议程。

<AgendaTraits> 议程特性

	<AgendaTraits>
		<Row AgendaType="AGENDA_FSN_ARCHER_EMIYA" TraitType="TRAIT_AGENDA_FSN_ARCHER_EMIYA"/>
	</AgendaTraits>

为了实现议程是如何根据某些条件生效的,所以我们把议程也当作一个特性来看待,每个议程可以绑定多个特性(就像我刚才在领袖特性说的那样)。

AgendaType是议程ID,TraitType是特性Id,每个议程不能重复绑定同一个特性Id,而议程之间没有这一规定,可以重复使用同一个特性。

<FavoredReligions> 信仰倾向

在百科中,每个领袖都会有自己的信仰,这个元素没有在大佬工具1.5中体现,你可以手动添加,AI会第一时间信仰这里面的信仰,而每个领袖只能有一个信仰倾向。

	<FavoredReligions>
		<Row LeaderType="LEADER_CHARLEMAGNE_SABER" ReligionType="RELIGION_CATHOLICISM"/>
	</FavoredReligions>

这是查理曼的代码,默认信仰是天主教,AI会在第一时间信仰该宗教,如果没有再选择其他的,

请注意,每个领袖只能有一条。

<Colors> 颜色

就像我上面说的那样,每个领袖有一个固定议程,所以你必须为你的领袖绑定一个,如果你没有,游戏也可以运行,因为领袖的议程不是必须存在的。

	<Colors>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_PRIMARY</Type>
			<Color>245,196,96,255</Color>
		</Row>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_SECONDARY</Type>
			<Color>199,16,36,255</Color>
		</Row>
		<Row>
			<Type>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_TEXT</Type>
			<Color>226,228,235,255</Color>
		</Row>
	</Colors>

文明6的颜色系统采用的是RGBA(红、绿、蓝、透明度)这四个属性,每个属性都是从(0-255)之间取值,你可以理解为255就是对应颜色或透明度的100%,0就是0%,你可以从网上取色然后填写颜色。

颜色不需要声明<Types>,每一个<Row>应当有Type和Color这两个属性,Type是指颜色的Id(唯一性),而Color就是我刚才说的RGBA的四个数值,用英文的逗号分隔(中文逗号:,英文逗号,)请注意区别。

这里面的三个颜色分别对应领袖的主要颜色(图标的图案颜色),次要颜色(图标的背景)和聊天颜色(多人联机领袖之间的聊天颜色是有区别的)。

注意,文明6的颜色可以写最大100%的小数,例如0.1,0.45,0.39,1这样,但这很反人类,就不要用了。

科普:文明5也用这样的颜色系统,直接复制过去完全可以用。

<PlayerColors> 玩家颜色

七、新的颜色系统
	<PlayerColors>
		<Row>
			<Type>LEADER_FSN_ARCHER_EMIYA</Type>
			<Usage>Unique</Usage>
			<PrimaryColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_PRIMARY</PrimaryColor>
			<SecondaryColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_SECONDARY</SecondaryColor>
			<TextColor>COLOR_PLAYER_LEADER_FSN_ARCHER_EMIYA_TEXT</TextColor>
		</Row>
	</PlayerColors>

你有了颜色,就需要给领袖绑定颜色,在<PlayerColors>中,每一个<Row>大致上都应该有以上几个属性,注意城邦也是有颜色的,但是城邦无法被玩家选择,所以没有TextColor这个属性。

Type是领袖ID,而Usage是指是否具有唯一性(你不希望你的颜色给其他人用吧?)所以请填写Unique,而PrimaryColor就是指图标的图案颜色(比如勇士的棒子),SecondaryColor是指图标的底色,TextColor是指这个领袖在多人模式文字聊天时候的颜色。

文明5的Primary和Secondary是反过来的。

<LoadingInfo> 加载信息

	<LoadingInfo>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" ForegroundImage="" BackgroundImage="" PlayDawnOfManAudio="1" EraText="LOC_ERA_" LeaderText="LOC_LOADING_INFO_LEADER_FSN_ARCHER_EMIYA"/>
	</LoadingInfo>

加载信息是指领袖在加载界面过程中的一些内容。

加载界面如你所见,也和游戏中的外交界面一样,但为了节省资源,实际上这些内容都是贴图,和游戏中的大有差别。

LeaderType是指领袖的Id,而后面的ForegroundImage是领袖的图片(前景图),BackgroundImage是领袖的背景图片,这里应该填写dds的Id或者dds的文件名。

PlayDawnOfManAudio只有两个属性,一个是0一个是1,如果为1则播放最开始的那段时代声音。(从水下第一个生命开始……)。

EraText请删除,官方也没有使用,我们也就不要保留了。

LeaderText是领袖的介绍文本,就是在加载界面下半部分的那段(秦始皇!……但愿您的人民手上永远没有水泡……)。

我们去掉EraText后应该如下:

	<LoadingInfo>
		<Row LeaderType="LEADER_FSN_ARCHER_EMIYA" ForegroundImage="" BackgroundImage="" PlayDawnOfManAudio="1" LeaderText="LOC_LOADING_INFO_LEADER_FSN_ARCHER_EMIYA"/>
	</LoadingInfo>

<DiplomacyInfo> 外交信息

	<DiplomacyInfo>
		<Row Type="LEADER_FSN_ARCHER_EMIYA" BackgroundImage=""/>
	</DiplomacyInfo>

外交信息是指游戏在游戏外交界面中的一些内容,如你所见,目前这里面只有两个属性。

第一个是Type,指的就是LeaderType,而后面的BackgroundImage就是背景图,是指外交界面领袖应该显示的背景图片。

关于贴图怎么加载到游戏中,以及他们的尺寸,请看后续章节。

至此,领袖所有初始内容都解释完毕并且也完成了。

现在!运行你的Mod!

啥?你开玩笑呢?

我没有!我不是!

事实上由于文明6系统的适应性比较好,不需要写完全部内容就可以加载到游戏中。

我之所以写这一部分,是让你感受一下你成功的果实。

科学调查来说(我的调查),如果一味的学习却看不到成功的果实,人会很疲倦的。

那么接下来,我们就去完成这个Mod的Config,也就是FrontEnd部分,通过FrontEnd,Mod才可以被加载。

还有一个新的领袖需要手动修改civ6proj的一些内容,我也会讲述,如果你忘记怎么手动修改civ6proj,请你看第三章:

三、创建一个项目并配置civ6proj文件

创建Config.xml

我们在GameData下面的FrontEnd中创建一个新的Xml FSN_Emiya_Archer_Config.xml,如果你忘记了,请你返回上面去看。

然后我们打开大佬工具1.5,在创建新文明的新建里点击Config。

这些都是留给你去写的

你可能会一脸懵逼,但是我现在要告诉你怎么去搞定这些内容。

你知道的,在文明6里,每个文明都有一位领袖,而每个领袖也必须有一个文明来进行游戏。

这里就是绑定文明和领袖之间关系的方式,通过这种方式,我们可以为文明快速绑定不同的领袖,从此不需要写更多的内容。

我现在就来演示一下如何让Emiya这个领袖的文明是日本。

但首先你需要在你刚才的领袖Xml(教程里是FSN_Emiya_Archer_Leader_Data.xml加上这样一个内容:

<CivilizationLeaders> 文明与领袖

	<CivilizationLeaders>
		<Row CivilizationType="CIVILIZATION_JAPAN" LeaderType="LEADER_FSN_ARCHER_EMIYA" CapitalName="LOC_CITY_NAME_EMIYA_FUYUKI"/>
	</CivilizationLeaders>

从这里开始,我就不强调格式问题了,因为所有的问题在这之前都讲的很明白了。

这一步是告诉游戏InGame中的文明和领袖之间的关系。

其中有三个属性,第一个是CivilizationType,这里是文明的Id,第二个是LeaderType,是领袖的Id,第三个是这个领袖的首都名称的文本Id。

每一个领袖的首都名称都可以通过这是方式赋予一个独一无二的名称,当然,领袖的首都名字如果你翻译成和游戏里或者其他Mod一样的,那也仍然是独一无二的,这是为什么呢?

你叫张三,

他也叫张三,

你俩名字一样,但不是同一个人。

一个文明可以绑定多个不重复的领袖(多个<Row>),如果你不明白,看我对于<LeaderTraits>的那段描述。

大佬工具-创建Config

这是我根据官方日本抄过来的内容

不要着急点击生成按钮,因为你这样写只会在生成一个原版游戏的日本,我们现在去把Emiya的内容添加进去来替换北条。

ICON是图标的意思,就先用北条的吧。(展示项目里的请先删掉)

如你所见,我已经根据刚才写的<Leaders>和<LeaderTraits>中的内容替换了领袖、领袖名称、领袖技能名和领袖技能说明。

现在你应该发现了另外一种出现了许多次的前缀,ICON_,这是游戏图标的ID,和文本ID一样,我们可以为游戏图标附上不同的贴图来实现游戏通过ID调用图标。

附上贴图不在这一章讲,因为这一部分是艺术资源。

现在我们点击保存当前。

密密麻麻?不要担心,这是官方复读机

我们和刚才一样,复制这些内容到FSN_Emiya_Archer_Config.xml中。

很长?不要担心。

<Players> 玩家

	<Players>
		<Row CivilizationAbilityDescription="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_DESCRIPTION" CivilizationAbilityIcon="ICON_CIVILIZATION_JAPAN" CivilizationAbilityName="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_NAME" CivilizationIcon="ICON_CIVILIZATION_JAPAN" CivilizationName="LOC_CIVILIZATION_JAPAN_NAME" CivilizationType="CIVILIZATION_JAPAN" LeaderAbilityDescription="LOC_LEADER_FSN_ARCHER_EMIYA_UBW_DESCRIPTION" LeaderAbilityIcon="ICON_LEADER_HOJO" LeaderAbilityName="LOC_TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW_NAME" LeaderIcon="ICON_LEADER_HOJO" LeaderName="LOC_LEADER_FSN_ARCHER_EMIYA_NAME" LeaderType="LEADER_FSN_ARCHER_EMIYA" Portrait=""/>
		<!-- Expansion 1 Support -->
		<Row CivilizationAbilityDescription="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_DESCRIPTION" CivilizationAbilityIcon="ICON_CIVILIZATION_JAPAN" CivilizationAbilityName="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_NAME" CivilizationIcon="ICON_CIVILIZATION_JAPAN" CivilizationName="LOC_CIVILIZATION_JAPAN_NAME" CivilizationType="CIVILIZATION_JAPAN" LeaderAbilityDescription="LOC_LEADER_FSN_ARCHER_EMIYA_UBW_DESCRIPTION" LeaderAbilityIcon="ICON_LEADER_HOJO" LeaderAbilityName="LOC_TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW_NAME" LeaderIcon="ICON_LEADER_HOJO" LeaderName="LOC_LEADER_FSN_ARCHER_EMIYA_NAME" LeaderType="LEADER_FSN_ARCHER_EMIYA" Portrait="" Domain="Players:Expansion1_Players"/>
		<!-- Expansion 2 Support -->
		<Row CivilizationAbilityDescription="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_DESCRIPTION" CivilizationAbilityIcon="ICON_CIVILIZATION_JAPAN" CivilizationAbilityName="LOC_TRAIT_CIVILIZATION_ADJACENT_DISTRICTS_NAME" CivilizationIcon="ICON_CIVILIZATION_JAPAN" CivilizationName="LOC_CIVILIZATION_JAPAN_NAME" CivilizationType="CIVILIZATION_JAPAN" LeaderAbilityDescription="LOC_LEADER_FSN_ARCHER_EMIYA_UBW_DESCRIPTION" LeaderAbilityIcon="ICON_LEADER_HOJO" LeaderAbilityName="LOC_TRAIT_LEADER_FSN_ARCHER_EMIYA_UBW_NAME" LeaderIcon="ICON_LEADER_HOJO" LeaderName="LOC_LEADER_FSN_ARCHER_EMIYA_NAME" LeaderType="LEADER_FSN_ARCHER_EMIYA" Portrait="" Domain="Players:Expansion2_Players"/>
	</Players>

游戏通过读取<Players>来获取玩家的数据信息,注意这一部分不应该和FSN_Emiya_Archer_Leader_Data.xml写在一起,为什么?因为这是FrontEnd需要的数据,如果你写在InGame的文件中,那加载是不会通过的。

我们继续和刚才一样逐条分析:

  • CivilizationAbilityDescription:文明主要技能的描述。

  • CivilizationAbilityIcon:文明主要技能的图标。

  • CivilizationAbilityName:文明主要技能的名称。

  • CivilizationIcon:文明的图标。

  • CivilizationName:文明的名称。

  • CivilizationType:文明的ID(和领袖ID一样,文明也有ID)。

  • LeaderAbilityDescription:领袖主要技能说明。

  • LeaderAbilityIcon:领袖主要技能的图标。

  • LeaderAbilityName:领袖主要技能的名称。

  • LeaderIcon:领袖的图标。

  • LeaderName:领袖的名称。

  • LeaderType:领袖ID(这就不做多解释了)。

  • Portrait:领袖的肖像(选择领袖界面左侧人物形象就是这个)。

  • Domain:作用域,是说这个领袖可以在哪几个场景或者资料片中被选择。

    • 原版游戏没有Domain。

    • Players:Expansion1_Players这是迭起兴衰的Domain

    • Players:Expansion2_Players这是风气云涌的Domain。

    • (进阶)游戏中的场景战役有着不同的Domain,具体可以打开游戏场景战役中的Xml文件来看。

好了,我现在已经都写清楚了,所有描述和名称和文本有关,前缀是LOC_,所有图标和贴图有关,前缀是ICON_,注意领袖肖像本质也是艺术资源,但它不是贴图,所以不遵守ICON_命名规则。

这三行的内容分别是原版、资料片1、资料片2的选择。

如果你仔细的观察的话,你会发现,在原版游戏里,原版、资料片1、资料片2选择的某些领袖特性是不一样的,因为每个资料片官方都要对领袖进行微调。

所以,他们之间的区别就是通过<Players>来告诉玩家的,但实际上区别还是在InGame中实现的,这个我们稍后再讲。

现在我们来看另外一个内容:

<PlayerItems> 玩家项

	<PlayerItems>
		<Row CivilizationType="CIVILIZATION_JAPAN" LeaderType="LEADER_FSN_ARCHER_EMIYA" Type="" Name="" Description="" Icon="" SortIndex="10"/>
		<!-- Expansion 1 Support -->
		<Row Domain="Players:Expansion1_Players" CivilizationType="CIVILIZATION_JAPAN" LeaderType="LEADER_FSN_ARCHER_EMIYA" Type="" Name="" Description="" Icon="" SortIndex="10"/>
		<!-- Expansion 2 Support -->
		<Row Domain="Players:Expansion2_Players" CivilizationType="CIVILIZATION_JAPAN" LeaderType="LEADER_FSN_ARCHER_EMIYA" Type="" Name="" Description="" Icon="" SortIndex="10"/>
	</PlayerItems>

玩家项是指右侧那些特色单位、特色建筑、特色改良的内容,通过<PlayerItems>被加载。

  • 和<Players>一样的内容:

    • CivilizationType

    • LeaderType

    • Domain

  • Name:这个内容的名称

  • Description:这个内容的说明

  • Icon:这个内容的展示图标

  • Type:这个内容是什么?单位?建筑?改良?直接写对应的ID就行了。

  • SortIndex:每个项之间间隔固定为10,最小的在最上面,最大的在最下面,以此升序。

但是我们目前没有做这部分的内容,所以我们先删掉或注释这部分内容,防止游戏出错。

至此,你的Config算是写完了。

LeaderCriteria 领袖认证

这是一个新加的特性,在某个更新中,因为这个特性的出现许多Mod都不能用了。

如果不做这一步,游戏开始后会提示加载失败。

修改这个需要在civ6proj中进行,图形化界面也可以,但我觉得那样比较复杂(实际上是为了学习),所以我们还是通过代码方式进行修改。

快速打开Mod项目的目录

我们可以通过这种方式打开Mod项目的目录(Open Folder in File Explorer)

还记得这个文件吗?
用Sublime Text打开后应该是这个样子的

我们需要添加的是<ActionCriteriaData>这个标签,添加在<PropertyGroup>里面。

	<ActionCriteriaData><![CDATA[<ActionCriteria><Criteria id="LeaderCriteria"><LeaderPlayable>Players:StandardPlayers::LEADER_FSN_ARCHER_EMIYA,Players:Expansion1_Players::LEADER_FSN_ARCHER_EMIYA,Players:Expansion2_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable></Criteria><Criteria id="LeaderCriteria_Expansion1"><LeaderPlayable>Players:Expansion1_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable><RuleSetInUse>RULESET_EXPANSION_1</RuleSetInUse></Criteria><Criteria id="LeaderCriteria_Expansion2"><LeaderPlayable>Players:Expansion2_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable><RuleSetInUse>RULESET_EXPANSION_2</RuleSetInUse></Criteria></ActionCriteria>]]></ActionCriteriaData>

2019年8月30日:修正StandardPlayers::为Players:StandardPlayers::,虽然没有Players:不会影响读取,但是官方最新标准为Players:StandardPlayers::

就像这样

注意,这可不算结束,你还得把里面的领袖ID修改成你Mod的领袖ID。

如果你迷茫的话,请看我下面的解释:

<Criteria id="LeaderCriteria"><LeaderPlayable>Players:StandardPlayers::LEADER_FSN_ARCHER_EMIYA,Players:Expansion1_Players::LEADER_FSN_ARCHER_EMIYA,Players:Expansion2_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable></Criteria>

在<LeaderPlayerable>中我们可以看得到是一些格式比较混乱,用逗号所分隔的文本。

LEADER_FSN_ARCHER_EMIYA就是我们刚才声明的LeaderType。

Players:StandardPlayers::是指标准游戏,不包含DLC的。

而剩下的两个分别是DLC1和DLC2。

每个认证声明之间用逗号分隔。

这些内容都被包括在了<Criteria>这个标签中,所以他们是一体的。

这个名为LeaderCriteria的认证包括允许ID为LEADER_FSN_ARCHER_EMIYA在原版、资料片1、资料片2中运行。

所以我们需要这一步来实现游戏加载这位领袖。

但我后面还写了两个内容:

你可以替换里面的五个LEADER_FSN_ARCHER_EMIYA为你的领袖ID来快速完成。

如果你的Mod有多个领袖,

Players:StandardPlayers::LEADER_XXX,Players:StandardPlayers::LEADER_YYY

这样就可以了,而不是直接在Players:StandardPlayers::里面写逗号然后写新的领袖ID(我没这样过,但不知道实际是否也可以运行)。

<Criteria id="LeaderCriteria_Expansion1"><LeaderPlayable>Players:Expansion1_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable><RuleSetInUse>RULESET_EXPANSION_1</RuleSetInUse></Criteria><Criteria id="LeaderCriteria_Expansion2"><LeaderPlayable>Players:Expansion2_Players::LEADER_FSN_ARCHER_EMIYA</LeaderPlayable><RuleSetInUse>RULESET_EXPANSION_2</RuleSetInUse></Criteria>

这与刚才不同的是,里面包含了<RuleSetInUse>这个标签,

而这两个认证分别是RULESET_EXPANSION_1和RULESET_EXPANSION_2,并且它们前面的<LeaderPlayable>也是DLC1和DLC2的关键字。

这个作用是什么呢?

是指有这两个认证的Action只会在对应的DLC被加载时生效。

你不希望你的原版游戏因为加载了一个DLC数据而发生游戏错误吧?

所以官方也是用这个方式来让不同的效果在不同的DLC中实现,通过这个效果,我们可以让Mod只在有DLC1的时候加载DLC1的领袖文件,在DLC2的时候加载DLC2的领袖文件,从而实现一个Mod兼容所有版本。

在第三章,我也讲过了认证是怎么工作的,如果你现在好奇,你也可以返回去看一看。

你现在不理解没关系,我们在后面会有更实际的例子。

我们现在通过Notepad++(或者你的编辑器)保存这个文件,然后返回ModBuddy。

好了,现在,我们开始添加Action。

按Reload即可刷新

(不推荐)通过ModBuddy 添加LeaderCriteria

大致上是这么个步骤……不过添加进去之后会崩溃

添加Action

你不会吗?看一眼第三章,注意*是说没保存,Ctrl+S快速保存

因为我在第三章的时候已经添加了这些Action,所以我们可以直接添加文件了。

这个我没有展示添加步骤,但是我写了添加的方法,请自行添加,并遵循第三章的添加命名规则。

三、创建一个项目并配置civ6proj文件

我们先在FrontEnd的UpdateDatabase中添加Config文件。(EmiyaPreData)

然后在InGame的UpdateDatabase中添加Leader_Data文件。(EmiyaInGameData)

添加之后是这个样子

注意,我们还要为InGame添加认证,也就是Criteria。

你会发现我们所写的三个认证数据已经存在了

因为是基础数据(原版),我们选择第一个。

依次从左到右Edit,却发现从第三个窗口和第二个窗口之间不太匹配(而且也没有我们写的内容)

请再三确认文件是否和动作关联正确

编译Mod

好了,你已经搞定一切了。

这就是一个风起云涌版本的Mod了!

当然如果你是原版,请删除风起云涌的那条DLC关联。

点击Remove,就不需要这个DLC存在了。

都没有问题了吗?现在别急着打开游戏,我们先让ModBuddy把项目转化为Mod。

Build是创建,Clean是清除原来创建的,Rebuild是先清除后创建

我们点击Build或者ReBuild。

建议Rebuild实时刷新Mod。

看!Succeeded!

OK,现在你的Mod已经成功被创建了!

Mod文件夹中也出现了

运行Mod

我们打开游戏,找到模组管理器。

默认会被启动的
如果你看得到这个,说明你Config写对了。

看见这个北条了吗?因为我们用的是他的ICON,所以自然会显示这个。

但是,LOC_已经是Emiya的了,证明我们刚才的内容是正确的。

现在,就算是没做完,你也可以点击开始。

加载界面
开始游戏界面

恭喜你!你可以进行下一章了!

疑难解答

Mod提示不兼容

Mod Info勾选对应版本

游戏加载出错

是InGame的Xml或者Criteria错了,具体的也可以查看log。

大佬工具1.5的工具菜单里可以看Log

如何看我会单独写的。

选择界面找不到领袖

看你的Action和Config是不是写错了。

Last updated

Was this helpful?