摘要

项目里有一个规则模拟器(Simulator),其中的 AI 可以和自己对战。长期目标之一是让 AI 去操作真实游戏,于是需要一座桥:动作级模拟——AI 发出的不是“攻击某单位”,而是“移动鼠标到某处、点击、等待”。模拟器一方已经实现了手势和界面状态机,但缺两样只能从录像里得到的东西:

  1. 界面布局表:每个界面元素在 2560×1440 原生画面中的位置、状态变体和录像证据。
  2. 五个界面行为问题:近战从哪一侧接近、延展模式点相邻敌人会怎样、开关法术书是否重置攻击方式、有没有快捷键、攻击预览要不要悬停。

本实验(内部编号 B162)用只读脚本从录像和游戏安装文件中给出布局表草案和五个回答。它们都是“录像证据和安装文件证据”,不是按键实测——录像里看不到鼠标按键和键盘。

要回答的问题

  1. 战斗底栏每个按钮、法术书每个格子在原生画面上的中心和半径是多少?各有什么状态变体?
  2. 上面五个界面行为问题的答案。

数据与来源

  • 多段用户自己的实战录像(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 个法术的书,屏幕上的翻页控件没见到;翻页按键是 , 和 .。

五个实机问题

  1. 近战从哪一侧接近:取决于指针在目标格里的位置。指针移到可攻击的敌人上变成一把剑,剑尖指向目标中心,攻击从指针那一侧发起,落点格用小六边形标出。四个样例一致。扇区的精确边界(6 个还是 12 个方向)录像量不出来。
  2. 延展模式点相邻敌人:不是“无效”,也不是原地打。游戏在指针一侧选一个距目标 2 格的落点,单位走过去再做延展攻击。样例:草木术士先切到近战,悬停相邻目标显示原地攻击;切回延展,悬停同一目标出现距离 2 的落点;点击后单位移动再攻击,日志显示“移动了 / 攻击了 / 受到 162 伤害,死亡 4”,没有反击。这和模拟器界面状态机现有的“延展模式不能打相邻”假设不同,需要模拟器一方修改。
  3. 开关法术书会不会重置攻击方式:会,开书那一刻就重置。一段录像中龙的备用攻击按钮正在发光(亮度 154),指针停到法术书按钮、书翻开的同一帧发光熄灭;关书后仍是默认攻击,当前单位不变,这次没有施法。只找到这一个片段;施法后的情况没有样例。
  4. 快捷键:有,而且可改键。默认值见上表;用户设置里没有改键。“盾牌”按钮的游戏名是“跳过回合”而不是“防御”。录像看不到按键,没有实测“按了就生效”。
  5. 攻击预览要不要悬停、多久:要悬停,但不用等。预览(骷髅 = 击杀数区间、心 = 伤害区间)与剑形光标同一帧出现,约 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 真正操作游戏,仍需按键实测。数据卫生的教训是:采集脚本必须先按训练/测试登记过滤录像。