全面战争模组中文站全面战争模组中文站
搜索/

搜索教程

输入标题,直接打开已发布教程。

输入教程标题开始搜索。

教程目录

远程武器详解

创建时间:2026年9月4日最后更新:2026年9月6日

远程攻击不是一个伤害数字,而是一条由多个表单共同组成的数据链。普通弓弩至少要连接“单位 → 远程武器 → 投射物”;火箭、炸弹、霰弹、制导弹、穿透弹和可切换弹药还会继续连接爆炸、破片、显示、命中效果、弹药类型等表单。

本文只讲 RPFM 中能够完成的数据配置,不制作发射动画、开火事件、弹丸模型、粒子特效或音频资产。第一次制作远程单位时,可以先完成《制作兵种:远程单位》中的基础流程,再用本文逐项理解和扩展数据。

本文列名以《全面战争:战锤 III》当前表结构为准。RPFM 会把字段显示为带空格的标题,例如primary_missile_weapon显示成Primary Missile Weapon。本文优先写数据库原名,方便在 RPFM 中搜索并对照 Schema 说明。Assembly Kit 数据只用于只读研究和交叉核对,不能从中导入、复制或编辑表单,也不能把它当成游戏运行时依赖。

先看完整数据链

land_units_tables.primary_missile_weapon
    ↓
missile_weapons_tables.default_projectile
    ↓
projectiles_tables
    ├─ projectile_display ─────────→ projectile_displays_tables
    │                                  └─ impact → projectile_impacts_tables
    ├─ explosion_type ─────────────→ projectiles_explosions_tables
    │                                  └─ shrapnel → projectile_shrapnels_tables
    │                                                   └─ projectile → projectiles_tables
    ├─ homing_params ──────────────→ projectile_homing_params_tables
    ├─ projectile_penetration ─────→ projectile_penetration_junctions_tables
    ├─ scaling_damage ─────────────→ projectiles_scaling_damages_tables
    └─ projectile_shot_type_display → projectile_shot_type_displays_tables

missile_weapons_tables.key
    └─ missile_weapons_to_projectiles_tables ─→ 额外可切换投射物

普通远程步兵一般从land_units_tables.primary_missile_weapon进入。传统火炮还可能先由land_units_tables.engine连接battlefield_engines_tables,再由战场引擎记录连接远程武器;无乘员战争机器、怪兽坐骑或特殊载具也可能继续使用单位自身的primary_missile_weapon。因此,发现模板单位的主要远程武器为空时,不要强行填写,先沿单位的战场引擎、坐骑和原版引用继续查。

需要哪些表单

表单 什么时候需要 负责什么
land_units_tables 普通远程单位必需 连接远程武器,保存单位级弹药容量、射击精度、装填技能、散兵和弹药池设置。
missile_weapons_tables 必需 注册一件远程武器,指定默认投射物、音频类型和使用哪个弹药池。
projectiles_tables 必需 定义真正飞出去的投射物,包括弹道、射程、精度、直击伤害、连射、目标限制及所有可选分支。
battlefield_engines_tables 传统火炮等情况需要 让战场引擎使用指定远程武器。不是所有远程单位都经过此表。
projectile_displays_tables 使用可见弹丸、飞行特效或命中效果时需要 连接弹丸模型、尾迹、发射特效、飞行动画和命中效果集合。
projectile_impacts_tables 自定义不同材质命中效果时需要 按水面、木材、岩石、血肉等表面选择命中效果。
projectiles_explosions_tables 投射物会爆炸时需要 定义爆炸触发、半径、伤害、推力、特效、音效、友伤和引信。
projectile_shrapnels_tables 爆炸后生成破片时需要 定义破片数量、发射形状和破片使用的另一条投射物。
projectile_homing_params_tables 投射物会制导时需要 定义开始制导、转向强度、视角与提前量。
projectile_penetration_junctions_tables 投射物可穿透多个实体时需要 按目标尺寸限制穿透,并设置最大穿透次数。
projectiles_scaling_damages_tables 伤害随目标生命比例变化时需要 用生命比例区间映射伤害倍率。
missile_weapons_to_projectiles_tables 同一武器具有额外可切换弹药时需要 把第二种或更多投射物连接到同一远程武器。
projectile_shot_type_enum_tables 使用或新建弹药类别时需要 定义射击类型、是否需要效果启用以及它取代哪类弹药。
projectile_shot_type_displays_tables 弹药需要在战斗界面显示和切换时需要 定义弹药按钮的图标、名称、说明和界面音效。
unit_missile_weapon_junctions_tables 效果驱动的整件武器替换时才需要 给单位关联可由效果启用的其他远程武器;它不是普通战斗中的弹药切换表。
effect_bonus_value_missile_weapon_junctions_tables 用科技、技能、特性等效果替换远程武器时需要 把效果与替换用远程武器连接起来。

没有爆炸就不要创建爆炸表,没有破片就不要创建破片表,没有制导就不要创建制导参数。表单越多并不代表武器越高级,只会增加断链和重复结算伤害的机会。

开始前:安全复制原版记录

不要直接编辑依赖项 → 游戏文件中的原版记录。建立自己的Mod类型 Pack 后,可以使用下面两种方式准备表单。依赖项 → Assembly Kit 文件只供只读研究,不能作为下列复制、导入或运行时引用的来源。

方法一:新建空表单

  1. 在自己的 Pack 上右键,选择新建 DB 表。
  2. 选择需要的表,例如projectiles_tables。
  3. 新增一行,再从依赖项 → 游戏文件中的同类原版记录逐列复制。
  4. 立刻把key改成自己的唯一 Key。

这种方法适合字段很少、你已完全理解结构的表。projectiles_tables字段很多,手工漏列的风险较高,通常更适合用第二种方法。

方法二:从游戏文件导入原版表单

  1. 在依赖项 → 游戏文件中搜索表单名或模板 Key。
  2. 打开原版表单,确认选中的确是目标单位使用的记录。
  3. 将原版表单导入自己的 Pack。
  4. 把导入后的data__重命名为自己的名称,例如twcn_tutorial_projectiles。
  5. 只保留要复制的记录:选中目标行后反选,再删除其他所有行。
  6. 把保留记录的主 Key 以及它引用的自定义子 Key 全部改成自己的命名。

不要把导入后的表单继续命名为data__。原版 DB 表也使用这个子表名;把同路径的data__放进 Mod 可能覆盖整张原版子表,而不是只覆盖你保留的那一行。每张导入表都应改成清楚、唯一的子表名。

建议统一前缀,例如:

twcn_tutorial_crossbow_weapon
twcn_tutorial_crossbow_projectile
twcn_tutorial_rocket_explosion
twcn_tutorial_rocket_shrapnel

同一个概念是否必须共用同一个 Key,取决于字段的引用。不要因为原版常把远程武器 Key 和默认投射物 Key 写成相同文本,就误以为它们必须相同;它们位于不同表中,可以同名,也可以分别命名。分别命名通常更容易看懂数据链。

怎样选模板

模板要按“射击机制”选择,不要只按外观或兵种名称选择。

