事件修改

本页面所适用的版本可能已经过时,最后更新于1.25
(重定向自Event modding

一个事件包含以下几个部分:

  • 唯一的事件id
  • 事件标题
  • 事件描述文本
  • 事件图片
  • 触发条件,返回为真所需要的条件。
  • 平均触发事件,事件在条件满足后平均多久触发一次
    • 是否只能被触发?意味着它只可能被一个特殊的脚本触发
  • 选项:供AI和玩家选择一个或多个选项,它们和事件连在一起

立即发生的效果:除此之外,你还可以加入一个立即发生的效果,而不需要等待玩家做出选择(比如,你可以阻止玩家在选择选项前移动军队到一个省份),这个效果可以对玩家显示或者隐藏

国家或省份事件

一个事件可以是关于一个省份的或者是一个国家的,具体的格式如下

country_event = {
}

province_event = {
}

这只是指定了事件根作用域,国家事件也可以具有省份范围效果,反之亦然。

事件id

事件ID必须是唯一的非负整数,不能在任何其他事件文件中复制,无论是您自己创建的事件,或是另一个mod的事件,亦或是原版游戏。关于事件ID的表格 Event ids

命名空间的重要性

为了避免其它mod以及未来官方更新带来的复杂问题,以及确保可靠性和为了维护的方便,使用命名空间是谨慎的做法。在一个事件文件的开头,定义如下所示的命名空间:

namespace = my_mod_event_namespace

当定义你的事件id时,使用你的命名空间,在它后面加一个点,接着加一个数字,通过命名空间保持了它的独一无二。

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

这将使你的事件id易于管理和避免在调试时需要记住一长串事件id,同时防止Paradox官方更新以及其它mod里相同事件id带来的冲突,你可以跨文件使用相同的命名空间,只要在每个文件的开头指定这个命名空间。

标题和描述

事件标题和描述文本将在本地化文件里引用,示例如下:

title = "my_mod_event_1_title"
desc = "my_mod_event_1_desc"

然后在本地化文件里加上如下描述:

my_mod_event_1_title:0 "Hello, world!"
my_mod_event_1_desc:0 "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:0 "Hello, world!"
my_mod_event_1_desc_1.1:0 "Let's go explore! This is France."
my_mod_event_1_desc_1.2:0 "Let's go explore! This is not France."

此外,加入一行major = yes会在事件选项被选择以后广播到所有国家

图片

你所选择的图片会出现在事件里,去gfx\event_pictures里找到事件图片的名字。你只要简短地写出文件名字: 不需要写出文件路径和后缀名,示例如下:

picture = BUDDHA_eventPicture

和上面一样图片也可以添加特定条件下显示,确定你的图片是有效的,示例如下:

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 = { } 里并列的条件默认为“与”操作,就像下面的例子:

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
		}
	}
}

触发器里也可以包含统治者特性,比如:

trigger = {
	ruler_has_personality = kind_hearted_personality
}

平均发生时间

MTTH(mean time to happen),在满足触发条件后,决定你的事件平均多久触发一次。MTTH里的时间是指平均值,说明这个事件平均每三个月触发一次 (尽管如此,它还是有可能在下一天就触发,或者一直不触发,这就像自然的概率一样)。这里基础的MTTH可以用天或月来定义。除此之外,你还可以用更多的修正语句来进一步变更事件发生的频率,示例如下:

mean_time_to_happen = {
	months = 400

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

如果没有至少0稳定度,那么基础的MTTH就要乘以0.8等于320个月。还有如果有几个修正所需的条件都为真,那么它们的效果会堆叠。

省份事件能有 is_mtth_scaled_to_size = yes,这将导致MTTH随着其拥有者省份数量的增加而增加。有两个省份,MTTH翻了一番。有四个省份,MTTH翻了两番。 这意味着,省份事件对于一个大国和一个小国发生的可能性是一样的,防止了省份事件在大国往往造成的事件堆积。

是否只能被触发?

许多事件没有MTTH,而采用这个条件:is_triggered_only = yes。使用这个条件的时候, 事件只能被其它的触发源所触发,通常是另一个事件(有MTTH的事件)或者是一个行动(被定义在如下文件里:/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
	}
}

