这次改了什么

v0.10.0 把 LoopTrain 的核心玩法从”线索收集”正式升级为”NPC 时间线推理”。

线索系统从 8 条推倒重设计为 20 条,分为物理线索、NPC 主张、时间线观察、推理线索四类。新增 3 种观察行动(观察场景/盯住NPC/守点观察),玩家通过观察 NPC 行动构建时间线,发现 NPC 主张与客观事实的矛盾。

灰衣乘客现在会主动撒谎——声称自己一直在连接处,但玩家可以观察到他 14:04 经过二号车厢、14:06 进入三号车厢。小宁会隐瞒信息——声称一直坐着,但玩家可以观察到她 14:02 从三号车厢方向回来。

矛盾检测自动生成推理线索,推理线索影响游戏进程。成功条件从”收集 2 条线索”升级为 5 维度证据评分。失败后时间线记忆继承到下一轮,玩家可提前守点重新验证。

为什么要改

v0.9.0 的试玩版有一个根本问题:8 条线索全部互补递进,玩家不需要判读”谁在撒谎”。收集即可推进,没有推理压力。

同时,trial-timeline.json 定义了 9 个时间线事件,但 engine.js 完全没有引用——这些数据是死的。

这两个问题合在一起,意味着 LoopTrain 缺乏自己的核心差异化。普通互动叙事游戏是”和 NPC 对话,拿线索,推进剧情”,而 LoopTrain 应该是”观察 NPC 行动,构建时间线,用事实反证 NPC 的说法”。

v0.10.0 就是把这个差异化做出来。

设计取舍

known_clues 与 player_timeline 并存

最大的架构决策是:不推翻 known_clues,而是新增 player_timeline 与之并存。known_clues 继续管理物理线索(兼容现有 UI 和成功判定),player_timeline 管理 NPC 行动时间线(观察/主张/推理/记忆),通过 public_clue_id 字段同步两者。

选择并存而不是取代的原因:取代会破坏现有 Engine、测试、UI 和成功路径,风险太高。

推理线索固定判定

本迭代推理线索的判定结论是预写在数据里的,矛盾检测后自动取默认判定。许知微的判定交互(展示选项让玩家选)留给下个迭代。这个取舍让第一版逻辑实现简单,同时数据结构已完整预留许知微接口。

三条通关路径,门槛有意提高

所有路径都需要 actionable_location >= 1(地板划痕)。这提高了原路径门槛,但 clue_floor_panel_scratch 在检查声音来源时自动补充,不多一个玩家操作。三条路径 AP 消耗约 8AP(总 10AP),留 2AP 容错。

循环的价值是重新验证

失败继承时,观察过的时间点转为 memory 类型,current_loop_verified = falsecounts_as_current_evidence = false。这意味着记忆不算本轮证据,但玩家可以提前守在 remembered 的时间点重新观察,获得本轮有效证据。这才是循环玩法的核心价值——不是简单重复,而是策略性验证。

实现结果

27 个文件变更,约 1926 行新增代码:

文件数关键变更
数据层617 事件 + 20 线索 + NPC 对话 + 指令注册
Engine1628→1261 行,10 新函数
Server1POST /api/action/observe
Frontend2观察 UI + 时间线 UI + 66 行 CSS
测试125 新测试 + 7 更新
脚本1verify_slt.sh 服务器启动修复
文档4VERSION + 3 稳态文档

测试结果:11 个引擎测试 + smoke test 7 section + 12 个 E2E 全通过,verify_slt.sh 全绿。

还存在的问题

  1. 许知微判定交互未实现(verdict_options 数据已预留,下迭代开发)
  2. 小宁母亲彩蛋未实现(数据结构预留但无触发逻辑)
  3. 三条通关路径需要实际游玩验证平衡

下一步计划

  1. 许知微判定交互:检测到矛盾时主动发起对话,展示判定选项,玩家选择生成推理线索
  2. 许知微时间线整理话术
  3. LLM Bridge 接入(许知微优先)
  4. 小宁母亲彩蛋触发逻辑