目标 优先寻找的模板
普通弓、弩 同样是单弹丸、同样曲射或直射、同样持弓动作的单位。
火枪 同样使用火枪射击动画、弹道速度和射击音频的单位。
投掷武器 同样从人物手部发射、射程和抛物线接近的标枪、斧或手雷单位。
多弹丸霰射 原版已经使用多个projectile_number并具有相似散布的武器。
传统火炮 同样通过battlefield_engines_tables开火、具有相似炮架和发射点数量的火炮。
火箭或空爆弹 原版本身已使用projectiles_explosions_tables和引信的投射物。
制导弹 原版本身已填写homing_params的投射物。
可切换弹药 原版本身已出现在missile_weapons_to_projectiles_tables中的远程武器。

先比较两到三个原版模板,再决定复制哪个。只看一条记录很难判断某个0、空值或特殊枚举是通用默认值,还是该武器独有的例外。

可直接定位的模板

先打开依赖项 → 游戏文件中的projectiles_tables,在key列按下表完整 Key 筛选。表中列出的是投射物 Key,不是部队 Key;需要复制发射者时,再反查missile_weapons_tables.default_projectile或missile_weapons_to_projectiles_tables.projectile。

想做的机制 原版投射物 Key 已存在的分支
普通弩箭 wh3_cth_crossbow_bolt 单弹丸,无爆炸、无制导,穿透组very_low。
实心炮弹 wh3_main_cth_grand_cannon_ball 单弹丸,穿透组very_high_low_entity。
可切换的单发弩炮弹 wh2_main_def_reaper_bolt_thrower_bolt artillery_default,穿透组large_2。
同一弩炮的霰射弹 wh2_main_def_reaper_bolt_thrower_bolt_spread projectile_number=16、artillery_canister,穿透组medium。
空爆后生成破片 wh3_dlc23_chd_deathshrieker_rocket_stage_1 先连接同名爆炸,再经破片记录生成第二阶段投射物;完整链见后文破片一节。
带制导的爆炸弹 wh3_dlc23_chd_deathshrieker_rocket_demolition homing_params=homing_medium_artillery_fast,连接同名爆炸。

以上是机制入口,不能只复制这一行便跳过发射动画、显示和单位连接。只改普通弩箭的射程时,可以继续引用原版显示与穿透组;需要独立修改穿透或爆炸时才复制对应子记录并换引用。

单位级远程字段:land_units_tables

单位连接主要远程武器

单位的主要与次要弹药容量

单位远程修正与散兵设置

单位的无限次要弹药设置

字段 含义与使用要点
primary_missile_weapon 单位主要远程武器的 Key,引用missile_weapons_tables.key。普通远程单位通常从这里进入完整链路。
accuracy 单位自身的射击精度。它会与投射物的marksmanship_bonus、calibration_area和calibration_distance共同影响落点;不要把面板中的“射击精度”理解成单独决定命中率的百分比。
primary_ammo 主要弹药池的数量。大多数普通远程武器消耗这一池。
secondary_ammo 次要弹药池的数量。只有远程武器勾选use_secondary_ammo_pool时才消耗它;它不等同于“第二种可切换弹药”。
reload 对投射物装填时间的百分比削减,是单位级修正,不是秒数。基础装填秒数在projectiles_tables.base_reload_time。不要把两列填成相同数值。
damage_mod_missile 单位级远程抗性修正。当前 Schema 说明中,0表示不修改,-100表示承受的远程伤害加倍,+100表示远程伤害被抵消,方向与一般人直觉相反。除非要做特殊单位,否则保持模板值。
can_skirmish 是否允许单位使用散兵模式。勾选只提供散兵行为,不会替单位补齐远程武器、射击动画或 AI 配置。
infinite_secondary_ammo 是否让次要弹药池无限。只对次要池有意义,不会使主要弹药无限。

以原版玉勇弩手wh3_main_cth_inf_jade_warrior_crossbowmen_0为例,它使用wh3_cth_crossbow_bolt,accuracy = 10、primary_ammo = 22、secondary_ammo = 0。这只是一条普通弩手模板,不是远程单位的固定数值。

主要弹药、次要弹药和可切换弹药不是一回事

  • primary_ammo和secondary_ammo是两个“数量池”。
  • missile_weapons_tables.use_secondary_ammo_pool决定这件远程武器从哪个池扣除数量。
  • missile_weapons_to_projectiles_tables决定同一件武器是否还有别的投射物可选。
  • 一件武器可以只有一种投射物却使用次要池;也可以拥有两种可切换投射物但仍共享同一个主要池。

不要看到“Secondary Ammo”就自动认为它负责弹药切换。

远程武器入口:missile_weapons_tables

远程武器表的全部字段

missile_weapons_tables本身只有少量字段,但它是单位与投射物之间不可缺少的入口。

字段 含义与使用要点
key 远程武器唯一 Key。land_units_tables、battlefield_engines_tables和其他替换武器表会引用它。
precursor 当前 RPFM Schema 没有给出明确的引擎说明。不要把它当作“前置投射物”或其他字面含义自行猜测;复制完全同类原版模板时保留原值,需要改变时必须进游戏专项验证。普通玉勇弩和收割者弩炮都使用false。
default_projectile 默认投射物 Key,引用projectiles_tables.key。没有弹药切换时,单位始终使用它。
audio_type 武器开火动作使用的音频类型,例如弓、弩、火枪或大型弩炮类别。它不是飞行音效;投射物飞行音频由projectiles_tables.projectile_audio控制。
use_secondary_ammo_pool 勾选后消耗land_units_tables.secondary_ammo,否则消耗primary_ammo。它只选择弹药池,不生成第二种投射物,也不生成切换按钮。

为新武器建立记录时,最低限度要保证:

  1. key不与原版或其他 Mod 重复。
  2. default_projectile确实存在于你的 Pack、游戏文件或实际加载的父级 Pack 中;Assembly Kit 文件不算运行时依赖。
  3. audio_type与开火方式相近。
  4. use_secondary_ammo_pool与单位实际填写的弹药池一致。

如果多个单位共享同一条远程武器,而你只想修改其中一个单位,必须先复制远程武器并给它新 Key。否则所有引用原武器的单位都可能一起变化。

投射物核心:projectiles_tables

projectiles_tables决定弹丸怎样飞、飞多远、落点多散、直接造成多少伤害、能否命中某类目标,以及它是否连接爆炸、制导、穿透和显示。下面按功能解释当前表中的全部字段。

身份、类别与基础发射方式

投射物的类型、爆炸、旋转、数量和弹道

