花一整天写解析器,然后发现腾讯已经帮我做完了
用 CDragon 自己写英雄联盟技能数值解析器,debug 到 93% 覆盖率。然后有人丢了一个腾讯 API 链接过来——0 解析,100% 覆盖。
花一整天写解析器,然后发现腾讯已经帮我做完了
这个故事分三幕。
第一幕:我以为问题很简单。 第二幕:我发现问题很复杂。 第三幕:我发现问题根本不该用这种方式解决。
先说背景
我做了一个英雄联盟桌面助手。Tauri + Rust + React,悬浮窗,玩家在游戏里能看到英雄技能的完整数值——各等级伤害、冷却时间、法力消耗。
游戏里的技能描述是这样的:
造成 @BaseDamage@ 物理伤害
Riot 的存储方式不是直接给你”30/60/90/120/150”,而是:
- 模板字符串:
造成 @BaseDamage@ 物理伤害 - 数值表:
BaseDamage = [0, 30, 60, 90, 120, 150]
第 0 个是占位,1-5 是各等级。游戏运行时做替换。
所以我的工作就是——写一个替换引擎。
听起来简单对吧?
第一幕:我觉得这不难
数据来源有两个:
- LCU(英雄联盟客户端本地 HTTP 接口,端口 2999)→ 给你技能描述模板
- CDragon(社区维护的数据镜像站)→ 给你完整的数值表
我先写单元测试验证 CDragon 解析层。8 个测试,全绿。
然后我跑起来一看——所有技能数值都是 0。
第二幕:Debug 地狱
Bug 1:大小写
CDragon HashMap 存的 key 是 "Q"、"W"、"E"、"R"。
LCU 返回的 spellKey 是 "q"、"w"、"e"、"r"。
Rust 的 HashMap 大小写敏感。get_spell("q") 永远返回 None。
修了。
Bug 2:切片
数值表是 [0, 30, 60, 90, 120, 150],第 0 个是占位符,应该跳过。代码没跳。显示 0/30/60/90/120/150。
修了。
Bug 3:跨技能引用
有些模板写 @spell.GnarE:Damage@,意思是”去 E 技能里找 Damage”。但代码只在当前技能里找。
修了。
Bug 4:f1 token
另一种引用语法,指向 effectAmount 数组而不是 DataValues。两种格式完全不同,要分别处理。
修了。
然后我建了一个”侦察兵”
audit_token_coverage——一次性扫描所有 191 个英雄,告诉我哪些 token 没被正确替换。
跑完一看:178/191 完美。覆盖率 93%。
剩下 13 个都是边角 case——某个英雄的某个技能用了某种罕见的引用语法。
这时候有人说了句话
你确定你需要这个功能吗?
我愣了一下。
然后他继续说:
你的应用核心价值是什么?看截图,是英雄选择情报——评分、最近 6 场战绩、连败提示、One-trick 标签。这些才是卖点。
技能数值呢?玩家鼠标悬停技能图标 0.5 秒就能看到。你的悬浮窗在游戏开始后才显示。你的面板真的比游戏内置的好用吗?
我当时没认真想,只在”怎么修完剩下 13 个”的思路里打转。
第三幕:真相
后来有人丢了一个链接:
https://game.gtimg.cn/images/lol/act/img/js/hero/{champId}.js
这是腾讯运营国服时自己整理的中文数据。我一看——
{
"cooldown": "4/4/4/4/4",
"cost": "60/65/70/75/80",
"description": "造成【80/125/170/215/260】+80%【法术强度】..."
}
冷却时间:直接是字符串,不需要 token 解析。 法力消耗:直接是字符串。 伤害数值:已经替换好了。
腾讯帮我做掉了我一整天在做的所有工作。
而且不是 93%。是 100%。
真正的工作量对比
| CDragon 方案 | 腾讯 API | |
|---|---|---|
| 覆盖率 | 93% | 100% |
| 中文支持 | 要手动翻译 | 天然中文 |
| 解析复杂度 | 4 层 fallback + 8 种 formula part | 零解析 |
| 已投入时间 | 一整天 | 半天集成 |
| 维护成本 | 每个版本可能要补新 token | 腾讯自己维护 |
国内有个项目叫 frank,技能数值显示就是用这个 API。稳定、完整、不会被封。
我从这件事学到的
1. 先调研,再动手。
如果我在第一天就搜了”英雄联盟技能数据 API”,可能 8 小时前就知道腾讯这个接口了。frank 这个项目我早 8 小时看到,就能省下今天 90% 的工作。
2. 单元测试绿不代表没 bug。
测试覆盖了”解析层”,但 bug 在”调用层”。两层之间的缝隙,测试够不到。
3. 有时候最好的代码是不写。
CDragon 解析器写了上千行。腾讯 API 零解析。答案一直都在那里,只是我没去找。
4. 灵魂拷问有时比 debug 更重要。
有人问我”你确定你需要这个功能吗”的时候,我没认真想。如果我当时停下来想 5 分钟,可能就去搜替代方案了,而不是继续修第 5 轮、第 6 轮。
5. 但也不算白干。
今天的 CDragon 解析器、audit 工具、token 解析的理解、Claude Code 的协作经验——这些留下来了。不是沉没成本,是技术积累。
结局
现在的方案:
- 腾讯 API 做主数据源(100% 覆盖,天然中文,零解析)
- CDragon 做 fallback(万一腾讯 API 挂了)
- LCU 补充运行时信息(当前等级、技能图标)
代码更少了,数据更准了,维护更轻松了。
有时候你花一整天解决的问题,答案是一个你根本没去搜的链接。
不是能力问题,是方向问题。