编写modinfo
Modinfo文件其实也用xml语言写成。我们拿官方教程的Tutorial.modinfo
文件来学习modinfo的结构:
<?xml version="1.0" encoding="utf-8"?>
<Mod id="17462E0F-1EE1-4819-AAAA-052B5896B02A" version="1">
<Properties>
<Name>LOC_MOD_TITLE</Name>
<Teaser>LOC_MOD_TEASER</Teaser>
<Description>LOC_MOD_DESCRIPTION</Description>
<Authors>LOC_MOD_AUTHORS</Authors>
<Trusted>1784197304</Trusted>
<ShowInBrowser>AlwaysHidden</ShowInBrowser>
<EnabledAtStartup>0</EnabledAtStartup>
</Properties>
<Components>
<UpdateDatabase id="TUTORIAL_DATBASE_UPDATES">
<Properties>
<RuleSet>RULESET_TUTORIAL</RuleSet>
</Properties>
<Items>
<File>Tutorial_Technologies.xml</File>
</Items>
</UpdateDatabase>
<ImportFiles id="TUTORIAL_IMPORT_FILES">
<Properties>
<RuleSet>RULESET_TUTORIAL</RuleSet>
</Properties>
<Items>
<File>TutorialScenarioBase.lua</File>
</Items>
</ImportFiles>
</Components>
<Settings>
<Map id="TUTORIAL_MAP">
<Properties>
<Group>Tutorial_Maps</Group>
<Name>LOC_TUTORIAL_MAP_NAME</Name>
<Description>LOC_TUTORIAL_MAP_DESCRIPTION</Description>
</Properties>
<Items>
<File>Tutorial.Civ6Map</File>
</Items>
</Map>
<Custom id="TUTORIAL_SETTINGS">
<Items>
<File>Tutorial_Config.xml</File>
</Items>
</Custom>
</Settings>
<LocalizedText>
<Text id="LOC_MOD_TITLE">
<en_US>Tutorial</en_US>
</Text>
<Text id="LOC_MOD_TEASER">
<en_US>A basic tutorial.</en_US>
</Text>
<Text id="LOC_MOD_DESCRIPTION">
<en_US>This is a basic tutorial</en_US>
</Text>
<Text id="LOC_MOD_AUTHORS">
<en_US>Firaxis</en_US>
</Text>
<Text id="LOC_TUTORIAL_MAP_NAME">
<en_US>Tutorial Map</en_US>
</Text>
<Text id="LOC_TUTORIAL_MAP_DESCRIPTION">
<en_US>A basic tutorial</en_US>
</Text>
</LocalizedText>
<Files>
<File>Tutorial.Civ6Map</File>
<File>Tutorial.lua</File>
<File>Tutorial_Config.xml</File>
<File>Tutorial_Technologies.xml</File>
<File>TutorialScenarioBase.lua</File>
</Files>
</Mod>
一级标签 Tag是Mod
,它有两个属性 Properties:id
和version
。id
是一个Mod的唯一序列号,不能与其它的Mod重复,生成id的方法一般来说是计算一段字符的哈希值(Hash),比如说你这个Mod叫做LOLI.modinfo
,那么就可以把LOLI的Hash值c5a19b9ca363404934080167e5689330
写到id里。当然偷懒的方法就是脸滚键盘,随便写一个长度相同的放上去。version
是Mod的版本号,我们第一次写,所以就填1好了。
一个Mod的二级标签一般来说有5个,它们是:属性Properties
、元件Components
、设置Settings
、地区文本LocalizedText
、文件Files
。(注:这可以在Assets/Database/Modding.sql
文件里找到定义)
属性Properties
<Properties>
<Name>LOC_MOD_TITLE</Name>
<Teaser>LOC_MOD_TEASER</Teaser>
<Description>LOC_MOD_DESCRIPTION</Description>
<Authors>LOC_MOD_AUTHORS</Authors>
<Trusted>1784197304</Trusted>
<ShowInBrowser>AlwaysHidden</ShowInBrowser>
<EnabledAtStartup>0</EnabledAtStartup>
</Properties>
定义Mod的基本信息,比如名称Name,副标题Teaser,描述Description,作者Authors等等。这里它赋值都用了变量LOC_MOD_*
,这些变量在LocalizedText标签中会有声明。
元件Components
定义了所有对游戏内容的修改。
<Components>
<UpdateDatabase id="TUTORIAL_DATBASE_UPDATES">
<Properties>
<RuleSet>RULESET_TUTORIAL</RuleSet>
</Properties>
<Items>
<File>Tutorial_Technologies.xml</File>
</Items>
</UpdateDatabase>
<ImportFiles id="TUTORIAL_IMPORT_FILES">
<Properties>
<RuleSet>RULESET_TUTORIAL</RuleSet>
</Properties>
<Items>
<File>TutorialScenarioBase.lua</File>
</Items>
</ImportFiles>
</Components>
在这个标签下我们要加入相应类型的修改文件,用<Items>
列出,以及它们适用的规则(RuleSet),自定义的规则(RuleSet)需要在Settings中定义,默认为标准规则Standard RuleSet(规则是比较进阶的内容在此不涉及),可以省略(通常省略)。
Components下可以包含6种类别的修改,每种类别的修改都可以放复数个,从常用到冷门排列如下:
UpdateDatabase,更新数据库。用于修改游戏内容,比如在数据库章节中提到的各种操作就是属于这个类型,阿兹特克DLC中的文明特性、领袖特性和特殊建筑也都属于这一类别。(非常重要,最最常用)
LocalizedText,地区文本。用于添加不同语言的文本信息(中、英等等),文本信息都会放在单独的
_Text.xml
文件中,与数据库信息区别开来。(非常重要)ImportFiles,导入文件。其实这个是万金油的类型,一般来说所有的Lua文件、sql文件都通过这种方法导入,以至于下面三种类型基本不会使用。(比较重要)
GameplayScripts,游戏脚本。用于添加游戏运行所需的自定义函数,一般都是Lua文件。
ModArt,多媒体文件。可以定义单位、建筑、改良等的模型。
UserInterface,用户界面,如文明百科等。
设置Settings
用于定制游戏的设置界面。比如说一旦新加了一个文明,我们需要在选择文明的那个选择框下加入一个新的条目(可以参考阿兹特克DLC)。这一项比较进阶,我们暂时不涉及。
地区文本LocalizedText
<LocalizedText>
<Text id="LOC_MOD_TITLE">
<en_US>Tutorial</en_US>
</Text>
...
</LocalizedText>
这里的地区文本与元件和设置里的地区文本不同,它仅被用于本Modinfo文件(在属性Properties二级标签,之前介绍过)之类的信息,可以理解为变量替换。当然图省力大可不必这么做,只要在前面直接写就可以了,不需要用到“变量替换”这种东西。
文件Files
<Files>
<File>Tutorial.Civ6Map</File>
<File>Tutorial.lua</File>
<File>Tutorial_Config.xml</File>
<File>Tutorial_Technologies.xml</File>
<File>TutorialScenarioBase.lua</File>
</Files>
需要包含所有Mod包含的文件,否则相应的修改不能起到效果。
一个简单的例子
我们觉得沿海1粮1金实在是太不友好了,想做一个Mod修改。Mod名称可以叫做:RichCoast。我们可以这么写RichCoast.modinfo
:
<?xml version="1.0" encoding="utf-8"?>
<!-- 这里的id 是RichCoast的hash值 -->
<Mod id="8a1e553b-1acf-e4fe-af41-a514008b7672" version="1">
<Properties>
<Name>Rich Coast</Name>
<Teaser>LOC_MOD_TEASER</Teaser> <!-- 这里用了变量替换,替换的文字在下面 -->
<ShowInBrowser>Visible</ShowInBrowser>
<EnabledByDefault>1</EnabledByDefault> <!-- 默认开启这个Mod -->
<EnabledAtStartup>1</EnabledAtStartup>
</Properties>
<LocalizedText>
<Text id="LOC_MOD_TEASER">
<en_US>Coast tile now yields more.</en_US>
<zh_Hans_CN>沿海地块产量增加。</zh_Hans_CN>
</Text>
</LocalizedText>
<Components>
<UpdateDatabase id="RICH_COAST_DATBASE_UPDATES">
<Items>
<File>Change.xml</File>
</Items>
</UpdateDatabase>
</Components>
<Files>
<File>Change.xml</File>
</Files>
</Mod>
Change.xml
与RichCoast.modinfo
被放在一个目录RichCoast
下,它的内容是这个样子的:
<?xml version="1.0" encoding="UTF-8"?>
<GameInfo>
<Terrain_YieldChanges>
<Update>
<Where TerrainType="TERRAIN_COAST" YieldType="YIELD_FOOD" />
<Set YieldChange="2" />
</Update>
</Terrain_YieldChanges>
</GameInfo>
这样,我们的海岸产量就从1粮1金变为了2粮1金。
将RichCoast
文件夹复制到游戏的Mods
文件夹下,便可以完成安装,打开游戏看看效果吧。