Files
climperor/CHANGELOG.md
T
voson a91789b72f v0.2.0: relations preview, item shop, abilities, overlay recommend, GSI enhancements
- Add relations/item/abilities preview (serve_relations.py + web/relations/)
- Add fetch scripts: hero_items, item_shop, items_meta, hero_abilities,
  ability_videos, patches, stratz, matchups, portraits
- Add overlay.py (role tags + Top-3 cyan marks), recommend.py
- Add http_utils.py, loc_format.py, hero_tags.py, item_fears.py
- GSI: full payload JSONL dump, foreground window detection
- Drop real template library; CDN-only matching
- Update docs: CHANGELOG 0.2.0, DESIGN config table, AGENTS module table
- .gitignore: exclude large regenerable assets (icons/portraits/videos)
2026-07-27 11:56:51 +08:00

225 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
本文件记录 **上分帝(Climperor** 的用户可见变更。格式参考 [Keep a Changelog](https://keepachangelog.com/)。
## [0.3.0] - 2026-07-27
### Added
- 关系预览「版本」页改为默认展示**最新版本**的完整改动详情(综合 / 物品 / 中立物品 /
英雄),顶部下拉可切换近一年内的其它版本;`fetch_patches.py` 重写为抓取近一年
(默认 365 天,`--days` / `--since` 可调)版本列表 + 逐版本 `patchnotes` 详情,
构建 `lookup`ability_id / hero_id → 名称 + 图标 key)并下载引用到的物品 / 技能
图标到 `assets/`,静态导出与本地预览均自包含、不联网。
- 版本页排版对齐官网:左大标题「游戏性更新 {版本}」+ 右选择框,内容居中窄列;
物品图标按 Steam CDN 88×64 比例(66×48)显示(修复正方形框上下黑边);英雄头像
复用英雄页 16:9 宽卡(`?v=wide``object-fit:contain`)不再裁切面部;图标放大
(物品 56、技能 48、头像 112,对齐技能页 68 / 商店 70)。
- 英雄详情区新增 **版本变更** 标签:列出该英雄近一年各版本的改动(版本号 + 日期 +
属性 chip + 各技能改动),内容居中、可滚动;与版本页共用技能块渲染逻辑。
- 版本日志先天技能图标修复:先天技能(如剑心犹在、狙击瞄准)CDN 404,现复用英雄
技能页 bundled `innate.png`(从 `hero_abilities.is_innate` 构建先天 key 集合判断),
覆盖 117 个被引用的先天技能。
- `hero_notes` 属性标签补全 `movement` → 「移速」(修复原始英文 `movement` 漏显示)。
- 新增 `export_relations_site.py`:一键导出关系预览为纯静态站点(`dist/relations/`),
内含 `data.json` 快照 + 前端 + 图片资源,可直接部署到任意静态托管;
`--with-videos` 可选拷贝技能演示视频(体积数 GB)。
- 关系预览前端资源路径改为相对路径(`data.json` / `attr/` / `portrait/` / `item/` 等),
静态托管在子路径下也能正常工作;`serve_relations.py` 同时提供 `/data.json` 路由,
本地预览行为不变。
- 关系预览技能详情:左侧播放官网技能演示视频(`assets/ability_videos/` 本地缓存,
`/ability-video/<英雄>/<技能>.webm` 路由),右侧为技能名与描述(对齐官网左右分栏);
未缓存的技能自动隐藏视频,描述列占满整行。
- 英雄详情的装备详情区不再重复显示大图(上方装备行已有图标)。
- 关系预览技能详情新增「施法前摇」「吟唱时间」两行(取自 Valve `cast_points` /
`channel_times`,逐级相同则合并为单值);`fetch_hero_abilities.py` 全量重抓后生效。
- 关系预览技能详情按 dota2.com.cn 版式重排:移除右上重复的技能大图标(上方技能列表
已高亮选中项);属性值(技能/伤害类型/免疫/驱散/施法距离等)双列网格、特殊数值
自适应多列网格(消除右列大片空白);冷却/蓝量移到带图标的底栏——冷却用官方
`cooldown.png`(新增 `assets/ui_icons/` + `/ui-icon/` 路由,静态导出一并拷贝),
蓝量沿用官方 CSS 渐变方块;`serve_relations.py` 字段投影补齐 `cast_point` /
`channel_time`
- 技能详情布局适配 `.detail` 定值高度链:视频改 `height:100%` + `object-fit:cover`
自适应填满可用高度(`align-self:stretch` 无法压过被替换元素的 16:9 固有高度,曾
导致视频下方留白 / 顶出滚轮),`main` 钉到列高、内容超高时仅在详情列内细滚,视频
不再被牵连出滚轮;压缩参数行距使典型技能在高屏零滚轮(无头 Chrome + CDP 实测
`scrollHeight == clientHeight` 验证)。整块宽度上限 1000→1320px、视频 700→820px、
详情列 720→760px。
### Fixed
- `fetch_hero_abilities.py``has_scepter`/`has_shard` 不再 `or bool(scepter_loc/shard_loc)`
Valve 移除某项升级后**仍保留**旧 `scepter_loc`/`shard_loc` 文案,但
`ability_has_scepter`/`ability_has_shard` 已变为 `False`;旧 fallback 把残留文案
当成「有升级」,导致本地数据与 dota2.com 不一致。改为只信显式 flag 并清空残留
文案,全量重抓后修正 **10 个过期 A 杖 + 20 个过期魔晶**(主宰/剑刃风暴、
影魔/支配死灵、幻影长矛/灵魂之矛、斯拉达/鱼人碎击、术士/暗言术、哈斯卡/沸血之矛、
殁境神蚀者/奥术天球、熊战士/灵魂链接、玛尔斯/护身甲盾、破晓辰星/熠熠生辉;
剃刀/静电连接、沙王/尾刺、暗影萨满/禽戏 等)。
- `fetch_ability_videos.py`A 杖/魔晶**赋予**的技能(`granted_by_scepter`/
`granted_by_shard`CDN 视频名是 `<hero>_aghanims_scepter`/`<hero>_aghanims_shard`
而非技能 key(如 `juggernaut_swift_slash``juggernaut_aghanims_scepter.webm`)。
之前脚本用技能 key 拼 URL 导致 **69 个赋予技能视频全部 404**。新增 `_cdn_name()`
映射,本地文件名仍用 ability key(前端 `app.js` 按 ability key 请求,无需改动)。
重抓后 69 个视频全部到位(迅风斩、水晶克隆、雷云 等)。
## [0.2.0] - 2026-07-27
### Changed
- 代码审查重构:提取 `http_utils.py` 公共模块,统一所有 fetch 脚本的 HTTP 请求、
UA、超时与图标下载逻辑;移除 `requests` 依赖(`requirements.txt`)。
- 合并 `fetch_stratz_matchups.py` + `fetch_synergies.py``fetch_stratz.py --mode matchups|synergies`
- `fetch_cdn_templates.py` / `fetch_hero_portraits.py` 改用 `http_utils`(不再依赖 `requests`)。
- `loc_format.py` 新增导出 `strip_html`,统一 HTML 清理逻辑(`fetch_hero_abilities.py` /
`fetch_items_meta.py` 原各有一份重复实现)。
- fetch 脚本 JSON 输出统一为 `indent=2`(原 `indent=1` / 紧凑 `separators` 混用)。
- `fetch_hero_abilities.py` 主循环改为每 10 个英雄写一次 JSON(原每英雄写一次,O(n²) I/O)。
- `fetch_hero_items.py` 循环内 `collect_used_ids` 改为增量更新(原全量重算)。
- `data/relations.json` meta 中本机路径 `C:\Users\...` 脱敏为 `dota2.xlsx`
### Fixed
- `fetch_items_meta.py`:删除 `strip_html` 死代码(未导入 `unescape`,若被调用会 `NameError`)。
- `audit_relations.py`:删除重复 `missing_cache` 死代码块;JSON 加载加 try/except 防文件损坏崩溃。
- `app.js``renderBoard``state.data` null 守卫(防 fetch pending 期间搜索触发崩溃)。
- `relations.py`:删除 `EXTRA_NAMES``"圣堂/TA"` 重复项(与 `"圣堂/ta"` 归一化后相同)
`"axe":"axe"` 等冗余自映射项。
- `hero_tags.py`:注释「幻想系」→「幻象系」(与代码 `TAG_ORDER` 一致)。
- `item_fears.py``enrich_override_items``not isinstance(row, dict)` 分支的 `cost` 死条件简化。
- `import_relations_xlsx.py``"a仗" in t.lower() or "A仗" in t` 冗余条件简化。
### Removed
- `web/relations/style.css`:删除未引用的 `.item-row` / `.item-phase` / `.item-phase-fear` 规则。
- `web/relations/app.js`:删除死回退函数 `onItemClick`、死类名(`hero-stats-left` /
`shop-group-*` / `shop-column-*`)、合并 `state.selectedSkillId``state.inspect`
### Added
- 关系预览英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复;
附攻击/护甲/移速/攻击距离)。数据来自 OpenDota(`fetch_cdn_templates.py`
`data/heroes.json`),主属性高亮。
- `fetch_ability_videos.py`:从 Steam CDN 批量拉取官网技能演示(webm/mp4),
默认限速约 1.5s+抖动,支持断点续传与 404 缓存;输出 `assets/ability_videos/`(不入库)。
- 装备说明填充 Valve `%token%` 数值(如飓风长戟「飓风之力」);
`fetch_items_meta.py --reformat-desc`,共用 `loc_format.py`
- 关系预览英雄详情底部分页:**技能** / **核心装备** / **被克装备**
- 关系预览新增顶级 **物品** 页(与英雄同级):对齐 dota2.com.cn 商店物品
**11 列竖排**(基础分类 / 合成分类),详情在右侧;目录来自官网
`itemscategory/json``fetch_item_shop.py``data/item_shop.json`),
并展示合成组件(含卷轴)与「可升级为」。
- 英雄页固定上方英雄网格高度;技能 / 核心装备 / 被克装备均可点击,
详情(含装备合成)展示在下方详情区(非弹窗)。
- 「害怕」装备规则完善:莲花 `spell_reflect`、点目标技能自动关联莲花/林肯;
`data/hero_fear_overrides.json` 补经典克制(如剑圣→莲花)。
- 关系预览技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述;
下方展示天赋树(25→10)。数据来自 Valve herodata`fetch_hero_abilities.py`)。
- 关系预览选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述);
数据来自 `data/hero_abilities.json`,图标按需缓存到 `assets/ability_icons/`
- 关系预览「怕的装备」:`fetch_items_meta.py`Valve/OpenDota 描述 → 机制标签)、
`fetch_hero_abilities.py`(技能驱散等汇总)、`item_fears.py`(规则映射)→
`data/items_meta.json` / `hero_abilities.json` / `hero_item_fears.json`
详情区在「核心」下增加「怕」行。例外标签见 `data/item_tag_overrides.json`
本阶段仅预览,无对局内出装推荐。
- 关系预览选中英雄后,下方展示中文定位 `tags` 与核心成品装备(不再分阶段);
`fetch_hero_items.py`OpenDota 热度合并 + Valve 中文名,Steam CDN 图标 →
`data/hero_items.json` / `assets/item_icons/`(过滤消耗品/中立/廉价件;
坚韧球/夜叉等中间件若该英雄常继续合成则隐藏,停在该件则保留)。
- GSI 全量落盘:默认把每包 POST 追加到 `samples/raw/<matchid>/gsi.jsonl`
`gsi.dump_payloads` / `--dump-gsi` / `--no-dump-gsi`)。
- 前台窗口检测:`gsi.require_foreground`(默认 true)。选将跟踪时若前台不是
`dota2.exe` 则跳过本帧截屏/识别,且不消耗 `strategy_tail_polls`;切回后继续。
- 选将角色标签悬浮层:`overlay.enabled`(默认 true)。跟踪过程中在顶栏已确认
英雄下方显示角色图标(Carry / Nuker / Initiator 等);点击穿透。
- `data/heroes.json` 增加 `roles` 字段(来自 dotaconstants);`fetch_cdn_templates.py` 同步拉取。
- `data/heroes.json` 增加中文口语别名 `aliases`(如斯拉达→大鱼人、主宰→剑圣);
`fetch_cdn_templates.py` 重拉时按 `key` 合并保留,不覆盖手工收录。
- `data/heroes.json` 增加英文缩写 `abbr`(小写列表,如 nec / vs / pa);
关系预览搜索支持缩写且不区分大小写;重拉模板时保留该字段。
- `fetch_stratz_matchups.py` + `audit_relations.py`:拉取 STRATZ 对位并与 OpenDota
交叉审计定性关系,输出 `data/relations_audit.json`
- 定性关系库 `data/relations.json`(克制有向边 + 搭档 + 理由);
`import_relations_xlsx.py` 可从选将笔记导入;`serve_relations.py` 三视图只读预览(改 JSON 后刷新)。
- `fetch_hero_portraits.py` 下载 dota2.com/heroes 竖版头像到 `assets/hero_portraits/`
供关系预览网格使用(与匹配用 `templates/cdn/` 分离)。
- 英雄中文定位标签 `tags`(核心/辅助/推进/逃生/爆发/先手/控制/耐久/幻象);
关系预览页可筛选,不参与推荐打分。
- 关系预览属性图标改用 dota2.com 官方素材(`assets/attr_icons/`),不再手绘。
- 选将 Top-3 推荐改为读定性关系:+克制敌方 / −被敌方克 / +己方搭档;
叠层左上角青方标显示名次 1/2/3。
- draft JSON / GSI `self` 透传 `accountid``steamid`
### Changed
- 关系预览英雄详情(`#detail`):贴视口底部展示(`margin-top: auto`,高度仍按内容收缩);
与上方英雄选择区保留约 16px 间距;标题 / 属性条 / 分页 / 技能与装备行 / 检视区整体水平居中(最大宽约 820px),长描述在居中容器内仍左对齐。物品页布局未改。
- 关系预览技能详情区不再重复放大技能图标;顶栏选中态即可识别,详情只保留名称 / 标签 / 驱散 / 描述(核心/怕装详情仍显示装备大图)。
- 关系预览先天技能统一使用共用金色水滴图标 `assets/ability_icons/innate.png`
(多数 innate 在 Steam `dota_react/abilities` 上 404),技能行与详情区不再破图占位。
- 关系预览英雄详情:技能图标与核心/怕装列表图标加大(技能 68px、装备 72×54),
便于点选;商店页 `.shop-item` 尺寸未改。
- 物品页详情面板改为与 11 列商店并排居中集群(`sticky`),贴在商店右侧约 16px
不再固定贴视口右缘;窄屏仍堆叠置顶。
- 物品页:`#items-view` 限制为视口内滚动容器,避免 `sticky` 详情随窗口滚动盖住商店列;
空状态去掉过大 `min-height`,面板高度随内容收缩。
- 关系预览天赋树改为官网弹层风格(居中「天赋树」、25→10 圆形等级徽标、左右选项行)。
- `heroes.json` 迁至 `data/heroes.json`;可再生成的对位/审计/报告文件改由 `.gitignore` 忽略。
- `assets/role_icons/` 改用 Valve 游戏内选人筛选图标(`filter_*`);灰蓝底板 + 深色
符号,透明角填品红 chroma,叠层不再出现黑边。
- 项目定名:**上分帝** / **Climperor**(目录 `climperor`),由 `dota2-draft-vision` 迁出独立仓库。
- **放弃 real 实拍模板库**:删除 `build_library.py``templates/real/`;匹配仅使用 CDN 层。
- 移除 `match.cdn_penalty``evaluate.py --cdn-only`(双层库对比已无意义)。
- 模板加载 API 简化为 `(hero_key, image)`
- GSI 会话截图按对局写入 `samples/raw/<matchid>/`
- 运行产物纳入 `.gitignore``preview/``results/``failures/``samples/raw/`
- 文档拆分为 `README`(操作)、`DESIGN`(决策)、`AGENTS`(协作)、`CHANGELOG`(变更)。
- `DESIGN.md` / `AGENTS.md` 补录原型会话结论:顶栏皮肤时机、决策禁改判原因、
real 库审计结论、无法靠 GSI 卡「皮肤前」单帧等。
- 本人顶栏槽位只使用 GSI `team_slot`;移除截屏名字亮度识别「自己是第几格」。
### Removed
- real 库补充流水线与相关验收指标。
- 仓库内历史 `preview/``results/` 调试产物。
- `roles._detect_self` 视觉认槽位备用路径。
### Fixed
- 关系预览英雄卡片 title 垃圾清理:`data/relations.json` 的 counters 被
`relations_patch_draft.json` 注入 100 条 reason 为 `opendota_adv/stratz_adv`
胜率数值的边(违反 `meta.note: no winrate` 与 AGENTS.md「不要用胜率/场次表达
机制克制」),拼进 hover title 显示为「opendota_adv=0.13; stratz_adv=4.47」
之类。删除这 100 条 numeric-reason 边(含水人 axe/hoodwink/windrunner →
morphling 三条),保留 5 条定性 + 149 条空 reason counters + 11 条
synergies(空 reason 经 `.filter(Boolean)` 不进 title)。
- 关系预览英雄页:`#detail` 不再 `flex: 1` 撑满网格下方剩余视口(短内容时大片黑底空白);
改为按内容收缩(`fit-content`),并用 `max-height` 限制长文案在面板内滚动。
- 关系预览技能行对齐官网:左起「天赋树图标 → 先天圆形图标 → 方形技能」;天赋详情改为
悬停/点击浮动弹层(不再内联占高);图标见 `assets/ability_icons/talent_tree.png`
- 关系预览天赋树数值修复:天赋 `name_loc``{s:bonus_<sv>}` token 原全部
显示为 `+?`/`-?``format_loc` 只读 `values_float``talent_rows` 只传天赋
自身空 `special_values`)。改为跨技能按 talent key 索引 `bonuses` + sv 名
/单 token 配对两层兜底填 `bonus.value`;重生成 `data/hero_abilities.json`
1016 条全部恢复。naga_siren「捕捞速度」上游缺 bonus,经
`data/talent_overrides.json` 手工补 `+125`
- 关系预览核心装备「阿哈利姆福佑」→「阿哈利姆神杖」:`ultimate_scepter_2`
(id 271) 是神杖 (id 108) 的激活形态,OpenDota 分开计数导致 37 个英雄
核心装备列表出现「福佑」甚至神杖+福佑并存。`fetch_hero_items.py` 新增
`fold_blessing_into_scepter` 把 blessing 计数按 max 合并入 scepter
重生成 `data/hero_items.json` 统一显示「阿哈利姆神杖」。
- (继承自原型)CDN 头像按顶栏窗口裁切,而非中心正方形;CDN-only 即可高准确率。
- (继承自原型)天梯段位条 / 勋章遮罩匹配;选人多帧 + 决策禁改判规避皮肤;
best 帧优先选人阶段;本人英雄以 GSI 覆盖。
## [0.1.0] - 2026-07-25
### Added
- 决策时间顶栏 10 格模板匹配识别。
- 相对坐标 ROI、自动标定(玩家颜色条)。
- Steam CDN 全英雄模板拉取(`fetch_cdn_templates.py`)。
- GSI 触发的选将会话跟踪(`gsi_watch.py` / `draft_session.py`)。
- 位置文字、禁用网格、模式字辅助识别。
- 天梯 UI 遮罩与会话层皮肤策略。