字段 含义与使用要点
key 投射物唯一 Key。远程武器、破片和其他系统都可能引用它。
category 投射物大类。当前可见类型包括arrow、artillery、axe、grenade、javelin、misc、musket、sling。它不是纯 UI 标签:Schema 特别说明artillery和misc等类别可能无视盾牌,artillery还有独立的领导力惩罚,因此不要只为改图标随意换类别。
shot_type 射击类型,影响弹药切换、效果启用和界面分类。它与projectile_shot_type_display不是同一列:前者是规则类别,后者是玩家看见的显示定义。
explosion_type 爆炸 Key,引用projectiles_explosions_tables。普通箭矢应留空;填错或引用不存在会使爆炸分支失效。
high_air_resistance 高空气阻力开关。当前 Schema 没有进一步解释具体公式;只在同类原版模板确实使用时复制,并通过弹道实测确认。
spin_type 飞行旋转方式。当前常见枚举包括none、axe_spin、chain_shot_spin、grenade_spin、shell_spin。它需要与可视模型方向和动画相配。
projectile_number 每个发射位置、每次发射同时生成的投射物数量。它是霰射数量,不是弹药池数量,也不是一轮连续射击次数。
trajectory_sight 瞄准和弹道类型。当前常见值包括low、high、fixed、dual_low_fixed。不同类型会决定哪些仰角和初速字段参与计算;不要只为了“看起来更弯”随意更换。

射程、弹道、精度与直击伤害

投射物的数量、弹道、射程、精度和直击伤害

投射物的碰撞、装填、校准距离与目标加成

字段 含义与使用要点
effective_range 武器的有效射程,也是单位通常能够选择目标和显示射程圈的核心值之一。它不等于弹丸绝对存活距离。
minimum_range 最小射程。目标进入该距离后,某些武器不能射击或不能按预期触发空爆。空爆引信距离较大时尤其要检查此值。
max_elevation 最大允许发射仰角。Schema 建议普通非固定弹道通常设得较高,常高于45度;火炮等特殊武器例外。trajectory_sight = fixed时此列不参与普通弹道计算。
muzzle_velocity 出膛初速,单位为米/秒。负值会让引擎按45度、命中effective_range的方式计算初速;fixed弹道不使用普通初速逻辑。速度越大通常越平直、更快,但必须与动画、特效和瞄准方式一起测试。
marksmanship_bonus 投射物自身的精度加成,会与land_units_tables.accuracy一起缩小校准区域。它不是“额外命中率百分比”。
spread 同次多弹丸或发射方向的散布参数。具体可见效果与投射数量、校准区域和模板机制共同决定;不要把它当成唯一的准度列。
damage 单枚投射物直接命中造成的基础远程杀伤。爆炸伤害和破片伤害不在这里。
ap_damage 单枚投射物直接命中的破甲远程杀伤。单位面板上显示的“远程威力”还可能受投射数量、加成、单位修正、技能和效果影响。
can_bounce 投射物是否能够弹跳。必须同时确认模型、碰撞和同类模板行为;勾选不代表所有地面或目标都会产生自然反弹。
collision_radius 弹丸用于判断与建筑碰撞的半径。它不是爆炸半径,也不是单位命中框大小。
base_reload_time 基础装填时间,单位为秒。最终射速还会受单位reload、经验、技能、科技、效果、动画时长和发射事件限制。只把数值改得很小,动画不一定能按同样速度可靠开火。

校准区域、目标加成、显示和掠过效果

投射物的校准、目标加成、显示和音效字段

字段 含义与使用要点
calibration_distance 校准区域达到100%大小时对应的距离。它定义精度随距离变化的参照点。
calibration_area 投射物可能落入的校准区域大小。该区域会按calibration_distance缩放,并由单位accuracy和投射物marksmanship_bonus进一步缩小。数值越小通常越集中,但应与同类模板比较。
bonus_v_infantry 对小型或极小型实体的额外伤害。额外伤害会沿用该投射物总直击伤害中的普通/破甲比例。
bonus_v_large 对中型及更大实体的额外伤害,同样沿用直击杀伤的基础/破甲比例。它不是单独的全额破甲杀伤。
projectile_display 投射物显示 Key,引用projectile_displays_tables。它决定模型、尾迹和命中效果入口,但不能凭空生成缺失的资产文件。
overhead_stat_effect 投射物从单位上空掠过时应用的special_ability_phases_tables阶段,可用于压制或其他掠过效果。没有明确需求时留空。
contact_stat_effect 投射物直接命中单位时应用的能力阶段。它与爆炸表中的contact_phase_effect属于不同结算阶段,重复填写可能重复施加效果。
projectile_audio 投射物飞行或相关弹丸音频,引用audio_projectiles_tables。它与远程武器audio_type和爆炸explosion_audio分别负责不同阶段。

擦身伤害、建筑、连射、重力与质量

投射物擦身经过时的伤害范围、建筑、命中效果、重力、连射和质量字段

字段 含义与使用要点
shockwave_radius 弹丸周围仍可造成伤害的半径:即使弹丸只是从目标身旁擦过、没有直接撞上,也可能在这个范围内造成伤害。-1通常表示关闭。它不是爆炸半径projectiles_explosions_tables.detonation_radius。
can_damage_buildings 直击是否可伤害建筑。还要结合collision_radius与building_damage_multiplier。
burst_size 一次连射中包含的射击次数;1表示没有连射模式。它不是每发同时生成的弹丸数。
burst_shot_delay 同一次连射内部,相邻两发之间的延迟。只有burst_size > 1时才有直接意义。
gravity 自定义重力/空气阻力表现。负值表示使用正常重力;其他值可让投射物更少或更多地受重力影响。不要只凭数值猜外观,必须观察完整弹道。
mass 投射物质量,参与碰撞和物理表现。它不等于伤害,也不等于爆炸推力。

制导、目标限制、友伤与穿透

投射物的制导、魔法、目标、友伤与穿透字段

字段 含义与使用要点
homing_params 制导参数 Key,引用projectile_homing_params_tables。留空就是不连接这套制导参数。
first_person_params 第一人称投射物参数 Key,引用projectile_first_person_params_tables。普通单位战斗镜头通常无需自建。
ignition_amount 投射物对点燃的贡献。大于0时也会让它在上下文中被视为火焰攻击。它与爆炸自身的ignition_amount分开。
is_magical 是否在上下文中视为魔法攻击。它不等于is_spell;魔法攻击与法术伤害是两种不同判定。
can_target_airborne 是否允许把飞行单位作为目标。它不保证弹道、转向或动画一定能打中飞行目标。
can_damage_allies 投射物直击是否能伤害友军。爆炸是否影响友军还要看爆炸记录的affects_allies。
fixed_elevation 固定弹道使用的发射仰角。只有相应弹道模式使用它时才生效。
projectile_penetration 穿透规则 Key,引用projectile_penetration_junctions_tables。留空表示不连接自定义穿透规则。
expiry_range 弹丸的最大飞行距离。正值表示飞到该距离后失效,负值通常表示不使用该限制。它不是单位可选择目标的effective_range。
is_beam_launch_burst 用于光束发射:让视觉效果匹配弹丸飞行,并在命中时使用裁切面隐藏命中点前方不应继续显示的部分。普通箭弹不要启用。

命中后的行为、齐射、坐骑和目标选择

投射物的失效、滚动、尾迹、齐射、坐骑和载具字段