所有的事件文件都能在事件文件夹里找到,这里是 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.9104flavor_fra.9104 这两个事件。因此,事件是可以包含 is_triggered_only = yes 条件。然而,若要事件flavor_eng.9104发生,还有其它条件必须满足:该国不能有国家标识 ENG_had_event_9104,年份必须在1500年之后,国家代码必须是 GBR 或者 ENG,等等。 如果这些条件没有都满足,那么这个事件不会触发,即使它被 on_peace_recipient 发送了。

触发器和只能被触发一起使用

原版代码里没有的同时使用 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
}

awesome_event.2在国家威望大于25时才会发生。 如果它发生了,首先会添加国家标志had_awesome_event.2 到事件所触发的国家。 在 awesome_event.3里我们输入如下代码:

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

这意味着awesome_event.3 只会在没有 had_awesome_event.2.国家标识的情况下触发。 总结一下,第一个事件 (awesome_event.1) 触发了两个事件 (awesome_event.2 and awesome_event.3)。如果国家威望大于25事件awesome_event.2 将会在300天后发生 -注意如果威望一直低于25,那么直到第299天为止它仍然可以被触发。如果 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。

比如

option = {
	name = heiljsf_demonstrate.1.A		
	ai_chance = { factor = 60 }
	event_target:university_town = {
		spawn_rebels = {
			size = 0.5
			type = heiljsf_demonstrate_rebels
		}
	}
}
option = {
	name = heiljsf_demonstrate.1.B		
	ai_chance = { factor = 40 }
	event_target:university_town = {
		spawn_rebels = {
			size = 1.5
			type = heiljsf_demonstrate_rebels
		}
	}
}
after = {
	clear_saved_name = philosopher_dude
}

after 的内容 会在option 之后发生.也就是不管你选择 选项A或选项B.最后after 的内容都会执行.这是after 的另一种用法.跟立即实行效果类似.

选项

你必须给ai或玩家至少一个选项用来关闭事件窗口,当玩家将鼠标放在它上面时,会列出该选项的效果,但设置国家标志除外。每个选项都需要指向文本的本地化。一个示例选项如下:

option = {
	name = "CHILE_WAR" #这指向本地化文件
	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
}

每个选项的基本要素是:

  • 名字
  • 触发器(可选)
  • if条件(可选)
  • ai意愿 (可选)
  • 效果
  • 高亮显示

触发器

触发器确定该选项是否可用。必须注意确保始终至少有一个选项可用。这是一个选项的示例,其中只能有一个(但始终是一个)选项可用:

	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
	}
}

If条件

选项可以具有多种效果,这些效果取决于条件是否为真。条件在限制大括号中添加,效果在条件满足之后发生:

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

在上面的示例中,如果这个国家有继承人,则选择该选项将增加10威望。如果该国没有继承人,该事件将使该国失去10个威望。 在任何一种情况下,选择该选项将始终向国库中添加10金币。

AI 意愿

ai意愿决定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将仅选择此选项。

事件目标

事件的直接目标,即触发事件的国家/省份 - 事件中的ROOT - 可以通过在选项中或在即时效果部分中使用以下效果保存为全局事件目标。

save_global_event_target_as = my_event_1_event_target

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

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

在另一个事件的本地化:

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

要在触发器中添加效果或使用事件目标,您需要在实际事件目标的名称前添加event_target:例:

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


调试事件

即使不满足触发条件,您也可以在控制台中手动触发事件。控制台将输出满足哪些条件(如果有),这在调试时很有用。 只需键入event [event id] [<Target Country Tag> OPTIONAL] [<Option id> OPTIONAL],如下所示:

event 12345

如果事件有命名空间,那么请使用命名空间:

event my_mod_event_namespace.1
重要的是要注意,由于不总是满足触发条件,因此可能会出现奇怪的结果。例如,即使显然至少有一个省生产葡萄酒,也有可能会使用错误的省份

您还可以使用命令testevent [<事件ID>] [<字符ID>可选]来显示事件触发器以及它们是否已满足。

在试图弄清楚问题所在的时候,通常可以用来找出发生问题的事件的某些部分。这允许您缩小可能原因的范围。为避免右侧显示的问题,您可以希望将MTTH设置为1天,以便立即触发。