事件修改

一个事件必须包含以下内容:

  • 唯一的 id
  • 标题
  • 描述文本
  • 图片
  • 触发条件:事件触发所必须满足的条件
  • “平均发生时间”(mean time to happen),即在触发条件得到满足的情况下,事件应当多频繁地触发,以及相应的修正
  • 可以将其标记为“仅被触发”(triggered only),这意味着只有当其他脚本明确触发它时才会触发。这会使 mean_time_to_happen 失去作用,除非该事件是在某个 on_action 的随机事件列表中被触发。
  • 供玩家或 AI 选择的一个或多个选项,以及相应的效果。

你还可以选择性地加入一个在事件触发时立即发生、而不必等待玩家选择选项的效果(例如,防止玩家在选择会导致该省份叛乱的选项之前,把军队调入该省份)。这个效果对玩家可以是可见的,也可以是隐藏的。

国家事件还是省份事件?

一个事件既可以是关于某个省份的,也可以是关于某个国家的。你可以这样指定:

country_event = {
}

或者

province_event = {
}

这只是指定了事件的根作用域——国家事件可以有省份层面的效果,反之亦然。

通过使用 major = yes 参数,可以向所有人显示该事件已发生的通知。 重大事件还可以带有 major_trigger 块,使通知只显示给满足该触发条件的国家。在 major_trigger 块内,ROOT 作用域是看到弹窗的国家,而 FROM 是原始的事件作用域。

major_trigger = { prestige = 50 }

这样只会向威望超过 50 的国家显示通知。

country_event = {
	id = test.1
	title = test.1.t
	desc = test.1.d
	picture = TRADEGOODS_eventPicture

	major = yes
	major_trigger = {
		prestige = 50
	}

	option = {
		name = test.1.a
		add_prestige = 50
	}
}

事件 id

它必须是唯一的非负整数,不能与你自己制作的、其他模组的或原版的任何其他事件文件中的事件重复。

命名空间的重要性

为避免将来可能出现的模组或 Paradox 更新带来的兼容性问题,并确保可读性和易于维护,使用命名空间是明智之举。在事件文件的开头,像这样定义要使用的命名空间:

namespace = my_mod_event_namespace

然后在定义事件 ID 时,使用你的命名空间,后跟一个点,再跟一个在该命名空间内唯一的数字:

country_event = {
	id = my_mod_event_namespace.1
        #everything else goes after ...
}

这样可以让你的事件 ID 保持易于管理,在调试时不必记住冗长的事件 ID 数字,同时也避免了 Paradox 或其他模组作者添加同 ID 事件的风险。只要在任一事件文件的某处声明了命名空间,你就可以在多个文件中使用同一个命名空间。命名空间的 ID 范围是 0 到 9999,不使用命名空间时也是如此。

标题与描述

它们指向标题和描述文本的本地化条目。示例:

title = "my_mod_event_1_title"
desc = "my_mod_event_1_desc"

然后在本地化文件中:

my_mod_event_1_title: "Hello, world!"
my_mod_event_1_desc: "Let's go explore!"

描述可以带有触发条件,使其只在特定情况下显示。但要确保始终有一条描述可见。示例:

title = "my_mod_event_1_title"
desc = {
   trigger = { tag = FRA }
   desc = "my_mod_event_1_desc_1.1"
}
desc = {
   trigger = { NOT = { tag = FRA } }
   desc = "my_mod_event_1_desc_1.2"
}

然后在本地化文件中:

my_mod_event_1_title: "Hello, world!"
my_mod_event_1_desc_1.1: "Let's go explore! This is France."
my_mod_event_1_desc_1.2: "Let's go explore! This is not France."

图片

另见:事件图片列表

你所选择的图片就是事件中显示的图片。事件图片的名称可以在事件图片列表中找到,也可以在 Europa Universalis IV/interface/eventpictures.gfx 以及包含它们的 DLC 压缩包中的 interface/eventpictures_*.gfx 文件的 name = 行中找到。仅仅使用文件名是不起作用的,除非存在某个 .gfx 文件,其 name = 行中写有该文件名。

