- 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)
112 lines
5.8 KiB
Markdown
112 lines
5.8 KiB
Markdown
# 上分帝(Climperor)
|
||
|
||
Dota 2 **天梯选将识别**:从选人 / 决策时间截图中识别双方 10 个英雄。
|
||
|
||
本地、离线、秒级;模板来自 Steam CDN 官方头像。GSI 只负责触发时机,阵容靠视觉读顶栏。
|
||
|
||
设计背景见 [DESIGN.md](DESIGN.md);协作约定见 [AGENTS.md](AGENTS.md);变更记录见 [CHANGELOG.md](CHANGELOG.md)。
|
||
|
||
## 原理
|
||
|
||
```
|
||
决策时间截图(PNG)
|
||
→ 按相对坐标裁出 10 个头像格(分辨率无关)
|
||
→ 缩放到统一尺寸;天梯局自动屏蔽段位条/勋章遮挡区
|
||
→ 与 CDN 模板做归一化相关匹配(TM_CCOEFF_NORMED)
|
||
→ Top-1 分数 + Top1−Top2 分差双阈值 → hero_key 或 null
|
||
```
|
||
|
||
皮肤差异靠会话策略处理(选人阶段多帧确认,决策阶段禁止改判),不堆皮肤模板。
|
||
|
||
## 安装
|
||
|
||
```powershell
|
||
pip install -r requirements.txt
|
||
python fetch_cdn_templates.py # 一次性:data/heroes.json(含基础属性/血蓝)+ templates/cdn/
|
||
# 可选:从选将笔记 xlsx 导入定性克制/搭档
|
||
# python import_relations_xlsx.py path\to\dota2.xlsx
|
||
```
|
||
|
||
## 克制 / 被克制 / 搭档(游戏外)
|
||
|
||
```powershell
|
||
python fetch_hero_portraits.py # 官网竖版头像 → assets/hero_portraits/
|
||
python fetch_hero_items.py # OpenDota 热度 + Valve 中文名 + Steam 图标 → data/hero_items.json
|
||
python fetch_item_shop.py # 官网商店 11 列目录 → data/item_shop.json
|
||
python fetch_items_meta.py # 装备描述 + 机制标签 → data/items_meta.json
|
||
python fetch_hero_abilities.py # 英雄技能 / 驱散汇总 → data/hero_abilities.json
|
||
python fetch_ability_videos.py # 官网技能演示 webm(限速)→ assets/ability_videos/
|
||
python item_fears.py # 规则推导「怕的装备」→ data/hero_item_fears.json
|
||
python fetch_patches.py # 近一年版本日志 + 详情 → data/patches.json(版本页)
|
||
python serve_relations.py # 只读预览 http://127.0.0.1:8765(改 JSON 后刷新)
|
||
```
|
||
|
||
仿局内选将四列网格(图标来自 [dota2.com/heroes](https://www.dota2.com/heroes) 竖版裁切):点英雄高亮克制 / 被克制 / 搭档,下方显示定位,并以标签页切换 **技能**(可点选魔晶/神杖升级与天赋树)、**核心装备**、**被克装备**、**版本变更**(该英雄近一年各版本改动)。
|
||
英雄页上方网格固定高度;点选技能 / 核心装备 / 被克装备后,详情显示在下方(装备含合成,非弹窗)。
|
||
|
||
顶部另有 **物品** 页:对齐 [官网商店物品](https://www.dota2.com.cn/items/index.htm) 的 **11 列竖排**(基础分类 5 列 + 合成分类 6 列),点选后详情显示在右侧(含合成组件)。目录来自 `data/item_shop.json`(`python fetch_item_shop.py`)。
|
||
顶部另有 **版本** 页:默认展示最新版本完整改动(综合 / 物品 / 中立物品 / 英雄),下拉切换近一年其它版本;数据来自 `data/patches.json`(`python fetch_patches.py`,近一年窗口可用 `--days` / `--since` 调)。
|
||
数据在 `data/relations.json`(英雄关系,不用胜率);选将 Top-3 推荐读同一份文件。热门装备来自 OpenDota 统计;被克装备由描述标签 + 规则推导(可改 `data/item_tag_overrides.json` 后重跑 `fetch_items_meta.py` 与 `item_fears.py`)。**尚无对局内出装推荐**。
|
||
|
||
## 快速开始(GSI 自动跟踪)
|
||
|
||
```powershell
|
||
python gsi_setup.py # 写入 Dota GSI 配置
|
||
# Steam → Dota 2 → 属性 → 启动项加上 -gamestateintegration,重启游戏
|
||
python gsi_watch.py
|
||
```
|
||
|
||
进入英雄选择后自动跟踪;定位匹配下会按本局分路 + 敌方/己方关系在英雄网格左上角标出 **Top 3** 青色名次方标(需 `data/relations.json`)。凑齐 10 人或超时后写出 `results/draft_<时间戳>.json`(该目录已 gitignore)。
|
||
会话截图按对局落在 `samples/raw/<matchid>/`;默认同时把每包 GSI JSON 追加到同目录 `gsi.jsonl`(`--no-dump-gsi` 可关)。
|
||
|
||
> 主菜单收不到 GSI 是正常的:客户端**第一次载入对局后**才开始推送。看到 `[gsi] connected` 才算链路通。
|
||
|
||
## 手动流程
|
||
|
||
### 截图
|
||
|
||
```powershell
|
||
python capture.py # 单张 → samples/raw/
|
||
python capture.py --loop 300 3 # 每 3 秒一张,持续 300 秒
|
||
```
|
||
|
||
GSI 跟踪时自动写入 `samples/raw/<matchid>/draft_*.png`(含 milestone / best)。
|
||
需无边框窗口或窗口模式(独占全屏可能黑帧)。
|
||
|
||
### 标定 ROI(一次性)
|
||
|
||
```powershell
|
||
python autocalibrate.py samples/raw/<matchid>/<某帧>.png
|
||
# 失败时退路:python calibrate.py samples/raw/<matchid>/<某帧>.png
|
||
```
|
||
|
||
### 识别 / 评测
|
||
|
||
```powershell
|
||
python recognize.py samples/raw/<matchid>/<帧>.png
|
||
python recognize.py samples/raw/<matchid>/<帧>.png --sheet
|
||
python recognize.py samples/raw/<matchid>/<帧>.png --truth hero1,...,hero10
|
||
python evaluate.py # 按 samples/labels.json 批量评测
|
||
```
|
||
|
||
辅助脚本:`roles.py`(位置字)、`grid.py`(禁用名单)、`modes.py`(模式字)。
|
||
|
||
## 截图要求
|
||
|
||
- PNG、原始分辨率(勿经聊天工具压缩)
|
||
- 顶栏 10 个英雄完整可见
|
||
- 优先选人阶段默认脸帧(全员选完后顶栏才会换皮肤;GSI 无「皮肤已加载」信号)
|
||
|
||
## 已知限制
|
||
|
||
- 宽高比差异大(如 21:9)时可能需重标定
|
||
- 客户端改网格排序后 `grid.py` 会 `ok=False`,不会瞎报禁用名单
|
||
- 新英雄上线后重跑 `fetch_cdn_templates.py`;版本更新后重跑 `fetch_patches.py`
|
||
- 位置文字模板取自简体中文客户端
|
||
- 决策界面 3D 模型挡住顶栏时单帧会很弱,依赖会话多帧回填
|
||
- 普通玩家 GSI 只有自己的英雄 id,不能代替读顶栏
|
||
|
||
## 相关项目
|
||
|
||
成熟后可移植到 [dota2-hex](../dota2-hex) 或独立发布。合规边界:只使用屏幕可见信息,不读内存、不注入。
|