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

## 创建一个新项目

我们要知道，每一个Mod都是一个项目，所以创建新项目是开始写一个Mod的第一步。

![](/files/-LbbG1YgX3eqWIWV_pjx)

{% hint style="info" %}
Starter相关的是官方的Mod样例项目，其中包含每种类型的基本代码。
{% endhint %}

{% hint style="danger" %}
注意这两步名称内不应该包括奇特的字符，例如/ \* \ ? 等等不满足文件命名要求的，会造成编译出错等奇特问题（而且不好修复）。
{% endhint %}

我们选择对应DLC的空MOD(Empty Mod，后面小括号内是DLC版本)，在Name中填写上Mod的项目名称，点击OK。

![Mod的基本信息](/files/-LbbGRS7o7wCdRBfJUR3)

当我们点击OK后，会弹出创建新Mod步骤1的窗口，我们需要根据文本框依次填写标题、作者、特别感谢、描述等内容，当然，不填写也可以在项目中修改。

{% hint style="warning" %}
Description（描述）有最小字数限制，若不满足条件则无法点击其他按钮和控件。
{% endhint %}

{% hint style="warning" %}
这里不建议填写中文，若需要中文后续再改（部分字段涉及到项目的初次生成）。
{% endhint %}

**新人强烈建议确定Title！！！原因如下：（看不懂也没关系，后面会讲）。**

{% hint style="danger" %}
进阶Modder注意：Mod.Art.xml的\<id>\<name>会根据这里的Title生成。
{% endhint %}

## 初识项目管理器

![项目管理器可以管理Mod项目文件](/files/-LbbIQquZpAx3dfNBcny)

{% hint style="info" %}
进阶Modder注意：老版本的art.xml生成会是mod.art.xml，新版本空格都会变成\_，建议手动纠正xml中的\<id>\<name>中的\_为空格（xml中可以写空格，与Modding.log日志有关）
{% endhint %}

**Fate\_Stay\_Night\_\_\_Emiya.Art.xml** 是空项目自动生成的文件，用于控制游戏如何载入Mod相关的模型音效等多媒体素材。（老版本是Mod.art.xml，新版本似乎会与项目名称一致）。

我们将在稍后讲述关于art.xml的事情，现在把重点放在本章主题：配置civ6proj。

## civ6proj图形化配置

civ6proj实际上是转化为modinfo之前的文件，不会在项目管理器中作为文件显现，因为其中绝大多数内容都会出现在图形化的配置页面当中，但你仍然需要了解如何手动修改这个文件，我们先来看看如何打开图形化界面。

![当你右击白色文件的时候，会弹出一个重要的对话框，我们先点击Properties](/files/-LbbLpbaX7VOfhO-8kaG)

### Mod基本信息配置

通过这一步，我们的工作区会弹出如下内容：

![这是Mod配置的主要界面，左侧为项目，右侧为内容](/files/-LbbM-hZ4j6yyb_Diq8e)

我们先来看Mod Info：

