摘要
项目里有一个规则模拟器(Simulator),其中的 AI 可以和自己对战。长期目标之一是让 AI 去操作真实游戏,于是需要一座桥:动作级模拟——AI 发出的不是“攻击某单位”,而是“移动鼠标到某处、点击、等待”。模拟器一方已经实现了手势和界面状态机,但缺两样只能从录像里得到的东西:
- 界面布局表:每个界面元素在 2560×1440 原生画面中的位置、状态变体和录像证据。
- 五个界面行为问题:近战从哪一侧接近、延展模式点相邻敌人会怎样、开关法术书是否重置攻击方式、有没有快捷键、攻击预览要不要悬停。
本实验(内部编号 B162)用只读脚本从录像和游戏安装文件中给出布局表草案和五个回答。它们都是“录像证据和安装文件证据”,不是按键实测——录像里看不到鼠标按键和键盘。
要回答的问题
- 战斗底栏每个按钮、法术书每个格子在原生画面上的中心和半径是多少?各有什么状态变体?
- 上面五个界面行为问题的答案。
数据与来源
- 多段用户自己的实战录像(30 帧/秒),主要是 10 月 8 日 20:39 和 10 月 9 日 08:38 两段。
- 游戏安装包里的中文文本(按钮提示文字)和默认按键表。
- 游戏本地日志(只记战斗阶段的时间,不记具体操作)。
方法
全部是只读脚本:
- 一段录像每秒截底栏,按外观分组,看按钮的状态变体。
- 底栏区域变化时做 OCR,保留含两个以上汉字的提示行和它的原生框。游戏的按钮提示框水平居中在按钮正上方,所以“提示文字 + 框中心 x”就能对上按钮身份。
- 逐帧记录攻击方式按钮外圈亮度、当前单位头像、场景,寻找“切换 → 开书 → 关书”片段。
- 从安装文件抽出默认按键表。
- 用 Hough 圆检测在不同录像的帧上量按钮位置,两段录像一致到 ±3 像素;法术书格子用三本不同的书量。
设置
单一用户、单一分辨率(2560×1440)、默认界面缩放。录像 30 帧/秒,可逐帧看。
结果
底栏按钮(部分)
| 元素 | 中心(原生) | 半径 | 游戏文字 | 默认按键 |
|---|---|---|---|---|
| 跳过回合 | (490, 1358) | 36 | 跳过回合 | D,备用空格 |
| 等待 | (576, 1358) | 36 | 等待:部队会在本回合稍后行动。 | W |
| 当前单位头像 | (716, 1340) | 96 | — | — |
| 单位能力槽 1–5 | x 859/946/1032/1117/1202,y 1360 | 37 | 能力名 + 说明 | 1–5(按顺序推定) |
| 英雄能力槽 1–5 | x 1352/1440/1528/1612/1698,y 1362 | 37 | 英雄能力名 + 说明 | 6–0(对应关系未核实) |
| 英勇攻击 | = 英雄槽最右 (1698, 1360) | 37 | 英勇攻击 | `(反引号) |
| 魔法书 | (1841, 1340) | 96 | 魔法书 | B |
| 投降 / 逃跑 | (1981, 1357) / (2067, 1357) | 36 | 投降(悬停显示竞技场不可用)/ 逃跑(排除法) | R / E |
| 战斗记录 | (38, 1400) | 29 | 魔法纪录 | L |
| 自动战斗 | (112, 1399) | 26 | 切换至自动战斗 | A |
| 自动完成剩余战斗 | (186, 1398) | 29 | 自动完成剩余战斗 | Shift+Q |
- 单位能力槽从左填:单位有备用攻击时(安装数据里 63 种单位有)第 1 格是备用攻击,后面按数据顺序排能力。图标下沿的菱形是集能消耗,图标中间的数字是剩余冷却。
- 英雄能力槽从右填:最右一格在所有看到的帧里都是英勇攻击。
- 状态变体:等待按钮变灰(推断为当前单位不能再等待);法术书圆圈上压沙漏 = 本回合已用过魔法书;攻击方式按钮发光 = 已选备用攻击(外圈平均亮度关约 60、开 150–165)。
- 备用攻击不只是“延展 ↔ 近战”:很多射手的备用攻击是近战,黑龙的是锥形攻击。
法术书
- 每页 7 格(2-3-2 排列),一对页 14 格,三本不同的书位置相同,半径约 70。
- 书会下沉:开书时偏移 0,约 6 秒内慢慢降约 20 像素后停住,下次开书又从 0 开始(一段录像 17 次开书,格子 y 419–440)。点击中心不受影响。书上魔力读数框已核对:下沉 ≥10 像素的 28 张截图读出 27 张,与未下沉时一样;把框加高反而读丢分母的一位,所以不改。
- 录像里没有超过 14 个法术的书,屏幕上的翻页控件没见到;翻页按键是
,和.。
五个实机问题
- 近战从哪一侧接近:取决于指针在目标格里的位置。指针移到可攻击的敌人上变成一把剑,剑尖指向目标中心,攻击从指针那一侧发起,落点格用小六边形标出。四个样例一致。扇区的精确边界(6 个还是 12 个方向)录像量不出来。
- 延展模式点相邻敌人:不是“无效”,也不是原地打。游戏在指针一侧选一个距目标 2 格的落点,单位走过去再做延展攻击。样例:草木术士先切到近战,悬停相邻目标显示原地攻击;切回延展,悬停同一目标出现距离 2 的落点;点击后单位移动再攻击,日志显示“移动了 / 攻击了 / 受到 162 伤害,死亡 4”,没有反击。这和模拟器界面状态机现有的“延展模式不能打相邻”假设不同,需要模拟器一方修改。
- 开关法术书会不会重置攻击方式:会,开书那一刻就重置。一段录像中龙的备用攻击按钮正在发光(亮度 154),指针停到法术书按钮、书翻开的同一帧发光熄灭;关书后仍是默认攻击,当前单位不变,这次没有施法。只找到这一个片段;施法后的情况没有样例。
- 快捷键:有,而且可改键。默认值见上表;用户设置里没有改键。“盾牌”按钮的游戏名是“跳过回合”而不是“防御”。录像看不到按键,没有实测“按了就生效”。
- 攻击预览要不要悬停、多久:要悬停,但不用等。预览(骷髅 = 击杀数区间、心 = 伤害区间)与剑形光标同一帧出现,约 2 帧(0.07 秒)淡入;指针离开约 0.07 秒淡出。不需要点击,也不需要 0.5 秒。样例实际结果落在预览区间内(预览 150–180 / 4–5,实际 162 / 4)。
其他时序
- 按钮悬停提示:指针停住约 0.2 秒后出现,约 0.07 秒淡入;指针在按钮上移动约 0.5 秒没有出提示(一个样例,像是要停住才计时)。模拟器用 ≥0.3 秒的停留就能覆盖实测。
- 悬停敌方单位会描出它的移动范围(取决于用户设置);生物面板约 0.2 秒淡入。
失败与负结果
- 数据卫生问题(事后补记两次):晚间 20:39 那段录像在另一实验里已登记为测试池,但本实验用它量了按钮位置、悬停文字和攻击方式时间线。另外两个扫描脚本按扫描清单取了全部录像,没有按池过滤,包括另一测试池的全部 12 段,其中有两段登记为“冻结评估、不训练、不调阈值”。所以这些录像对底栏与版面字段不再是盲测材料,那两段的“不调阈值”约定已被违反,以后不能再称为冻结。之后的采集按登记只取训练池。
- 施法后攻击方式是否重置没有样例;扇区精确边界量不出来。
局限
- 都是一个用户、一个分辨率、默认界面缩放下的证据;改分辨率或缩放要重新量。
- 中间徽记、右上角甲虫图标、书下两个书签的用途未知;逃跑按钮由排除法推断。
- 英雄能力槽与 6–0 按键的对应关系、单位能力槽与 1–5 的对应关系都是推定。
结论与下一步
布局表草案和五个问题的回答已交给模拟器一方,其中“延展模式可以打相邻敌人(走到距离 2 的格再打)”需要模拟器修改界面状态机。这些都是观察证据,后续如果要让 AI 真正操作游戏,仍需按键实测。数据卫生的教训是:采集脚本必须先按训练/测试登记过滤录像。
Comments