测试视频:
本模组只是为了加强角色扮演的代入感。
使用须知
- 必须使用WSE2启动
- 直接将lua文件夹解压到你想挂载的模组文件夹中
- 在不同模组上使用时,注意校对名字池对应的阵营号(建议使用魔球)
- 欢迎各种形式的修改与再分发

这是一个基于 WSE2 Lua 开发的普通士兵持久化系统。
它的目标不是给英雄单位加功能。
而是让
普通士兵也能拥有稳定的
姓名、性别、脸、装备、战绩、服役时间。
并在招募、升级、受伤、死亡、逃跑、驻军、俘虏、交换、战后转交等复杂流程中尽量保持“这个人还是这个人”。
系统尽量
不修改原模组的 txt 文件,而是在 Lua 层通过 WSE2 array、mission trigger、operation hook 和战场 agent 接管来实现。
因此它可以直接挂在不同模组上使用,但仍然会受限于战团本身对普通士兵的黑箱处理方式。
主要功能
现在每个进入玩家队伍的普通士兵都会被存储进后台的“花名册”。
他们在战斗中会显示自己的姓名,且会保持姓名、面容、性别在后续的升级中不变。
此外,脚本还会统计他们的杀敌数、受伤次数和服役天数。
他们每个人都有一个独立条目。条目保存:
- 当前兵种。
- 随机姓名种子。
- 性别。
- 脸型 key 和拆解后的脸型字段。
- 当前装备。
- 加入队伍的游戏内时间。
- 击杀数。
- 受伤次数。
- 老兵敬意判定用的上次击杀数和上次服役天数。
- 当前状态:在玩家部队、在外部部队/驻军、在俘虏列表,或者空闲。
- 如果不在玩家部队,还会保存它所在的 party id。
普通士兵在玩家部队里增减时,系统会用玩家队伍的 troop stack 数量和花名册条目数量做同步。多出来的同兵种士兵会创建新条目,减少的同兵种士兵会移除或转移条目,升级则会迁移旧条目到新兵种。
老兵敬意
当花名册士兵被击倒时,可以触发“老兵敬意”判定。
判定成功时,这次击倒会强制按受伤处理,而不是死亡。
成功率由两部分相加:
- 自上次判定后新增击杀数 × `veteran_respect_kill_chance_percent`。
- 自上次判定后新增服役天数 × `veteran_respect_service_day_chance_percent`。
判定后会记录本次击杀数和服役天数,下一次只计算新增部分。这个功能由 `veteran_respect_enabled` 总开关控制。
默认配置为:
每击杀1敌人+2%成功率,每服役1天+0.5%成功率
风格名字库
为了让名字符合各类模组的主题,我在配置文件中预留了许多风格的名字池。举例:
- 维京
- 基辅罗斯
- 法兰西
- 穆斯林
- 蒙古
- 神圣罗马帝国
- 西班牙
- 罗马
- 精灵
- 用于兜底的普通中世纪姓名杂烩
注意
模组文件中自带的姓名库对应的阵营id是基于潘德的预言子mod制作。
如果你想安装到其他模组上但不想出现串风格的情况,请自行对照目标模组的阵营id修改。
你也可以自己添加更多姓名池。
2.0+版本原理讲解
在1.7版本之前,本模组采用了将原生Agent藏到地下、克隆Agent实现面部、性别保存及变更的效果。
原因很简单——原版没有agent_get/set_face_key、agent_get/set_type等操作码。
之前的方式是可以做到,但副作用不言而喻:兼容性差、克隆出来的agent不属于任何party、影响战场上场人数、性能差等等等等...
在一次偶然的测试中,我发现agent脱下头盔/戴上头盔会导致面部甚至性别更换。
于是我就这样找到了一个破局点:
agent脱下/戴上装备,mesh会随之刷新一次。
但为什么原版的agent通常情况下不会出现脱了装备就变脸的情况呢?
这是因为每个agent都有一个”dna“,也就是随机数种子。这个种子会决定它们落在face_key范围里的哪个固定点上。
所以我们可以反其道而行之:
1.首先,用操作码获取agent的face_key。
2.将troop facekey的上界和下界均设置为上述face_key。
3.让原生Agent摘下头盔 ,再戴上头盔。
4.此时Agent会变成我们需要的面容。即使它有dna作为种子也无济于事,因为troop的facekey的上下界均被设死,它只能落在那个点上。
5.还原Troop的face_key以及Type。
这样,我们仅仅是简单地操作了一下原生的Agent,就实现了设置Agent面容/性别的方法!
这样性能极好,兼容性问题也不会太大。
欢迎使用2.0+版本。
更多功能
我内置了更多实用功能,欢迎移植到其他模组中!
我已写了说明到压缩包里的txt文件中。只要有心,将以下功能完全移植到其他模组并不难。
包括但不限于:给普通士兵换装、跟随、编组、更名……