字段 含义与使用要点
expire_on_impact 命中后立即失效,不再插入目标或从目标表面偏转。爆炸或特殊破片是否仍触发,要按模板实测。
can_roll 落地后是否能继续滚动。通常用于炮弹或特殊投射物,需要显示模型和物理参数配合。
trail_always_on 无论玩家是否关闭投射物尾迹显示,都强制显示该投射物的尾迹。
shots_per_volley 一轮齐射对应的射击数,主要给拥有多个动画发射点的系统作参考。Schema 特别说明许多其他逻辑并不知道这一数值,所以它不能代替正确的动画发射点。
fired_by_mount 发射实体是宏实体时,由坐骑而不是骑手开火。它不负责选择武器挂点,也不自动修复骑乘射击动画。
lock_on_multiple_fire_pos 多个发射点开火时,全部锁定目标原始位置;关闭时,各发射点会继续追踪目标当前的位置。
prefer_central_targets 优先瞄准目标编队中央附近的实体,而不是优先选择射界中最近的实体。
can_damage_vehicles 是否能伤害载具。不要与can_damage_buildings混为一谈。
building_damage_multiplier 命中建筑或载具时的伤害倍率。Schema 还记录了火炮类别存在额外规则:通常为1.5,多投射物火炮可用1.25覆盖,单实体火炮可用2.0;因此最终伤害不一定只由这一格决定。

按生命比例调整伤害、法术、植被与弹药显示

投射物按目标生命比例调整伤害、法术判定、植被、待验证的时间参数、漩涡与弹药显示字段

字段 含义与使用要点
scaling_damage 按目标当前生命值占最大生命值的比例调整伤害的规则 Key,引用projectiles_scaling_damages_tables。只有需要这种伤害变化时填写。
is_spell 此投射物的伤害是否受法术抗性影响。它与is_magical分开;不要因为投射物有魔法视觉就自动勾选。
vegetation_ignore_time 发射后忽略植被碰撞或影响的时间窗口。当前 Schema 没有更详细的单位与边界说明,应复制同类模板并在树林中实测。
missile_mirror_start_time 图中为0.4。当前 Schema 没有说明它在《战锤 III》中的具体触发条件和画面效果,本教程尚未完成游戏验证。先保留同类原版值,不根据Mirror字面推断它会翻转模型、复制弹丸或改变伤害。
spawned_vortex 投射物与地面碰撞时生成的battle_vortexs_tables旋涡 Key。它不是普通爆炸;同时配置爆炸时要分别检查两套效果。
projectile_shot_type_display 弹药/射击类型显示 Key,引用projectile_shot_type_displays_tables。需要玩家在战斗中识别或切换弹药时必须正确填写。

四组最容易混淆的数值

1. 可选射程与弹丸存活距离

  • effective_range:单位通常能选择并射击目标的范围。
  • minimum_range:武器不能正常攻击的近距离区域。
  • expiry_range:弹丸离开发射点后最多还能飞多远。
  • fuse_distance_from_target:爆炸在距离目标多少米时触发。

把effective_range调到500,却把expiry_range留在300,可能出现单位愿意开火但弹丸飞不到目标的情况。空爆距离又大于目标距离时,爆炸可能在投射物刚激活时立即发生。

2. 精度不是一列

最终散布至少要同时看:

land_units_tables.accuracy
+ projectiles_tables.marksmanship_bonus
+ projectiles_tables.calibration_distance
+ projectiles_tables.calibration_area
+ projectiles_tables.spread

其中calibration_area是落点区域,单位精度与投射物精度会缩小它;spread还会影响同次多个投射物之间的散布。只把accuracy改得很高,不能证明多弹丸就会完全重合。

3. 一次到底发出多少东西

字段 计数对象
projectile_number 每个发射点在同一发射动作中同时生成多少枚投射物。
burst_size 一次连射动作连续开多少发。
shots_per_volley 动画一轮齐射有多少个射击点/射击参考。
projectile_shrapnels_tables.amount 一次爆炸额外生成多少枚破片投射物。

理论上这些层可以叠加,但最终生成数量、伤害和性能消耗会迅速放大。不要为了做“更密集”同时把四个数字全部加大。

4. 伤害可能结算多次

一枚带爆炸和破片的投射物,可能具有:

  1. 主投射物的damage + ap_damage直击伤害。
  2. 主投射物连接爆炸的detonation_damage + detonation_damage_ap。
  3. 每枚破片投射物自己的直击伤害。
  4. 每枚破片再次连接的第二段爆炸伤害。
  5. 对步兵或大型单位加成。
  6. 弹丸擦身经过时的范围伤害、接触状态效果、旋涡和其他额外效果。

平衡时必须算完整链,不能只看主投射物那一行。

投射物外观:projectile_displays_tables

projectiles_tables.projectile_display只保存显示 Key,真正的模型、尾迹、发射效果和命中效果在projectile_displays_tables。

投射物显示表的模型与命中入口

投射物显示表的发射、尾迹和动画字段

投射物显示表的尖端偏移、发射震动和命中变体字段

字段 含义与使用要点
key 显示记录唯一 Key,由projectiles_tables.projectile_display引用。
display_model 飞行中显示的弹丸模型。填写 Key 不代表模型文件已被打包;自定义模型仍要放在正确路径并使用游戏支持的格式。
impact 命中效果集合 Key,引用projectile_impacts_tables。它负责按表面材质选择效果。
launch_fx 发射瞬间使用的效果。它与远程武器音频、飞行尾迹和爆炸效果分开。
trail_fx 飞行中的尾迹效果。projectiles_tables.trail_always_on决定是否强制显示尾迹。
stationary_fx 投射物静止或特定停留状态下使用的效果。普通快速弹丸常沿用模板空值。
airborne_anim 弹丸在空中时使用的动画。模型本身没有相应动画时,填写其他单位的动画 Key 不会自动兼容。
landing_anim 弹丸落地时使用的动画。只对有落地阶段的显示结构有意义。
tip_offset 弹丸尖端相对模型原点的偏移,用于对齐命中、尾迹或显示。单位与轴向应照同类模型模板验证。
trail_spin 尾迹随弹丸旋转的设置。它与projectiles_tables.spin_type相互配合,但不是同一个概念。
launch_camera_shake 发射时使用的镜头震动参数。爆炸表还有独立的爆炸镜头震动。
impact_bounce 弹丸弹跳时的命中效果集合。
impact_penetrate 弹丸穿透目标时的命中效果集合。
impact_blood 普通命中血肉目标时的带血命中效果集合。
impact_bounce_blood 弹跳并命中血肉目标时的效果集合。
impact_penetrate_blood 穿透血肉目标时的效果集合。
mirroring_start 粒子特效引用,连接particle_effects_tables。Schema 将其描述为投射物开始mirroring时播放的特效;该状态在当前游戏中的具体触发条件尚未验证,先沿用同类模板。这里填写特效 Key,不是秒数。
mirroring_trail 同样引用particle_effects_tables,供上述mirroring状态使用尾迹特效。具体触发条件尚未验证,先沿用同类模板。
scale 投射物显示模型缩放。它只改变视觉尺寸,不会同比改变碰撞半径、爆炸半径、质量或伤害。

显示模型放大十倍而collision_radius不变,会出现“画面看起来撞到了,实际判定没有撞到”的错觉;反过来只放大碰撞半径,也可能让弹丸在视觉上尚未接触时就命中。

