摘要

Arena 是本项目里用来和 AI 对战的本地网页(背后是规则模拟器 Simulator)。当网页请求 AI 行动失败时,对局会进入“需要手动重试恢复”的暂停状态。此前的问题是:失败原因一闪而过,再次重试失败时会被覆盖;回合标签还继续显示“轮到某方”,让玩家误以为对局在正常推进。本次只修展示:暂停期间保留第一个失败原因,回合标签同步显示“对局已暂停 · 请重试恢复”。真实浏览器的“断开服务—失败—离线重试—恢复服务—重试—继续”流程通过。这只是展示修复,最初那局(game197 第 55 个事件)为什么暂停仍然未知。

要回答的问题

暂停时,玩家能不能一直看到“为什么停了”,并且回合标签不会说谎?

方法

  • 暂停期间记住第一个被捕获的失败原因;之后的失败重试不覆盖它。刷新成功、渲染成功或开新局时清除。
  • 原因文字先规整空白,最长显示 400 个字符,只当纯文本显示,不按 HTML 解释(防止把奇怪内容当网页代码执行)。
  • 已有的回合标签和新渲染的战斗画面在暂停期间都显示“对局已暂停 · 请重试恢复”,恢复后立即回到正常状态。
  • 原有的保护不变:提交失败且服务端状态没变时不自动重试;若服务端其实已经推进,读取最新状态即可恢复,不会重复提交动作。

没有改通信格式、存档格式、规则、AI 策略或默认档位。

设置

把原第 55 个事件的快照复制到一个独立目录,在隔离的网页服务上加载(原始对局和诊断快照不覆盖)。用应用内浏览器分别在桌面(1164×654)和窄屏(436×818)检查。流程:恢复存档 → 关掉这个隔离服务 → 自动 AI 请求失败 → 离线时手动重试一次 → 重启服务 → 再手动重试。

结果

检查 结果
暂停原因在提示消失后、离线重试后仍保留 通过
回合标签显示暂停 通过
重启服务后一次手动重试 横幅与原因清除,同一局继续到第 58 个事件、玩家回合
页面身份、非空、无框架错误覆盖、交互 通过

注意:这次在关服务之前已有一个动作完成,所以它不是对原第 55 个事件暂停的精确复现;触发失败的是真实的 Failed to fetch。控制台错误列表在请求失败时也是空的,所以“控制台没报错”本身不能证明请求成功。

自动化检查:在 Node 下运行真实前端辅助函数的专项 24 项通过(0.83 秒);整个 Arena 测试集 2799 项通过(1228.77 秒,8 进程)。两者有重叠,不相加。随后另一整局(game211)93 个事件没有出现恢复暂停,并完成重启与独立回放。

局限

  • 这是展示修复,不解释最初那次暂停的触发原因。
  • 原因只保存在浏览器当前页面里,不是持久的故障日志。
  • 不增加任何完整对局或游戏原生规则一致性的验收。

结论与下一步

暂停原因和回合状态现在能如实显示,玩家知道该点重试。下一步是公平人类预览的决定和剩余生命周期证据;game197 的原始故障原因、Murmurs 的原生持续时间仍待查。