Skip to content

杀戮尖塔2 种子与随机数机制

杀戮尖塔2 的“种子”可以理解为一局游戏的随机起点。它会影响地图、奖励、商店、洗牌、怪物行动等很多内容,但它不是一张完整剧本:同一个种子并不等于“无论怎么打,后面所有东西都完全一样”。

对普通玩家来说,最有用的结论是:种子能帮助你复现一局的大方向,但真正结果还会被角色、路线、选择、当前牌组、遗物、游戏版本、Mod、多人玩家编号等因素影响。

玩家能看到什么

同一个种子通常会让这些内容更容易复现:

  • 地图大致结构、路径和房间分布。
  • 同一路线、同一选择下的奖励倾向。
  • 商店、宝箱、事件奖励等部分结果。
  • 战斗中的洗牌顺序、随机生成、怪物随机行动分支。

但如果你改变了中途行为,后面的结果可能会变:

  • 走了不同路线,遇到的房间和奖励池会变。
  • 选了不同事件选项,后续状态和候选池会变。
  • 多拿或少拿一张牌,之后的洗牌、随机选牌、奖励候选可能会变。
  • 装了不同 Mod,候选卡池、遗物池、事件或逻辑钩子可能会变。
  • 多人模式下,不同玩家的奖励和商店可能按玩家编号分开计算。

所以“同种子复现”更准确的说法是:在版本、Mod、角色、路线、选择和关键状态都接近一致时,很多随机结果可以复现。

为什么同一种子不一定完全一样

种子只决定“随机序列从哪里开始”,不决定“这一次随机要从哪些东西里面选”。

举个玩家视角的例子:奖励卡不是单纯由种子决定。游戏会先根据角色、解锁状态、当前模式、多人限制、遗物、Mod 等条件整理一个候选池,然后再从候选池里随机抽。候选池不同,即使随机数位置一样,最后看到的卡也可能不同。

再比如洗牌:同一个随机顺序作用在不同牌组上,结果当然不同。你上一场多删了一张牌,或者多拿了一张牌,下一次洗牌看起来就可能不一样。

怎么更可靠地复现一局

如果你想复现某个局面,只记录种子通常不够。建议同时记录:

  • 游戏版本。
  • 使用的 Mod 列表和版本。
  • 角色、进阶等级、游戏模式。
  • 路线和每个房间的主要选择。
  • 关键奖励选择、删牌、变化、商店购买。
  • 多人模式下的玩家位置或玩家编号。

如果是为了调试或写 Mod,最好额外记录当时的存档、日志,或者 RNG 状态。普通玩家一般不需要关心这部分。

God Mod 可以怎么利用这些信息

这些功能对玩家比较直观:

功能能解决什么问题风险
种子查看 / 复制分享当前局,记录测试样本只读,风险低
当前地图种子信息辅助复现某一幕地图只读,风险低
复现信息导出把种子、角色、Mod、路线等整理成报告只读,适合反馈 bug
安全预览预览下次洗牌、问号房、奖励或商店趋势需要谨慎实现,不能改变真实随机状态

高级功能,例如重置随机状态、快进随机状态、强制替换某条随机流,会直接影响本局未来结果,也可能破坏多人同步。更适合放在专家模式或调试工具里,而不是普通玩家入口。

底层实现原理

这一节是源码和实现视角。如果你只是想知道种子对游戏表现有什么影响,可以跳过这一节,前面的内容已经足够。

源码层面,STS2 并不是用“一条全局随机流”控制所有系统,而是从同一个字符串种子派生出多条用途不同的随机流。每条随机流都有自己的种子和计数器;每次取随机数、洗牌或随机选择,都会推进对应流的计数器。

杀戮尖塔2 种子派生多条随机数流的流程图
同一个字符串种子会派生出 Run 级和 Player 级随机数流;预测未来结果时需要同时知道当前游戏状态和对应流的计数器。

源码里可以按这几个层级理解:

层级机制主要用途
字符串种子新开局时保存为 StringSeed,再转成稳定的整数种子分享、复现、生成派生随机流
Rng每条随机数流保存 SeedCounter;每次取随机数都会推进 counter确保同一流可以保存、加载、快进和复现
RunRngSet从本局种子派生多条 Run 级 RNG地图、洗牌、问号房、战斗生成、怪物 AI、宝箱遗物等
PlayerRngSet从本局种子加玩家 NetId 派生玩家级 RNG奖励、商店、变化等按玩家区分的结果
地图 RNG每幕地图使用 act_N_map 从 run seed 派生当前幕地图结构、路径和房间类型分布

常见 Run 级随机流包括:

  • Shuffle:战斗初始洗牌、弃牌堆洗回抽牌堆、部分随机插牌位置。
  • UnknownMapPoint:问号房类型 roll,以及相关 odds 的推进。
  • CombatCardGeneration:战斗中随机生成卡牌,例如部分药水、能力、怪物效果。
  • CombatPotionGeneration:战斗中随机生成药水。
  • CombatCardSelection:战斗中从现有卡牌里随机选择目标。
  • CombatEnergyCostsCombatTargetsCombatOrbs:战斗中随机费用、目标或充能球相关逻辑。
  • MonsterAi:怪物随机行动分支。
  • TreasureRoomRelics:宝箱房共享遗物同步。
  • UpFront:开局阶段、房间池、遗物池、先民遗物等前置生成。
  • Niche:一些零散但需要稳定复现的随机选择。

玩家级随机流更少,但对结果影响很大:

  • Rewards:奖励卡、奖励遗物稀有度、部分事件奖励。
  • Shops:商店卡牌、药水、价格浮动等。
  • Transformations:卡牌变化。

预览未来为什么要复制 RNG

如果工具想“预览未来”,正确做法不是直接调用当前游戏里的随机函数,而是复制当前随机流的 Seed + Counter,在副本上模拟下一步结果。

原因很简单:真实随机流每被调用一次,counter 都会前进。预览如果直接消耗真实 RNG,就会让“被预览的未来”本身发生变化。

安全预览的逻辑应当是:

  1. 读取当前真实 RNG 的 seed 和 counter。
  2. 创建一个同状态的临时 RNG 副本。
  3. 在副本上模拟奖励、洗牌、问号房或商店结果。
  4. 展示预览结果。
  5. 丢弃副本,不碰真实游戏状态。

Indie games, mods, and dev notes.