不同表面的命中效果:projectile_impacts_tables

projectile_impacts_tables不是伤害表,它为不同表面指定视觉或音效资源。自定义弹丸只要能够接受原版命中效果,就可以复用已有记录;只有需要新表现时才复制或新建。

投射物在水、船帆、泥地和草地上的命中效果

投射物在道路、岩石、沙地和雪地上的命中效果

投射物在皮革、木材和血肉上的命中效果及镜头震动 图中通过表格底部的 Columns 仅显示 Key、Leather、Wood、Blood 和 Camera Shake,以便完整查看这些字段的值。

字段 负责的表面或效果
key 命中效果集合唯一 Key。
water 水面。
sails 船帆等帆布表面。
mud 泥地。
grass 草地。
road 道路。
rock 岩石或硬质石面。
sand 沙地。
snow 雪地。
leather 皮革类表面。
wood 木材。
blood 命中血肉目标时的血迹效果。
camera_shake 命中时使用的镜头震动参数。

某些格为空并不一定是错误,可能表示该弹丸对相应表面不使用独立效果。不要为了“补全”把同一个粒子 Key 填进所有材质;粒子方向、颜色、规模和生命周期可能只适合特定表面。

穿透规则:projectile_penetration_junctions_tables

投射物穿透规则表

projectiles_tables.projectile_penetration连接一组穿透规则。每组规则可以有多行,用目标实体尺寸决定是否继续穿透。

字段 含义与使用要点
key 穿透规则组 Key。多行可以共用同一 Key,组成一整套规则。
entity_size_cap 尺寸门槛字段,使用下表中的实体尺寸标识。原版说明以遇到某种尺寸的目标停止穿透来描述;不要只按 Key 中的low、high猜测。
max_penetration 对符合尺寸条件的目标允许穿透的最大数量或上限。最终表现还受弹丸类别、质量、碰撞和目标排列影响。
description 给制作人员看的说明,不参与玩家界面显示。可写清用途,方便以后维护。

复制穿透投射物时,应把该 Key 下的所有相关行一起复制。只复制其中一行,可能让某些尺寸目标完全不遵守预期规则。

当前原版的全部穿透组

下表是当前游戏 DB 中的 21 条记录;尺寸来自目标的battle_entities_tables.size。五档为very_small、small、medium、large、very_large,是实体尺寸标识,不等于界面上的对大型单位加成分类。

穿透组 Key entity_size_cap max_penetration
all 空 -1
high large 10
high_magic large 20
large_2 large 2
large_3 large 3
large_4 large 4
low small 2
low_3 small 3
low_magic small 4
medium medium 5
medium_1 medium 1
medium_2 medium 2
medium_3 medium 3
medium_6 medium 6
medium_magic medium 10
very_high very_large 20
very_high_6 very_large 6
very_high_low_entity very_large 9
very_high_magic very_large 40
very_low very_small 0
very_low_magic very_small 2

all的原版说明是可以穿过所有目标、穿过实体时减速;这里的空尺寸与-1是一组原版配置,不要推广为其他表中负数的通用规则。very_low的数值为0,可用于对照普通弩箭;需要霰射弩炮的穿透表现可以从medium入手。

low_3的说明文字写着 Medium,但实际entity_size_cap是small。本表保留真实字段值;制作时不要把说明当成另一份可覆盖字段的规则。尺寸边界、穿过多少人以及速度衰减的实际表现仍须用对应目标在战斗中验收。

制导参数:projectile_homing_params_tables

投射物制导参数表

字段 含义与使用要点
key 制导参数唯一 Key,由projectiles_tables.homing_params引用。
lookahead_time 制导计算的预判时间,用于考虑目标未来位置。数值不是“命中率”;过大或过小都可能产生奇怪转向。
max_target_angle_delta 允许追踪目标的最大角度变化范围。限制过小会失去目标,过大可能产生急转弯。
start_time 发射后经过多长时间开始制导。可让弹丸先按初始方向飞行,再开始修正。
steering_coefficient 转向强度或响应程度。必须结合速度、目标角速度和模型朝向实测。

制导只解决飞行方向修正,不会自动解决发射动画、目标选择、飞行模型朝向、尾迹转弯或近距离穿模。制作新制导弹时,最好先复制速度和体量接近的原版制导投射物,再一次只改一个参数。

按目标生命缩放伤害:projectiles_scaling_damages_tables

投射物缩放伤害表

字段 含义与使用要点
key 缩放伤害规则唯一 Key,由projectiles_tables.scaling_damage引用。
min_health_ratio 低生命端的目标生命比例。
min_damage_multiplier 目标位于低生命端时使用的伤害倍率。
max_health_ratio 高生命端的目标生命比例。
max_damage_multiplier 目标位于高生命端时使用的伤害倍率。

这组字段描述生命比例区间和两端倍率。区间内部怎样插值应以同类原版记录和游戏实测为准;不要把health_ratio当作生命点数,也不要把倍率写成面板远程威力。

爆炸:projectiles_explosions_tables

投射物是否会爆炸,由projectiles_tables.explosion_type是否连接爆炸记录决定。爆炸记录的 Key 不强制与投射物 Key 同名,但同名便于沿链查找。

爆炸表的触发、传播、伤害和破片字段

爆炸表的特效、引信、音频和接触效果字段

爆炸表的火焰、魔法、破甲、推力、友伤和法术字段

爆炸的全部字段

字段 含义与使用要点
key 爆炸记录唯一 Key,由projectiles_tables.explosion_type引用。
detonator_type 引爆器类型。当前原版记录实际使用fuse与percussive,分别作为引信式和撞击式模板入口。fuse还需配合本表引信参数,具体时机见下文;本次没有在原版记录中找到fuse_grenade,不能把它当作已验证的当前可用选项。
detonation_type 爆炸传播或上下文类型。当前原版记录实际使用none、shockwave、boiling_oil、carcass、fire_ignition。本次没有找到blinding_shockwave、flaming_ground、quicklime的原版使用记录,不将旧名称列为已验证选项。它们不是单纯特效名称,可能影响爆炸规则;不要把视觉相似当作可以互换。
detonation_radius 爆炸作用半径。它决定影响范围,不会自动放大粒子特效模型。
detonation_duration 爆炸传播或持续过程的时长参数。Schema 没有给出完整计算公式,应与detonation_speed一起复制同类模板。
detonation_speed 爆炸作用向外传播的速度参数。它不是投射物飞行速度。
detonation_damage 爆炸对每个命中实体造成的基础爆炸杀伤。它与投射物直击damage叠加计算。
detonation_damage_ap 爆炸对每个命中实体造成的破甲爆炸杀伤。
shrapnel 破片组 Key,引用projectile_shrapnels_tables。没有破片时留空。
explosion_particle_effect 通常用于空中或一般情况下的爆炸粒子效果。
fuse_distance_from_target 距目标还有多少米时触发爆炸。如果该数值大于投射物激活时到目标的距离,爆炸可能立即发生;此时需要结合投射物minimum_range避免近距离错误触发。
explosion_particle_effect_on_ground 爆炸发生在地面时使用的粒子效果。留空时是否回退到一般爆炸效果应按模板验证。
explosion_audio 爆炸音频 Key,引用audio_explosions_tables。它与开火音频和飞行音频分开。
contact_phase_effect 爆炸接触或作用时应用的special_ability_phases_tables阶段。不要与投射物contact_stat_effect重复套用同一效果,除非这是明确设计。
ignition_amount 爆炸对点燃的贡献;大于0时也会使爆炸在上下文中视为火焰攻击。
is_magical 爆炸是否在上下文中视为魔法攻击。主投射物也有独立的is_magical。
camera_shake 爆炸时使用的镜头震动参数。大范围爆炸不必然需要强震动,应按视觉规模选择。
detonation_force 爆炸施加的物理推力,影响击退等结果。推力很大不等于伤害很高,也可能只把目标炸飞而没有相称伤害。
fuse_fixed_time 固定引信时间,单位为秒;-1表示不使用固定时间。Schema 明确要求固定时间与目标距离引信二选一。
affects_allies 爆炸是否影响友军。即使主投射物can_damage_allies = false,爆炸这一阶段仍要单独检查此列。
is_spell 爆炸伤害是否受法术抗性影响。主投射物也有独立的is_spell,两处应按各自伤害阶段设置。

