Files
climperor/CHANGELOG.md
T

20 KiB
Raw Blame History

Changelog

本文件记录 上分帝(Climperor 的用户可见变更。格式参考 Keep a Changelog

[Unreleased]

[0.4.0] - 2026-07-27

Added

  • 新增 deploy_relations.py:一键把关系预览静态站点部署到 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.pyUNIT_NAMES 静态导出一并拷贝头像)。

Fixed

  • 修复 serializeHash 生成 #heroes(缺 /)导致刷新后路由解析异常的 问题,现统一为 #/heroes 形态。
  • 版本日志中未知单位 id 不再显示 # 1961 原始数字,回退为「其它单位」。
  • 本地预览 serve_relations.py 增加 CSP 响应头(default-src 'self' 等), 限制资源只从本站加载。
  • data.json 加载失败时显式抛出 HTTP 状态错误,不再静默进入异常渲染。

Performance

  • 关系预览缓存英雄技能条目(skillEntriesFor)与血蓝条量程 resourceBarScale)计算结果,数据重载时失效,减少重复遍历。

[0.3.0] - 2026-07-27

Added

  • 关系预览「版本」页改为默认展示最新版本的完整改动详情(综合 / 物品 / 中立物品 / 英雄),顶部下拉可切换近一年内的其它版本;fetch_patches.py 重写为抓取近一年 (默认 365 天,--days / --since 可调)版本列表 + 逐版本 patchnotes 详情, 构建 lookupability_id / hero_id → 名称 + 图标 key)并下载引用到的物品 / 技能 图标到 assets/,静态导出与本地预览均自包含、不联网。
  • 版本页排版对齐官网:左大标题「游戏性更新 {版本}」+ 右选择框,内容居中窄列; 物品图标按 Steam CDN 88×64 比例(66×48)显示(修复正方形框上下黑边);英雄头像 复用英雄页 16:9 宽卡(?v=wideobject-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。
  • 关系预览顶栏左上角新增 Dota 2 logo +「上分帝」标题(assets/ui_icons/dota2_logo.png 透明 emblem),经 /ui-icon/ 路由与静态导出统一分发;窄屏自动隐藏标题或整组标识, 不影响居中分页布局。
  • 关系预览新增 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.jsparseHash / serializeHash / installRouter),app.jsmain() 装载并首屏 applyUrlToState export_relations_site.py 静态导出列表补入 router.js,静态站点深度链接同样可用 (可部署 GitHub Pages,无需 rewrite)。Hash 路由不命中后端路径,serve_relations.py 零改动。

Fixed

  • fetch_hero_abilities.pyhas_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.pyA 杖/魔晶赋予的技能(granted_by_scepter/ granted_by_shardCDN 视频名是 <hero>_aghanims_scepter/<hero>_aghanims_shard 而非技能 key(如 juggernaut_swift_slashjuggernaut_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.pyfetch_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.jsrenderBoardstate.data null 守卫(防 fetch pending 期间搜索触发崩溃)。
  • relations.py:删除 EXTRA_NAMES"圣堂/TA" 重复项(与 "圣堂/ta" 归一化后相同) 及 "axe":"axe" 等冗余自映射项。
  • hero_tags.py:注释「幻想系」→「幻象系」(与代码 TAG_ORDER 一致)。
  • item_fears.pyenrich_override_itemsnot 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.selectedSkillIdstate.inspect

Added

  • 关系预览英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复; 附攻击/护甲/移速/攻击距离)。数据来自 OpenDota(fetch_cdn_templates.pydata/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/jsonfetch_item_shop.pydata/item_shop.json), 并展示合成组件(含卷轴)与「可升级为」。
  • 英雄页固定上方英雄网格高度;技能 / 核心装备 / 被克装备均可点击, 详情(含装备合成)展示在下方详情区(非弹窗)。
  • 「害怕」装备规则完善:莲花 spell_reflect、点目标技能自动关联莲花/林肯; data/hero_fear_overrides.json 补经典克制(如剑圣→莲花)。
  • 关系预览技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述; 下方展示天赋树(25→10)。数据来自 Valve herodatafetch_hero_abilities.py)。
  • 关系预览选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述); 数据来自 data/hero_abilities.json,图标按需缓存到 assets/ability_icons/
  • 关系预览「怕的装备」:fetch_items_meta.pyValve/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.pyOpenDota 热度合并 + 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 透传 accountidsteamid

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.pytemplates/real/;匹配仅使用 CDN 层。
  • 移除 match.cdn_penaltyevaluate.py --cdn-only(双层库对比已无意义)。
  • 模板加载 API 简化为 (hero_key, image)
  • GSI 会话截图按对局写入 samples/raw/<matchid>/
  • 运行产物纳入 .gitignorepreview/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_floattalent_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 遮罩与会话层皮肤策略。