有些事件图片在 .gfx 文件中有多个条目,名称各不相同,此时可以使用其中任何一个名称。如果相同的名称在基础游戏和 DLC 中多次出现且对应不同的图片,则会使用最后一个 .gfx 文件(按文件名的 ASCII 表示排序)中的图片。例如 b_eventpictures.gfx 会覆盖 a_eventpictures.gfx,但 Z_eventpictures.gfx 两者都不会覆盖,因为大写字母排在小写字母之前。

有些名称带有文化、文化组、宗教或图形文化的前缀。使用不带前缀名称的事件,会根据收到该事件的国家而得到不同的图片。例如:

picture = ANGRY_MOB_eventPicture

将使用以下图片:

图片 名称 条件 所需DLC
ANGRY_MOB_eventPicture ANGRY_MOB_eventPicture 默认
muslimgfx_ANGRY_MOB_eventPicture muslimgfx_ANGRY_MOB_eventPicture muslimgfx 图形文化 星与新月 DLC
northamericagfx_ANGRY_MOB_eventPicture northamericagfx_ANGRY_MOB_eventPicture northamericagfx 图形文化 Conquest of Paradise.png
indiangfx_ANGRY_MOB_eventPicture indiangfx_ANGRY_MOB_eventPicture indiangfx 图形文化 Wealth of Nations.png
southamericagfx_ANGRY_MOB_eventPicture southamericagfx_ANGRY_MOB_eventPicture southamericagfx 图形文化 El Dorado.png
BUDDHISM_BAD_eventPicture, asiangfx_ANGRY_MOB_eventPicture, asiangfx_BAD_WITH_MONARCH_eventPicture, asiangfx_RELIGIOUS_TURMOIL_eventPicture, asiangfx_RELIGIOUS_WARS_eventPicture
  • asiangfx_ANGRY_MOB_eventPicture
  • asiangfx_RELIGIOUS_TURMOIL_eventPicture
  • asiangfx_RELIGIOUS_WARS_eventPicture
  • asiangfx_BAD_WITH_MONARCH_eventPicture
  • BUDDHISM_BAD_eventPicture
asiangfx 图形文化
IKKO_IKKI_INCIDENT_eventPicture, confucianism_ANGRY_MOB_eventPicture, confucianism_RELIGIOUS_TURMOIL_eventPicture, east_asian_ANGRY_MOB_eventPicture, east_asian_RELIGIOUS_TURMOIL_eventPicture, shinto_ANGRY_MOB_eventPicture, shinto_RELIGIOUS_TURMOIL_eventPicture
  • east_asian_ANGRY_MOB_eventPicture
  • shinto_ANGRY_MOB_eventPicture
  • confucianism_ANGRY_MOB_eventPicture
  • east_asian_RELIGIOUS_TURMOIL_eventPicture
  • shinto_RELIGIOUS_TURMOIL_eventPicture
  • confucianism_RELIGIOUS_TURMOIL_eventPicture
  • IKKO_IKKI_INCIDENT_eventPicture
中华文化组(east_asian)或神道教或儒家宗教 Mandate of Heaven.png
MARCHING_PEASANTS_eventPicture, east_slavic_ANGRY_MOB_eventPicture, south_slavic_ANGRY_MOB_eventPicture, south_slavic_RELIGIOUS_TURMOIL_eventPicture
  • east_slavic_ANGRY_MOB_eventPicture
  • south_slavic_ANGRY_MOB_eventPicture
  • south_slavic_RELIGIOUS_TURMOIL_eventPicture
  • MARCHING_PEASANTS_eventPicture
东/南斯拉夫文化组 Third Rome.png

图片也可以带有触发条件,使其在特定情况下显示。要确保始终有一张图片可见。示例:

picture = {
   trigger = { is_part_of_hre = yes }
   picture = HRE_eventPicture
}
picture = {
   trigger = { is_part_of_hre = no }
   picture = GOOD_WITH_MONARCH_eventPicture
}

注意:如果你想添加自定义图片,需要同时添加图片本身(通常在“gfx\event_pictures”中)和一个引用该图片的 .gfx 文件(在“interface”中)。.gfx 文件的示例可以查看 interface\eventpictures.gfx。