固定时间引信与目标距离引信

两种引信不要同时当成有效控制量:

  • 按飞行时间爆炸:设置fuse_fixed_time,让fuse_distance_from_target保持同类模板中不参与的值。
  • 按距目标距离爆炸:设置fuse_distance_from_target,令fuse_fixed_time = -1。

固定时间引信的爆点会受初速、弹道和目标距离影响;距离引信则更适合在目标附近空爆。两者都需要测试目标静止、目标移动、近距离、最大射程和高低差。

火焰、魔法和法术是三种不同判定

判定 投射物字段 爆炸字段 作用
火焰上下文 ignition_amount > 0 ignition_amount > 0 参与点燃,并使相应阶段被视为火焰攻击。
魔法攻击 is_magical is_magical 把相应阶段标记为魔法上下文。
法术伤害 is_spell is_spell 决定相应伤害是否受法术抗性影响。

不要因为粒子是蓝色、紫色或燃烧外观就自动勾选魔法或法术;视觉资源不决定伤害上下文。

破片:projectile_shrapnels_tables

破片表的发射形状、数量、角度和投射物

破片不是爆炸伤害中的一个倍率,而是爆炸时另外生成的一批projectiles_tables投射物。每一枚破片都有自己的弹道、直击伤害、显示、穿透,甚至还能再次连接爆炸。

字段 含义与使用要点
key 破片组唯一 Key,由爆炸表shrapnel引用。
launch_type 破片发射形状。当前值包括hemisphere、sphere、sector,分别表示半球、球形和扇区式分布。
amount 每次爆炸生成的破片投射物数量。它会直接放大实体数量、潜在伤害和性能开销。
sector_angle 扇区角度或相关发射角参数。不同launch_type下的解释可能不同;即使原版在非sector记录中也可能保留数值,因此不要擅自清零。
projectile 破片实际使用的投射物 Key,引用另一条projectiles_tables记录。

死啸者火箭发射器的完整两段结构

原版死啸者火箭发射器提供了一条清楚的空爆破片链,可作为“机制模板”,但它的数值不适合所有火箭:

主投射物
wh3_dlc23_chd_deathshrieker_rocket_stage_1
    └─ explosion_type = 同名爆炸记录
        └─ shrapnel = deathshrieker_rocket
            ├─ launch_type = hemisphere
            ├─ amount = 8
            ├─ sector_angle = 160
            └─ projectile = wh3_dlc23_chd_deathshrieker_rocket_stage_2_shrapnel
                └─ explosion_type = wh3_dlc23_chd_deathshrieker_rocket_stage_2

主投射物的当前原版记录使用effective_range = 420、minimum_range = 60、fixed_elevation = 55,在距目标60米时触发第一段爆炸;第一段爆炸生成8枚第二阶段破片。这个例子说明破片还可以继续爆炸,也说明总伤害不能只看第一行。

如果复制这类结构,至少需要一起复制主投射物、第一段爆炸、破片组、破片投射物,以及破片连接的第二段爆炸和所需显示记录。少一环都可能出现“有第一段爆炸但没有破片”“有伤害但没有模型”或“破片飞出却不爆炸”。

弹药切换

可切换弹药指同一件missile_weapons_tables远程武器在战斗中提供多个projectiles_tables选项。它不是primary_ammo与secondary_ammo之间的自动切换,也不是科技效果替换整件远程武器。

连接额外投射物

为远程武器连接额外投射物

missile_weapons_to_projectiles_tables只有两个核心字段:

字段 含义
missile_weapon 要增加额外弹药的远程武器 Key。
projectile 额外可选的投射物 Key。默认投射物不需要在这里重复,它已经由missile_weapons_tables.default_projectile连接。

需要三种可切换投射物时,可以为同一远程武器建立多行,每行连接一个额外投射物。不要把默认投射物再次作为额外投射物连接,否则可能产生重复或无法区分的选项。

射击类型规则

射击类型的启用与替代关系

projectile_shot_type_enum_tables定义弹药规则类型:

字段 含义与使用要点
key 射击类型 Key,由projectiles_tables.shot_type引用。
requires_effect_enabling 是否必须由某个效果启用后才能使用。只做始终可用的战斗切换时,优先复制同类原版配置,不要随意勾选。
supersedes_shot_type 当前射击类型取代的其他射击类型,用于处理解锁、升级或优先关系。没有明确替代逻辑时不要自建关系。

当前定义表共有以下 15 项。普通弩箭从small_arm_default入手;火炮单发、霰射和爆炸弹分别可从artillery_default、artillery_canister、artillery_explosive的实际模板入手。其余 Key 保留英文作为技术索引,不将字面名称当成机制保证。

射击类型 Key requires_effect_enabling 当前projectiles中是否有引用
artillery_canister false 有
artillery_default false 有
artillery_explosive false 有
artillery_flammable true 有
artillery_poison false 有
artillery_whistling true 未找到,保留定义
explosives false 有
oil true 未找到,保留定义
small_arm_default false 有
small_arm_extended false 有
small_arm_flaming false 有
small_arm_heavy false 有
small_arm_poison false 有
small_arm_whistling false 未找到,保留定义
torch true 未找到,保留定义

这 15 项当前的supersedes_shot_type均为空。需要改成效果启用或建立替代关系时,必须另有授予连接;勾选requires_effect_enabling不会自己生成解锁条件。

这些名称描述规则类别,不等于所有武器都能使用。比如把普通弓箭的shot_type改成artillery_canister,不会自动生成霰弹、火炮领导力惩罚、正确图标或切换按钮。

弹药按钮和说明

弹药显示表的图标、名称、说明与音效

projectile_shot_type_displays_tables负责玩家在战斗界面看到的弹药信息:

