制作第一个模组
下面用一个数值修改走完 RPFM 的基本流程:把震旦玉勇的基础近战防御从34改为100。
开始前应已完成首次启动与初始设置,并能在
依赖项中看到游戏文件。操作时关闭游戏,并暂时停用其他会修改玉勇数据的 Mod。
为什么选择 land_units_tables
对第一次制作 Mod 的用户来说,修改单位数值是最简单、方便且直观的入门操作。它不需要先理解模型、贴图、动画、脚本和多张数据表之间的复杂关系,只要找到一个数值、修改并保存,就能在游戏中看到变化。
这次选择land_units_tables,是因为它保存了陆战单位的许多核心战斗数据。玉勇的基础近战防御就直接写在这张表的melee_defence列中,把34改为100即可得到明显的游戏内变化,非常适合用来确认第一个 Mod 是否制作成功。
这篇教程真正要学习的并不只是把一个数值从34改成100,而是借助这个简单修改,完整走一遍制作数据类 Mod 的基本流程:
- 新建 Pack、设置文件名并保存到正确位置。
- 在
依赖项中查找原版数据表和单位记录。 - 复制原版记录并创建新表,或者把原始表导入自己的 Pack。
- 为导入的表文件重新命名,避免使用
data__覆盖原版同名数据表。 - 只保留需要修改的单位记录,减少冲突和不必要的数据。
- 修改数值、保存 Pack、运行诊断并进入游戏检查结果。
掌握这些操作后,即使以后修改的不是近战防御,也可以沿用相同思路:先找到负责该内容的数据表,再把需要的原版记录放进自己的 Pack,完成修改、保存和测试。
land_units_tables不只包含近战防御。它可以直接设置领导力、近战攻击、冲锋加成、弹药量、精度、装填时间缩减、额外生命值和多种伤害抗性,也可以指定单位使用的护甲、盾牌、近战武器、远程武器、实体、动画、坐骑、阵型间距、属性组和语音,还包含隐蔽与侦测、AI 战斗定位、占领能力、自动结算分类和默认战斗模式等设置。
有些列保存的是数值,有些列只是指向其他表的记录。例如
armour选择护甲记录,primary_melee_weapon选择近战武器记录;真正的护甲值、武器伤害和攻击间隔还要到被引用的表中查看。land_units_tables也不负责单位人数、招募费用、招募建筑、单位名称、兵牌或模型外观,这些内容需要其他表或 Loc 文件。第一个练习只修改它直接保存的melee_defence。
新建并保存 Pack
- 打开
PackFile → 新建 PackFile,也可以按Ctrl+N。 - 在保存窗口中进入《全面战争:战锤 III》的
data文件夹。 - 将文件名设为
tutorial_first_mod.pack并保存。
常见的保存位置如下,实际 Steam 库和盘符以你的电脑为准:
……\SteamLibrary\steamapps\common\Total War WARHAMMER III\data\tutorial_first_mod.pack
不要覆盖
data.pack、db.pack等原版文件,也不要使用已经存在的 Mod 文件名。新 Pack 默认是Mod类型;如需确认,右键 Pack 根节点,查看更改 PackFile 类型 → Mod左侧是否有选中标记。
找到玉勇的数据
- 如果左下角没有
依赖项面板,打开视图 → 切换依赖面板。 - 在依赖项筛选框中输入
land_units_tables。 - 展开
游戏文件 → db → land_units_tables,双击data__。 - 在表格下方的筛选栏中输入
wh3_main_cth_inf_jade_warriors_0并按Enter。 - 确认表格只剩这条玉勇记录。
标签名中的Game-RO表示这是原版只读数据。它只供查找和复制,不能直接保存修改。
复制完整数据行
如果准备使用下面的“方法一:创建空表”,先复制玉勇记录;如果准备使用“方法二:导入原始表”,可以跳过这一节。
- 保持数据表的全部列可见。
- 点击玉勇记录最左侧的行号,选中整行。行号会随游戏和工具版本变化,不必与图中的
1447相同。 - 按
Ctrl+C复制。
不要在复制前隐藏列。RPFM 只会复制当前显示的列;缺少列的数据粘贴到新表后,会产生空字段或错误引用。复制完成后再隐藏无关列没有问题。
在自己的 Pack 中创建数据表
创建land_units_tables有两种常用方法。第一种是创建空表后粘贴目标记录,Pack 最干净;第二种是把原始表导入 Pack,再删除不需要的记录,适合习惯先取得完整原表再筛选的用户。两种方法最后都只应留下玉勇这一条记录,选择其中一种即可。
方法一:创建空表
- 在左上角
Pack 内容中右键tutorial_first_mod.pack。 - 点击
创建 → 创建 DB 数据表。 - 文件名填写
tutorial_first_mod。 - 在下方筛选框输入
land_units_tables,然后在中间的下拉框选择land_units_tables。 - 点击
确定。
完成后,Pack 中会出现db → land_units_tables → tutorial_first_mod。双击tutorial_first_mod打开空白表格。
方法二:导入原始表
- 在
Pack 内容中先单击tutorial_first_mod.pack,确保它是当前目标 Pack。 - 在
依赖项筛选框中输入land_units_tables。 - 展开
游戏文件 → db → land_units_tables,右键data__并点击导入。 - 在
Pack 内容中展开db → land_units_tables,确认已经出现data__。 - 右键这个
data__文件,点击重命名/移动,将文件名改为tutorial_first_mod。不要勾选启用全路径移动,也不要重命名land_units_tables文件夹。
导入后必须重命名
data__。 如果 Mod 中仍然保留db/land_units_tables/data__这个原版内部路径和文件名,游戏加载 Mod 时会用它覆盖原版同名数据表,而不是只覆盖你修改的玉勇记录。这不会改坏硬盘中的原版data.pack,但会让你的 Mod 接管整张原版表,容易造成大范围兼容问题。应把文件改成自己独有的名称,例如tutorial_first_mod。
- 双击重命名后的
tutorial_first_mod,在表格筛选栏中输入wh3_main_cth_inf_jade_warriors_0并按Enter。 - 点击玉勇记录最左侧的行号,选中完整一行。
- 清空筛选栏并按
Enter,让全部记录重新显示。此时玉勇这一行仍应保持选中。 - 使用表格工具栏或右键菜单中的
反选;如果使用右键菜单,应在仍被选中的玉勇行上点击右键。确认玉勇不再处于选中状态,而其他记录全部被选中。 - 在任意一个已选中的其他记录上点击右键,再点击
删除行,只留下玉勇记录。 - 确认右下角的行数显示为
1/1,并再次核对剩下的Key是wh3_main_cth_inf_jade_warriors_0。
执行
反选前必须先清空筛选条件。反选只会处理当前表格中可见的记录;如果筛选结果中只显示玉勇,直接反选不会选中那些被筛选隐藏的记录,也就无法删除它们。
修改数值
如果使用方法一,先完成下面两步;如果使用方法二,表格中已经只剩玉勇,可以直接修改Melee Defence。
- 右键空白表格,点击
粘贴为新行,也可以按Ctrl+Shift+V。 - 确认右下角的行数显示为
1/1。
接下来两种方法的操作相同:
- 为了方便查看,可以打开表格下方的
Columns,只保留Key和Melee Defence。使用方法一时,这一步必须放在复制完成之后。 - 双击
Melee Defence列中的34,输入100并按Enter。
左侧文件位于自己的 Pack 中,标签也不再以Game-RO开头,因此这里的内容可以编辑。不要修改Key,它用于确定这条记录覆盖的是哪个原版单位。
保存并运行诊断
- 按
Ctrl+S保存 Pack。 - 确认窗口标题末尾的
*消失,状态栏显示All packs saved.。 - 打开
视图 → 切换诊断窗口。 - 点击诊断面板左侧的三角形按钮重新检查。
- 确认错误、警告和信息三个计数都是
0。
诊断通过只说明 Pack 的结构和引用没有发现问题,不等于已经完成游戏内验证。
在游戏中检查
- 关闭 RPFM 或保持 Pack 已保存,然后打开《全面战争:战锤 III》启动器。
- 在模组管理器中启用
tutorial_first_mod.pack,暂时关闭其他 Mod。 - 启动游戏并进入自定义战斗。
- 选择震旦军队,查看玉勇的近战防御。
预期结果是玉勇的近战防御明显提高。游戏版本、难度、技能和战场效果可能继续修改单位面板中的最终数值,因此不要只凭是否恰好显示100判断 Pack 有没有加载。
如果启动器中找不到 Mod,检查 Pack 是否位于游戏的data文件夹、扩展名是否确实为.pack、PackFile 类型是否为Mod。如果数值没有变化,先确认 Mod 已启用,再关闭其他会修改land_units_tables的 Mod 后重试。
完成测试后,可以继续保留这个练习 Mod,也可以先在启动器中停用,再从data文件夹移走tutorial_first_mod.pack。
land_units_tables 各列作用
RPFM 会把字段名整理成带空格的标题,例如melee_defence显示为Melee Defence。下面按当前《全面战争:战锤 III》Schema v54 中可编辑的60列列出作用,并使用 Schema 中的原始字段名,方便在不同语言界面和其他资料中核对。当前练习不需要修改除melee_defence以外的列;复制现有单位时,其他列保持原值最安全。
身份、类型与单位构成
| 列名 | 作用 |
|---|---|
key |
这条陆战单位记录的唯一标识。其他表通过它找到该单位;本教程保留原值,才能覆盖原版玉勇。 |
category |
单位的大类,例如近战步兵、远程步兵、骑兵或战争机器,供战斗、界面和其他系统分类。 |
class |
比category更具体的单位类别,供界面、AI和部分战斗逻辑判断。 |
short_description_text |
单位短说明的文本键,指向unit_description_short_texts_tables,不是直接填写的中文。 |
historical_description_text |
单位长说明的文本键,指向unit_description_historical_texts_tables。 |
campaign_action_points |
战役地图行动点,主要用于领主及其带领的军队;普通兵种通常照抄相近原版单位。它不是战场移动速度。 |
man_entity |
单个士兵或生物使用的战斗实体记录,关联移动速度、质量、碰撞、基础生命值等底层属性。 |
man_animation |
单位成员使用的战斗动画集合。动画与骨架、武器姿态不匹配会造成动作异常。 |
num_mounts |
该单位包含的坐骑数量。普通骑兵通常与单位中的骑手数量对应,单体骑乘角色通常为1。 |
mount |
坐骑记录。步兵通常留空;骑兵、骑乘角色和部分载具需要与num_mounts配套。 |
spacing |
单位成员的阵型间距与排列规则,指向unit_spacings_tables。 |
rank_depth |
单位采用的默认阵列纵深,也就是阵型默认排成多少排。 |
morale |
单位的基础领导力。实际战斗数值还会受到难度、技能、效果和战场状态影响。 |
bonus_hit_points |
在man_entity基础生命值之上增加的生命值。总生命值还与实体和单位人数有关。 |
training_level |
训练等级。RPFM Schema 注明战锤系列应保持为trained,其他选项已经被设计弃用。 |
防护、武器与基础战斗数值
| 列名 | 作用 |
|---|---|
armour |
指向unit_armour_types_tables中的护甲记录,由被引用记录决定护甲数值。 |
shield |
指向unit_shield_types_tables中的盾牌记录,决定远程格挡等盾牌属性;无盾单位通常使用none。 |
primary_missile_weapon |
主要远程武器记录,关联远程武器和弹丸;没有远程攻击的单位通常留空。 |
accuracy |
单位使用远程武器时的基础精度。最终散布还会受到武器、弹丸和其他参数影响。 |
primary_ammo |
主要远程武器的基础弹药量。没有主要远程武器时通常为0。 |
primary_melee_weapon |
主要近战武器记录,关联基础伤害、破甲伤害、攻击间隔和溅射等数据。 |
melee_attack |
基础近战攻击,影响近战攻击命中对手的概率。 |
charge_bonus |
基础冲锋加成,在冲锋接战后暂时提高近战攻击和武器伤害。 |
melee_defence |
基础近战防御,影响单位躲开敌方近战攻击的概率;本教程把这一项从34改为100。 |
num_engines |
单位包含的战争机器或火炮实体数量,需要与engine等记录配套。 |
engine |
单位使用的战场引擎记录,主要用于火炮、战车或其他战争机器。 |
articulated_record |
铰接式载具记录,用于具有多段连接结构的特殊车辆;普通单位通常留空。 |
is_male |
单位成员的性别标记,可能被语音、动画或其他内容选择逻辑使用。 |
侦测、属性、语音与地形
| 列名 | 作用 |
|---|---|
visibility_spotting_range_min |
可见性系统使用的最小侦测距离参数。具体结果还会受到隐藏类型和其他倍率影响。 |
visibility_spotting_range_max |
可见性系统使用的最大侦测距离参数,不等同于远程武器射程。 |
attribute_group |
指向单位属性组,可集中赋予先锋部署、鼓舞、免疫心理等属性。 |
spot_dist_tree |
单位与树林隐蔽目标交互时使用的侦测距离参数。 |
spot_dist_scrub |
单位与灌木隐蔽目标交互时使用的侦测距离参数。 |
reload |
对远程武器装填时间的百分比缩减。它会与武器基础装填时间及其他加成共同计算。 |
selection_vo |
选中单位时使用的主要语音分类。 |
selected_vo_secondary |
选中语音的第二层分类,通常补充兵种或战斗角色信息。 |
selected_vo_tertiary |
选中语音的第三层分类,通常补充文化等信息。三项语音字段需与现有音频配置匹配。 |
hiding_scalar |
单位被敌人发现时使用的隐藏倍率。该字段容易受其他可见性参数影响,制作新单位时应复制相近原版单位。 |
ground_stat_effect_group |
地形对单位数值产生影响时使用的分组,例如区分小型和大型单位。 |
secondary_ammo |
特殊单位的次要弹药量。没有第二套弹药机制的单位通常为0。 |
伤害修正与战斗行为
| 列名 | 作用 |
|---|---|
damage_mod_flame |
火焰伤害修正。0表示不修正,正值降低所受火焰伤害,负值增加所受伤害。 |
damage_mod_magic |
魔法伤害修正。0表示不修正,正值降低所受魔法伤害,负值增加所受伤害。 |
damage_mod_physical |
物理伤害修正,通常对应物理抗性或物理弱点。 |
damage_mod_missile |
远程伤害修正,通常对应远程抗性或远程弱点。 |
damage_mod_all |
对全部伤害生效的总伤害修正。它会与其他抗性和游戏限制共同计算。 |
ai_usage_group |
AI在战斗中如何定位和使用这个单位,例如前线近战、远程、火炮或高价值单位。 |
can_skirmish |
是否允许使用自动规避近战敌人的散兵模式。勾选表示允许。 |
mounted_draughts |
牵引生物与载具组合使用的专用标记,不是普通骑兵开关;应照抄结构相同的原版单位。 |
sync_locomotion |
是否强制单位成员同步播放行走、奔跑和冲锋动画。只在确实需要同步动作的单位上使用。 |
占领、特殊机制与默认状态
| 列名 | 作用 |
|---|---|
capture_tier |
单位占领普通控制点时使用的占领能力档位。 |
key_building_capture_tier |
单位占领关键建筑或关键控制目标时使用的占领能力档位。 |
score_capture_tier |
据点战、统御模式等计分规则使用的单位占领分类。 |
harmony_amplification_type |
震旦宁和增幅类型。Schema 注明还需要单位具有encourage属性才会工作。 |
can_brace |
单位是否能够进入抵御冲锋的列阵状态。勾选只代表允许,实际效果还受朝向、移动状态等条件影响。 |
first_person |
战争机器第一人称射击所使用的配置,普通单位通常留空。 |
ar_unit_category |
自动结算系统使用的单位类别,ar是autoresolve的缩写。 |
healing_power |
治疗相关的倍率字段。原版单位通常保持为1;修改前应配合具体治疗能力进行验证。 |
spell_mastery |
法术威力倍率。普通单位通常为1,主要对施法单位有意义。 |
infinite_secondary_ammo |
是否让次要弹药不受数量限制。只对实际使用次要弹药机制的单位生效。 |
default_guard_mode |
单位进入战斗时是否默认开启守卫模式。勾选表示默认开启。 |
这些列并不是彼此独立的开关。引用字段必须指向实际存在且彼此兼容的记录,部分数值还会被技能、难度、战役效果和战斗规则继续修正。制作新兵种时应从类型最接近的原版单位复制完整记录,再逐项修改。