仅触发一次?

你可以通过写入以下内容,指定该事件只触发一次且仅一次

fire_only_once = yes

需要说明的是,这一设置意味着在该事件触发之后,无论它是对谁触发的,都不会再对任何国家触发——即使它们本来满足触发该事件的要求,或者该事件已被代码直接调用。

隐藏?

你可以指定该事件只在后台触发,而不向玩家弹出。通过写入以下内容即可

hidden = yes

请确保至少有一个选项(还应包含 ai_chance),否则它将无法工作。

触发条件

触发条件是一组必须全部为真,事件才有资格触发的条件。trigger = { } 子句的根部被视为 AND 运算符,因此像这样的写法是多余的:

trigger = {
	AND = {
		#stuff
		#more stuff
		#...
		#even more stuff
	}
}

在触发条件中,你可以任意深度地切换作用域。在下面这个省份事件中,作用域最初是一个省份,然后切换到其所有者,再切换到任意其他国家,以测试某些条件是否满足:该省份必须生产奴隶,所有者不能采取过“废除奴隶制”决议,并且必须存在另一个国家,该省份的所有者与其关系有所改善,且该国同样没有废除奴隶制。

trigger = {
	trade_goods = slaves
	NOT = {
		owner = { has_country_modifier = the_abolish_slavery_act }
	}
	any_country = {
		has_opinion_modifier = {
			who = ROOT
			modifier = improved_relation
		}
		NOT = {
			has_country_modifier = the_abolish_slavery_act
		}
	}
}

平均发生时间

它指定在触发条件得到满足的情况下,事件应当多频繁地触发。MTTH 为 3 个月意味着平均而言,该事件大约每 6-7 个月触发一次(当然,它也可能第二天就触发,或者根本不触发,这就是概率的本质)。“基础”MTTH 可以用天数或月数来定义。此外,你还可以根据特定条件使其更容易或更不容易触发。例如:

mean_time_to_happen = {
	months = 400

	modifier = {
		factor = 0.8
		NOT = { stability = 0 }
	}
}

如果该国家的稳定度不足 0,则基础 MTTH 会乘以 0.8 的系数,得到 320 个月。可以定义许多修正,如果其中有数个为真,它们的效果会叠加。

省份事件可以设置 is_mtth_scaled_to_size = 1,这会使 MTTH 随着其所有者拥有的省份数量增加而按比例增大。有两个省份时,MTTH 翻倍。有四个省份时,MTTH 变为四倍。 这意味着省份事件对大国和小国发生的可能性相同,避免了省份事件在庞大的国家中往往造成的事件刷屏。

对于在 on_action 的“random_events = {}”部分中触发的“is_triggered_only = yes”事件,你可以将 mean_time_to_happen 设为“days = 1”,然后在此值上添加修正。这些修正将应用于“random_events = {}”中赋予该事件的随机几率。这意味着与常规的平均发生时间不同,0.8 的修正实际上会使事件更不容易发生,因为随机几率被降低了。

仅被触发

许多事件没有 MTTH,而是使用条件 is_triggered_only = yes。使用该条件时,事件只有在被其他来源触发时才会发生,通常是另一个事件(一般带有 MTTH)或 on_action(例如 /Europa Universalis IV/common/on_actions/00_on_actions.txt 中定义的事件脉冲)。一个有趣且有用的要点是,包含该条件的事件同样可以包含触发条件。这是如何实现的?以从 00_on_actions.txt 触发的事件“百年战争的终结”为例:

on_peace_recipient = {
	events = {
		flavor_eng.9104			# End of Hundred Years' War
		flavor_fra.9104			# End of Hundred Years' War
	}
}

这两个事件都可以在 events 文件夹中找到,下面是 flavor_eng.9104 事件:

