问题背景
Kenshi 的 MOD 系统在不变更 MOD 列表时,每次新开游戏会产生相同的随机结果(如 NPC 位置、物品掉落等)。这是因为游戏使用了固定的随机数种子,导致玩家每次新开档都遇到完全相同的随机事件。
解决方案
本工具通过 DLL 注入替换游戏运行时的随机数种子,以实现每次开档的随机差异化。
技术实现
参考 RE_Kenshi FixRNG 的实现策略,通过 Hook MSVCR100 运行时库与游戏内函数来实现种子替换:
| Hook 目标 | 说明 |
|---|---|
srand | MSVCR100 种子替换(时间戳或自定义值) |
rand | TLS 切换真随机 / 确定性模式 |
randomInt | Building::selectParts +0x113,整数随机 |
random (float) | Building::selectParts +0x26D,浮点随机 |
getFoliageRotation | RVA 0x6CB8A0,植被旋转随机 |
种子替换原理
// 使用时间戳替代固定种子
void srand_hook(unsigned int seed) {
if (use_custom_seed) {
original_srand(custom_seed_value);
} else {
// 使用当前时间戳作为种子
original_srand((unsigned int)time(NULL));
}
}上述 5 个 Hook 均基于逆向工程得到的固定偏移地址实现。
使用方法
基本使用
- 将
KenshiRNGFix.dll和启动器放入 Kenshi 游戏目录 - 运行启动器,选择是否使用自定义种子
- 启动游戏,每次新开档都会产生不同的随机结果
自定义种子
如果需要复现特定的随机结果:
[RNG]
use_custom_seed=true
custom_seed=12345使用相同种子可以复现一致的随机结果,便于测试和分享。
验证方法
- 日志中出现
"Full RNG fix active (RE-style)"表明全部 Hook 生效 - 多次新开档后对比 NPC 位置与物品掉落可验证随机化效果
- 启用
use_custom_seed可在相同种子下复现一致的随机结果
局限性
本工具的 Hook 依赖于特定游戏版本的内存偏移:
- 仅支持 Kenshi 1.0.64 版本
- 游戏更新后可能需要重新适配偏移地址
- 不保证与其他 DLL 注入工具的兼容性
与 RE_Kenshi 的关系
本工具的 Hook 策略参考了 RE_Kenshi FixRNG 的实现,但作为独立工具提供,不依赖 RE_Kenshi 框架。
相关链接
最后更新: 2026-03-17