* Mod ID:这里是一个 [UUID](https://baike.baidu.com/item/UUID/5921266?fr=aladdin) 通用唯一识别码（Universally Unique Identifier）,不建议修改（因为已经是唯一的），**关系到Mod和DLC之间的执行关系和游戏资源的加载**，若New之后，必须将Art.xml中的一并修改（Art.xml中UUID的与这里必须一致）。
* Version:这里指Mod版本，意思为你下一次发布的Mod的版本是什么，我们可以利用这个实现一些**Mod和DLC之间版本的控制**等等。
* Mod Name:这是Mod名称，在游戏中会显示。
* Author:这是作者。
* Special Thanks：特别感谢。
* Homepage:这是Mod作者的相关主页，可以填写你的Steam个人主页。
* Teaser:当你打开游戏中的Mod管理器，鼠标在Mod名称上停留（可以开关的那块区域），会提示这个。
* Description:Mod的描述。
* Compatibility:这是兼容性
  * Single Player:支持单机游戏，可在单机中运行。
  * Hot Seat:支持热座游戏，可在热座中运行。
  * Network Multiplayer:支持网络游戏，可在网络中运行。
  * 若以上几项为否，则不能再对应的游戏中运行。
* Saved Games: 游戏存档相关。
  * Affects Saved Games 是否影响游戏存档，如果Mod是修改了UI等内容，可以不勾选，因为不会有新的数据添加到游戏中，这样UI Mod关闭后，存档也可以被游戏载入，反之不行。
* Compatible Versions：版本兼容性，不勾选对应的版本在Mod管理器中提示版本不兼容。
  * Gathering Storm：是否支持风起云涌。
  * Rise and Fall - Spring Update:是否支持迭起兴衰 春季更新

{% hint style="warning" %}
Homepage会自动填充http\://，但不识别https\://，解决方案1.手动改civ6proj，解决方案2：把URL复制进去不要点其他地方，ctrl+s保存然后快速关闭图形化配置界面再打开。
{% endhint %}

### ​Mod自定义数据配置

![基本可以无视，极特殊情况使用](/files/-LbbQ3eGTvguBvGUx9Zk)

自定义配置内容，很少会使用，这里不详细描述，键值对形式，在civ6proj以xml形式存储。

{% hint style="info" %}
键值对是指 Key-Value，通过对应的Key我们可以访问到对应的Value，例如：

Key:Min Value:1 | Key:Max Value:10

这样，程序通过访问Min和Max即可得到相应的数据。
{% endhint %}

### Mod依赖项和关联项配置

![Mod加载依赖项管理](/files/-LbbQp77p2v64mEviF0U)

这里面有三大文本框，分别为 Dependencies References Blocks。

* Dependencies:依赖项，如图所示，其中依赖了风起云涌这个DLC，没有这个DLC无法在游戏中激活该Mod。
* References:引用项，是一种“不严格”的依赖项，即便相关内容没启用Mod也可以运行。
* Blocks：禁用项，若某个Mod或者DLC开启，该Mod无法被启用。

Type是类型，Name是名称，接下来，我们将讲述三个列表那三个相同按钮（名字一样的都是一样的）。

![Add Mod...会弹出的菜单](/files/-LbbSMN2umcADwC4lVBA)

* Mod Title:对应Mod的标题，在游戏Mod管理器中显示。
* Mod Id:对应Mod的UUID，这里必须填写一致，在游戏过程中被处理识别。
* From Version & To Version:开始和结束版本，这里是一个区间，只有处于这个版本号的Mod才会被影响，除此之外不影响，可以阻止一些老旧Mod不兼容导致的Bug，又或者是你不想让两个Mod同时被启用（这里指用于Blocks时）。

![Add DLC..会弹出的菜单](/files/-LbbTcjgtvz8FmLISzsZ)

官方很良心的把每个DLC的Name和Id都写在里面了，所以我们只需要在上面的下拉菜单中选择对应的DLC即可。

{% hint style="info" %}
官方的叫Package，我们的叫Mod。
{% endhint %}

若添加错误可以选中对应条目之后变蓝按Remove键移除。

### Mod数据内容和文件加载配置

{% hint style="info" %}
FrontEnd是指你打开文明6到没有点击开始游戏的这段时间。

In-Game是你进入游戏后的时间。（从点击按钮之后黑屏时显示载入中就已经是了）。
{% endhint %}

![FrontEnd时Mod如何被载入](/files/-LbbVG-U6AGe4IaPHRfi)

这是重点，所以要仔细看，一句话都不要落下。

我们先看最左侧的Action（动作）旁边的列表框。\
Type：是类型，可以出现多个相同的（在InGame中比较有用），我会详细讲述有哪几种类型，而ID则是相关动作的名字，在日志中会有体现，似乎FrontEnd和InGame之间可以重复，Mod与Mod之间可以重复。

{% hint style="info" %}
这里的Emiya Pre Art可以理解为 卫宫 预加载 美术资源，我都说这么命名的。

EmiyaInGameDataEP1 卫宫 游戏中 数据 资料片1

统一的命名方便后续DEBUG（查找漏洞）。
{% endhint %}

截至2019年4月4日，包括所有官方内容，共有以下几种Action Type：

* AddMap：添加地图，只有把做好的地图通过这个方式加入到游戏中才可以被读取，应该是MAP格式。
* AddWorldBuilderMap：类似于盘古大陆、岛屿那样的东西？相关文件被载入就可以在游戏中动态生成，也许包含XML，SQL，LUA，MAP格式。
* ImportFiles：导入文件，部分文件是通过中继调用的，所以要把部分文件导入到游戏中让游戏读取。
* UpdateArt：这里只应该有一项内容，就是(Mod Art Dependency File)，这个是Art.xml的代词，等同于Art.xml，而Art.xml也只应该在这里被载入，绝大多数情况下不需要有第二个UpdateArt。
* UpdateColors：风起云涌后的新功能，把InGame的颜色改到了FrontEnd（这样玩家可以在开始的时候修改自己图标配色），即便如此原来的颜色系统（老版本的UpdateDatabase-InGame方案）也可以正常工作，风起云涌更新前（我是指风起云涌这次版本而不是DLC），无法被正常使用（大多数影响盗版，因为正版就是最新版），只应该有XML和SQL。
* UpdateDatabase:主要数据内容，凡是涉及到游戏中的数据（战斗力、生产、科技树）等等内容，都会通过这个动作被更新，在FrontEnd里用于注册Mod在FrontEnd时期的工作内容，例如领袖的选择界面，只应该有XML和SQL。
* UpdateIcons：图标内容：当你在FrontEnd选择领袖时的那个图标，和在游戏中的图标，都是通过这个功能来加入到游戏中的，这里面只应该有XML和SQL，而其他的贴图会在资源编辑器中被打包，后续章节会讲。
* UpdateText：文本内容：更新游戏中的文本，只应该有XML和SQL。
* DoNothing：啥也不干，上一个夏天（Last Summer Update）更新的新功能，字面意思，不管。

{% hint style="warning" %}
DoNothing有可能可以通过这个方式把一些无关文件打包为Mod（Steam上传器会检索modinfo，也许通过这种方式可以上传一些乱七八糟的内容）。
{% endhint %}

{% hint style="info" %}
可以这么理解：在FrontEnd阶段不需要载入的（例如信仰的图标和文字内容），可以在InGame中载入，所以以此区分FrontEnd和InGame都需要Update哪些内容，只在对应的动作中添加需要访问的对应文件即可。
{% endhint %}

右侧分别为两大栏，上部分为Custom Properties，（Type和ID在上面讲过了）。

![](/files/-Lbbi8x_hkJEFp0OGB9e)

在这里可以写一些内容用于自定义数据被游戏读取，例如官方的LoadOrder，用于控制读取顺序，和下面的优先级使用方式一样。

{% hint style="info" %}
Context标签在AddUserInterfaces中必须被声明，我只用过Value为InGame这一种。
{% endhint %}

{% hint style="info" %}
LoadOrder的排序似乎是以全游戏顺序排的，DLC1和DLC2在-100。
{% endhint %}

Files是添加文件，通过这个方式，我们把需要加载的对应文件添加到对应的动作中。

![再次重申，该文件等同于art.xml](/files/-LbbgbfaWvj3lJP5wygJ)

Priority是读取顺序，通过数字来调整前-后，先读取小的，再读取大的，允许负数。（该功能似乎只限制于该动作内）。

{% hint style="info" %}
举例子：假设你有三个修改同一个单位的文件，你可以把基础数据改为1，把增量数据改为2，把第三个改为3，这样就会按顺序覆盖，如果你反着来，3号文件可能会提示缺少1号文件的内容。
{% endhint %}

{% hint style="info" %}
我的政哥哥有大量的特性需要被修改，但放在一个XML里又很乱，所以我把特性抽了出来，做成了新的文件，并排在最后让游戏导入。

如果不做排序，那么当政哥哥还没加载完全，就去开始修改其中的数据时，这时候游戏会报错，因为那些要被修改的数据还没有被加载，当然也改不了。
{% endhint %}

![InGame界面，比FrontEnd多了点东西](/files/-LbblT4CiaejVNXi8iRw)

其中刚才和FrontEnd中匹配的内容用法和功能是一样的，这里只讲新出现的：

* AddGameplayScripts：游戏中一些内容是通过Lua实现的，Lua是脚本语言，与XML和SQL完全不同。
* AddUserInterfaces：添加用户界面，通过这种方式游戏可以获得新的UI内容，需要加载XML，对应的Lua需要被ImportFiles加载而不是AddGameplayScripts。
* ReplaceUIScript：替换UI文件，这是迭起兴衰更新后的功能，用于替换原版的一些UI（因为原版所有内容都要被读取，而新内容只能通过这种方式替代），和AddUserInterfaces用法一样。
* UpdateAudio:更新声音文件，这里应该包含由Wwise生成的bnk、txt、xml和一个我们自己写的bank.ini
* UpdateLogitechARX:升级ARX图标，在文明6中，所有文明的图标都可以在罗技推出的LogitechARX手机APP里显示，通过这个方式，可以把Mod文明的图标传送到手机里。

{% hint style="info" %}
Audio在文明BGM中有BUG，需要Wwise软件才可以实现，后续章节讲。
{% endhint %}

{% hint style="info" %}
LogitechARX用的人很少，不做的话新文明在手机APP上会显示问号，命名前缀为：Civ\_（后面详细讲）。
{% endhint %}

![InGame中的新内容](/files/-LbbnsGWjNo8AX30Wdev)

![Criteria这个界面的New很少用到](/files/-LbbnwkGJMopifnt5QxT)

Criteria是文明6官方后续更新（迭起兴衰之前的版本）添加的内容，只有将对应的Criteria写入游戏中，自定义文明和自定义领袖才能够被游戏读取。

通过Criteria可以控制DLC1，DLC2，和原版分别读取哪些文件，也就是说为对应的Action添加对应的Crieria可以实现该功能。

{% hint style="info" %}
我的政哥哥Mod长城在原版，DLC1和DLC2的加成是不一样的，就是通过这个方式实现的，而不是优先级。
{% endhint %}

![关联项内容](/files/-Lbbp7izJNEQ1IIDnBzE)

可以理解为是动作之间的关联项，例如：

> 有一个Mod记录着一个单位，而另一个Mod想要修改这个文件，那么排序和验证都是无效的，通过依赖项，我们可以让新Mod以Required的方式，让需要修改的Mod提前载入，而新Mod后载入，这样就可以实现覆盖效果了。

Mod Id是指目标Mod的UUID（你也可以写这个Mod本身的UUID）。

Action Id是指目标的动作ID（注意刚才讲过的命名规则，这里就有用了）。

Type是依赖类型：

* Include:该动作包含目标动作？（不确定）
* Exclude:该动作排除目标动作？（不确定）
* Required：该动作需要目标动作。（这个用的多一些）
* ConflictsWith：该动作排斥目标动作？（不确定）

至此，所有civ6proj的图形化内容全部完成。

#### 案例：官方Action加载

{% code title="" %}

```markup
		<UpdateDatabase id="Expansion2Core" criteria="Expansion2">
			<Properties>
				<LoadOrder>-100</LoadOrder>
			</Properties>
			<!-- Schema comes first -->
			<File Priority="2">Data/Expansion2_Schema.sql</File>

			<!-- Remove data second -->
			<File Priority="1">Data/Expansion2_RemoveData.xml</File>
		</UpdateDatabase>
```

{% endcode %}

这是官方DLC2更新数据的相关XML，在DLC2的modinfo中可以找到。

其中定义了(id="ExpansionCore2")这个动作(UpdateDatabase)只会在DLC2时候被读取(criteria="Expansion2")，读取的顺序是-100(LoadOrder)，先读取顺序为2的文件(Priority="2")中的基础数据，然后通过读取顺序为1的文件来删除无用的数据。

{% hint style="info" %}
复读机：读取顺序数值越高越提前。
{% endhint %}

## civ6proj代码化配置

有一些内容，还是要通过文本方式去修改的，现在，我们来学习如何找到civ6proj并明白其中的内容。

![你的Mod项目应该在这个路径下（Win10）](/files/-LbbsLbtlyOW7Ci7bjcC)

这是Mod的最外层，其中ci6sln和civ6suo是IDE使用的，通过这个才可以被IDE打开，这些文件和我们制作没有关系，但你必须要保留并且不能破坏。

![这是Mod的真正路径](/files/-Lbbs_LUsIUD5NVzVlp_)

当我们打开后，我们发现了Art.xml和.civ6proj两个文件，我们把主要方向着重与civ6proj，笔者通过使用Sublime Text来修改，当然，你有其他工具也可以，例如UltraEdit,Atom,Linux的vim等等。

不建议使用自带的文本文档，因为复杂的结构会让你十分很乱。

![Mod的项目配置文件（最终大部分内容完成后的样子）](/files/-Ltnj33rO_ozAKk4TsHf)

这也许是你第一次看到XML，但不要眼晕，你仔细看一看，其中的<>内容是否与刚才图形化对应的选项文字的一样？OK，本章节不会告诉你怎么去理解这些，因为我会先从XML的基本来教你，现在只是告诉你这个文件的位置，并且如何去打开。

{% hint style="info" %}
复读机：civ6proj在Mod生成后就是modinfo
{% endhint %}

{% hint style="info" %}
因为这个文件不需要大幅度手动修改（90%图形化解决），所以这一节很短。
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://haojun0823.gitbook.io/randerion-civ-mod-guide/san-chuang-jian-yi-ge-xiang-mu-bing-pei-zhi-civ6proj-wen-jian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