# The End of the Hundred Years' War
country_event = {
	id = flavor_eng.9104
	title = "flavor_eng.EVTNAME9104"
	desc = "flavor_eng.EVTDESC9104"
	picture = DIPLOMACY_eventPicture

	is_triggered_only = yes

	trigger = {
		NOT = { has_country_flag = ENG_had_event_9104 }
		NOT = { is_year = 1500 }
		OR = {
			AND = {
				tag = ENG
				NOT = { exists = GBR }
			}
			tag = GBR
		}
		primary_culture = English
		NOT = {
			french_region = { owned_by = ROOT }
		}
		FRA = {
			exists = yes
			NOT = { war_with = ENG }
			NOT = { war_with = GBR }
		}
 	}
}

当一个国家接受和约时,on_peace_recipient 会向该国发送事件 flavor_eng.9104 和 flavor_fra.9104。因此,这些事件包含条件 is_triggered_only = yes。然而,要让事件 flavor_eng.9104 真正发生,还需要满足一系列其他条件:该国不能拥有国家标记 ENG_had_event_9104,年份必须晚于 1500 年,该国的标签必须是 GBR 或 ENG,等等。如果这些条件没有得到满足,即使事件是从 on_peace_recipient 发送的,也不会触发。

将 is_triggered_only 与触发条件结合使用

将 is_triggered_only 与触发条件结合使用有几项好处,这些在原版代码中并不存在:

option = {
	name = "flavor_hsa.EVTOPTA3"
 	hidden_effect = {
		country_event = {
			id = awesome_event.2
			days = 300
			}
		country_event = {
			id = awesome_event.3
			days = 350
		}
	}
}

在上面的选项中(我们可以称之为 awesome_event.1),将发生两个事件:awesome_event.2 将在整整 300 天后发生,awesome_event.3 将在整整 350 天后发生。在 awesome_event.2 中,我们输入以下代码:

is_triggered_only = yes

trigger = {
	prestige = 25
}

immediate = {
	set_country_flag = had_awesome_event.2
}

这意味着,如果该国家的威望高于 25,awesome_event.2 就会发生。而一旦发生,最先执行的效果之一就是为经历该事件的国家添加国家标记 had_awesome_event.2。在 awesome_event.3 中,我们输入以下内容:

is_triggered_only = yes

trigger = {
	NOT = { has_country_flag = had_awesome_event.2 }
}

这意味着只有当该国家没有国家标记 had_awesome_event.2 时,awesome_event.3 才会发生。总结来说,第一个事件(awesome_event.1)发送了两个事件(awesome_event.2 和 awesome_event.3)。如果该国家的威望高于 25,awesome_event.2 将在 300 天后发生——注意,威望在第 299 天之前都可以低于 25,事件仍然会发生。如果 awesome_event.2 确实发生了,那么 awesome_event.3 就不会发生,因为 awesome_event.2 添加了一个阻止该事件发生的国家标记。然而,如果该国家在第 300 天时威望不足 25,则什么都不会发生——但在第 350 天时,awesome_event.3 将会发生,因为该国家没有国家标记 had_awesome_event.2。

另一种做法是:在事件 1 触发时设置事件 3 的标记,如果事件 2 触发则清除事件 3 的标记,并在事件 3 中清除该标记,这样当事件 2 未被触发时,事件 3 就不会反复触发。这样做的优点是游戏引擎不必在游戏全程维护该标记。

即时效果

你可能希望某些事情在事件触发时立即发生,而不是等待玩家的操作。这可以用来防止如上所述的钻系统漏洞,或者让某件事情无论选择哪个选项都会发生。默认情况下,这些效果会列在事件描述文本的下方。如果你愿意,也可以将其隐藏。

隐藏的即时效果示例:

immediate = {
	hidden_effect = {
		every_owned_province = {
			limit = {
				is_overseas = yes
				culture_group = iberian
				region = chile_region
			}
			add_core = CHL
		}
		release = CHL
		CHL = {
			set_country_flag = recent_independence_chl
		}
	}
}

这会让智利在智利区域内每个属于伊比利亚文化组的海外省份上获得一个核心,然后释放智利,并给它一个标记,表明它是最近被释放的。

虽然事件在已经打开的情况下无法再次打开(例如无延迟地触发自身),但它们仍然会执行自己的即时效果。此外,即时效果确实会在事件被触发时立即发生,如果其他代码无延迟地调用该事件,这可能发生在其他代码执行的中途。

