文明帝国6 mod笔记

2020年4月15日

修改生效

文明6运行时,如果用Mod Buddy修改项目属性,可能编译出错,表示“无法删除目录”。必须退出游戏再编译。

游戏引擎会在运行时监控自身源文件(C:\Program Files (x86)\Steam\steamapps\common\Sid Meier’s Civilization VI\Base\Assets\ 里面的文件)和modinfo Mod\Files列出的源文件,如果它们改变了,游戏会重新加载。

  • 游戏引擎不监控modinfo文件。如果修改了modinfo,如更改mod名称,修改Mod\Files等,必须重新启动游戏。
  • 如果添加新的mod文件,必须重启游戏。
  • 如果修改InGameActions列出的文件,因为那些文件在加载存档时运行,必须重新加载存档才能生效。
  • 如果修改UI文件,刷新相应界面即可生效。

modinfo文件

<AffectsSavedGames>标签:如果值为1,如果一个存档之前没有此mod,则加载存档时游戏引擎不主动加载此mod。

<Components>标签(见于《文明6 Mod教程(8)Lua脚本制作》)和<InGameActions>标签是等价的。[1]ModBuddy使用<InGameActions>标签。

lua文件

lua文件的格式不要想当然地以为是lua。它是Havok脚本!Havok脚本是lua 5.1版本的改编,私有的Havok引擎运行Havok脚本,而Havok引擎已经不再开发了。

https://forums.civfanatics.com/threads/replace-tag-and-row-tag-which-one-should-i-use.564585/

https://zh.wikipedia.org/wiki/Havok%E5%BC%95%E6%93%8E

http://twvideo01.ubm-us.net/o1/vault/gdc2011/slides/Malcolm_Tyrrell_Programming_EfficientLuaScripting.pdf

https://wiki.esoui.com/Esolua#Differences_to_Lua_5.1

文明6 LUA API参考资料

Lua Objects: Gedemon. Lua Objects. . 2016-10-23 [2020-04-16].

未知作者提供的Google文档

XML文本文件

XML文本文件指提供游戏文本的文件。XML文本文件应有如下结构

<GameData>
	<LocalizedText>
		<Row Tag="LOC_AILIKETALL_NOTIFICATION_INITIALIZED_TITLE" Language="en_US">
			<Text>AI Play Tall is initialized!</Text>
		</Row>
		<Replace Tag="LOC_BOOST_TRIGGER_ADVANCED_BALLISTICS" Language="zh_Hans_CN">
			<Text>Build 2 regular power plants or local power plants</Text>
		</Replace>
	</LocalizedText>
</GameData>

如果定义全新文本,则用Row标签;如果修改已有文本,则用Replace标签。

方括号用法

[NEWLINE] 换行。游戏文本必须用此法换号,

<Text>
第一行
第二行</Text>

这种方式会显示乱码。

[COLOR][ENDCOLOR]
夹在这中间的文本会变成第一个括号的颜色,比如:
[COLOR_FLOAT_SCIENCE]Fate/EXTELLA LINK Charlemagne-Saber[ENDCOLOR]
这个意思是其中的文本变为游戏中科学文本颜色的蓝色。

[ICON_]
其中填写代码为游戏中的图标代码,可以显示图标,比如:[ICON_GreatPerson],会显示伟人的小图标。

参考 https://haojun0823.gitbook.io/randerion-civ-mod-guide/liu-chuang-jian-mod-de-duo-yu-yan-shu-ju#te-shu-text-xiang-jie

大括号用法

{key}:读取文本

<Text>建一座{LOC_BUILDING_FACTORY_NAME}就会送一个{LOC_CITY_STATES_ENVOYS}</Text>

将显示为“建一座工厂就会送一个使者”。

{num}:num为数字,表示对该文本执行格式化

若有TEXT文本


<Row Tag="LOC_AILIKETALL_NOTIFICATION_INITIALIZED_TITLE" Language="zh_Hans_CN">
	<Text>已建造{2}座{1}</Text>
</Row>

lua代码有

print(Locale.Lookup('LOC_AILIKETALL_NOTIFICATION_INITIALIZED_TITLE', '紫禁城', 20))

则会输出“已建造20座紫禁城”。

注,数字后可加下划线和注释,便于阅读。以下文本是等效的:

<Text>已建造{2_haha}座{1_hehe}</Text>
<Text>已建造{2_几}座{1_什么建筑}</Text>
<Text>已建造{2}座{1}</Text>

{num:function}:对该文本进行变换

可用的函数有:gender, plural

:plural

若有文本

<Row Tag="LOC_AILIKETALL_PLAYERS" Language="en_US">
	<Text>{1} {1:plural 1?player; other?players;} like tall countries</Text>
</Row>

若有Lua脚本
print(Locale.Lookup('LOC_AILIKETALL_PLAYERS', 10))

以下是计算步骤

  1. 数字10传入{1},得10 {1:plural 1?player; other?players;} like tall countries
  2. 数字10传入{1:plural 1?player; other?players;}。因为10是复数(>1),10:plural得2,顾整体得10 {2 1?player; other?players;} like tall countries
  3. 2不等于1,得other,顾{2 1?player; other?players;}得players。
  4. 整个文本计算为“10 players like tall countries”
若有文本

<Row Tag="LOC_AILIKETALL_PLAYERS" Language="en_US">
	<Text>{1} {1:plural 2?player; other?players;} like tall countries</Text>
</Row>

若有Lua脚本
print(Locale.Lookup('LOC_AILIKETALL_PLAYERS', 1))

以下是计算步骤

  1. 数字1传入{1},得1 {1:plural 2?player; other?players;} like tall countries
  2. 数字1传入{1:plural 2?player; other?players;}。因为1是单数,1:plural得1,顾整体得1 {1 2?player; other?players;} like tall countries
  3. 1不等于2,得other,顾{2 1?player; other?players;}得players。
  4. 整个文本计算为“1 players like tall countries”

注意:某些语言(包括中文)不支持plural函数。

参考资料 http://modiki.civfanatics.com/index.php?title=Localization_Tutorial_(Civ5)

参考资料

  1. LeeS; . LeeS' Civilization 6 Modding Guide. . 2019-04-07, (): [2020-04-15].