摘要
Simulator 是本项目自己实现的《英雄无敌:上古纪元》竞技场战斗规则引擎,用来生成可复现的战斗,并不是商业游戏本身。九头蛇有一个被动“生齿不息”:每受到一次伤害就增加攻击。旧规则(Core380–385,Core 后的数字是 Simulator 的规则版本号)在整次行动结束后按“净掉血”只结算一次,导致受伤后的反击仍用旧攻击力。本批按独立的原生代码顺序证据,新增规则版本 Core386:每个真实伤害包落地后立即增攻。普通九头蛇四只/三只/一只的反击由 80/60/20 改为 84/63/21,皇家九头蛇为 88/66/22。旧版本存档仍按旧规则回放,全量回归新增失败为 0。
要回答的问题
增攻应该发生在“哪个时刻”?如果在反击之前就已增攻,反击伤害会变大;如果一次行动里有两个伤害包(例如主伤害加天堂之刃的 35 点追加伤害),应增攻一次还是两次?受伤后又被治疗回满时,增攻是否还算?
方法
- 先在实施约定中记录语义变更与消费者影响,再修改代码。
- 提取共享的“接收伤害”函数:先扣生命,再调用原有增攻结算;旧版本只扣生命。共 29 个调用点(普攻、范围攻击、反击、追加伤害、英雄、法术、能力、场地效应、持续/延迟伤害等)统一改用它。
- 预期数值写在测试里,不从本次输出反推。
设置
- 规则身份
battle-core.v386;默认加载仍是 380,新启动的 Web 服务选择 386。380–386 的存档各自按原规则恢复,不同版本回放互相拒绝。 - 新增中文场景:六个反击数值、受伤后回满生命、三种屠神者×普通/皇家共六种技能操作。
结果
| 场景 | 旧版 | Core386 |
|---|---|---|
| 普通九头蛇 4/3/1 只反击 | 80/60/20 | 84/63/21 |
| 皇家九头蛇 4/3/1 只反击 | 80/60/20 | 88/66/22 |
| 主伤害 + 天堂之刃 35,三只反击(普通/皇家) | 60/60 | 66/72 |
| 先受 20 伤害、反击的天堂之刃又回满 20 生命 | 漏掉增攻 | 保留 +1 |
- 60 份 380–385 原始完整历史共 912 个操作,重新生成的 JSON 与原件完全相等;另存 10 份 386 历史。
- 51 个正常中文场景通过,10 个旧版本缺口按预期失败;61 个前缀共 82 操作、278 条断言全部可回放。
- 五模块全量 1002.53 秒:Simulator 12652 通过、65 既有失败、2 跳过、152 严格预期失败;Game Knowledge 7816 通过、31 既有失败、7 既有异常;Game AI 6343、状态估计 2004(20 环境跳过)、Arena 2993 全部通过。与上一批逐节点比较,新增失败 0。
“严格预期失败”(strict xfail)指专门记录已知缺陷的测试:现在失败是预期的,修好后若意外通过会报警,因此不计入正确通过。
失败与负结果
初轮测试发现夹具缺少严格的英雄/来源账本、用了九头蛇免疫的毒类持续伤害,以及持续效果时钟限制;均改为合法施放的夹具,没有放宽引擎校验。Arena 恢复代码一次替换产生语法错误,已修复。凤凰测试原先靠偶然导入通过,改为显式导入后 23 个节点重新通过。
局限
- 独立原生证据只支持“正伤害、存活接收者先增攻再普通反击”。致死不增攻沿用 Simulator 约定;其他伤害家族的完整原生订阅者与多包回调队列仍待取证。
- 没有为每次增攻新增独立事件字段;九头蛇横扫几何、免反击、皇家命中减益等缺口仍在排队。
- 公开攻击预估在无法完整模拟时返回“未知”,不冒充完整结果。
结论与下一步
Core386 修正了一个已确认的时序偏差,旧回放保持不变。这不代表 Simulator 已完全正确;后续九头蛇攻击见实验 0334 的进度记录。新增规则版本时必须保留 386 的逐包增攻,不能只提升版本号。
Comments