Ship OpenDota counter-stats reordering for feared items, finalize SITE_VERSION/docs for rankings/streamers/trends/matches/mechanics and draft archetypes, and ignore regenerable Web data caches. Co-authored-by: Cursor <cursoragent@cursor.com>
540 lines
30 KiB
Markdown
540 lines
30 KiB
Markdown
# Changelog
|
||
|
||
本文件记录 **上分帝(Climperor)** 的用户可见变更。格式参考 [Keep a Changelog](https://keepachangelog.com/)。
|
||
|
||
## [Unreleased]
|
||
|
||
## [0.5.59] - 2026-07-29
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「被克装备」观测证据:`fetch_item_counter_stats.py`(OpenDota Explorer
|
||
对阵购买率/条件胜率减同装备全局队伍基线)→ `data/item_counter_stats.json`;
|
||
`item_fears.py` 对全部英雄已有机制候选小幅调序;显著新组合须机制复核后写入 overrides。
|
||
- 上分帝 Web 日活飞书推送:`notify_site_traffic.py` + Gitea Actions
|
||
`site-traffic-notify`(每日 09:00 CST;真实访问按已知浏览器 UA 打开 `/` 估算;
|
||
卡片含自动刷新:`web-daily`/`weekly`/`patch` 结论 + 当日 Pages 生产部署)。
|
||
- 上分帝 Web 顶层「走势」`#/trends[/bracket]`:近 8 周高胜率/上场率榜(初期 / 迷你走势 / 末期 / 变化;STRATZ;无禁用率)。
|
||
- 上分帝 Web 接入 STRATZ(`fetch_stratz_meta.py`,token 经 `.env` / keyzoo):
|
||
- 英雄详情「走势」优先 STRATZ:勋章条 + **最近 1 周**三卡 + 分路 + **近 8 周**逐周列表(OpenDota 作兜底)
|
||
- 新子 Tab「对位」`#/heroes/<key>/matchups`:克制 / 被克 / 搭档三列 STRATZ Top(与网格机制「克/怕/搭」分开展示)
|
||
- 缓存:`data/stratz_hero_meta.json` / `data/stratz_matchup_tops.json`(gitignore;仅 Web,不进 recommend / relations)
|
||
- 上分帝 Web「近期比赛」Tab(`#/heroes/<key>/matches`):同英雄近期局终局出装 +
|
||
加点顺序;展示选手昵称/段位勋章与外链;
|
||
`fetch_hero_matches.py` → `data/hero_matches.json`
|
||
(`--source league|public|both`;`--workers`;`--enrich-item-times`;仅 Web,不进局内推荐)。
|
||
- 选将规则阵容画像(不接 AI):识别敌方推进/全球流、敌我缺口(缺控制/爆发/输出/先手);
|
||
全网格标 **克 / 搭 / 补**;叠加层显示一句阵容分析;每英雄短推荐原因写入日志与
|
||
`results` JSON(`draft_archetypes.py` + `recommend.suggest_marks`)。
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web「被克装备」卡片有对阵证据时显示购买率角标;显著新组合补入 overrides
|
||
(帕克紫怨、幻影刺客/编织者/石鳞剑士鬼杖、编织者 Eul、石鳞剑士/虚无之灵羊刀);
|
||
剑圣移除林肯法球并补入幽魂权杖。
|
||
- 上分帝 Web 英雄详情「走势」:三卡 / 分路统一 **当前选中勋章 · 最近 1 周**;
|
||
布局为勋章条 → 提示 → 三卡 → 分路 → 近 8 周列表。
|
||
- 文档与注释统一称呼:`web/relations/` 子项目改称 **上分帝 Web**(不再称「关系预览」);路径与脚本名(如 `serve_relations.py`)暂保持不变。
|
||
- 「近期比赛」公开对局默认优先国服;展示最近 10 场胜局;外链改 Dotabuff。
|
||
- 选将推荐不再限 Top-3 名次青标;非定位局也可推克/搭/补(无分路字则不过滤)。
|
||
|
||
## [0.5.58] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「主播」新增 B 站沙王主播,收录主页、直播间、关注与粉丝数。
|
||
|
||
### Changed
|
||
|
||
- 主播卡片元信息按平台显示:抖音显示获赞/粉丝,B 站显示 UID/关注/粉丝。
|
||
|
||
## [0.5.57] - 2026-07-28
|
||
|
||
### Fixed
|
||
|
||
- 上分帝 Web「主播」竖屏精选视频黑边:不再依赖 canvas 扫边;竖屏统一用内容框 +
|
||
`object-fit: cover`,按上下黑边比例设 `object-position`;亚瑟归来 / 大地瓜写入
|
||
`video_aspect`(横屏仍 `contain`)。
|
||
|
||
## [0.5.56] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web「主播」精选视频:滚动自动播放默认静音;不再因页面任意点击/按键全局开声,需在各视频原生控件中主动取消静音。
|
||
|
||
## [0.5.55] - 2026-07-28
|
||
|
||
### Fixed
|
||
|
||
- 上分帝 Web「主播」竖屏精选视频黑边:修正 `object-position` 方向;`preload=auto` +
|
||
首帧检测失败时对竖屏启用 16:9 启发式裁切(canvas / OSS CORS 不可用时仍生效)。
|
||
|
||
## [0.5.54] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web 英雄详情「主播」子 Tab:卡片宽度与顶层 `#/streamers` 一致(`880px` 居中),竖屏/横屏精选视频比例不变。
|
||
|
||
## [0.5.53] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web「主播」精选视频:竖屏且文件内嵌上下黑边时,首帧自动检测内容区并裁切显示;
|
||
横屏视频仍为 `contain`。可选 `video_fit` / `video_crop` / `video_aspect` 手工覆盖。
|
||
|
||
## [0.5.52] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「主播」页卡片精选高光视频:手工 `video`/`video_title` +
|
||
`assets/streamer_videos/`(本地 `/streamer-video/`,OSS `streamer-video/`);
|
||
滚入视口中部自动播放(原生 controls;多卡时播最靠近中心者);10 人收录。
|
||
- 直播态头像:抖音式粉红外圈脉冲 + 头像呼吸动画;有 `live_url`(或将来
|
||
`is_live`)时点击头像进直播间;角标「直播」。
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web「主播」卡片改版:抖音式资料区(昵称行 + 全宽元信息/签名)、
|
||
约 880px 宽、元信息竖线分隔、放大英雄标签;右侧仅「关注」;不显示视频标题。
|
||
|
||
## [0.5.51] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web 英雄详情:定位标签从标题下方移到「技能」Tab 中间列顶部(技能图标上方)。
|
||
|
||
## [0.5.50] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web 顶层「主播」`#/streamers` + 英雄详情「主播」子 Tab:手工维护直播间/主页与常用英雄,
|
||
`fetch_streamers.py` 从抖音主页补全昵称/签名/关注粉丝获赞/头像;首版仅抖音;
|
||
`data/streamers.json`;仅 Web,不进 recommend;进 `refresh_web` daily 软失败刷新。
|
||
|
||
## [0.5.29] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web:STRATZ 走势 / 对位 Tab(见 Unreleased 明细;站点版本 `0.5.29`)。
|
||
|
||
## [0.5.28] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 「近期比赛」出装图标叠加购买时间(MM:SS,支持负值);数据来自 OpenDota
|
||
`purchase_log`(未解析对局无时间)。中立装用 `neutral_item_history`。
|
||
- `fetch_hero_matches.py --enrich-item-times`:只补时间字段,无需全量重拉列表。
|
||
|
||
### Changed
|
||
|
||
- 「近期比赛」出装布局对齐 OpenDota:主栏一行、背包第二行(背包轮廓图标),去掉竖分隔线。
|
||
|
||
## [0.5.27] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 「近期比赛」卡片头:昵称旁不再显示段位文字(如「冠绝」);保留勋章图标,排行榜 # 放进勋章 tooltip。
|
||
|
||
## [0.5.19] - 2026-07-28
|
||
|
||
### Fixed
|
||
|
||
- 排行页标题「Immortal 排行榜」与 info 图标保持同一行不换行。
|
||
|
||
## [0.5.18] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页「Immortal 排行榜」标题旁增加与走势页一致的 info 气泡提示(官方 Immortal 地区榜 · 各区分数不可比)。
|
||
|
||
## [0.5.13] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行榜按视口居中(不含右侧说明);说明绝对定位贴在榜单右侧。
|
||
|
||
## [0.5.12] - 2026-07-28
|
||
|
||
### Fixed
|
||
|
||
- 排行表分割线错位(去掉选手列 flex)。
|
||
|
||
## [0.5.11] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页右侧说明贴紧榜单(与榜单成组居中),不再贴屏幕右缘。
|
||
|
||
## [0.5.10] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页国籍列显示中文国名(未知代码仍回退为原代码)。
|
||
|
||
## [0.5.9] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页战队 / 国籍无数据时留空,不再显示「—」。
|
||
|
||
## [0.5.8] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页:榜单单独居中,右侧说明贴屏幕右缘(不再与榜单成组居中)。
|
||
|
||
## [0.5.7] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页新增「战队」列(原选手行内战队标签拆出)。
|
||
|
||
## [0.5.6] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页新增「国籍」列(原选手行内国旗代码拆出)。
|
||
|
||
## [0.5.5] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页去掉官方榜说明文案。
|
||
|
||
## [0.5.4] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页副标题去掉地区名与「Top 100」,仅保留更新时间。
|
||
|
||
## [0.5.3] - 2026-07-28
|
||
|
||
### Changed
|
||
|
||
- 排行页:榜单居中,标题 / 地区切换 / 说明贴在右侧。
|
||
|
||
## [0.5.1] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「排行」页(`#/rankings`,插在英雄之后):Valve Immortal 四区榜
|
||
Top 100(中国 / 欧洲 / 美洲 / 东南亚);`fetch_leaderboards.py` →
|
||
`data/leaderboards.json`(仅排名+昵称等,无 MMR/账号 ID)。
|
||
|
||
## [0.5.0] - 2026-07-28
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「走势」Tab(`#/heroes/<key>/trends`):OpenDota 近约 7 天各段位
|
||
胜率 / 上场率 / 场次;顶部勋章条(先锋→冠绝)切换段位。
|
||
- `fetch_hero_stats.py` → `data/hero_stats.json`(含 `totals` / `window_*`);
|
||
仅 Web 站点,不进 `relations.json` / 局内推荐。
|
||
- 核心装备图标显示列表内相对使用率 %(OpenDota popularity 归一化)。
|
||
- 冠绝勋章旁说明:样本过小则与超凡合并展示。
|
||
|
||
### Changed
|
||
|
||
- 走势布局居中:勋章条 + 三卡,无段位列表 / 被禁率;勋章约 90px。
|
||
- 静态资源增加 `/rank/` 与 `assets/rank_icons/rank_icon_1..8.png`。
|
||
|
||
## [0.4.2] - 2026-07-27
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web静态图标(头像 / 装备 / 技能 / 属性等)改由阿里云 OSS 同桶托管;
|
||
`config.js` 新增 `STATIC_ASSET_BASE`,生产 Pages 包体约 **2 MB**(仅
|
||
HTML/JS/data),换机部署无需本地 fetch 图标。同步脚本
|
||
`_oss_static_assets.py upload`。
|
||
|
||
### Added
|
||
|
||
- 新增 `_oss_static_assets.py`:将 portrait/item/ability 等图标同步到 OSS。
|
||
|
||
## [0.4.1] - 2026-07-27
|
||
|
||
### Changed
|
||
|
||
- 线上上分帝 Web技能演示视频改由阿里云 OSS 托管(桶 `climperor`,
|
||
`https://climperor.oss-cn-shanghai.aliyuncs.com/ability-video/...`),不再打进
|
||
Cloudflare Pages;本地 `serve_relations.py` 仍读 `assets/ability_videos/`。
|
||
导出写入 `config.js` 的 `ABILITY_VIDEO_BASE`(`export_relations_site.py
|
||
--ability-video-base` / `deploy_relations.py` 默认 OSS 地址)。
|
||
|
||
### Added
|
||
|
||
- 版本页底部居中显示站点版本号(`config.js` 的 `SITE_VERSION`,如 `v0.4.1`)。
|
||
|
||
### Fixed
|
||
|
||
- 版本页熊灵(spirit bear)头像:静态导出包含 `portrait/spirit_bear.png`。
|
||
|
||
## [0.4.0] - 2026-07-27
|
||
|
||
### Added
|
||
|
||
- 新增 `deploy_relations.py`:一键把上分帝 Web静态站点部署到 Cloudflare Pages
|
||
—— 串联导出(`export_relations_site.py`)→ 资产完整性预检(缺图则中止)
|
||
→ `wrangler pages deploy` 直传 `dist/relations/` → 绑定自定义域名。凭据
|
||
经 keyzoo 注入(`refining/cloudflare` 的 Global API Key)或手动
|
||
`CLOUDFLARE_EMAIL` / `CLOUDFLARE_API_KEY` 环境变量;默认项目
|
||
`climperor-relations`、域名 `dota2.refining.dev`,均可参数覆盖。
|
||
- 新增 `_cf_status.py`:只读查询 Cloudflare Pages 项目 / 部署 / 自定义域名
|
||
状态(凭据经 keyzoo 注入),部署后核对用;另有一次性辅助脚本
|
||
`_cf_domain.py`(探测域名/ DNS 记录)与 `_cf_add_cname.py`(补建缺失的
|
||
CNAME,幂等)。
|
||
- 物品页搜索框进 URL:`#/items?q=...`,刷新保状态、可分享;英雄页与物品页
|
||
搜索各用独立 debounce 计时器,互不干扰。
|
||
- 版本页支持非英雄单位:Valve patchnotes `heroes[]` 中的熊灵(id 1961)等
|
||
伪英雄 id 现解析为中文名 + 本地头像(`fetch_patches.py` 的 `UNIT_NAMES`,
|
||
静态导出一并拷贝头像)。
|
||
|
||
### Fixed
|
||
|
||
- 修复 `serializeHash` 生成 `#heroes`(缺 `/`)导致刷新后路由解析异常的
|
||
问题,现统一为 `#/heroes` 形态。
|
||
- 版本日志中未知单位 id 不再显示 `# 1961` 原始数字,回退为「其它单位」。
|
||
- 本地开发服务 `serve_relations.py` 增加 CSP 响应头(`default-src 'self'` 等),
|
||
限制资源只从本站加载。
|
||
- `data.json` 加载失败时显式抛出 HTTP 状态错误,不再静默进入异常渲染。
|
||
|
||
### Performance
|
||
|
||
- 上分帝 Web缓存英雄技能条目(`skillEntriesFor`)与血蓝条量程
|
||
(`resourceBarScale`)计算结果,数据重载时失效,减少重复遍历。
|
||
|
||
## [0.3.0] - 2026-07-27
|
||
|
||
### Added
|
||
|
||
- 上分帝 Web「版本」页改为默认展示**最新版本**的完整改动详情(综合 / 物品 / 中立物品 /
|
||
英雄),顶部下拉可切换近一年内的其它版本;`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`:一键导出上分帝 Web为纯静态站点(`dist/relations/`),
|
||
内含 `data.json` 快照 + 前端 + 图片资源,可直接部署到任意静态托管;
|
||
`--with-videos` 可选拷贝技能演示视频(体积数 GB)。
|
||
- 上分帝 Web前端资源路径改为相对路径(`data.json` / `attr/` / `portrait/` / `item/` 等),
|
||
静态托管在子路径下也能正常工作;`serve_relations.py` 同时提供 `/data.json` 路由,
|
||
本地开发服务行为不变。
|
||
- 上分帝 Web技能详情:左侧播放官网技能演示视频(`assets/ability_videos/` 本地缓存,
|
||
`/ability-video/<英雄>/<技能>.webm` 路由),右侧为技能名与描述(对齐官网左右分栏);
|
||
未缓存的技能自动隐藏视频,描述列占满整行。
|
||
- 英雄详情的装备详情区不再重复显示大图(上方装备行已有图标)。
|
||
- 上分帝 Web技能详情新增「施法前摇」「吟唱时间」两行(取自 Valve `cast_points` /
|
||
`channel_times`,逐级相同则合并为单值);`fetch_hero_abilities.py` 全量重抓后生效。
|
||
- 上分帝 Web技能详情按 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。
|
||
- 上分帝 Web顶栏左上角新增 Dota 2 logo +「上分帝」标题(`assets/ui_icons/dota2_logo.png`
|
||
透明 emblem),经 `/ui-icon/` 路由与静态导出统一分发;窄屏自动隐藏标题或整组标识,
|
||
不影响居中分页布局。
|
||
- 上分帝 Web新增 **Hash 路由**:顶层标签(英雄 / 物品 / 版本)、选中英雄 + 详情子标签
|
||
(技能 / 核心装备 / 被克装备 / 版本变更)、物品页选中物品、版本页选中版本均同步进
|
||
URL;英雄页的定位标签筛选与搜索框文本以 query 参数(`?tags=核心,辅助&q=axe`)进
|
||
URL。形态如 `#/heroes/axe/core`、`#/items/black_king_bar`、`#/patches/7.41`
|
||
(`#/patches` = 最新版,序列化时省略与最新同名的版本号)。刷新保状态、可分享 /
|
||
深度链接、浏览器前进后退还原;搜索框 300ms debounce + `replaceState`(不刷历史栈),
|
||
标签筛选用 `replaceState`,其余离散选择用 `pushState`。坏链接(未知英雄 / 物品 /
|
||
版本)优雅降级为丢弃该项。新增 `web/relations/router.js`(`parseHash` /
|
||
`serializeHash` / `installRouter`),`app.js` 在 `main()` 装载并首屏 `applyUrlToState`;
|
||
`export_relations_site.py` 静态导出列表补入 `router.js`,静态站点深度链接同样可用
|
||
(可部署 GitHub Pages,无需 rewrite)。Hash 路由不命中后端路径,`serve_relations.py`
|
||
零改动。
|
||
|
||
### 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
|
||
|
||
- 上分帝 Web英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复;
|
||
附攻击/护甲/移速/攻击距离)。数据来自 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`。
|
||
- 上分帝 Web英雄详情底部分页:**技能** / **核心装备** / **被克装备**。
|
||
- 上分帝 Web新增顶级 **物品** 页(与英雄同级):对齐 dota2.com.cn 商店物品
|
||
**11 列竖排**(基础分类 / 合成分类),详情在右侧;目录来自官网
|
||
`itemscategory/json`(`fetch_item_shop.py` → `data/item_shop.json`),
|
||
并展示合成组件(含卷轴)与「可升级为」。
|
||
- 英雄页固定上方英雄网格高度;技能 / 核心装备 / 被克装备均可点击,
|
||
详情(含装备合成)展示在下方详情区(非弹窗)。
|
||
- 「害怕」装备规则完善:莲花 `spell_reflect`、点目标技能自动关联莲花/林肯;
|
||
`data/hero_fear_overrides.json` 补经典克制(如剑圣→莲花)。
|
||
- 上分帝 Web技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述;
|
||
下方展示天赋树(25→10)。数据来自 Valve herodata(`fetch_hero_abilities.py`)。
|
||
- 上分帝 Web选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述);
|
||
数据来自 `data/hero_abilities.json`,图标按需缓存到 `assets/ability_icons/`。
|
||
- 上分帝 Web「怕的装备」:`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`。
|
||
本阶段仅 Web 站点,无对局内出装推荐。
|
||
- 上分帝 Web选中英雄后,下方展示中文定位 `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);
|
||
上分帝 Web搜索支持缩写且不区分大小写;重拉模板时保留该字段。
|
||
- `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/`,
|
||
供上分帝 Web网格使用(与匹配用 `templates/cdn/` 分离)。
|
||
- 英雄中文定位标签 `tags`(核心/辅助/推进/逃生/爆发/先手/控制/耐久/幻象);
|
||
上分帝 Web 页可筛选,不参与推荐打分。
|
||
- 上分帝 Web属性图标改用 dota2.com 官方素材(`assets/attr_icons/`),不再手绘。
|
||
- 选将 Top-3 推荐改为读定性关系:+克制敌方 / −被敌方克 / +己方搭档;
|
||
叠层左上角青方标显示名次 1/2/3。
|
||
- draft JSON / GSI `self` 透传 `accountid`、`steamid`。
|
||
|
||
### Changed
|
||
|
||
- 上分帝 Web英雄详情(`#detail`):贴视口底部展示(`margin-top: auto`,高度仍按内容收缩);
|
||
与上方英雄选择区保留约 16px 间距;标题 / 属性条 / 分页 / 技能与装备行 / 检视区整体水平居中(最大宽约 820px),长描述在居中容器内仍左对齐。物品页布局未改。
|
||
- 上分帝 Web技能详情区不再重复放大技能图标;顶栏选中态即可识别,详情只保留名称 / 标签 / 驱散 / 描述(核心/怕装详情仍显示装备大图)。
|
||
- 上分帝 Web先天技能统一使用共用金色水滴图标 `assets/ability_icons/innate.png`
|
||
(多数 innate 在 Steam `dota_react/abilities` 上 404),技能行与详情区不再破图占位。
|
||
- 上分帝 Web英雄详情:技能图标与核心/怕装列表图标加大(技能 68px、装备 72×54),
|
||
便于点选;商店页 `.shop-item` 尺寸未改。
|
||
- 物品页详情面板改为与 11 列商店并排居中集群(`sticky`),贴在商店右侧约 16px,
|
||
不再固定贴视口右缘;窄屏仍堆叠置顶。
|
||
- 物品页:`#items-view` 限制为视口内滚动容器,避免 `sticky` 详情随窗口滚动盖住商店列;
|
||
空状态去掉过大 `min-height`,面板高度随内容收缩。
|
||
- 上分帝 Web天赋树改为官网弹层风格(居中「天赋树」、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
|
||
|
||
- 上分帝 Web英雄卡片 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)。
|
||
- 上分帝 Web英雄页:`#detail` 不再 `flex: 1` 撑满网格下方剩余视口(短内容时大片黑底空白);
|
||
改为按内容收缩(`fit-content`),并用 `max-height` 限制长文案在面板内滚动。
|
||
- 上分帝 Web技能行对齐官网:左起「天赋树图标 → 先天圆形图标 → 方形技能」;天赋详情改为
|
||
悬停/点击浮动弹层(不再内联占高);图标见 `assets/ability_icons/talent_tree.png`。
|
||
- 上分帝 Web天赋树数值修复:天赋 `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`。
|
||
- 上分帝 Web核心装备「阿哈利姆福佑」→「阿哈利姆神杖」:`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 遮罩与会话层皮肤策略。
|