后续效果

你可能希望在选择某个事件选项之后发生一些事情,而不必将其添加到每个选项中。这可以用来清理事件内部使用的变量和标记。默认情况下,这些效果会列在事件描述文本的下方。如果你愿意,也可以将其隐藏。

after = {
   set_variable = { which = my_event_test value = 0 }
   clr_country_flag = option_1_disable
}

选项

你必须至少给玩家或 AI 一个可供选择的选项以退出事件。鼠标悬停在选项上时会列出该选项的效果,设置国家标记除外。每个选项都需要指向其文本的本地化条目。选项示例如下:

option = {
	name = "CHILE_WAR" #this is the pointer to the localisation
	set_country_flag = chilean_nationalism	#setting and removing country flags aren't shown on mouseover
	CHL = {
		declare_war_with_cb = {
			who = ROOT
			casus_belli = cb_independence_war
		}
	}
	clr_country_flag = colonial_annexation_chl
}

选项的组成元素有:

  • name
  • trigger(可选)
  • if(可选)
  • ai_chance(可选)
  • effects
  • highlight(可选)

触发条件

触发条件决定某个选项是否可用。必须小心确保始终至少有一个选项可用。以下是一个每次仅有一个(但始终有一个)选项可用的选项示例:

	option = {
		name = "EVTOPTA799"
		trigger = {
			prestige = 90
		}
		add_dip_power = 20
	}
	option = {
		name = "EVTOPTB799"
		trigger = {
			NOT = { prestige = 90 }
		}
		add_prestige = 20
	}

在上面的例子中,选项 A 仅在威望达到 90 及以上时可用,而选项 B 仅在威望低于 90 时可用。

高亮

可以为事件中的某个选项添加高亮,例如:

option = {
	highlight = yes
	trigger = {
		ruler_has_personality = well_connected_personality
	}
}

Goto

如果你想让任何一个事件选项高亮并将镜头重新聚焦到某个省份,请使用 goto:

option = {
	goto = 183 # Paris
}

如果某个省份已被保存为事件目标,你可以使用事件目标字符串来代替。

If

一个选项可以根据哪些条件为真而拥有多个效果。条件添加在 limit 括号中,效果跟在其后:

option = {
	name = awesome_event.22.a
	if = {
		limit = {
			has_heir = yes
		}
		add_prestige = 10
        }
	if = {
		limit = {
			has_heir = no
		}
		add_prestige = -10
	}
	add_treasury = 10
}

在上面的例子中,选择该选项时,如果该国家有继承人,就会获得 10 点威望。如果该国家没有继承人,事件则会使该国家失去 10 点威望。无论哪种情况,选择该选项都始终会向国库增加 10 金币。

AI 几率

ai_chance 决定 AI 选择某个选项的几率。ai_chance 的数值是系数,例如,如果第一个选项的 ai_chance 数值为 3,第二个选项的 ai_chance 数值为 1,那么 AI 选择第一个选项的可能性是第二个选项的三倍。按惯例,这些系数以 100 为总数来指定,因此三比一就是 75 和 25。示例如下:

	option = {
		name = "EVTOPTA1073"			# Increase centralization efforts.
		ai_chance = { factor = 75 }
		add_treasury = -500
	}
	option = {
		name = "EVTOPTB1073"			# Leave as it is.
		ai_chance = { factor = 25 }
		add_stability = -2
	}

ai_chance 语句可以接受如下的修正:

		ai_chance = {
			factor = 40
			modifier = {
				factor = 0
				NOT = { prestige = 50 }
			}
			modifier = {
				factor = 0
				NOT = { dip_power = 100 }
			}
		}

在上面的例子中,只有当威望达到 50 以上且外交点数达到 100 以上时,AI 才会选择该选项。

ai_chance 的评估计算中似乎存在一个小 bug——有时无论几率如何,都会选中第一个事件选项,即使其几率被设为 0。如果你希望第一个选项在某些情况下永远不会发生,请添加一个对 AI 国家禁用它的触发条件。

事件目标

当前作用域所指代的任何对象,都可以通过在选项或即时效果部分的该作用域内使用以下效果,保存为事件目标。

