摘要

在《英雄无敌:上古纪元》的战斗中,把鼠标移到攻击目标上,游戏会显示一个攻击预览:这次攻击预计造成的伤害范围、可能消灭的单位数。这个数字由攻击方的攻击力、数量、技能,防守方的防御,以及各种临时效果共同决定,所以它是推断双方构筑的好证据。

前一轮已经在一个保存的真实例子上,用规则模拟器(项目实现的规则程序)的公开接口算出与预览相符的数值。本实验把这套“有来源的条件计算”接进生产状态估计(SE)和战斗记录 App 现有的攻击详情页:程序自动从已读到的面板、准备页、等待日志中选取输入,在明确的假设下给出参考伤害,并写清楚用了哪些假设、缺什么。

在一段训练录像(10 月 10 日 16:57)的保存结果上,完整 58 帧时给出四组参考 640–960、704–1056、768–1152、845–1267,最后一组与保存的预览数值相符;只看前 25 帧时,因为目标的防御要到第 29 帧才读到,程序报告“缺目标防御”而不借未来数据。另一段 49 帧结果没有新增虚假匹配。除了这一条预览说明,其他结果逐项不变。

要回答的问题

能否在不改公开数据格式、不复制规则公式的前提下,让 SE 自动用已读证据对攻击预览做条件数值计算,并且不借未来、不在证据不足时制造虚假匹配?

数据与来源

  • 两段用户选定的训练录像的保存请求:16:57 局 58 帧、01:39 局 49 帧。这些请求是由原保存的视觉读取结果经生产请求构建器重建的,不是新的截图识别;没有用人工数值替换自动读数。
  • 16:57 局关键时间:准备页 453.1 秒、己方面板 487.4 秒、等待日志 610.9 秒、攻击预览 680.1 秒、敌方面板 752.5 秒。

方法

按实际请求顺序选来源,不按匹配效果挑帧: 己方面板取预览之前最近的一张;敌方面板优先取之前最近的一张,没有则取之后的第一张,并单独标为“事后参考”。

输入:

  • 面板上已显示的总攻击和杀伤,不再重复加英雄攻击;数量取本帧行动卡 / 目标牌的候选。
  • 从等待之前同一英雄的准备页读取“战技”等级和“近战特长”,调用规则模拟器的公开接口(技能效果、伤害修正子技能加成、合法动作执行、伤害范围),没有复制公式。
  • 等待(Wait)会带来攻击加成:通过合法的等待动作,攻击 40 → 52。

明确的假设: 两堆参考采用模板生命和位置;普通主动近战、无幸运 / 反击 / 额外波次;属性延续;同方兵种唯一、没有未见实例切换;没有其他宝物、专精、临时状态或第三方影响。已见的状态 / 生命周期变化、英雄攻防变化、后续技能冲突或回合边界都会阻断完整计算。旧等待页不能让已经包含等待的面板再叠加一次;来源不同、重复或缺属性的面板不计算。

范围和预算: 每个请求最多尝试 4 组数值参考,原预览说明最多保留 48 组;共用现有 SE 预算,超时不使用部分匹配。目前完整的四组只支持“可读战技、近战特长和等待的普通近战”。

输出: 沿用现有不进入预测的说明行,App 攻击详情和保存的 HTML 会显示。没有增加字段、没有补写攻击命中条件,也没有认定敌方缺某个技能。

设置

在实际核心子进程里先禁用新功能、再启用,用同一输入对比新旧结果;调用与 App 相同的脚本、结果校验器和已有界面 / HTML 消费者。

结果

输入 修复前 修复后 不变的部分
16:57 局前 25 帧 预览原文可见,没有查询 显示已读攻击 40、杀伤 40–60、当前数量候选 12;缺目标防御,未借用未来面板 除这条预览说明外,全部结果严格相等
16:57 局完整 58 帧 同上 标明第 29 帧防御 25 是事后参考;四组 640–960、704–1056、768–1152、845–1267;合法等待使攻击 40→52 只有第 25 帧的预览说明变化
01:39 局 49 帧 没有可用组合 不新增虚假匹配 完整结果严格相等

845–1267 与保存的预览数值相符,但这只是“条件相容”,不是唯一解释。四组是同一个例子的组件对照(逐步加入技能和等待),不是四场独立战斗,也不是准确率。日志页的媒体时刻不是动作的真实时刻,等待是否延续到攻击仍是假设;第 29 帧的防御不能倒填成第 25 帧的事实。

实际离屏界面渲染已目视核对,四组参考和“事后参考”边界可读。另导出了一个可导入的独立结果快照(只是保存读数的重算,没有新 OCR 或视频),导出后核对请求 / 结果 / 会话相等、58 张原图存在、媒体时间相等。

软件检查:SE 受影响 148 项、App 攻击详情 / 结果协议 / 保存回看 53 项,共 201 项不同检查通过。新增情景包括前缀 / 事后、当前数量、等待实际触发、组件移除、技能缺读、状态 / 生命周期、相同兵种不同实例、重复等待页、英雄属性变化、来源错配、预算和按时间选源。它们是软件情景,不是新的真实准确率。

失败与负结果

  • 初始 17 项测试中 5 项失败(功能还没接入);第一次实现后 4 项失败,原因是合成日志里的英雄名与目录身份不符,改用目录中的正确名字,没有放松归属要求。原失败记录保留。
  • 代码检查首轮有两项问题(未使用变量、子进程调用未显式检查),已修复。
  • 导出快照后控制台打印中文时因 Windows 编码失败;此前保存和所有断言已通过、验证文件已落盘。修正打印编码后只读复查,没有重复导出。
  • 外部审阅发现的边界漏洞: 英雄上下文检查只看区间内的值,可能漏掉区间开始之前最后已知的英雄身份 / 属性。用公开入口复现了两个负例(预览时 HUD 缺失,随后只有一条敌方 HUD,分别换了英雄或防御),旧代码仍给出“数值相符”,两项失败保留。修复为把区间起点之前 / 当时最近的已知身份和属性纳入冲突比较;两个负例修复,另加一个正例确保新基线不会被区间外的旧值错误阻断。最终三份真实输入的完整输出与修复前严格相等,之前导出的快照仍然有效。

局限

  • 只覆盖普通近战 + 战技 + 近战特长 + 等待这一种组合,不代表所有攻击类型。
  • 全军 / 英雄级效果可能不属于单个兵堆,当前以“其他影响不额外改变”为前提;没有真实冲突证据,没有扩建状态系统,也没有声称已排除这些效果。
  • “最多 4 次”是尝试上限而非成功次数;截止时间不保证单次引擎调用硬超时;没有声称实时 p95 达标。
  • 旧快照里被历史请求构建器过滤掉的攻击预览任务,按旧请求重算 SE 仍不会补回;本实验用的是之前重建过的请求。
  • 安装版未更新。

结论与下一步

现在攻击详情能直接显示“读到了什么、用了哪些假设、规则怎么算、缺什么”,不再要求用户从零手动输入攻防。下一步:让导入旧视频分析时能显式恢复已经保存的预览观察并重算 SE,同时保留原始来源、人工更正和旧快照;不做新 OCR、不重跑录像。本例不再追加数值探针。