摘要

在《英雄无敌:上古纪元》里,英雄施法要消耗魔力。法术的基础价格由法术和它的等级(1–4 级)决定,但对手的技能、装备、我方的某些技能(例如会让敌方法术变贵的“阻碍”)都会改变实际费用。战斗日志(Logs)里会出现“某英雄失去了 22 点魔力”紧接着“施展了法术‘连锁闪电’”这样的行,把两行配对起来,就得到一次真实的支付。

状态估计(SE,把读到的观察累积成对局状态和对手构筑推断的模块)之前只在一个独立按钮里,用一个有限的费用模型算“哪些条件组合能解释这次支付”。本实验让自动 SE 直接消费已配对的支付,以及同一次施法留下的等级证据(例如同一秒连续出现的伤害行数说明命中了几个目标,从而限定法术等级),输出一条不进入预测的“条件说明”。

在一段训练录像(10 月 10 日 16:57)已保存的 58 帧结果上,前后对比只新增 4 条说明:其中连锁闪电 22 魔力那次,因为同次命中三个目标只支持 2–4 级,相容条件从 8 种缩到 6 种;其余三次支付保持不变(4→4、36→36、32→32)。原有的所有观察、费用、攻击条件、构筑候选和排除逐项相等。

要回答的问题

能否让自动 SE 在不改公开数据格式、不复制规则公式的前提下,消费日志支付和同一次施法的等级证据,给出有限、带前提的费用条件说明?它会不会改动原有结果?在 App 的有限时间预算下能否算完?

数据与来源

  • 一段用户选定的训练录像(10 月 10 日 16:57 开始)已保存的 58 帧分析请求。没有新的 OCR 或新视频。
  • 重点帧:第 12 帧(审判,28 魔力,没有同次等级约束)、第 42 帧(连锁闪电,22 魔力,同次三个目标的伤害行支持 2–4 级)。
  • 第 42 帧原图已目视核对:日志中扣 22 魔力 / 施放连锁闪电,随后圣骑兵、骷髅、死亡商人三行伤害。日志时间与媒体时刻的对齐仍未知。
  • 基线来自已冻结的 10.13-1 测试包;修改后只有 SE 源码来自工作区,其他模块用同一冻结包,避免混入规则模拟器的并行草稿。

方法

  1. 只用同一次的证据。 只消费原来已接受的“支付—施法”配对,以及这一次施法本身的效果等级;不借后面施法的等级,不借全局汇总等级,不把我方法术书页上的等级借给敌方。
  2. 复用原有查询。 从原独立按钮中提取相同的有限枚举,通过原费用模型调用规则模拟器的公开报价接口,没有新的费用或伤害公式。
  3. 缓存。 按规则版本和法术 / 学派集合缓存最多 64 个不可变的单等级报价;主体、行号、费用和筛选后的候选不缓存。
  4. 输出。 保持原输出格式,只增加“不进入预测、不指向具体 ID”的说明行,写明等级、固定增减、倍率、是否有阻碍等前提。预算中断时不把部分搜索当完整结论。

费用模型里的每个条件都是匿名的“声明有限模型”,例如“倍率 ×1、净固定 −2、无阻碍”,不能解读成对手一定有某件装备或某个技能。

设置

  • 保存观察重放:公开推断入口在修改前后各跑一次,58 帧无预算。
  • 有限预算:先在同一进程里调用 6 次、每次 0.2 秒预算;再用实际 App 的循环(刷新预算 0.2 秒、空闲续算 0.15 秒最多 4 次、最多 20 次追加刷新)。
  • 所有计算通过限制 8 核的包装器串行运行。

结果

前后对比(58 帧):

帧 支付 相容条件数 说明
第 12 帧 审判 28 4 → 4 没有同次等级约束
第 22 帧 绝望 14 36 → 36 —
第 42 帧 连锁闪电 22 8 → 6 同次三目标支持 2/3/4 级,去掉 1 级的两种条件
第 44 帧 暗影缩减 6 32 → 32 —

第 42 帧合并后显示的条件为:“×1、净固定 −2、无阻碍”,或“×1、净固定 −6、有阻碍但无对应学派”。去掉新增的 4 行后,其余全部旧结果逐项相等,输入也未改。无预算重放耗时:修改前 4.452 秒、修改后 4.992 秒(这是 58 帧保存观察的重放,不是整段录像重新识别)。

有限预算:

  • 同一进程 6 次 0.2 秒调用:前 3 次消耗在已有的面板 / 伤害工作上,后 3 次只完成了四个等级报价中的三个,没有算完(这不证明永远不收敛)。
  • 实际 App 循环第一次验证:第 5 次刷新完成,结果与无预算完全相等;第一次和最后一次刷新分别 2.226 秒和 0.181 秒(含 58 帧历史汇总)。
  • 使用原 App 服务脚本和冻结核心的第二次验证:第 3 次刷新完成,结果与无预算完全相等;含冷启动共 11.915 秒,各次返回等待 1.964 / 2.471 / 0.421 秒。这是协作预算,不是硬性的 0.2 秒,也不是热单帧 p95;完成轮次受缓存影响,不能把“第 3 次”当固定承诺。

App 消费:真实界面严格接收新结果,“推断说明”页可以看到 8→6 及其前提和来源;构筑预测集合与旧版相同。新结果另存为可导入的分析快照,冻结 App 实际导入 58 帧、推断说明、保存再读取都核验通过。

软件检查:新增 9 项(合法施法的高级 / 专家实际费用、同次目标数、未来隔离、未知归属、缓存跨事件、预算和查询错误),与原日志费用 36 项共 45 通过;相关主 SE、费用归因、同页效果、真实规则触发组合、命令行和公开日志合同共 214 通过、12 项因符号链接权限跳过。合计 259 个不同节点通过。这些是软件检查,不是识别准确率。

失败与负结果

  • 同进程 6 次 0.2 秒没算完。 原失败记录保留;之后用实际 App 循环验证可以完成,没有因此扩大生产预算或改变 App 的重试上限。
  • 验收脚本断言放错位置。 第一次界面检查把完整说明断言在“推断的”摘要里而失败;真实说明位于“推断说明”页。修正验收脚本后在新目录复核,原记录保留。
  • 导出漏了媒体时间。 第一次导出新快照时没有复制原来的时间记录,新目录 0/58 帧有媒体时间;补入原有的小型时间元数据后,58 个媒体时间与原目录一致。
  • 早期一次尝试有两项测试夹具归属错误;调查过程中有几条定位命令路径错误。都不是实际识别失败。
  • 范围不足: 自动路径只增加逐次施法的匿名费用条件,并没有消费已读的技能 / 装备身份,不能称为完整的构筑来源推断。

局限

  • 只有一段录像的 58 帧保存结果,没有独立准确率证明,主准确率目标未完成。
  • 费用模型不覆盖英雄特长和部分动态 / 单法术费用。
  • 安装版的实时 SE 尚未包含新代码;用户只能导入保存的新结果核对。

结论与下一步

自动 SE 现在会对每次已配对的支付给出带前提的费用条件说明,并且只在有同一次施法证据时才收窄。外部审阅支持收尾,并强调保持“同次效果关联”的前提、匿名净项不能恢复成强制来源(这条前提文字在保存结果中已经存在)。

下一步只检查:已读、归属和时效都成立的费用相关来源(优先我方阻碍 / 学派技能和生物光环),能否进一步约束现有匿名条件;必须保留未知的抵消来源,证据不足就不缩小。不扩建费用模型平台。