Seed Oracle 是《Slay the Spire 2》0.111.0 的路线信息前瞻 Mod。它在地图节点 HoverTip 中显示当前跑局已经能够确定的信息,并为每一项结果标注“确定”“当前世界线”“路线相关”或“暂不支持”。
当前版本实现:
- 普通战、精英战与 Boss 的 Encounter 队列前瞻;
- 枚举从当前位置到目标节点的可行路线,并统一用“绿色线路”“青色线路”等完整彩色线路对应不同结果;
- 每个颜色标签注明该结果包含的完整路线数;只有从当前位置连续沿同色线路走到目标才对应该结果,共线色带表示在分岔前仍有多种结果可能;
- 多种结果共用同一段地图边时,将颜色排成独立的不透明平行色带,避免后绘制路线覆盖前一条或因透明叠加而混色;
- 路线会保留到查看另一个节点或关闭地图,并按节点实际图标中心连接;路线覆盖层位于 HoverTip 下方,不再遮住文字;
- 修复中途推进后彩色路线落到地图背景层下方的问题;路线、顶部总览和 HoverTip 使用独立的显示层级;
- 地图顶部中央提供“先古 / Boss”按钮,按需展开或隐藏三幕总览;先古初始选项在序列化影子跑局中用事件独立 RNG 生成,已访问选项取自历史记录,未来幕中依赖牌组、遗物或进度的结果标成“按当前状态预测”;
- 对特兹卡塔拉、诺努佩佩、坦克斯与帕尔的动态候选池,用同一事件 RNG 分别计算条件成立和不成立的结果;只有实际选项发生变化时才显示“若条件成立:A 替换 B”,并注明其余条件保持不变;
- 相同预测结果与等效选择合并显示;长提示按原生字体的实际尺寸分页,Shift+滚轮翻页时锁定地图滚动,整组面板保持在屏幕安全区内;
- Boss 前瞻把共同的遭遇与怪物信息只显示一次,并把不同路线掉落压缩到最多三块面板,同时保留每条彩色完整路线及其终点连线;
- 支持普通连线、羽翼之靴剩余次数和 Flight 修正下的路线可达性;
- 沿每条路线依次推进问号房间、Event、普通战、精英战和 Boss 队列,显示目标事件或战斗及怪物阵容;
- 使用 Encounter 的独立确定性种子生成怪物阵容;
- 对下一步可进入且遭遇唯一的战斗,用克隆的
NicheRNG 精确生成怪物初始 HP;隔着其他房间的战斗在普通悬窗中保留“未确定”,战前 worker 可计算条件场景; - 用克隆的
UnknownMapPointRNG、赔率状态和 Hook 监听器预测路线上的连续?房间类型; - 用克隆的 Event 队列和 Hook 监听器预测路线上的事件身份;
- 对 Random Foreseer 已支持的 31 类事件,在序列化影子跑局中初始化事件选项,并分别显示入场时原生选项已经生成的卡牌、遗物、药水与选择后的额外预测;滑脚木桥的首次无伤删牌、旺戈商店的精选遗物等不会因 Random Foreseer 只补充后续结果而遗漏;远端事件会先推进沿途已建模的奖励状态;
- 使用原版商店生成器按路线生成初始库存,包括卡牌、遗物、药水、半价、价格和删牌价;按已建模的沿途基础奖励推进共享 RNG 与遗物袋,未执行的拾取、事件、购买和补货仍标为条件;
- 按可行路线推进克隆的
Rewards、Shops、卡牌/药水赔率和玩家遗物袋,显示战后金币、卡牌、药水与遗物;支持当前游戏内会改写基础奖励的遗物与自定义模式; - 使用克隆的
TreasureRoomRelicsRNG 与共享遗物袋预测宝箱遗物和金币,处理银坩埚空箱与首次教学宝箱;白银熔炉按游戏规则只在打开的第一个宝箱生效(进房计数器先递增再判定出货),沿途后续宝箱正常预测遗物与金币; - 使用游戏支持的
[gold]、[green]、[orange]和[blue]富文本标签显示预测状态与价格; - 卡牌、遗物与药水名称按实际稀有度显示为普通白、罕见蓝、稀有金等颜色;Mod 设置页可改用原生卡图缩略图代替卡名,彩色菱形继续标出稀有度,升级牌保留“+”;
- Mod 设置页可关闭非计划模式下的路线、标记和地图预测浮窗(默认开启);打开计划面板仍显示规划信息,面板顶部固定提示“当前计划模式,点击房间不会进入,需要进入时请关闭计划面板”;
- 地图顶部提供“战损与模拟”按钮和可见面板;打开面板与地图悬停都不会启动 worker。每个场景有独立“计算”按钮,未选择的路线不排队;相同跑局状态与搜索设置会直接恢复缓存结果;
- 面板用与地图路线标记一致的彩色三角形、正方形、菱形等图形区分路线,悬停一行会在地图上高亮对应目标与路径;可选择单场搜索预算与并行度,并查看耗时、可信度和药水计划;
- 面板实时显示隔离 Combat Solver worker 的 PID、工作集、私有内存和静音状态;可选择保活 2、10、30 分钟、一直维持或任务结束后自动关闭,也可手动关闭及重启/预热;
- Combat Solver 在主游戏初始化时钉住本次会话实际载入的 Mod 文件;Steam 运行中更新工坊目录时,隔离 worker 仍以主进程版本为准,不会因磁盘版本先行更新而误报 Mod 集合不一致;
- “咱俩碰一碰”页可手动运行 0~10 个假设样本,对象包括当前幕随机弱怪池、强怪池、精英池、指定普通/精英怪组和当前 Boss;指定怪组及样本结果使用游戏当前语言的本地化遭遇名称,逐样本显示战损、终局生命、回合和用药,并汇总最低、平均与最高战损;
- 纯模拟明确使用假定的怪物组与怪物生命、开局洗牌、怪物行动和其他战斗随机数,只用当前牌组、遗物、药水与生命比较威胁,不把远处未确定战斗显示成预测事实;
- 规划中的普通战、精英战、Boss、问号点战斗和事件选项战斗可从规划快照运行模拟,默认 3 次、可选 1~10 次;成功结果可作为该节点的生命与用药参照写回规划;
- 手动计算覆盖每条当前可行路线上的第一场确定战斗。目标前允许经过不会直接消耗战斗序列的篝火、宝箱或商店,目标坐标和中间楼层历史会传入隔离进程;未决事件和中间战斗不跳过计算;
- 若目标前有篝火,面板同时给出“沿途状态保持当前值”和“在前置篝火休息后入战”场景。休息分支在开战 Hook 前应用游戏当前规则算出的 HP,并明确标出尚未模拟的奖励、锻造与其他触发;
- 探测 Random Foreseer 与 Combat Solver 的版本和可调用能力;
- Debug 构建在每次地图预测前后比较 live state 指纹。
远端路线预测只展开实际算出内容变化的选择分支:以一条具体选择链为参照,逐格列出其他选择造成的商品、价格或掉落变化。相同结果合并,未算出具体结果的情况不再追加泛泛提示。计算仍有预算和机制覆盖范围,分支列表不代表穷尽全部玩法。
当前版本同时兼容 Combat Solver public API v5;检测到 API v6 时额外启用规划快照战斗模拟。v6 扩展通过独立 SerializableRun 把规划中的牌组、生命、药水、地图和事件状态交给 worker,支持问号点与事件战斗;旧的 v5 工坊版仍可使用确定路线和当前状态假设样本,规划模拟控件会明确标记为不可用。所有战斗都在独立 headless 游戏进程中初始化和求解,主进程调用前后核对完整跑局/RNG 状态令牌。远端确定路线数值仍是清楚标注的条件结果:沿途若拿牌、拿遗物、用药、购买、锻造或触发其他状态变化,应在实际选择后重新计算。
设计评估与验证边界见 docs/combat-solver-precombat-assessment.md。
补齐帕尔之翼“献祭”等替代操作的显示和差分,卡图模式保留附魔名称、数值;重掷预算未覆盖的组合不再误写成“卡牌变为无”,不再生成大量虚假的移除行。重掷预览复用奖励生成后的独立状态,并遵守外层预算;熔岩灯重掷与规划选牌恢复战斗房间上下文。完整/截断覆盖保留区别,狩猎只说明实际算过的次数。
修复休息点、战斗和宝箱漏掉巨口储蓄罐进房金币、营地漏掉永恒羽毛治疗及账本覆盖自动收益的问题;恢复原版自定义模式的加载初始化,避免致命事件精英问号的基础概率丢失。本轮复现、性能及验证边界。
快速划过未缓存的远处节点时,仅在停留80毫秒后计算最后一个节点,离开就取消;拖动地图期间推迟计算。相邻节点和已有缓存立即显示。缓存改为最多64项、逐项淘汰最近最少使用的结果,避免看过12个节点后整批失效;牌组、遗物、随机状态、事件页面或语言变化仍会失效。
分支入队只记录待追加的坐标,实际处理时才应用,省去逐个候选恢复并重新复制完整跑局;状态复制移除整份JSON中间树,保留独立副本与地图标记。隔离测试的512路线场景首次查询由约176毫秒降至130毫秒;16次缓存查询共约2.4毫秒,复杂节点首次计算仍有开销。性能测量与验证。
修复悬停含前置休息点的路线、或相应预测刷新时,一批牌依次播放升级并飞回牌组的动画。此前逐张枚举锻造目标时,新分支的玩家副本不等于外层隔离对象,但保留相同玩家编号,被原版误认为本地牌。隔离复现中10个锻造分支生成了10个真实动画节点,真实牌组数据没有改变。
预测锻造明确关闭动画,副本按对象身份持续隔离,覆盖嵌套分支和隔离结束后的回调;真实玩家归属与会员卡价格计算保持各自原有行为。复现与修复记录。
普通购买沿用进店时已经生成的商品,不额外消耗随机数;送货员补货、星系仪生成五组选牌以及遗物改变奖励规则会产生实际后续分支。购买预测改为执行原版购买、获得效果、补货、购买后回调及库存更新,补齐此前手动扣钱和加物品遗漏的步骤。星盘变牌使用独立的 Niche 随机流,不能一概当成奖励随机数变化。
路线规划保留同一次进店的库存,按购买顺序更新会员卡折扣与补货,并可再次购买送货员补出的同一格商品。需要额外指定变牌等目标的购买会保留未完成条件;不会自动代选后宣称确定。逐项随机流对照及原生购买实测见 商店机制核查。
前置商店不再把同结果的“不买/购买各张卡”逐一列出。对已核对的商店后直接进入普通战斗场景,普通购牌不会改变奖励时显示“14层购牌:任意选择(137金内)”,覆盖预算内的多张连买。其他后续流程只合并实际验证的单件购买,不扩大为任意组合。
保留实际商品、价格和预算,并区分“买不起”“药水栏满”和“未计算购买”。例如飞溅166金、预计137金时明确说明买不起;若转经轮可购买并改变后方掉落,则列出具体增加的选牌。原因及52种购牌组合对照见 商店购买摘要验证。
已验证等效的普通奖励不再只隐藏默认跳过操作,统一显示“2、3层选牌:任意选择”,同一范围只说明一次,不标成必要前提。浮木存在时把普通拿牌/跳过与重掷分开,显示“任意选择(不重掷)”;转经轮、白星产生的多组普通选牌同样保留各组的等效范围。
等效检查只读取实际使用的卡池、遗物袋和回调,未参与预测的注册模型不再阻止判断;尚未证实等效的部分选项和真正影响后续结果的行为继续保留条件。验证记录。
原版在生成战斗奖励时就抽好候选牌,普通拿牌或跳过不再抽随机数。对已核对的普通战斗、脑蛭、目标商店流程,若拿牌只改变牌组且后续操作不读取这些变化,省略“2、3层跳过选牌”等默认操作前提。遇到重掷、狩猎、拿牌触发效果或读取现有牌组的事件时保留相应条件;条件消除不依赖分支枚举碰巧是否完成。
两场战斗的全部16种普通拿牌/跳过组合,分别对照脑蛭5种“分享知识”选牌和3种“把它扯下来”选牌,共128例商店内容及价格一致。原版核查、反例与性能记录见 普通选牌条件核查。
战斗奖励、Boss奖励和宝箱接入结构化选择条件,补齐参照结果的菜单范围;已验证全部选法等效时不显示旧的逐项枚举。只对某条线路成立的前提在该线路旁说明一次。
商店基础库存增加①②③等格位编号。每种其他情况用一个标题列出完整变化,按商品类别合成行,例如“角色卡:②完美打击48金(-24)、③破灭48金(-24)”。基础库存已列出的旧商品和旧价格不再重复。实测及完整节点浮窗验证见 奖励条件与商店可读性。
商店条件按实际选项范围合并。一个步骤的全部选法都得到相同结果时,删除该步骤;同一事件选项下的不同选牌目标得到相同结果时,只写事件选项。只算出部分选法时仍列出具体子集,保持先后顺序和选择之间的关联。
所有结果共同依赖的前提只写一次,例如“2、3层跳过选牌”。多个分支共有的商品格位变化也只列一次,并注明适用条件;各分支剩余差异单列。实测与边界见 条件简并验证。
取消按约10个汉字强制换行,改由原生字体按实际宽度排版;浮窗常规宽度520像素,并按视口高度分页,保留所有已算内容。按住 Shift 时锁定地图滚轮、拖动和滚动惯性,Shift+滚轮只翻提示页,松开后恢复地图滚动。
商店按完整商品、格位、升级/附魔、价格、半价状态与删牌价格合并相同库存。覆盖已计算路线与选择组合最多的一份库存作为基础,先展示一次完整清单,再列对应条件;其他情况只展示相对基础的变化格位及价格增减。覆盖数量不代表发生概率。
原生布局、商店合并和地图滚轮验证见 布局与商店摘要验证。
复杂路线的完整悬停预测增加同跑局状态缓存和分阶段计算预算。已知房间线路直接推进队列位置,相同基础奖励/商品序列只生成一次;事件与问号仍走独立跑局。卡牌、遗物、药水、RNG、地图、当前事件页或语言变化会使相应缓存失效。收起的“先古/Boss”总览改为展开时生成。
长提示使用单个原生浮窗分页,悬停节点时按 Shift+滚轮 查看所有已计算内容。多组重掷和狩猎结果不再只展示前16条,上游选择变化不再只展示前8组;相同结果合并,重复的未变化牌组省略。分组时复用共享预测对象的完整结果键,保留升级、附魔与条件差异。
路线或内容计算截断时显示实际已计算数量,掉落与商品同步标为条件预测。空事件选项、未计算的战损说明和无数值的HP提示不再占行。具体参照选择仍显示,避免单一条件结果被读成所有选法都相同。
性能、原版对照与原生页面尺寸记录见 再次体验排查。
奖励结算后打开地图时,收起的“战损与模拟”面板不再遍历全图或生成战斗候选;展开时才准备列表,相同跑局状态再次展开复用列表。路线搜索按目标可达性与剩余羽翼之靴次数剪枝,优先到达目标,只在找到完整路线时生成路径数组;达到路线预算仍注明截断。战斗候选提前排除需要经过其他战斗或未决事件的线路。
测量与路线完整性对照见 复杂路线性能验证。
变牌事件按相同完整结果合并来源,每行最多显示两个来源牌名并保留实际张数,例如“打击、防御等12张牌变化为XX”。摘要使用卡名,避免卡图继续撑大浮窗;多次变牌按第几次分别显示,升级、附魔或结果列表不同的预测不会合并。底层每张来源牌的预测保持完整。
地图预测纳入当前尚未选择的事件初始页,包括开局涅奥;已选完的事件不会重复执行。当前事件先在独立跑局中按实际选项和选牌目标执行,再推进后方商店、战后掉落与宝箱。优先把当前选项推到目标,然后在剩余预算内枚举沿途选择。
提示用“参照选择”和“改为某选项”对应具体结果,仅列变化的格位、卡名、遗物、药水、升级、价格及金币。移除“选择会影响结果,请重算”“未覆盖”等没有具体替代内容的附加提示;浮木仍显示实际算出的各组选牌与重掷顺序。
原版对照和具体测试结果见 具体选择变化验证。
普通地图的远端商店增加前置选择条件:选牌、跳过、浮木重掷、拿取或跳过遗物,以及可无头执行的事件及其后续页,会在独立影子跑局中推进后再生成商店。不同条件下的相同库存合并显示;计算或展示达到上限、事件需要未覆盖操作时会明确注明,不把已计算结果当作全部可能。
普通战斗前瞻现在显示浮木重掷后的牌组,并区分“先重掷第 1 组再第 2 组”和相反顺序。转经轮与白星的额外组选牌沿用原生生成器;持有狩猎时,增加触发 0–3 次的条件预览。规划可指定狩猎触发次数,并按记录的跨组选牌、重掷、跳过顺序回放。普通重掷分支假设之前及期间没有领取奖励;规划仍先领取勾选的非卡牌奖励,再执行选牌序列。
宝箱、商店和挖掘得到的遗物改走原生领取流程,保留领取时的金币、随机升级、附加奖励及 RNG 变化。商店买牌保留完整卡牌状态并触发原生入牌效果。领取还需要未指定的选择时,规划会停止计算后续节点。
边界与验证见 前置选择及重掷验证。
普通地图的商店现在使用原版 MerchantInventory.CreateForNormalMerchant,保留半价牌第二次价格骰、上架去重、三种蛋的卡牌结果 Hook、会员卡与快递员折扣。生成只发生在影子跑局中,不把预测商品写进真实资料的发现记录。
远端事件在独立影子跑局中推进沿途楼层、历史与已见事件,修正楼层准入门槛;尚未执行的事件选择、购买、拿奖励和篝火动作仍属于条件。单结果和多结果视图都会注明这些条件及路线枚举截断;截断结果不会保留全路线“确定”标签。
战斗奖励明确显示为胜利后的基础掉落,并注明全歼、没有战中新增奖励或改写奖励状态的假设。商店库存、价格、卡牌升级和附魔状态参与路线分组。事件内容区分选牌目标映射、继续重抽序列、待选卡包和部分内容预览,并指出未覆盖的选项与后续页。
普通模式仍使用真实隐藏队列及 RNG 副本;战损对应求解器找到的打法。它没有接入只使用玩家可见信息的 blind 策略,找到终局路线也不代表最优或实战结果保证。
修复与验证记录见 普通模式预测修复。
Seed Oracle 0.1.26 在 SeedOracle.json 中把 RitsuLib 的最低兼容门槛设为 0.6.0,把 Combat Solver 的最低兼容门槛设为 0.31.2;Mod loader 按 min_version 使用大于等于比较,因此后续主 Mod 版本无需跟随每次发布修改依赖。public API v5 是确定路线和当前状态假设样本的最低能力,规划战斗模拟会在运行时探测 v6 方法,旧的 v5 构建会安全降级为不可用。Combat Solver 0.39.0 的公开战前 API 仍保持 v6 签名兼容;RitsuLib 0.6.0 的拆分程序集由项目自动引用。详细核对记录见 依赖兼容性审计。
复制 local.props.example 为 local.props,按本机路径调整后运行:
dotnet build .\SeedOracle.csproj -c Releaselocal.props 中的 CombatSolverDir 应指向含所需 API 的 CombatSolver 构建目录;可以使用作者工坊条目 2868840/3790899961,或在审阅 v6 PR 时指向本地 Release 输出。不要把临时构建目录中的 SeedOracle 文件复制到 CombatSolver 目录。
默认会把 SeedOracle.dll、PDB 和清单部署到游戏目录的 mods/SeedOracle。
依赖:
- STS2-RitsuLib
0.6.0+ - Random Foreseer
0.13.11+ - Combat Solver
>=0.31.2(public API v5 最低门槛;更新的主 Mod 版本自动兼容);规划战斗模拟需 API v6 扩展
依赖能力审计见 docs/capability-audit.md。
- STS2-RitsuLib
- Random Foreseer
- Combat Solver(作者原版)
- Combat Solver API v6 Fork(规划快照模拟扩展与上游 PR)
Seed Oracle 自有源码按 MIT License 发布。游戏、游戏资产以及单独安装的依赖不属于本许可证;详情见 THIRD_PARTY_NOTICES.md。