特性详解
人物特性由“特性身份—特性等级—等级效果”三层组成。人物在游戏中获得的是特性点数;点数达到character_trait_levels_tables的阈值后,才显示对应等级并应用该等级连接的 Effect。
完整数据链
character_traits_tables
├─ character_trait_levels_tables
│ └─ trait_level_effects_tables
├─ trait_info_tables
├─ trait_to_antitraits_tables
└─ 获得或移除来源
├─ 战役脚本
├─ 事件、任务、战后结果
└─ 其他系统表
新建完三张核心表,只代表“这个特性可以存在”。它不会自动告诉游戏何时给人物加点。获得条件可能来自脚本或其他系统,必须另外追踪模板的授予来源。
核心表单
| 表单 | 负责什么 |
|---|---|
character_traits_tables |
特性 Key、隐藏状态、不可回退等级、图标和优先级。 |
character_trait_levels_tables |
每个显示等级的名称、说明、阈值和所属特性。 |
trait_level_effects_tables |
每个特性等级实际提供的 Effect。 |
trait_info_tables |
特性标识记录。当前 Schema 中只有trait列,character_traits.key引用它;不能在此填写不存在的人物权限列。 |
trait_categories_tables |
特性分类和分类图标。只在目标界面系统使用时添加。 |
trait_to_antitraits_tables |
定义相反或互斥特性。 |
不要把trait_triggers_tables、trait_to_included_agents_tables等旧教程表名直接当成通用授予方法。应从依赖项 → 游戏文件搜索目标特性 Key,并追踪当前原版脚本或实际使用的系统连接。Assembly Kit 仅可交叉参考,不是导入来源;本文也不使用start_pos编辑初始人物。
character_traits_tables
①是特性 Key,②是回退与隐藏字段,③是图标分类,④是界面倾向等设置。这里筛选原版wh2_main_trait_attacking_victory,它的三个阶段在官方简中显示为“自傲的攻击者”“攻势思维”“突袭专家”。这个案例适合解释多阶段特性;击败特定领主的一次性特性、隐藏计数特性和人物初始特性,需要另查对应模板与授予条件,不要求全部照此设置。
| 字段 | 含义 |
|---|---|
key |
特性唯一 Key。 |
no_going_back_level |
达到指定等级后,特性点数不能再退回更低阶段的入口。按原版同类特性验证。 |
hidden |
是否隐藏特性。隐藏特性可用于内部计数或脚本状态。 |
precedence |
特性竞争或显示时的优先级入口。不是效果强度。 |
icon |
引用trait_categories_tables.category的图标分类入口;不是随意填 PNG 路径。本例是trait_good。 |
ui_priority |
当前 Schema 对此字段注明:-1按负面红色、0按中性黄色、1按正面绿色显示。不能仅按“优先级”字面理解为列表序号;它也不改变 Effect 的计算正负。 |
pre_battle_speech_parameter |
战前语音参数。 |
remove_on_skill_reset |
重置技能时是否移除。只对相关人物系统有意义。 |
当前截图对应的游戏表没有author、comment列。参考资料中的编辑备注不能当作游戏 DB 必填项;玩家名称与说明放在特性等级的.loc文本中。
图标分类的全部 Key
当前trait_categories_tables共有 55 项。普通正面特性可从trait_good入手,负面从trait_bad入手;人物类别或特殊系统图标只改变对应图像,不会自动增加获得条件。下表列出实际引用路径,中文用途不靠英文 Key 猜成游戏名称。
icon应填的分类 Key |
定义表中的icon_path |
|---|---|
agent |
ui/campaign ui/skills/trait_agent.png |
beastmen |
ui/campaign ui/skills/trait_beastmen.png |
bretonnia |
ui/campaign ui/skills/trait_bretonnia.png |
cathay |
ui/campaign ui/skills/trait_cathay.png |
chaos |
ui/campaign ui/skills/trait_chaos.png |
chaos_dwarfs |
ui/campaign ui/skills/trait_chaos_dwarfs.png |
chivalry_negative |
ui/campaign ui/skills/virtue_negative.png |
chivalry_positive |
ui/campaign ui/skills/virtue_positive.png |
daemons |
ui/campaign ui/skills/trait_daemons.png |
dark_elves |
ui/campaign ui/skills/trait_dark_elves.png |
dlc25_chieftain_scaling_trait |
ui/campaign ui/effect_bundles/trait_deference_1.png |
dlc25_tamurkhan_scaling_trait |
ui/campaign ui/effect_bundles/trait_deference_4.png |
dwarf |
ui/campaign ui/skills/trait_dwarf.png |
greenskin |
ui/campaign ui/skills/trait_greenskins.png |
harkon_fractured |
ui/campaign ui/effect_bundles/fractured_mind.png |
harkon_restored |
ui/campaign ui/effect_bundles/restored_mind.png |
hertwig_legendary_physician |
ui/campaign ui/skills/trait_dlc13_hertwig_legendary_physician.png |
hertwig_van_hal_bloodline |
ui/campaign ui/skills/trait_dlc13_hertwig_van_hal_bloodline.png |
high_elves |
ui/campaign ui/skills/trait_high_elves.png |
human |
ui/campaign ui/skills/trait_human.png |
imrik_black_dragon |
ui/campaign ui/skills/trait_dlc15_imrik_black_dragon.png |
imrik_forest_dragon |
ui/campaign ui/skills/trait_dlc15_imrik_forest_dragon.png |
imrik_moon_dragon |
ui/campaign ui/skills/trait_dlc15_imrik_moon_dragon.png |
imrik_star_dragon |
ui/campaign ui/skills/trait_dlc15_imrik_star_dragon.png |
imrik_sun_dragon |
ui/campaign ui/skills/trait_dlc15_imrik_sun_dragon.png |
jorek_magnificent_engineer |
ui/campaign ui/skills/trait_dlc13_jorek_magnificent_engineer.png |
kalara_ishas_blessing |
ui/campaign ui/skills/trait_dlc13_kalara_ishas_blessing.png |
khorne |
ui/campaign ui/skills/trait_khorne.png |
kislev |
ui/campaign ui/skills/trait_kislev.png |
kislev_ataman |
ui/campaign ui/skills/trait_ataman.png |
kislev_ice_court |
ui/campaign ui/skills/trait_ice_court.png |
lizardmen |
ui/campaign ui/skills/trait_lizardmen.png |
loyalty |
ui/campaign ui/effect_bundles/loyalty.png |
military |
ui/campaign ui/skills/trait_military.png |
mortal_torment |
ui/campaign ui/effect_bundles/dlc10_mortal_torment.png |
navy |
ui/campaign ui/skills/trait_navy.png |
norsca |
ui/campaign ui/skills/trait_norsca.png |
nurgle |
ui/campaign ui/skills/trait_nurgle.png |
ogre_kingdoms |
ui/campaign ui/skills/trait_ogre_kingdoms.png |
personality |
ui/campaign ui/skills/trait_personality.png |
physical |
ui/campaign ui/skills/trait_physical.png |
rodrik_wolf_hearted |
ui/campaign ui/skills/trait_dlc13_rodrik_wolfhearted.png |
skaven |
ui/campaign ui/skills/trait_skaven.png |
slaanesh |
ui/campaign ui/skills/trait_slaanesh.png |
sword_of_khaine |
ui/campaign ui/effect_bundles/dlc10_sword_of_khaine.png |
tomb_kings |
ui/campaign ui/skills/trait_tomb_kings.png |
trait_bad |
ui/campaign ui/skills/trait_battle_negative.png |
trait_good |
ui/campaign ui/skills/trait_campaign_positive.png |
tzeentch |
ui/campaign ui/skills/trait_tzeentch.png |
vampire_coast |
ui/campaign ui/skills/trait_vampire_coast.png |
vampire_counts |
ui/campaign ui/skills/trait_vampire_counts.png |
vow_grail |
ui/campaign ui/effect_bundles/vow_grail_positive.png |
vow_knights |
ui/campaign ui/effect_bundles/vow_knights_positive.png |
vow_questing |
ui/campaign ui/effect_bundles/vow_questing_positive.png |
wood_elf |
ui/campaign ui/skills/trait_wood_elves.png |
在character_traits_tables.icon填左列 Key;右列用于定位或复用资源。若创建独立图标分类,还要新建分类记录并提供实际图像,不能把右列路径直接塞进特性的icon列。
character_trait_levels_tables
一项特性可以只有一级,也可以包含多个正向或负向阶段。
| 字段 | 含义 |
|---|---|
key |
当前特性等级的唯一 Key。 |
trait |
所属character_traits.key。 |
level |
显示等级序号。 |
threshold_points |
达到该等级所需特性点数。 |
onscreen_name(本地化字段) |
当前等级显示名称。不同等级可以不同。 |
explanation_text(本地化字段) |
获取等补充说明;本例原版写“获取方式:打赢多场进攻战”,但文字本身不执行授予条件。 |
removal_text(本地化字段) |
移除相关的说明文本;写入文本不会自动实现移除逻辑。 |
colour_text(本地化字段) |
描写人物行为或特性背景的文字,不是颜色开关。 |
这四项都保存于.loc,不是普通 DB 列。Loc Key 写成character_trait_levels_字段名_等级Key,例如character_trait_levels_onscreen_name_wh2_main_trait_attacking_victory_2对应“攻势思维”。注意最后拼接的是等级 Key,不是三个阶段共同引用的特性 Key。
图中编号①是当前等级记录 Key,②是level,③是所属trait,④是threshold_points。同一特性的多个等级通过③归组,再由④决定达到哪个阶段。
本例三个等级依次需要8、12、18点。它们的等级序号是1、2、3,两组数不能混写。截图没有显示每场战斗增加多少点,所以不能据此直接告诉读者“打赢 8 场必定获得一级”;还要继续追踪原版的加点条件、计数方法和例外限制。
阈值不必固定为1、2、3。有的特性每次行为加若干点,有的正负行为会互相抵消。复制时必须追踪授予脚本或事件怎样增减点数。
trait_level_effects_tables
| 字段 | 含义 |
|---|---|
trait_level |
哪一个显示等级。 |
effect |
提供哪个 Effect。 |
value |
传给 Bonus Value 的数值。 |
effect_scope |
影响人物、所属军队、派系或其他对象。 |
同一等级可以有多条 Effect。不同等级是“完整替换”还是“逐级叠加”,应通过原版数据和游戏行为确认,不能仅从level推断。
在trait_level_effects_tables筛选同一段 Key,可以看到七条连接:①中的一级、二级各两条,三级三条;②是各自的 Effect;③是每行的 Scope;④是数值。三级还多了一条近战攻击效果。这些行按具体等级 Key连接,不是把特性总 Key 填七遍。不同 Scope 可能分别影响人物自身和所属军队,不能把一整组统一改成同一个范围。
三个等级的效果不必再靠截图抄
trait_level |
effect |
effect_scope |
value |
|---|---|---|---|
wh2_main_trait_attacking_victory_1 |
wh_main_effect_character_stat_leadership_aura_size_attacking |
character_to_character_own |
10 |
wh2_main_trait_attacking_victory_1 |
wh_main_effect_force_stat_leadership_attacking |
general_to_force_own |
2 |
wh2_main_trait_attacking_victory_2 |
wh_main_effect_character_stat_leadership_aura_size_attacking |
character_to_character_own |
20 |
wh2_main_trait_attacking_victory_2 |
wh_main_effect_force_stat_leadership_attacking |
general_to_force_own |
3 |
wh2_main_trait_attacking_victory_3 |
wh_main_effect_character_stat_leadership_aura_size_attacking |
character_to_character_own |
30 |
wh2_main_trait_attacking_victory_3 |
wh_main_effect_character_stat_melee_attack |
character_to_character_own |
4 |
wh2_main_trait_attacking_victory_3 |
wh_main_effect_force_stat_leadership_attacking |
general_to_force_own |
4 |
对应名称依次为“自傲的攻击者”“攻势思维”“突袭专家”,阈值为8、12、18,已对照官方三种 Loc。自建三阶段特性时,把共同特性改为yourmod_trait,等级分别改为yourmod_trait_1至_3,并替换本表每行的等级引用;不改原版 Effect 行即可继续复用原版计算逻辑。
若只做一次获得、没有升级的特性,可以只建level=1、threshold_points=1的一条等级记录及其效果。1点方案是自定义设计,不要反过来把原版三阶段阈值都改成1。
相反特性与互斥
trait_to_antitraits_tables使用trait和antitrait建立相反关系。常见用途是让两种行为朝相反方向积累或互相移除,但实际点数变化仍由授予系统决定。
不要为了名字相反就建立关系。先找同类原版特性,确认脚本或系统是否读取该反特性关系。
特性适用对象
当前trait_info_tables的 Schema 只有trait标识列,没有applicable_to。参考资料中出现的编辑器元数据或其他结构,不能当成当前游戏可编辑的人物权限列。
应全局搜索目标特性 Key,查看实际授予脚本或系统连接怎样筛选人物大类、人物类型、派系、战斗参与者以及领主或英雄身份。创建一行特性定义,不代表所有人物都会自动获得;只更改描述也不会改变适用对象。
怎样找到特性的获得方式
- 用游戏简体中文名称定位
character_trait_levels或本地化 Key。 - 从等级记录找到
character_traits.key。 - 全局搜索特性 Key,记录所有 DB 和脚本引用。
- 如果只在脚本中出现,查看脚本在什么事件、人物类型和条件下增加点数。
- 如果出现在事件或任务数据中,沿对应载荷继续追踪;想让已有的目标人物在新战役开始时获得特性,应检查战役初始化脚本的授予条件,不新建同名初始化表来替代。
- 检查是否存在 antitrait、隐藏阶段或不可回退等级。
击败传奇领主、频繁伏击、长期征战等都只是可能的授予案例,不是特性系统的固定入口。
原版脚本的准确查找位置
在依赖项 → 游戏文件中按路径定位script/campaign/wh2_campaign_traits.lua,当前文件来自游戏data_script.pack。搜索campaign_traits:give_trait,可以看到这个函数检查人物接口、check_exclusion和随机概率,再调用cm:force_add_trait。
这个包装函数的参数顺序是character, trait, _points, _chance;后两项不传时,源码默认1点和100的概率。这里的trait填共同特性 Key,例如wh2_main_trait_attacking_victory,不填_1等级 Key。函数定义本身不是触发器,仍要找到谁在什么事件里调用它。
同一文件开头的trait_exclusions.subculture中,进攻胜利特性列有wh_main_sc_brt_bretonnia。这是排除表,不能把命中该 Key 误看成巴托尼亚的授予入口。本次在这个文件中找到的是排除项与通用授予函数,没有找到进攻胜利计数的完整触发链,因此不能把阈值8解释成固定八场胜利。
定位自己的目标时,先清空 DB 文件类型与data__$路径过滤,改为 Lua 内容搜索;依次搜完整特性 Key、give_trait调用和触发事件。命中定义、排除表、移除函数、授予调用时分别判断职责,只有最后的事件条件与加点调用才说明为什么获得。自己的新特性需要独立触发逻辑;不要复制或覆盖整份原版脚本来改一个 Key。
新建特性的推荐顺序
- 从
依赖项 → 游戏文件的原版记录选择同类模板,将必要子表导入自己的 Pack;把自己 Pack 中的data__改成唯一文件名,再仅保留需要的记录。创建唯一的character_traits.key,并按实际引用检查标识记录。 - 创建至少一个特性等级,设置等级与点数阈值,在
.loc填写对应等级的名称和说明。 - 为每个等级连接实际需要的 Effect。
- 设置适用对象和必要的反特性关系。
- 选择真实授予入口:脚本、事件、任务或同类原版已经使用的系统;需要开局授予时单独处理脚本初始化与读档防重复。
- 为获得、升级、下降和移除分别设计可验证条件。
- 运行 RPFM 诊断并检查脚本 Key。
- 在游戏中重复触发条件,验证点数、阶段和存档。
常见错误
- 特性永远不出现:只做了定义,没有授予来源。
- 特性出现但没有效果:缺少
trait_level_effects或 Effect 链错误。 - 一次触发直接跳到高等级:授予的点数超过多个阈值。
- 负向行为不能降级:检查
no_going_back_level和授予逻辑。 - 错误人物获得:检查授予入口对人物大类、人物类型、派系和参与条件的筛选,不在
trait_info中寻找不存在的applicable_to列。 - 名称随等级不变化:每个等级需要自己的显示文本。
游戏内验收
- 正确人物在正确条件下获得特性点数。
- 每个阈值只在预期时升级或降级。
- 名称、说明、图标和颜色正确。
- 每一级 Effect、Scope 和数值正确。
- 相反行为和 antitrait 按预期工作。
- 保存并读取后点数与当前等级保持一致。
RPFM 诊断无法执行授予脚本,也不能证明点数阈值的运行时变化。特性必须通过重复触发和存档读取验收。