save_event_target_as = my_event_1_event_target

示例:

option = {
  name = "my_mod_name.EVTOPT1"
  save_event_target_as = my_event_target
}

这会将收到事件的国家或省份(ROOT 作用域)保存为 my_event_target。

示例:

option = {
  name = "my_mod_name.EVTOPT2"
  random_ally = {
    save_event_target_as = roots_ally
  }
}

这会将收到事件的国家的一个随机盟友保存为 roots_ally。

所保存事件目标的名称可以自由选择,但必须唯一。 将国家或省份保存为事件目标,使得可以在其他事件的本地化中获取其名称,并直接对其添加效果。 要在其他本地化中获取事件目标的名称,必须使用 [event_target_name.GetName]。示例:

my_mod_event.event_title: "[my_event_target.GetName] explored the world!"

要对事件目标添加效果或在触发条件中使用事件目标,你需要在实际的事件目标名称前加上 event_target:。示例:

immediate = {
   save_event_target_as = my_first_event_target
}

option = {
   name = "my_mod_name.EVTOPT2"
   event_target:my_first_event_target = { add_stability = 1 }
}

事件目标保存在事件链之内——也就是说,使用 country_event 和 province_event 效果直接触发的事件将共享同样的事件目标。一旦事件链结束,事件目标就会被移除。

要在事件链之间保留已保存的事件目标,请使用 save_global_event_target_as。全局事件目标需要在全局范围内唯一,只有当它们被再次以同名保存而覆盖,或执行 clear_global_event_target 时,才会被移除。

事件目标可以用于效果中,以便轻松找到最高/最低值:遍历某个作用域,每当发现更高的值时就更新事件目标:

every_country = {
   limit = {
       diplomatic_reputation = event_target:highest_diprep
   }
   save_event_target_as = highest_diprep
}
event_target:highest_diprep = {
   #further effects
}

调试事件

即使触发条件没有得到满足,你也可以在控制台中手动触发事件。控制台会输出哪些条件(如果有的话)已满足,这在调试时很有用。只需像这样输入 event [event id] [<Target Country Tag/Province ID> OPTIONAL] [<Option id> OPTIONAL]:

event 12345

如果事件使用了命名空间,请使用命名空间:

event my_mod_event_namespace.1
需要注意的是,由于触发条件并不总是得到满足,可能会出现奇怪的结果。例如,在这个事件中使用了错误的省份,尽管显然至少有一个省份生产葡萄酒。

你也可以使用命令 testevent [<Event ID>] [<Target Country Tag/Province ID> OPTIONAL] 来显示事件的触发条件以及它们是否已满足。

在试图找出问题所在时,将问题事件的某些部分注释掉通常很有用。这样可以缩小可能原因的范围。为避免右图所示的问题,你可能需要将 MTTH 设为 1 天,使其立即触发。

文档 效果 • 触发条件 • 修正列表 • 作用域 • 变量 • 本地化 • 可自定义本地化 • 运行文件 • 事件图片列表
脚本 脚本函数 • 顾问 • 时代 • 开局设定 • 建筑 • 宣战理由 • 殖民区域 • 国家创建 • 文化 • 决议 • Defines • 外交行动 • 灾难 • 中华帝国 • 阶层 • 事件 • 派系 • 政府 • 政府互动 • 伟大工程 • 历史 • 神圣罗马帝国 • 理念组 • 思潮 • 佣兵 • 任务树 • 修正 • On Actions • 议会 • 和约 • 君主性格 • 政策 • 叛军类型 • 宗教 • 附属国类型 • 科技 • 贸易公司 • 商品 • 单位
地图 地图 • 地图修改速查 • 随机新世界 • 贸易节点
图形 模型 • 界面 • 贴图库 • 字体 • 单位模型
音频 音乐 • 音效
其他 控制台命令 • 校验和 • 模组结构 • 故障排查 • 运行文件
工具 克劳塞维茨开局编辑器 • EU4模组编辑工具 • JoroDox模组制作工具 • The Validator
指南 省份 • 地图修改速查 • 存档编辑 • 脚本教程