战役效果详解
战役中的收入、控制力、补员、招募等级、行军距离、建筑成本、研究速率、兵种上限等变化,最终大多会落到 Effect 数据链上。Effect 不是“一个能独立运行的 Buff”,而是告诉游戏:显示什么说明、把数值交给哪一种处理逻辑、影响什么对象,以及由哪个系统授予。
本文讲通用 Effect 框架。建筑、科技、人物技能、特性和物品怎样连接 Effect,会在各自教程中继续展开。不要为了“做一个效果”复制所有含
effect的表;先确定授予入口,再沿引用关系补齐实际使用的分支。
先看完整数据链
授予入口
├─ building_effects_junction_tables
├─ technology_effects_junction_tables
├─ character_skill_level_to_effects_junctions_tables
├─ trait_level_effects_tables
├─ ancillary_to_effects_tables
└─ effect_bundles_to_effects_junctions_tables
│
├─ effect_key ───────────→ effects_tables
├─ effect_scope ─────────→ campaign_effect_scopes_tables
└─ value
effects_tables.effect
↓
effect_bonus_value_*_junctions_tables
├─ bonus_value_id:游戏实际执行的数值逻辑
└─ 可选目标:兵种、兵种集合、建筑链、武器、派系等
阅读时把它分成四个问题:
effects_tables:这个效果叫什么、怎样显示。effect_bonus_value_*_junctions_tables:这个数值究竟修改什么。effect_scope:修改谁、在哪里生效。- 授予入口:为什么当前人物、建筑、科技或事件会拥有它。
只看 Effect 的 Key 无法判断完整行为;只看授予表也无法判断底层处理器。排错时必须把四层串起来。
需要认识的表单
| 表单 | 作用 |
|---|---|
effects_tables |
定义 Effect Key、说明、图标、界面优先级、类别和数值正负的显示倾向。 |
effect_bonus_value_basic_junction_tables |
把 Effect 连接到不需要额外目标的基础 Bonus Value。 |
effect_bonus_value_*_junctions_tables |
把 Effect 连接到特定目标类型,例如兵种、兵种集合、建筑链、远程武器、人物类型或派系。 |
campaign_effect_scopes_tables |
定义战役效果作用对象之间的关系,例如己方派系、所属军队、所在地区或省份。 |
effect_bundles_tables |
定义一个可以被脚本、事件或系统整体添加、移除的效果包。 |
effect_bundles_to_effects_junctions_tables |
把若干 Effect、数值和作用范围装进效果包。 |
effect_bundle_advancement_stages_tables |
当原版效果包采用阶段变化时,定义阶段入口。只在模板实际使用时复制。 |
effect_bundle_exclusion_groups_tables及连接表 |
处理互斥效果包。普通独立效果包通常不需要。 |
unit_sets_tables |
定义可被 Effect 指向的一组兵种。 |
unit_set_to_unit_junctions_tables |
用具体兵种、兵种类型、类别或排除条件组成兵种集合。 |
effects_tables:界面身份
图中①是 Effect Key,②是常规图标,③是显示优先级。筛选wh_main_effect_economy_gdp_mod_all后能看到基础条目及带不同后缀的变体;基础条目的官方简中说明是“所有建筑收入产值:%+n%”。后缀相似不代表显示或授予方式完全相同。查看原版数据时,从依赖项 → 游戏文件打开对应表,确认标签页带有Game-RO:;需要修改的记录导入自己的 Mod Pack 后再编辑。
| 字段 | 含义 | 使用要点 |
|---|---|---|
effect |
Effect 的唯一 Key | 自定义记录必须使用不会与原版和其他 Mod 冲突的前缀。所有连接表都引用它。 |
icon |
正面或常规显示使用的图标 | 填写原版已有图标时先从相近效果复制路径,不要猜文件名。 |
description(本地化字段) |
玩家看到的效果说明 | 保存在.loc中,不是普通 DB 单元格。Key 为effects_description_加 Effect Key;文本中常含%n、%+n等数值占位。占位格式应沿用同类原版 Effect。 |
priority |
多条效果同时显示时的排序与隐藏设置 | 当前 Schema 说明数值越大越靠下,0隐藏该条效果的界面显示。它不代表效果强度,隐藏也不是停用实际效果。 |
icon_negative |
负面显示使用的图标 | 不要把“负数”和“负面”混为一谈,成本降低等负值可能有利;与显示倾向字段一起对照同类原版记录。 |
category |
界面分类 | 影响归类或显示方式,不是 Bonus Value。 |
is_positive_value_good |
正数是否被视为有利 | 用于说明和颜色倾向。它不会自动把数值取反,也不会改变底层计算公式。 |
界面分类怎么选
当前原版effects_tables.category实际使用三项:campaign、battle、both,分别作为战役、战斗和两者相关的界面分类。经济和建筑效果先选同类campaign记录;战斗数值效果则保留所复制记录的分类。此列不决定效果获得时间,也不能把一个只在战役授予的 Effect 变成自定义战斗直接生效。
下面三条可直接在effects_tables.effect列筛选,说明均已对照官方英文、繁中和简中 Loc:
| 目标 | Effect Key | 基础 Bonus Value | 数值怎样读 |
|---|---|---|---|
| 所有建筑收入产值 | wh_main_effect_economy_gdp_mod_all |
gdp_mod_all |
原版有value=5表示+5%的授予记录。 |
| 所有建筑的建筑成本 | wh_main_effect_building_construction_cost_mod |
同时连接building_cost_mod与building_conversion_cost_mod |
原版有value=-10表示-10%的授予记录;复制自定义 Effect 时两条处理器都要检查。 |
| 补员速率 | wh_main_effect_force_all_campaign_replenishment_rate |
replenishment_percentage_bonus |
科技tech_grn_start_1_3授予value=5,Scope 为faction_to_force_own_unseen。 |
收入与建筑成本的完整原版授予例子见下文“崇拜珐克斯”效果包。三条都不能把5改写成0.05;其他 Bonus Value 是否用相同单位,须看对应连接和原版授予值。
说明文字的正负方向
这是同一组记录向右滚动后的字段。①是负面图标,②是分类,③是is_positive_value_good。带bad后缀的条目没有勾选③,而其他图中条目勾选了;这种差别影响显示倾向,不会把收入计算自动取反。还要继续查看下面的 Bonus Value 和实际授予数值。
不要只根据中文句子判断正负:
- “建筑成本降低”可能由负值配合“成本修正”实现。
- “补员速率提高”通常使用正值。
- 某些处理器把
1当开关,而不是百分比。 - 某些说明需要
%+n显示正负号,某些需要%n%显示百分号。
最稳妥的方法是找到游戏中已经产生相同结果的原版条目,同时查看它的 Effect、Bonus Value、Scope 和 Value,而不是只复制文字相似的 Key。
Bonus Value:真正执行的逻辑
①是 Effect,②是bonus_value_id。图中的五个显示定义都连接到gdp_mod_all:Effect 的身份和显示可以不同,实际调用的数值逻辑却可以相同。不能靠改 Effect 的中文说明来创造新的计算逻辑。
基础连接
effect_bonus_value_basic_junction_tables只有两类核心信息:
| 字段 | 含义 |
|---|---|
effect |
引用effects_tables.effect。 |
bonus_value_id |
交给战役系统处理的数值类型。 |
例如同样是“收入”,不同 Bonus Value 可能分别处理城镇收入、贸易收入、劫掠收入或税率。中文说明相近,不代表可以互换。
带目标的连接
很多 Effect 还必须告诉游戏“修改哪个对象”。常见分支包括:
| 表单 | 额外目标 |
|---|---|
effect_bonus_value_unit_record_junctions_tables |
一个具体main_units记录。 |
effect_bonus_value_ids_unit_sets_tables |
一个unit_sets兵种集合。 |
effect_bonus_value_building_chain_junctions_tables |
一条建筑链。 |
effect_bonus_value_recruitment_source_junctions_tables |
一种招募来源。 |
effect_bonus_value_agent_subtype_junctions_tables |
一种人物类型。 |
effect_bonus_value_faction_junctions_tables |
一个派系。 |
effect_bonus_value_technology_junctions_tables |
一项科技。 |
effect_bonus_value_melee_weapon_junction_tables |
一种近战武器。 |
effect_bonus_value_missile_weapon_junctions_tables |
一种远程武器。 |
effect_bonus_value_projectile_junctions_tables |
一种投射物。 |
effect_bonus_value_unit_ability_junctions_tables |
一个部队技能。 |
这不是完整清单。正确选择方法是:
- 用 RPFM 全局搜索找到产生目标结果的原版 Effect。
- 对该 Effect Key 执行全局搜索。
- 查看它出现在哪张
effect_bonus_value_*连接表中。 - 复制那张表的记录结构,再替换成自己的目标 Key。
如果一个 Effect 同时出现在多个 Bonus Value 连接表中,它可能同时驱动多种逻辑。复制时不能只拿其中一条。
campaign_effect_scopes_tables:效果作用于谁
Scope 不是装饰字段。相同 Effect 和相同 Value 换一个 Scope,生效对象就可能完全不同。
campaign_effect_scopes_tables通过以下维度描述关系:
| 字段 | 关注的问题 |
|---|---|
source |
效果从谁或什么对象出发。 |
target |
最终影响谁。 |
ownership |
是否要求己方、敌方或特定所有权关系。 |
location |
是否受所在地区、省份、军队位置等关系限制。 |
territory |
是否要求位于己方、敌方或其他领土。 |
localised_text(本地化字段) |
显示范围说明的.loc文本,Key 为campaign_effect_scopes_localised_text_加 Scope Key;不是普通 DB 列,也不负责决定实际范围。 |
图中编号①是 Scope Key,②是location与ownership,③是source,④是target与territory。选择 Scope 时必须同时满足授予来源和目标对象,不能只看 Key 中某一个词。
图中筛选province_to_region_own,四条记录的来源都是province、目标都是region,但其中一条的location是factionwide,其他图中记录是provincewide。这说明同一前缀下仍可能有不同的位置关系。下文效果包使用的是province_to_region_own_unseen;不要仅凭unseen这个词推断所有权或实际作用范围,还要检查字段、本地化显示和授予入口。
Scope Key 往往很长,但长名字只是一条线索。不能把faction_to_force_own之类的英文凭感觉直译后直接使用;应当查找原版中与自己授予入口相同的记录。
常用 Scope 可直接对照
当前定义表有 435 条 Scope,下面选出本系列实际用到的入口。中文说明按字段关系解释;只有授予系统能提供对应source时才适用。
| Scope Key | source → target |
location |
可用来核对的目标关系 |
|---|---|---|---|
faction_to_faction_own_unseen |
faction → faction |
factionwide |
派系自身,例如外交效果。 |
faction_to_force_own_unseen |
faction → force |
factionwide |
派系范围内己方军队,例如科技提供补员。 |
faction_to_province_own_unseen |
faction → province |
factionwide |
派系范围内己方省份,例如部分英雄招募等级效果。 |
character_to_character_own |
character → character |
character |
获得效果的人物自身。 |
character_to_force_own |
character → force |
forcewide |
人物关联的己方军队。 |
province_to_region_own_unseen |
province → region |
provincewide |
省份内己方地区,例如省份建筑收入修正。 |
province_to_province_own_unseen |
province → province |
provincewide |
省份自身,例如本文系列的英雄招募许可。 |
以上七条的ownership=yours、territory=any。当前原版ownership共使用yours、allied、yours_and_allied、enemy、any;territory共使用yours、enemy、neutral、unowned、any。前者限定对象所属关系,后者限定领土关系,二者不是同一个条件。
需要其他范围时,在campaign_effect_scopes_tables分别筛选source与target列,再检查ownership、location和territory。选中候选 Key 后查找引用,优先打开与你同属建筑、科技或人物技能的授予表;不要把一条现有 Scope 的 Key 改几个英文单词来“创造”新范围。
选择 Scope 的实用顺序
- 先找相同授予入口:建筑效果优先参考建筑,人物技能优先参考人物技能。
- 再找相同目标:派系、所属军队、地区、省份、人物或单位。
- 最后比较 Value 的符号和说明文字。
- 游戏内分别检查拥有者、盟友、敌人和离开地区后的状态。
不要因为某个 Scope 在一项科技上正常,就假定它放进建筑、特性或效果包后仍有相同上下文。Scope 的 source 必须能由授予系统提供。
效果包:一次授予多条效果
①至④分别是效果包、Effect、Scope 和 Value。这里是原版“崇拜珐克斯”的效果包wh2_dlc09_edict_tmb_worship_of_phakth:同一个包包含建筑成本修正-10%和所有建筑收入产值修正+5%(表中分别填-10和5),都使用province_to_region_own_unseen。这是省份相关原版案例,适合看清“一个包装多条效果”;制作人物、军队或派系效果时,应换用相同授予上下文的模板,不能原样套用这个 Scope。
effect_bundles_tables
| 字段 | 含义 |
|---|---|
key |
效果包唯一 Key。脚本和其他系统通常引用它。 |
localised_title(本地化字段) |
效果包标题,保存在.loc,Key 为effect_bundles_localised_title_加效果包 Key。 |
localised_description(本地化字段) |
效果包说明,保存在.loc,Key 为effect_bundles_localised_description_加效果包 Key。 |
ui_icon |
效果包图标。 |
bundle_target |
效果包预期附着的对象类型。 |
priority |
界面显示顺序。 |
is_global_effect |
顶部栏和派系概览中的显示设置。当前 Schema 说明设为false会在这两处隐藏,不受priority影响;不要把它当成“把实际作用范围扩大到全派系”的开关。 |
show_in_3d_space |
是否在人物、军队上方或聚居地标签末尾显示效果包图标。 |
owner_only |
配合show_in_3d_space限制上述地图图标只向拥有者显示,不是效果只作用于己方的权限开关。 |
此表的 DB 结构还保留了与标题、说明同名的字符串列,而 Schema 同时登记了对应本地化字段。玩家实际看到的简中标题和说明,应在自己的.loc中配置;不要看到同名 DB 列就把整段中文直接填进去。原版模板中这些 DB 列的内容按模板保留,改的是效果包 Key 与对应 Loc Key。
在上一张连接表的效果包 Key 上右键,选择转到… → 转到定义,再筛选同一 Key 并向右滚动,可以看到这张图。①的 DB 标题仍是英文,但官方简中 Loc 对应“崇拜珐克斯”;②的bundle_target是province;③和④控制界面与地图图标显示。③勾选并不把②变成派系,也不替代连接表中的 Scope。
效果包的附着对象选项
当前原版bundle_target实际使用character、faction、force、province、region、none六项:人物、派系、军队、省份、地区和不声明上述附着目标的模板。按调用入口选同类记录;none不是“作用于所有对象”,force也不等于每个独立兵种。本文省份案例使用province,其中每条效果的具体目标仍由 Scope 决定。
effect_bundles_to_effects_junctions_tables
| 字段 | 含义 |
|---|---|
effect_bundle_key |
连接到哪个效果包。 |
effect_key |
装入哪个 Effect。 |
value |
传给 Bonus Value 的数值。可能是整数、百分比或开关,取决于处理器。 |
effect_scope |
当前条目影响谁。一个效果包内的不同条目可以使用不同 Scope。 |
advancement_stage |
阶段型效果包使用的阶段。普通固定效果包通常沿用空值或模板设置。 |
效果包只负责“打包”。持续回合数、何时添加、何时移除,通常由脚本、事件、仪式、任务、系统载荷或其他引用效果包的表决定。
兵种集合
当一条 Effect 要影响一批兵种时,不一定需要为每个兵种复制一条效果。原版经常使用unit_sets_tables和unit_set_to_unit_junctions_tables。
unit_sets_tables
| 字段 | 含义 |
|---|---|
key |
兵种集合 Key。 |
use_unit_exp_level_range |
是否按部队经验等级进一步筛选。 |
min_unit_exp_level_inclusive |
包含的最低经验等级。 |
max_unit_exp_level_inclusive |
包含的最高经验等级。 |
special_category |
特殊分类标记。只在相同系统模板使用时复制。 |
unit_set_to_unit_junctions_tables
| 字段 | 含义 |
|---|---|
unit_set |
目标集合。 |
unit_record |
直接加入某个具体兵种。 |
unit_caste |
按兵种阶层纳入。 |
unit_category |
按步兵、骑兵等类别纳入。 |
unit_class |
按单位职业或细分类纳入。 |
exclude |
把匹配项从集合中排除。 |
一行不必同时填写所有选择条件。应从原版同类集合复制结构,并用 RPFM 的引用和全局搜索确认实际成员。
图中打开的是effect_bonus_value_ids_unit_sets_tables。①为战斗移动速度相关逻辑mod_land_movement_battle,②为wh_main_effect_force_stat_speed_infantry,其官方简中说明是“移动速度:步兵部队%+n%”,③为目标集合infantry_units。要确定包含哪些兵种,继续对③使用转到定义并在unit_set_to_unit_junctions_tables筛选同一个集合,而不是仅凭“步兵”两个字猜测。
注意另一张名称相近的表effect_bonus_value_unit_set_unit_attribute_junctions_tables:其中的unit_set_attribute引用unit_set_unit_attribute_junctions_tables.key,不是直接填写unit_sets_tables.key。这类连接还要经过“集合与属性”的中间记录。选择哪条路径取决于要调整数值还是授予属性,先跟踪同类原版 Effect,不能因为表名都含unit_set就混填 Key。
集合分类的填写边界
unit_sets_tables.special_category当前非空值为blessed_spawning、chieftain、crafted、elector_counts、mistwalker、rakarth_beasts、renown、tech_lab。这些是特殊系统索引;自建普通数值效果集合可保留空值,填renown等标记不会自动实现对应招募入口。
只影响新兵种时,新建集合yourmod_unit_set,在unit_set_to_unit_junctions_tables填unit_set=yourmod_unit_set、unit_record=自己的 main_units Key,unit_caste、unit_category、unit_class留空,exclude=false。需要覆盖多个兵种时增加同集合的独立行。按分类纳入时,可直接查陆战单位详解的分类取值;不要在同一行随手填满三个分类,使筛选范围偏离目标。
怎样从原版数据找到正确 Effect
从游戏里的中文说明出发
- 记下游戏中完整说明,例如“补员速率:+5%”。
- 在 RPFM 全局搜索中先搜中文关键词。
- 从本地化结果定位 Effect 或授予对象 Key。
- 搜索该 Key 的全部引用。
- 记录 Effect、Bonus Value、Scope、Value 和授予入口五项信息。
从已知对象出发
如果已经知道某项建筑、科技、技能、特性或物品:
- 先在对应定义表找到它的 Key。
- 打开它的效果连接表。
- 复制目标行中的 Effect Key。
- 全局搜索该 Effect,确认 Bonus Value 连接。
- 查看是否还引用兵种集合、建筑链、招募来源等额外目标。
从 Bonus Value 出发
如果只知道想修改的机制:
- 在
campaign_bonus_value_ids_*或已有 Effect 连接中搜索英文机制关键词。 - 查看哪些 Effect 使用该 Bonus Value。
- 优先挑选与目标授予入口和 Scope 相同的模板。
- 回到游戏中文本,确认该模板的玩家术语与目标一致。
新建自定义 Effect 的步骤
- 找到行为、授予入口和 Scope 都接近的原版模板。
- 把所需表导入自己的 Pack,只保留要参考的记录。
- 为自定义
effects_tables.effect改成唯一 Key。 - 创建或复制正确的
effect_bonus_value_*连接记录,并改为新 Effect Key。 - 在建筑、科技、技能、特性、物品或效果包的连接表中引用新 Effect。
- 添加或检查本地化说明和图标。
- 运行 RPFM 诊断,处理缺失引用和重复 Key。
- 进游戏检查实际对象、数值方向、范围、持续时间和提示文字。
只从
依赖项 → 游戏文件导入原版表,查看时确认Game-RO:页签。不能从Assembly Kit 文件复制、导入或编辑表单。导入后必须把自己 Pack 内的data__改成唯一表文件名;保留相同路径可能覆盖原版子表,而不是只新增一行。
常见错误
有说明但没有效果
通常是只创建了effects_tables,没有创建 Bonus Value 连接;或者授予入口引用了错误的 Effect Key。
效果生效但对象不对
优先检查effect_scope,再检查带目标的effect_bonus_value_*连接表。不要先改数值。
正负号或颜色反了
同时检查 Value、is_positive_value_good、说明占位符和原版同类模板。显示错误与计算方向错误是两类问题。
效果包出现但不消失
效果包表本身不一定负责持续回合。检查授予它的脚本、事件、载荷或系统是否提供了移除条件和持续时间。
改了单位集合却影响过多兵种
检查unit_caste、unit_category、unit_class以及exclude行。集合可能通过分类自动包含后续兵种。
数值写成10却得到意外结果
不同 Bonus Value 对10的解释不同:可能是+10、+10%、乘数的一部分、上限变化或开关。必须从同一个 Bonus Value 的原版记录确认单位。
游戏内验收清单
- 游戏界面使用正确的简体中文术语和图标。
- 正值、负值及百分号显示正确。
- 目标派系、人物、军队、地区或省份正确。
- 离开作用范围后效果按预期消失。
- 多个来源叠加时结果符合预期。
- 读取旧存档和新开战役的表现都经过检查。
- AI 使用或获得该效果时没有明显异常。
- 移除授予来源后不存在残留效果。
RPFM 诊断可以检查其规则覆盖的缺失引用、重复 Key 和表结构问题,但诊断通过不证明运行时上下文、叠加规则和中文提示完全正确。本篇截图核对的是原版数据关系,改出的效果仍须按上面的清单在游戏中验收。

