修正(Modifiers)与触发式修正

修正键、静态修正、add_modifier 与触发式修正

修正是什么

修正(modifier)是一组“键 = 数值”,挂在某个对象上持续改变它的属性,例如:

Clausewitz 脚本
planet_max_districts_add = -1                       # 最大区划数 -1
category_archaeostudies_research_speed_mult = 0.25  # 远古学研究速度 +25%
country_resource_max_add = 2000                     # 资源储存上限 +2000

几个要点:

  • 修正键不能自己发明。可用的键由游戏决定,完整列表用控制台 script_docs 导出到 logs\script_documentation\modifiers.log(见调试),每个键还标了类别(Pops、Planets、Countries……)。
  • 命名上,_add 结尾的是加减固定值,_mult 结尾的是百分比(0.25 即 +25%)。
  • 部分修正是由资源和经济类别自动生成的;原版 common/economic_categories/99_README_ECONOMIC_CATEGORIES.txt 说明了如何用 generate_mult_modifiers 等为新的经济类别生成修正。

修正挂在哪类对象上,就影响哪类对象。modifiers.log 开头特别说明:人口类(Pops)修正一般也可以挂在行星或国家上,此时作用于该对象下属的所有人口;类别只是“建议用在哪里”的标签,实际行为看具体实现。

静态修正:可以随时加上、移除的修正

common/static_modifiers/ 里定义的修正有名字、图标,可以被事件添加或移除。原版 00_static_modifiers.txt 里的例子:

Clausewitz 脚本
migrating_forests_2 = {
	icon = "gfx/interface/icons/planet_modifiers/pm_lush.dds"
	planet_max_districts_add = -1
}

修正也可以只有图标、不带任何数值,纯粹当作一个可见的“标签”。

在事件里添加和移除(摘自原版 events/colony_events_1.txt):

Clausewitz 脚本
add_modifier = {
	modifier = "migrating_forests"
	days = -1
}
Clausewitz 脚本
remove_modifier = "migrating_forests"

add_modifier 的参数(据 effects.log):

参数说明
modifier静态修正的名字
days / months / years持续时间,-1(默认)表示永久
multiplier可选,把修正的所有数值乘以这个数或变量

它能用于国家、行星、殖民地、舰船、舰队、人口组、星港等多种作用域。

本地化

静态修正的名字和说明分别用修正名和 修正名_desc 两个本地化键:

本地化 YML
l_simp_chinese:
 migrating_forests: "迁徙森林"
 migrating_forests_desc: "这个世界的迁徙森林频繁集体迁移到新的地区,破坏建设好的道路,输电线路和其他基础设施。"

修正键本身在提示框里显示的文字,原版用 MOD_<大写键名> 或 mod_<键名> 作本地化键,例如 MOD_PLANET_MAX_DISTRICTS_ADD: "最大区划数"。

注意 00_static_modifiers.txt 开头注明:其中的名字被代码引用,不能删除或改名。你可以修改它们的数值,但别动名字。

对象自带的修正块

很多对象直接内嵌修正块。原版建筑示例文件 common/buildings/00_example.txt 列出了建筑可用的几种:

Clausewitz 脚本
planet_modifier = {
	planet_housing_add = 300
}
country_modifier = {
	country_resource_max_add = 2000
}
army_modifier = {
	army_damage_mult = 0.1
}
system_modifier = {
	psionic_aura_resistance_mult = 0.5
}

这类修正在对象存在期间一直生效,不需要事件添加。

触发式修正(triggered modifier)

想让修正“满足条件时才生效”,就用触发式修正。原版 common/buildings/05_research_buildings.txt 中的真实写法:

Clausewitz 脚本
triggered_country_modifier = {
	potential = {
		exists = owner
		owner = {
			has_ascension_perk = ap_archaeoengineers
		}
	}
	country_resource_max_minor_artifacts_add = 3000
}

triggered_country_modifier = {
	potential = {
		is_planet_class = pc_relic
	}
	category_archaeostudies_research_speed_mult = 0.25
}

potential 是触发器块,成立时下面的修正生效。原版 common/README_TRIGGERED_MODIFIERS.txt 列出了可用字段:

字段说明
key修正名称使用的本地化键
potential决定是否生效的触发器
modifier生效时施加的修正
mult / multiplier修正数值的乘数
show_if_not_potential = yes条件不成立时也在提示框里显示(灰色);目前只对领袖特质和银河议会决议有效
not_potential_override_text_key配合上一项,用这段本地化代替触发器的显示

README 还说明:其他未列出的键都会被当作修正,所以修正可以像上面的例子那样直接写在块里,而不必包进 modifier = { }。

有哪些 triggered_*_modifier

不同对象支持的名字不同。按原版中的出现次数,常见的有 triggered_planet_modifier、triggered_country_modifier、triggered_district_planet_modifier、triggered_station_modifier、triggered_modifier、triggered_councilor_modifier、triggered_pop_group_modifier、triggered_sector_modifier。某个对象能用哪一种,请看它所在文件夹的原版写法或 README。

提示 触发式修正的 potential 会被反复评估。条件写得越简单越好,避免在里面做大范围遍历。

选择哪种方式

  1. 事件带来的、有时限的效果 → 静态修正 + add_modifier。
  2. 某个对象自带的固定加成 → 对象里的 planet_modifier、country_modifier 等。
  3. 某个对象自带、但要看条件的加成 → triggered_*_modifier。