防杀测试·回城失败自动重试 — 改动说明(2026-10-06)
问题:防杀测试 发现仇人后发一次回城包就「发完不管」,有时回城没生效
(人物还在原地),脚本照样停挂 → 等 10 分钟 → 回去继续挂 → 又被同一个仇人堵住。
本次把「发一次」改成「发 → 校验地图真的换了 → 没换就重试,最多 3 轮」。
一、为什么有时候回城失败(根因)
| # | 根因 | 说明 |
|---|
| 1 | 发包使用物品_名称 只保证「找到格子并发包」 | 人物在读条/被击退/移动中时,服务端可能拒绝使用请求 → 包发了但人没走 |
| 2 | 发包后立即 停止挂机() | 强杀寻路线程 + 小助手关(),可能与跨图流程互相干扰 |
| 3 | 遍历背包_取物品数量 依赖背包数据可读 | 角色异常状态下数量可能读成 0 → 误走「飞图」分支,而部分场景飞图不可用 |
| 4 | 全程无校验、无重试 | 以上任一失败都无人知晓,10 分钟后照常回去送死 —— 这就是你看到的「回城失败」 |
二、改了什么(全部在 代码/窗口程序集_MainDialogWnd.form.e.txt)
1. 防杀测试 命中仇人分支 → 循环重试 + 校验
发现仇人
↓ 刷新地图 () 取「危险图」真实ID
↓ 最多 3 轮:
│ 有回城符 → 发包使用物品_名称 (回城符)
│ 没有符 → 发包飞图 (目标地图ID)
│ 等待离开地图 (危险图ID, 8000) ← 轮询地图ID,真的换图了才算成功
│ 未生效 → 写日志「第N次回城未生效」→ 等 2 秒 → 下一轮(每轮重新数背包)
↓ 脱险成功 → 停止挂机 → 10 分钟后恢复挂机
↓ 3 轮都没跑掉 → 停止挂机 → 30 分钟后恢复挂机(避免刚恢复又被同一仇人送走)
↓ 跳出循环 ()(不再遍历剩余怪物槽,防同一仇人反复触发回城)
附带修了一个真 bug:原 寻找文本 (仇人名单, 怪物名称, , 假) 在怪物名称为空串时恒命中(读内存失败会误触发回城),已加 怪物名称 ≠ "" 防护。
2. 新增子程序 等待离开地图 (原地图ID, 超时毫秒)
- 每 500ms
刷新地图() 轮询 当前地图ID;前 2 秒不判(给服务器反应时间)。 - 连续两次读到同一个非 0 新地图ID 才返回真 —— 避免把跨图过渡态误判成成功。
- 换图立即返回真,不用等满 8 秒;最坏 8 秒超时返回假。
3. 新增子程序 延迟30分钟开始挂机
- 与
延迟10分钟开始挂机 同逻辑(完全复制),仅 程序_延时 (1800000)。 - 原有的
延迟10分钟开始挂机 一行未动,其他调用点零影响。
三、验证(四步全绿)
- 字节级补丁:UTF-8 BOM 保留、纯 CRLF(12567 行无 LF 污染)
- 块结构配平:
.如果/.如果真/循环/判断 全部闭合(check_blocks.py) - t2e 回转:e2txt
SUCC,日志 18470 条全为 [信息],0 错误 0 警告;防杀测试 / 等待离开地图 / 延迟30分钟开始挂机 均解析成功 - 易语言 F7 真实编译:输出面板出现 「程序代码编译成功」,弹出「请输入欲编译到的可执行文件名」(保存类型 = Windows动态链接库*.dll),无 10041/10050 任何错误
- e2t 往返保真:4 个相关子程序规范化后与源文本逐行 100% 一致
四、产物与备份
| 文件 | 说明 |
|---|
D:\AI空间\rxjh\旧版本更新.代码\...form.e.txt | 主本(本次改动所在) |
D:\AI空间\rxjh\旧版本更新_修复后.e | 已更新为 2,726,775 字节新版(含历次全部修复 + 本次改动),可直接 F7 编译出 DLL |
D:\AI空间\rxjh\旧版本更新.代码.bak_防杀回城重试_20261006_1407 | 改动前完整备份 |
D:\AI空间\rxjh\_patch\fix_防杀回城重试.py | 补丁脚本(锚点断言式,可重放追溯) |
D:\AI空间\rxjh\_patch\check_blocks.py / verify_roundtrip.py / probe2.py | 校验/编译探针脚本 |
下一步:用易语言打开 旧版本更新_修复后.e 按 F7 → 存为 DLL 即可上线。
若想调重试次数:把 .计次循环首 (3, 重试次数) 的 3 改大;想多等一会再确认:把 等待离开地图 (危险地图ID, 8000) 的 8000 改成 12000。