字段 含义与使用要点
key 显示记录 Key,由projectiles_tables.projectile_shot_type_display引用。
icon_name 弹药按钮使用的图标名。图标资产必须真实存在于正确 UI 路径。
ui_sound_event 选择或切换该弹药时的界面音效。
onscreen_name 玩家看到的弹药名称。本地化字段的实际编辑方式按当前 RPFM Schema 和 Loc 结构处理。
tooltip_text 鼠标悬停时的说明文本,同样需要正确本地化。

有些旧版结构会在projectile_shot_type_enum_tables中显示已弃用的icon_name、ui_sound_event、onscreen_name和tooltip_text。当前应以独立的projectile_shot_type_displays_tables为主,不要同时在新旧位置重复维护。

原版收割者弩炮案例

原版收割者弩炮的远程武器wh2_main_def_reaper_bolt_thrower_bolt具有两种投射物:

项目 单发大型弩箭 多发霰射
投射物 Key wh2_main_def_reaper_bolt_thrower_bolt wh2_main_def_reaper_bolt_thrower_bolt_spread
连接位置 default_projectile missile_weapons_to_projectiles_tables
shot_type artillery_default artillery_canister
projectile_number 1 16
damage / ap_damage 30 / 120 3 / 8,但一次生成 16 枚
bonus_v_large / bonus_v_infantry 50 / 0 0 / 11
projectile_shot_type_display bolt_thrower_single_shot bolt_thrower_multi_shot

这说明真正可区分的两种弹药至少需要不同投射物记录、不同规则类型和不同显示定义。不要只复制连接表一行,却让两种投射物仍使用完全相同的shot_type和显示 Key。

弹药切换的完整步骤

  1. 选一个原本就能切换弹药且机制接近的武器作为模板。
  2. 复制远程武器,改成自己的missile_weapons_tables.key。
  3. 复制默认投射物和额外投射物,并分别改成新 Key。
  4. 让远程武器default_projectile指向第一种投射物。
  5. 在missile_weapons_to_projectiles_tables把同一武器连接到第二种投射物。
  6. 为两种投射物选择能够区分的shot_type。
  7. 为两种投射物分别填写projectile_shot_type_display。
  8. 复用或新建两条显示记录,补齐图标、名称、说明和音效。
  9. 检查两种投射物是否使用同一弹药池;如要使用不同池,必须重新核对武器与单位的弹药池结构,不能只改投射物。
  10. 进战斗确认按钮数量、默认选项、切换、弹药消耗、射击和 AI 使用全部正常。

效果替换整件武器不是弹药切换

unit_missile_weapon_junctions_tables配合effect_bonus_value_missile_weapon_junctions_tables,可以通过科技、技能、特性或其他效果给单位启用另一件远程武器。这条路线适合“解锁升级武器”“战役效果替换弹丸”等情况,但它替换的是missile_weapons_tables记录,不是同一武器下的普通弹药按钮。

选择哪条路线取决于目标:

  • 玩家在战斗中手动切换:优先研究missile_weapons_to_projectiles_tables和射击类型显示。
  • 由科技、技能、状态或派系效果改变:研究武器连接与效果连接表。
  • 只是让武器消耗另一组数量:使用use_secondary_ammo_pool和secondary_ammo。

三种完整制作案例

下面的案例只展示通用思路。Key 和数值来自对应原版模板,不是新武器的唯一正确答案。

案例一:普通单弹丸弩箭

适用条件:普通步兵、单一弹药、没有爆炸、没有破片、没有制导。

  1. 从目标单位的land_units_tables.primary_missile_weapon找到原版弩武器。
  2. 复制missile_weapons_tables记录,改成自己的武器 Key。
  3. 复制default_projectile指向的projectiles_tables记录,改成自己的投射物 Key。
  4. 让新武器指向新投射物,让新单位指向新武器。
  5. 先保持显示、音频、穿透和弹道与模板一致,只改射程、伤害或装填中的一个目标参数。
  6. 进战斗确认能瞄准、能开火、会扣弹药、弹丸能命中并结算伤害。

原版玉勇弩箭wh3_cth_crossbow_bolt当前使用effective_range = 160、damage = 18、ap_damage = 6、base_reload_time = 13、projectile_number = 1。制作火枪、投矛或霰弹时不要照抄这些值,应重新找相同机制模板。

案例二:拥有两种可切换弹药的弩炮

适用条件:同一远程武器始终存在两种战斗内可选投射物。

  1. 复制收割者弩炮或其他同类可切换武器的完整结构。
  2. 分别建立默认单发投射物和额外多发投射物。
  3. 在连接表中只添加额外投射物。
  4. 分别设置artillery_default和artillery_canister或其他符合目标的类型。
  5. 分别设置单发和多发显示 Key。
  6. 根据用途配置projectile_number、单枚伤害、对步兵/大型加成、散布与穿透。
  7. 在战斗中反复切换,确认按钮、投射数量、弹药消耗和 AI 行为。

若你的目标是“科技研究后永久改用更强炮弹”,这个案例不合适,应改走效果驱动的武器替换路线。

案例三:空爆并产生二段爆炸破片的火箭

适用条件:主投射物在目标附近空爆,生成多枚破片,破片落地或命中后再爆炸。

  1. 复制主投射物、第一段爆炸、破片组、破片投射物和第二段爆炸。
  2. 给五组记录都改成自己的唯一 Key,并逐条修复引用。
  3. 先保留原版引信距离、固定仰角、初速和最小射程,确认空爆位置正确。
  4. 再调整破片amount、launch_type和破片投射物的弹道。
  5. 分别计算主投射物直伤、第一段爆炸伤害、每枚破片直伤和第二段爆炸伤害。
  6. 检查两段affects_allies、is_magical、is_spell与ignition_amount。
  7. 测试静止步兵、移动步兵、大型单位、友军混战、建筑、高低差和最大射程。

如果只想做“撞击地面后爆炸一次”的炮弹,不需要破片表,也不需要第二段投射物;直接连接一条爆炸记录更简单、更稳定。

怎样自行找到需要的数据

已知单位,沿引用向下找

  1. 在land_units_tables搜索单位 Key。
  2. 读取primary_missile_weapon。
  3. 跳到missile_weapons_tables,读取default_projectile。
  4. 在missile_weapons_to_projectiles_tables搜索远程武器 Key,检查是否还有额外投射物。
  5. 打开每条projectiles_tables记录,逐个检查爆炸、显示、制导、穿透、缩放和弹药显示引用。
  6. 对每个非空引用继续跳转,直到所有分支都闭合。

只知道想要的效果,反向找模板

  • 想做空爆:在projectiles_explosions_tables比较使用fuse_distance_from_target的记录,再查找哪些投射物引用它们。
  • 想做制导:在projectiles_tables筛选homing_params非空的记录。
  • 想做多弹丸:筛选projectile_number > 1,再比较spread、calibration_area与单枚伤害。
  • 想做破片:从projectile_shrapnels_tables找到amount和launch_type相近的记录,再反查爆炸。
  • 想做弹药切换:从missile_weapons_to_projectiles_tables找原版武器,再检查默认投射物、额外投射物和两套显示。
  • 想做接触状态:筛选contact_stat_effect或爆炸contact_phase_effect非空的记录,再沿能力阶段继续查。

