# 旧版本更新 v23 —— 卡坐标修复 + 回补熔断修复 + 回补异常兜底(关闭游戏进程) 日期:2026-10-09 产物:`旧版本更新_修复后_v23.e`(2,902,532 字节,程序信息 1.23.0.0) 源码:`旧版本更新.代码/`(t2e 0 错 0 警) --- ## 一、问题现象(用户日志实证) ### 现象 A:卡坐标不动(挂机点 25100) ``` 07:56:23 【状态】功能检测|地图=25100|背包空格=33|红药=300(阈值10)|蓝药=1546(阈值10)|下晶=15… 08:15:59 【状态】数据更新|地图=25100|背包空格=33|红药=300(阈值10)|蓝药=1543(阈值10)|下晶=15… ``` 近 20 分钟里:**背包空格恒定 33、红药恒定 300、下晶恒定 15**,只有蓝药每 3 分钟掉 1 点。 说明角色既没打怪、也没捡东西、也没喝药 —— 站在挂机坐标上干耗。 同时【流程】每分钟只打一条 `→ 五分钟无经验检测寻路` 心跳,**一次都没有**真正触发寻路。 ### 现象 B:回补熔断永不解除(回补图 5001) ``` 08:16:22 【警告·回补熔断】「背包已满」已连续 5 次判定成立……接下来 10 分钟内不再触发回补 08:16:27 【警告·回补熔断】「下晶不足」…… 08:16:32 【警告·回补熔断】「蓝药不足」…… (此后每 10~13 秒重复打印一轮,直到 08:21:43 停止挂机,全程没有一次【熔断解除】) ``` --- ## 二、两个真凶(代码层面) ### 真凶 1:`五分钟无经验检测寻路` 的「已触发」是永久锁 `代码/窗口程序集_MainDialogWnd.form.e.txt` 原实现: ```e .如果真 (当前实时经验 > 基准经验) 统计_起始时间 = 当前时间戳 已触发 = 假 ' ← 只有经验上涨才复位 .如果真结束 .如果真 (无经验分钟 ≥ 10 且 已触发 = 假) 启动线程 (&挂机寻路新, , 挂机寻路线程) 已触发 = 真 .如果真结束 ``` 第一次触发寻路后 `已触发` 永久为真。若这次寻路没把角色救回来(怪点被占 / 小助手没开 / 回补熔断把人卡在城里),经验永远不涨 → `已触发` 永远复位不了 → **之后再也不寻路**。 角色就一直钉在坐标上,日志只剩每分钟一条心跳 —— 与现象 A 完全吻合。 ### 真凶 2:熔断冷却被无限续期 `回补连败复查` 原来无条件把冷却往后推: ```e 回补熔断_冷却到 = 取启动时间 () + 600000 ``` 而主循环每周期仍在累加连败计数,5 个周期(约 5~13 秒)又凑满 5 → 再次把冷却推后 10 分钟。 结果 `回补熔断_冷却到` 永远追不上当前时间,`【熔断解除】` 永远等不到, **真正的回补被永久封死**(哪怕背包后来清空了、本该买药,也不会再买)—— 与现象 B 完全吻合。 --- ## 三、修复内容 ### 修复 1:无经验寻路改成「每满 10 分钟可再触发一次」 - 新增静态变量 `无经验计时起点`(不动 `统计_起始时间`,避免影响 10 分钟分段统计)。 - 触发寻路后计时归零,并新增解锁分支:新一轮计时未满 10 分钟即把 `已触发` 复位。 - 效果:连续无经验时,**每 10 分钟自动重跑一次 `挂机寻路新`**。 而 `挂机寻路新` 在到达挂机点会执行 `小助手开 ()`,所以「小助手没开」这类情况也能顺带自愈。 ### 修复 2:熔断冷却不再被续期 `回补连败复查` 开头加守卫: ```e .如果真 (回补熔断_冷却到 ≠ 0) 回补连败_红药 = 0 回补连败_蓝药 = 0 回补连败_包满 = 0 回补连败_下晶 = 0 返回 () .如果真结束 ``` 冷却期内不再累加、不再刷新截止时间 → 10 分钟后正常打印 `【熔断解除】` 并恢复检测。 顺带解决日志刷屏(原来每 10~13 秒一条告警)。 ### 修复 3(本次新增需求):回补异常累计 10 趟 → 关闭游戏进程 新增两个子程序: | 子程序 | 作用 | |---|---| | `回补异常_累计并处置(触发点)` | 每**真的启动了一趟回补线程**就 +1,写日志;累计满 10 趟调用兜底 | | `关闭游戏进程_异常兜底()` | 停助手(关两个时钟 + 复位标志 + 按钮标题复位)→ `打开进程 (1, 假, 全局_进程ID)` → `结束进程 (句柄, 0)` | 配套改动: - 全局变量 +3:`回补异常累计`、`回补异常_本轮命中`、`回补异常_已处置`(防重复杀)。 - 四个回补触发点(红药不足 / 蓝药不足 / 背包已满 / 下晶不足)各插一行 `回补异常_累计并处置 (…)`, 位置在 `.如果真 (回补被熔断中 () = 假)` **内部**、启动线程之前。 - `_更新数据时钟_周期事件` 末尾:本周期四个条件一个都没命中 → `回补异常累计` 归零(角色恢复健康就重新计数)。 - 点「开始挂机」时复位 `回补异常累计 / 回补异常_已处置 / 回补异常_本轮命中`。 **计数口径特意收紧**:只在「真的跑了一趟回补」时 +1,熔断冷却期内光判定成立不计数。 否则更新数据时钟是 1 秒一个周期,10 秒就把进程杀了 —— 那是误杀不是兜底。 关闭进程后由「自动登录」工程检测到游戏进程消失 → 自动重新登录上号 → 恢复挂机, 相当于一次干净的「重启自愈」。 --- ## 四、改动文件清单 | 文件 | 改动 | |---|---| | `旧版本更新.代码/代码/窗口程序集_MainDialogWnd.form.e.txt` | 修复 1(寻路触发逻辑)、修复 2(熔断守卫)、修复 3(+2 子程序 / +4 计数 / +1 归零 / +3 复位行) | | `旧版本更新.代码/全局变量.e.txt` | +3 全局变量 | | `tools/_patch_v23_kazuobiao.py` | 卡坐标 + 熔断补丁(含留底与写盘前断言) | | `tools/_patch_v23b_huibu_kill.py` | 回补异常兜底补丁(含留底与写盘前断言) | 留底: - `代码/窗口程序集_MainDialogWnd.form.e.txt.bak_v23卡坐标前_20261009_083001` - `代码/窗口程序集_MainDialogWnd.form.e.txt.bak_v23b异常兜底_20261009_084029` - `代码/全局变量.e.txt.bak_v23b全局变量_20261009_083810` --- ## 五、验收 - `_check_blocks.py`:控制块问题 0 处 ✓ - `_scan_varfmt2.py`(窗口 + 全局变量):可疑声明 0 处 ✓ - `_check_decls.py`:无误声明成数组的标量 ✓ - t2e:`EXIT=0 错误=0 警告=0` ✓ - `.e` 头部程序信息回读:名称 / 描述 / 作者 / 版权 / 1.23.0.0 一致 ✓ - 两工程程序信息同步到 v23(`_build.py` 自动校验通过)✓ --- ## 六、使用注意 1. 本次两个修复都在**服务端无关的客户端逻辑**里,网页 / 卡密验证不受影响。 2. 「关闭游戏进程」是**破坏性兜底**:触发后游戏会退出,靠自动登录重新上号。 若你没开自动登录,游戏关掉后需要手动重开 —— 日志里会明确写出原因和提示。 3. 触发前日志会先打印三行醒目提示并列出优先排查项(购买列表物品名 vs 背包实物名 / 阈值是否过大 / 背包与金钱是否够),方便事后定位。 4. 想调整阈值(默认 10 趟),改 `回补异常_累计并处置` 里的 `回补异常累计 ≥ 10` 即可。