战争借口与战争目标
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 | 代理人战争的花费与开战效果 |
原版“夺取宣称”(略去代理人战争部分):
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,由事件授予:
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 整块略去):
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 / possible | this 为攻方,from 为目标;不成立时隐藏/不可选 |
set_defender_wargoal | 强制守方使用某个目标;不写时守方自己选 |
defender_default = yes | 守方没及时选择时的默认目标(多个时取文件里第一个) |
hide | never(默认)、always、no_cb(没有 CB 时隐藏) |
cede_claims | 和谈时是否割让宣称:yes、occupied_only、no |
threat_multiplier | 征服星系、行星时产生的威胁倍数 |
war_exhaustion | 本方战争疲劳增长速度的倍数 |
surrender_acceptance | AI 接受投降的意愿,负数更不愿意 |
on_accept | 目标投降、宣称割让之后执行 |
on_status_quo | 以维持现状结束时执行 |
forbidden_peace_offers | 禁止的和谈方式:status_quo、surrender、demand_surrender,值为提示文字的本地化键 |
available_in_proxy_wars_only | 只用于代理人战争 |
ai_weight | AI 选择权重 |
银河帝国成员是否参战
示例文件写的是 galactic_community_joins_defender,而原版实际的战争目标几乎都用 galactic_empire_joins_defender(32 处,前者只出现在示例里)。写新目标时请照原版实际用法,并在 error.log 里确认没有报未知字段。
用脚本宣战
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_<目标键>_desc | war_goal_wg_conquest |
l_simp_chinese:
casus_belli_cb_mymod_vendetta: "世仇"
war_goal_wg_mymod_vendetta: "清算旧账"
war_goal_wg_mymod_vendetta_desc: "对宿敌发动战争,迫使其赔偿当年的损失。"检查清单
- 战争目标的
casus_belli指向存在的 CB。 - CB 的
potential与is_valid都能对目标国家成立,否则宣战界面里看不到这个目标。 - 想限制只能由事件触发的战争,用
hide = always并通过declare_war指定attacker_war_goal。 - 补齐本地化,尤其是
war_goal_<键>_desc,它显示在宣战界面里。