从解析 Demo 到能自己回看的桌面工具
开始支持 `.dem` 导入、2D 回放、回合筛选和 round / tick 跳转。做出来的统计不再只停在表格里,可以继续回比赛里看。
本地运行的 CS2 Demo 分析工具。把 `.dem` 解析成可检索、可比较的数据,并尽量让重要结果能继续点回具体比赛、回合和 tick,在 2D 回放里自己核对。
最开始我只是想从 Demo 里拿到比记分板更多的数据。后来越做越发现,比“还能算什么”更麻烦的是:算出来以后,怎么知道这个结果靠不靠谱。
所以我给 DAK 定了一个很简单的要求:如果一个分析值得看,就最好能继续找到它对应的比赛、回合和 tick。看到一个异常数据时,不用先相信算法,可以直接回 2D 回放看当时到底发生了什么。

DAK 里很多分析都不是看完数字就结束。一个结果如果值得继续追,最好还能顺着它找到具体样本:
分析结果
↓
具体样本
↓
比赛 / 回合 / tick
↓
2D 回放
早期版本已经能从不少统计跳回具体回合。0.8 主要做的是把这件事重新整理成更连续的使用流程:看完一个样本以后,仍然知道自己原来在看哪名选手、哪些比赛,以及为什么会来到这里。

DAK 的正式成熟度分成三档:稳定、测试中和实验。稳定能力已经有固定口径,测试中能力仍会随着验证集和边界处理继续调整,实验能力主要用于探索。
| 成熟度 | 现在怎么用 | 例子 |
|---|---|---|
| 稳定 | 已经有固定口径,可以正常用于复盘和比较 | 基础比赛事实、ADR / KAST / K-D、经济与转化、单场 RR、2D 回放 |
| 测试中 | 已经可以分析,但算法或边界还可能继续调整 | 对枪分类、枪法机制、反应 / 预瞄、闪光效果、道具点位库、跨场 RR / PRISM |
| 实验 | 用来探索模式,后续还会继续验证和调整 | 教练战术模式聚类、模式探索、对手打法倾向报告 |
另外还有一层输出约束。像控图覆盖场这类结果目前只做描述性观察:把空间覆盖和信息差画出来,保留给用户自己判断,不自动升级成战术结论或 Finding。
缺失值继续显示 —;证据不足的地方也会保留为空。

做到后面,DAK 遇到了另一个很实际的问题:RivalHub 也需要赛事统计和 Demo 分析。如果这些逻辑都留在 Studio 页面里,两个产品迟早会各写一套。
所以现在的数据链路大致是:
.dem
→ cs2df
→ cs2-demo-format / 3.x ZIP
→ @cs2dak/* 分析包
→ DAK Studio / RivalHub
Python 只负责把 Demo 解析成一份版本化的 v3 ZIP。后面的统计和界面都基于这份格式继续做。这样解析器可以单独更新,RivalHub 需要同样的统计时也可以直接复用,不需要把 Studio 整个搬过去。

v0.8.2 是目前正式发布的版本,macOS 和 Windows 都有完整桌面分发。后面还会继续做复盘行动项、教练赛前准备、战术板、BP 策略和地图控制模型,但这些现在还没有被当成已经完成的正式能力。
DAK Studio 本身使用 AGPL-3.0-only;可以给其它产品复用的 @cs2dak/* 分析包和 Python 壳使用 MIT。
开始支持 `.dem` 导入、2D 回放、回合筛选和 round / tick 跳转。做出来的统计不再只停在表格里,可以继续回比赛里看。
切到 cs2-demo-format v3;对枪、枪法机制、系列赛和教练分析等能力陆续加入,同时开始把分析能力分成稳定、测试中和实验三档。
加入赛事资源、Windows 在线安装器、应用内更新、稳定版 / 测试版通道和大库性能优化,也开始尝试控图覆盖场这类空间分析。
之前功能已经很多,但页面和分析入口越来越散。0.8 重新整理导航、分析范围和回看路径,让用户看完一个结果以后还能继续找到它来自哪场比赛、哪一回合。
Studio 可以直接读取 RivalHub 在线赛事、批量导入本地 Demo,并把赛事统计继续抽成共享包,给两个产品一起使用。
如果一个异常数据没法继续找到对应样本,很难判断它到底说明了什么。DAK 因此尽量给重要结果保留比赛、回合和 tick 的入口,让用户能直接回 2D 回放看当时发生了什么。
有些统计已经比较稳定,有些还在补验证集或处理边界情况。DAK 会明确区分稳定、测试中和实验功能;缺失值显示 `—`,证据不够时也不为了界面完整硬给结论。
Python 负责把 `.dem` 解析成 cs2-demo-format v3 ZIP,后面的 TypeScript 分析和界面都只认这份格式。这样解析器可以继续改,Studio 和 RivalHub 也能共用分析能力,不需要彼此依赖内部实现。
这些功能成熟度不同,所以这里保留它们各自现在真实的状态。