杀戮尖塔2 种子与随机数机制
杀戮尖塔2 的“种子”可以理解为一局游戏的随机起点。它会影响地图、奖励、商店、洗牌、怪物行动等很多内容,但它不是一张完整剧本:同一个种子并不等于“无论怎么打,后面所有东西都完全一样”。
对普通玩家来说,最有用的结论是:种子能帮助你复现一局的大方向,但真正结果还会被角色、路线、选择、当前牌组、遗物、游戏版本、Mod、多人玩家编号等因素影响。
玩家能看到什么
同一个种子通常会让这些内容更容易复现:
- 地图大致结构、路径和房间分布。
- 同一路线、同一选择下的奖励倾向。
- 商店、宝箱、事件奖励等部分结果。
- 战斗中的洗牌顺序、随机生成、怪物随机行动分支。
但如果你改变了中途行为,后面的结果可能会变:
- 走了不同路线,遇到的房间和奖励池会变。
- 选了不同事件选项,后续状态和候选池会变。
- 多拿或少拿一张牌,之后的洗牌、随机选牌、奖励候选可能会变。
- 装了不同 Mod,候选卡池、遗物池、事件或逻辑钩子可能会变。
- 多人模式下,不同玩家的奖励和商店可能按玩家编号分开计算。
所以“同种子复现”更准确的说法是:在版本、Mod、角色、路线、选择和关键状态都接近一致时,很多随机结果可以复现。
为什么同一种子不一定完全一样
种子只决定“随机序列从哪里开始”,不决定“这一次随机要从哪些东西里面选”。
举个玩家视角的例子:奖励卡不是单纯由种子决定。游戏会先根据角色、解锁状态、当前模式、多人限制、遗物、Mod 等条件整理一个候选池,然后再从候选池里随机抽。候选池不同,即使随机数位置一样,最后看到的卡也可能不同。
再比如洗牌:同一个随机顺序作用在不同牌组上,结果当然不同。你上一场多删了一张牌,或者多拿了一张牌,下一次洗牌看起来就可能不一样。
怎么更可靠地复现一局
如果你想复现某个局面,只记录种子通常不够。建议同时记录:
- 游戏版本。
- 使用的 Mod 列表和版本。
- 角色、进阶等级、游戏模式。
- 路线和每个房间的主要选择。
- 关键奖励选择、删牌、变化、商店购买。
- 多人模式下的玩家位置或玩家编号。
如果是为了调试或写 Mod,最好额外记录当时的存档、日志,或者 RNG 状态。普通玩家一般不需要关心这部分。
God Mod 可以怎么利用这些信息
这些功能对玩家比较直观:
| 功能 | 能解决什么问题 | 风险 |
|---|---|---|
| 种子查看 / 复制 | 分享当前局,记录测试样本 | 只读,风险低 |
| 当前地图种子信息 | 辅助复现某一幕地图 | 只读,风险低 |
| 复现信息导出 | 把种子、角色、Mod、路线等整理成报告 | 只读,适合反馈 bug |
| 安全预览 | 预览下次洗牌、问号房、奖励或商店趋势 | 需要谨慎实现,不能改变真实随机状态 |
高级功能,例如重置随机状态、快进随机状态、强制替换某条随机流,会直接影响本局未来结果,也可能破坏多人同步。更适合放在专家模式或调试工具里,而不是普通玩家入口。
底层实现原理
这一节是源码和实现视角。如果你只是想知道种子对游戏表现有什么影响,可以跳过这一节,前面的内容已经足够。
源码层面,STS2 并不是用“一条全局随机流”控制所有系统,而是从同一个字符串种子派生出多条用途不同的随机流。每条随机流都有自己的种子和计数器;每次取随机数、洗牌或随机选择,都会推进对应流的计数器。
源码里可以按这几个层级理解:
| 层级 | 机制 | 主要用途 |
|---|---|---|
| 字符串种子 | 新开局时保存为 StringSeed,再转成稳定的整数种子 | 分享、复现、生成派生随机流 |
Rng | 每条随机数流保存 Seed 和 Counter;每次取随机数都会推进 counter | 确保同一流可以保存、加载、快进和复现 |
RunRngSet | 从本局种子派生多条 Run 级 RNG | 地图、洗牌、问号房、战斗生成、怪物 AI、宝箱遗物等 |
PlayerRngSet | 从本局种子加玩家 NetId 派生玩家级 RNG | 奖励、商店、变化等按玩家区分的结果 |
| 地图 RNG | 每幕地图使用 act_N_map 从 run seed 派生 | 当前幕地图结构、路径和房间类型分布 |
常见 Run 级随机流包括:
Shuffle:战斗初始洗牌、弃牌堆洗回抽牌堆、部分随机插牌位置。UnknownMapPoint:问号房类型 roll,以及相关 odds 的推进。CombatCardGeneration:战斗中随机生成卡牌,例如部分药水、能力、怪物效果。CombatPotionGeneration:战斗中随机生成药水。CombatCardSelection:战斗中从现有卡牌里随机选择目标。CombatEnergyCosts、CombatTargets、CombatOrbs:战斗中随机费用、目标或充能球相关逻辑。MonsterAi:怪物随机行动分支。TreasureRoomRelics:宝箱房共享遗物同步。UpFront:开局阶段、房间池、遗物池、先民遗物等前置生成。Niche:一些零散但需要稳定复现的随机选择。
玩家级随机流更少,但对结果影响很大:
Rewards:奖励卡、奖励遗物稀有度、部分事件奖励。Shops:商店卡牌、药水、价格浮动等。Transformations:卡牌变化。
预览未来为什么要复制 RNG
如果工具想“预览未来”,正确做法不是直接调用当前游戏里的随机函数,而是复制当前随机流的 Seed + Counter,在副本上模拟下一步结果。
原因很简单:真实随机流每被调用一次,counter 都会前进。预览如果直接消耗真实 RNG,就会让“被预览的未来”本身发生变化。
安全预览的逻辑应当是:
- 读取当前真实 RNG 的 seed 和 counter。
- 创建一个同状态的临时 RNG 副本。
- 在副本上模拟奖励、洗牌、问号房或商店结果。
- 展示预览结果。
- 丢弃副本,不碰真实游戏状态。