日期:2026-10-06 14:29<br>改动文件:旧版本更新.代码/代码/窗口程序集_MainDialogWnd.form.e.txt(12568 → 12569 行)
工程里判断「一件物品是不是凝神珠」的地方原本有 3 套各自硬编码的写法,而且名单互不一致:
| 位置 | 原写法 | 名单 |
|---|---|---|
遍历背包凝神珠数量 | 调用 是否是凝神珠 () | — |
自动使用凝神珠(2 处) | 寻找文本 (物品名称, "凝神珠", , 假) ≠ -1 | 无名单,只要名字里含「凝神珠」就算 |
遍历凝神珠位置是否为空 | 寻找文本 ("地.凝神珠(十万)/天.凝神珠(十万)/…", 物品名称, , 假) = -1 | 含「天.」、括号前无空格 |
是否是凝神珠 () 本体 | 寻找文本 ("地.凝神珠 (十万)/…/", 物品名称, , 假) ≠ -1 | 只有「地.」、括号前有空格 |
三个问题:
是否是凝神珠 只有地.、有空格。谁改名单都得改两处,漏一处就静默失效。自动使用凝神珠 用的是模糊匹配 — 寻找文本("凝神珠") 会把任何名字带「凝神珠」三个字的物品都算进来(含未完成的珠子),和另外两处的严格名单语义不同。遍历凝神珠位置是否为空 注释与代码矛盾 — 注释写「不覆盖,跳过该格」,代码却是 返回 (凝神珠格子 - 1),把已被占用的格子当成空位返回,会往有东西的格子上发包。现在统一成「只维护 是否是凝神珠 () 一处名单」。
自动使用凝神珠 — 源物品判断(原 9894 行)- .如果真 (寻找文本 (物品名称, “凝神珠”, , 假) ≠ -1)
+ .如果真 (是否是凝神珠 (物品名称) = 真)
效果:不再误搬「名字里带凝神珠但不是成品珠」的东西,与背包计数口径一致。
自动使用凝神珠 — 回读目标格校验(原 9906 行)- .如果真 (寻找文本 (目标名称, “凝神珠”, , 假) ≠ -1)
+ .如果真 (是否是凝神珠 (目标名称) = 真)
效果:搬完回读目标格,用同一套名单判定,避免「校验说成功、其实搬错东西」。
遍历凝神珠位置是否为空 — 名单判断(原 9948 行)- .如果真 (寻找文本 (“地.凝神珠(十万)/天.凝神珠(十万)/…/”, 物品名称, , 假) = -1)
+ .如果真 (是否是凝神珠 (物品名称) = 假)
遍历凝神珠位置是否为空 — 占用格不再被当成空位(原 9949~9953 行) .否则
物品名称 = 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 物品位置 + #背包物品名称值))
.如果真 (是否是凝神珠 (物品名称) = 假)
' 【修正】非凝神珠物品占格 → 不覆盖,跳过该格,继续往后找真空格
' (原代码此处误写 返回 (凝神珠格子 - 1),会把占用格里的东西覆盖掉)
写日志 (…“格被[” + 物品名称 + “]占用,跳过。”…)
.如果真结束
到循环尾 () ' 该格已有物品(凝神珠或其它)都不是空位,继续遍历下一格
.如果结束
行为变化:改前「格子里有非凝神珠物品」→ 直接返回该格下标(会被覆盖);改后 → 跳过,继续往后找真空格;6 格都不空则返回 -1,干脆不搬。
到循环尾 ()写在.如果分支里是工程标准写法(全文 83 处先例)。
是否是凝神珠 (...) 在工程内共 4 个调用点,名单只在 是否是凝神珠 一处维护:
自动使用凝神珠 源判定自动使用凝神珠 目标校验遍历凝神珠位置是否为空遍历背包凝神珠数量| 步骤 | 结果 |
|---|---|
| 字节级写入(保留 UTF-8 BOM + 纯 CRLF) | BOM ✓ / CRLF 12568 / LF-only 0 ✓ |
块结构配平(.如果 / .如果真 / 循环全闭合) | 配平 ✓ |
| e2txt t2e 回转 | 0 错误 0 警告,日志级别只有 [信息] 18470 条;末尾 SUCC ✓ |
| 4 个子程序方法解析 | 全部 1 条解析成功 ✓ |
| e2t 往返比对 | 改动行 0 差异;总差异仅为「, 数组 标志位 / 空格」格式归一化噪声 ✓ |
| 旧硬编码残留扫描 | 寻找文本 (物品名称/目标名称, "凝神珠"…)、地.凝神珠(十万) 残留 0 处 ✓ |
未做:易语言 F7 编译验证。原因是操作时你正开着易语言 IDE,自动化探针会抢前台焦点,且可能在同一个 IDE 实例里打开 out.e 冲掉你未保存的编辑。请在 IDE 里自行 F7 编译一次确认。
是否是凝神珠 () 的名单目前是:
“地.凝神珠 (十万)/地.凝神珠 (五百万)/地.凝神珠 (五千万)/地.凝神珠 (一亿)/”
你贴的空位子程序名单是 地.凝神珠(十万)/天.凝神珠(十万)/…(括号前无空格,且含「天.」)。
按你的选择,名单由你自己在 IDE 里补。请对照游戏内真实物品名确认两件事:
地.凝神珠 (十万) vs 地.凝神珠(十万))——这一字之差会让名单整条失效改完之后,自动使用凝神珠 / 遍历凝神珠位置是否为空 / 遍历背包凝神珠数量 三处会同时生效,不用再改别的地方。
发包_移动物品 的参数注释是错的。注释写「所在背包位置 背包格子(1基),如 35」「凝神珠位置 凝神珠目标位置(1基),如 1/2/6」,<br>但函数体里封包样本写明是 0 基:<br>``<br>000000001A000C000100 0D 00 AB 00 00 00 01000000 ' 可用14到1 → 0x0D=13=14-1, 目标 0x00=0=1-1<br>000000001A000C000100 0E 00 AB 00 01 00 01000000 ' 可用15到2 → 0x0E=14=15-1, 目标 0x01=1=2-1<br>`<br>调用处传的也是 0 基(发包_移动物品 (物品格子 - 1, 凝神位置)`),代码是对的,注释写错了。<br>建议把两处注释的「1基」改成「0基」,避免以后有人按注释传参。
自动使用凝神珠 回读校验有一段冗余赋值。 物品位置 = 内存_读整数型 (全局_进程句柄, #凝神珠背包基址值) ← 这行无用,紧接着被覆盖
背包基址 = 内存_读整数型 (全局_进程句柄, #凝神珠背包基址值)
物品位置 = 内存_读整数型 (全局_进程句柄, 背包基址 + 4 × 凝神位置 + #背包物品位置值)
第一行读出来的值赋给 物品位置 后立刻被第三行覆盖,可删。
.如果真 (已移动 ≥ 10) 里的实时上限是 10,但下面被注释掉的日志写「已达单次最大移动数30」,且失败分支里写 已移动 = 30。三处口径不统一,只是注释问题,不影响运行。
D:\AI空间\rxjh\旧版本更新.代码(本次改动的唯一主本)D:\AI空间\rxjh\旧版本更新_修复后.e(2,726,673 字节,魔数 CNWTEPRG ✓)D:\AI空间\rxjh\旧版本更新.代码.bak_凝神珠统一判断_20261006_1424回滚:把备份目录里的 代码/窗口程序集_MainDialogWnd.form.e.txt 拷回主本即可。