每次至少比较三类信息

  1. 表中数值:字段到底填了什么。
  2. 引用关系:哪些单位、武器、投射物和效果共享这条记录。
  3. 游戏表现:原版单位实际如何发射、命中、爆炸、切换和扣除弹药。

只复制数值而不看引用,会漏表;只看引用而不看游戏,会复制到机制不同的模板。

常见故障与排查顺序

单位没有远程攻击或不肯开火

  1. 检查land_units_tables.primary_missile_weapon是否存在且拼写完全一致。
  2. 检查远程武器default_projectile是否存在。
  3. 检查primary_ammo或实际使用的secondary_ammo是否大于0。
  4. 检查use_secondary_ammo_pool有没有误勾。
  5. 检查射程和最小射程是否把目标排除在外。
  6. 检查该单位的射击动画、开火事件和发射点;这些不能只靠 DB 补齐。
  7. 对传统火炮检查battlefield_engines_tables和乘员/引擎链。

有开火动作,但看不到弹丸

  1. 检查projectile_display引用是否存在。
  2. 检查display_model实际资产是否存在、路径和格式是否正确。
  3. 检查模型缩放、轴向和tip_offset。
  4. 检查弹丸是否因为expiry_range过短或引信错误而立即失效。
  5. 暂时复用已验证的原版显示记录,区分“数据链错误”和“自定义资产错误”。

看得到弹丸,但打不中或飞不到

  1. 比较effective_range与expiry_range。
  2. 检查trajectory_sight、fixed_elevation、max_elevation、muzzle_velocity和gravity是否属于同一套弹道。
  3. 检查calibration_area、calibration_distance、单位accuracy和marksmanship_bonus。
  4. 检查minimum_range以及目标高低差。
  5. 制导弹还要检查start_time、转向角和转向强度。

伤害远高于预期

  1. 先算projectile_number × burst_size可能生成的主投射物数量。
  2. 加上主投射物的基础远程杀伤和破甲远程杀伤。
  3. 加上基础爆炸杀伤和破甲爆炸杀伤。
  4. 再算shrapnel.amount × 每枚破片完整伤害链。
  5. 检查对步兵/大型加成、damage_mod_missile、建筑倍率和缩放伤害。
  6. 检查投射物与爆炸是否重复施加同一接触效果。

有爆炸特效,但没有爆炸杀伤

  1. 确认projectiles_tables.explosion_type不是只填了粒子 Key,而是正确的爆炸记录 Key。
  2. 检查爆炸detonation_damage和detonation_damage_ap。
  3. 检查半径、触发类型、固定引信或距离引信。
  4. 检查爆炸是否在目标前过早触发。
  5. 检查目标是否因友军、法术或其他上下文规则被排除。

有第一段爆炸,但没有破片

  1. 检查爆炸记录shrapnel是否指向存在的破片组。
  2. 检查破片amount是否大于0。
  3. 检查projectile引用的破片投射物是否存在。
  4. 暂时让破片复用一个可见的原版显示,排除模型问题。
  5. 检查发射形状、角度和破片投射物最小射程/失效距离。

看不到弹药切换按钮

  1. 检查额外投射物连接的远程武器 Key 是否与单位实际使用的武器一致。
  2. 检查默认与额外投射物是否是两条不同记录。
  3. 检查两者的shot_type能否区分。
  4. 检查两者的projectile_shot_type_display是否存在。
  5. 检查显示记录的图标、名称和说明。
  6. 检查射击类型是否要求由效果启用。
  7. 如果复制的是效果驱动武器替换模板,确认你真正需要的是否是另一条路线。

RPFM 诊断没有报错,但游戏仍然不对

RPFM 诊断主要能发现缺失引用、字段类型、重复 Key 等结构问题。它不能证明下面这些行为正确:

  • 射击动画中存在正确的开火事件。
  • 发射点数量与shots_per_volley相符。
  • 弹丸模型轴向、缩放和挂点正确。
  • 粒子、尾迹和音频在当前场景可加载。
  • AI 会按你的设计选择和切换弹药。
  • 伤害、击退、穿透和破片数量在实际战斗中平衡。

这些必须通过自定义战斗或战役环境实测。

游戏内验收清单

每改完一种机制,只测试该机制,不要一次改完所有数值再找问题。

基础开火

  • 单位能选择目标并进入射程。
  • 开火动作、发射时机和发射位置正确。
  • 每轮正确扣除主要或次要弹药。
  • 装填节奏没有被动画卡住或跳过。

弹道与命中

  • 近距离不会因最小射程或引信立即失效。
  • 最大射程处弹丸不会在目标前消失。
  • 平地、高处射低处、低处射高处都能工作。
  • 静止编队、移动编队、大型单位和飞行单位分别测试。
  • 弹丸模型、尖端、尾迹和飞行方向一致。

伤害与目标

  • 分别记录对低甲、高甲、小型和大型目标的伤害。
  • 检查对建筑、城门、载具和友军的行为。
  • 多弹丸要确认实际生成数量与单枚伤害。
  • 穿透弹要观察命中第一排、后排和大型实体后的表现。

爆炸与破片

  • 空中、地面和直接命中时的爆点都正确。
  • 基础爆炸杀伤、破甲爆炸杀伤、推力和镜头震动符合设计。
  • 破片数量、方向、二次命中和二次爆炸可见。
  • 友军混入目标时,直击与爆炸两阶段的友伤都符合设置。
  • 大量单位同时开火时没有明显性能问题。

弹药切换

  • 默认弹药正确。
  • 按钮图标、名称、说明和音效正确。
  • 每一种弹药都能选择、开火、扣弹和造成不同效果。
  • 来回切换后不会卡在错误动画或错误投射物。
  • AI 控制该单位时也能产生可接受行为。

最后检查 Pack

  1. 每张 DB 子表都已从data__改成唯一名称。
  2. 所有自定义 Key 使用统一前缀。
  3. 没有为了单个单位直接修改共享的原版远程武器或投射物。
  4. 所有非空引用都能在自己的 Pack、游戏文件或实际加载的父级 Pack 中找到;Assembly Kit 文件不算运行时依赖。
  5. 没有把显示 Key、粒子 Key、投射物 Key和爆炸 Key填错列。
  6. 没有同时把固定时间引信和距离引信当成主要触发方式。
  7. 没有把次要弹药池误当成可切换弹药。
  8. RPFM 诊断已检查,但没有把“诊断通过”当成游戏验收通过。
  9. 自定义战斗已按基础、弹道、伤害、爆炸、破片和切换分阶段测试。

本文的字段结构以 RPFM 当前《战锤 III》Schema 和依赖项 → 游戏文件中的原版数据库为主要依据;本机 Assembly Kit 数据只用于只读交叉核对,旧版《战锤 II》远程武器资料只用于追踪历史线索。游戏更新后如果字段发生变化,应先更新 RPFM Schema,再以新版本游戏文件中的原版记录和实际游戏表现重新核对。

图片查看
100%

滚轮或按钮缩放 · 拖动或滑动查看 · Esc 关闭