九个月后:用 Go 和 Claude 构建高级星际争霸报告工具

故事的起点
15 岁那年,我在布宜诺斯艾利斯市中心的一场 LAN Party 上认识了最好的哥们,那时《星际争霸:母巢之战》刚火起来。我俩当场就迷上了这款游戏。
如今已是 2026 年,我们都有工作,住在世界两端,但几乎每个周末还会通过 Zoom 约战、瞎玩。这份持续几十年的热情,催生了一个想法。
周末通话里的点子
“要是我们能用自然语言直接问 AI 关于刚才那局游戏的问题,会怎样?”
比如:
-
这家伙是不是总出航母?
-
上一局他们三个是不是结盟打我们?
-
打这个虫族的时候,我平均应该在什么时间造防空塔?
最自然的实现方式是搭一个 MCP 服务器,但喂给它的数据从哪来?
母巢之战每局结束后会写一个录像文件(.rep),游戏客户端可以用它回放。但 MCP 读不了星际的录像文件。
于是我去找解析器,András Belicza 的 screp 是自然之选(它本身就用 Go 写的)。
就这样,screpdb 诞生了:
- 用
screp解析录像 - 结构化输出,存入关系数据库(SQLite)
- 前面挂一个 MCP 服务器
第一个提交落在 2025 年 9 月 30 日。
从聊天机器人到报告工具
后来我们真的用它玩了几局,感觉不太对。对着聊天机器人打字问问题,总觉得别扭。

第一个版本:Claude 通过 MCP 查询 screpdb 并自己绘制图表。功能很强大,但每次都要让聊天机器人重新构建视图,很快就腻了。

我们真正想要的不是一个对话工具,而是一个报告工具。
不过,这个开发工作量就大多了。在动手之前,我想先看看市面上已经有哪些现成的选择。
已有的工具
BWChart 是我们在 2003 年就开始使用的元老级工具。它的最后一个版本停在 2017 年,之后被 SCRChart 取代。关于它的完整历史,可以查看 Liquipedia 页面。


SCRChart 是 BWChart 在 2019 年的继承者,不过同年似乎就停止维护了。作为一款 Java 应用,它支持跨平台运行。


RepMastered 是 András Belicza 开发的优秀网页数据库和浏览器内分析工具,基于他自己的 screp 解析器(也就是整个项目的基石)。它收录了超过 1 亿个录像回放,功能非常完善:
- 批量上传和分享录像,甚至能一次上传整个文件夹。
- 庞大的可筛选数据库:可按玩家、地图、对战组合或标签搜索。
- 浏览器内分析功能:APM/EAPM、快捷键、建造顺序和战术图表,以及动画地图回放。


vespene.gg 是最新(2026 年)也是最大胆的一个工具。据其作者 dethsc 在 TL.net 的介绍帖里回答我的提问时所说,它是对 SC:R 二进制文件的全新逆向工程。你上传一个录像,就能在浏览器里观看游戏回放,附带各种实时数据、AI 教练、录像数据库、锦标赛、Twitch 直播等丰富功能。


历时九个月:用 Go 和 Claude 打造星际争霸高级报告工具
这些工具都很棒,但并没有完全覆盖我们的需求。我们希望在游戏过程中看到更高层次的语义。
不过,在动手构建报告工具之前,我首先得弄清楚:从 replay 文件中提取语义到底有多棘手。
为什么星际争霸 replay 文件(暗地里)异常难搞
星际争霸的 replay 并不会记录“发生了什么”,它只记录命令:每个玩家下达的指令流。
游戏引擎和 replay 的工程实现非常有趣,但这并非本文重点。如果你感兴趣,我通过 vibe-coding 方式做了一个教学站点,讲得更深入但依然通俗易懂:Inside Brood War。


简而言之:要想知道游戏中究竟发生了什么,你需要把命令输入到游戏引擎中去执行。但截至星际争霸重制版(SC:Remastered),并没有一个无头 API(headless API)来做这件事(对于重制版之前的版本,有 BWAPI 和 OpenBW 可用,但各有取舍;dethsc 对重制版的反向工程代码是闭源的)。
这意味着,单凭 replay 文件,有些信息永远无法回答:
- 玩家随时间变化的资源量是多少?当前玩家有没有卡人口(supply blocked)?
- 一个单位被造出来了,但它后来被击杀了吗?建筑有没有被摧毁?
- 一个单位被命令前往某处,但它最终到达了吗?什么时候到的?


而且命令本身也很嘈杂(noisy):
- 无效指令(Spam):许多命令被记录下来,但被引擎拒绝了(资源不够、取消建造、工兵在路上被击杀),我们往往无法分辨哪些命令真的执行了。
- 数据缺失:按理应该携带有坐标、源单位或目标单位的命令,经常就是没有这些信息。