战争借口与战争目标

casus_belli 如何自动产生与销毁,war_goals 如何引用它、控制和谈结果,以及用脚本宣战

两者的关系

宣战需要两样东西:

位置是什么
战争借口(casus belli,CB)common/casus_belli/国家 A 对国家 B 有没有资格开战;游戏每天按条件自动授予或撤销
战争目标(war goal)common/war_goals/开战时选择的目标,决定和谈结果;每个目标都要求攻方持有某个 CB

所以新增一种战争,通常要同时写一个 CB 和一个战争目标。

战争借口

common/casus_belli/00_casus_belli.txt 开头的注释列出了字段:

字段说明
potential哪些国家可能拥有这个 CB;this 为攻方
is_valid每天检查,成立时自动授予,不成立时自动撤销;this 为攻方,from 为目标。对脚本授予的 CB 无效
destroy_if每天检查,用来提前销毁由脚本授予的 CB
show_notification是否发通知,默认 yes
show_in_diplomacy原版字段,是否显示在外交界面
proxy_war_resources / on_proxy_war_start代理人战争的花费与开战效果

原版“夺取宣称”(略去代理人战争部分):

Clausewitz 脚本
cb_claim = {
	show_in_diplomacy = yes
	show_notification = no
	potential = {
		is_country_type = default
		NOT = { is_in_federation_with = from }
		is_nomadic = no
	}
	is_valid = {
		OR = {
			has_claim = FROM
			from = {
				any_subject = {
					root = { has_claim = prev }
				}
			}
		}
		has_total_war_cb = no
		NOT = { is_overlord_to = FROM }
		OR = {
			is_subject = no
			overlord = { NOT = { is_same_value = from } }
		}
	}
}

提示 is_valid 对每一对国家每天都要算一遍,国家多时开销可观。把便宜、最容易失败的条件写在前面,复杂遍历放到 potential 已经筛掉大部分国家之后。

用脚本授予

不想让 CB 自动产生,可以把 is_valid 写成 always = no,由事件授予:

Clausewitz 脚本
add_casus_belli = {
	type = cb_mymod_vendetta
	who = event_target:mymod_rival
	days = 3600
}

(参数格式来自 effects.log:add_casus_belli = { type = … who = <country> days = … }。)脚本授予的 CB 不受 is_valid 影响,到期或 destroy_if 成立时消失。检查用 has_casus_belli = { target = <国家> type = <CB> },type 可省略。

战争目标

字段说明在 common/war_goals/wg_example.txt。原版“征服”(有删减,possible 整块略去):

Clausewitz 脚本
wg_conquest = {
	casus_belli = cb_claim
	galactic_empire_joins_defender = {
		from = { is_galactic_emperor = yes }
		imperial_authority >= 100
	}

	threat_multiplier = 0.75

	potential = {
		has_total_war_cb = no
		is_nomadic = no
		from = { is_nomadic = no }
	}

	ai_weight = {
		weight = 2
	}
}
字段说明
casus_belli必填;攻方必须对目标持有这个 CB
potential / possiblethis 为攻方,from 为目标;不成立时隐藏/不可选
set_defender_wargoal强制守方使用某个目标;不写时守方自己选
defender_default = yes守方没及时选择时的默认目标(多个时取文件里第一个)
hidenever(默认)、always、no_cb(没有 CB 时隐藏)
cede_claims和谈时是否割让宣称:yes、occupied_only、no
threat_multiplier征服星系、行星时产生的威胁倍数
war_exhaustion本方战争疲劳增长速度的倍数
surrender_acceptanceAI 接受投降的意愿,负数更不愿意
on_accept目标投降、宣称割让之后执行
on_status_quo以维持现状结束时执行
forbidden_peace_offers禁止的和谈方式:status_quo、surrender、demand_surrender,值为提示文字的本地化键
available_in_proxy_wars_only只用于代理人战争
ai_weightAI 选择权重

银河帝国成员是否参战

示例文件写的是 galactic_community_joins_defender,而原版实际的战争目标几乎都用 galactic_empire_joins_defender(32 处,前者只出现在示例里)。写新目标时请照原版实际用法,并在 error.log 里确认没有报未知字段。

用脚本宣战

Clausewitz 脚本
declare_war = {
	target = event_target:mymod_rival
	name = "mymod_vendetta_war"
	attacker_war_goal = wg_mymod_vendetta
}

格式来自 effects.log,作用域是攻方国家。name 可省略。

本地化

对象键原版示例
战争借口casus_belli_<CB 键>,以及 casus_belli_<CB 键>_acquire_hint(如何获得的提示)casus_belli_cb_claim
战争目标war_goal_<目标键>、war_goal_<目标键>_descwar_goal_wg_conquest
本地化 YML
l_simp_chinese:
 casus_belli_cb_mymod_vendetta: "世仇"
 war_goal_wg_mymod_vendetta: "清算旧账"
 war_goal_wg_mymod_vendetta_desc: "对宿敌发动战争,迫使其赔偿当年的损失。"

检查清单

  1. 战争目标的 casus_belli 指向存在的 CB。
  2. CB 的 potential 与 is_valid 都能对目标国家成立,否则宣战界面里看不到这个目标。
  3. 想限制只能由事件触发的战争,用 hide = always 并通过 declare_war 指定 attacker_war_goal。
  4. 补齐本地化,尤其是 war_goal_<键>_desc,它显示在宣战界面里。