然后讨论下技术,目前我能想到三个需要改进的点。
第一点,护符区域移动到上方更加合理。切换原版背包 / 大背包更方便些。
但是目前会产生一个BUG:

大板子可以通过蹭边的方式生效。这是因为暗黑2的物品坐标是第一个格子的坐标。下面贴出我用(Chao)的代码:
D2Common.dll
Address Hex dump Command Comments
6FD78843F7D8NEG EAX
6FD788455EPOP ESI
6FD78846E9 A2390400JMP 6FDBC1ED ;|Jump to custom code
Address Hex dump Command Comments
6FDBC1ED 85C0 TEST EAX,EAX
6FDBC1EF 75 03 JNE SHORT 6FDBC1F4
6FDBC1F1 C2 0800 RETN 8
6FDBC1F4 8B44E4 04 MOV EAX,DWORD PTR SS:[ESP+4]
6FDBC1F8 8B40 2C MOV EAX,DWORD PTR DS:[EAX+2C]
6FDBC1FB 8378 0C 00 CMP DWORD PTR DS:[EAX+0C],0
6FDBC1FF 72 1A JB SHORT 6FDBC21B
6FDBC201 8378 0C 07 CMP DWORD PTR DS:[EAX+0C],7
6FDBC205 77 14 JA SHORT 6FDBC21B
6FDBC207 8378 10 04 CMP DWORD PTR DS:[EAX+10],4
6FDBC20B 72 0E JB SHORT 6FDBC21B
6FDBC20D 8378 10 07 CMP DWORD PTR DS:[EAX+10],7
6FDBC211 77 08 JA SHORT 6FDBC21B
6FDBC213 B8 01000000 MOV EAX,1
6FDBC218 C2 0800 RETN 8
6FDBC21B 31C0 XOR EAX,EAX
6FDBC21D C2 0800 RETN 8
这段代码是参考的 The Phrozen Keep 和 snej 上的帖子得到。
查阅资料得知 6FD787D0 处的函数应该是这样的:
__stdcall AreCharmReqsMet(struct Unit *pItem, struct Unit *pUnit)
而 6FDBC1FB 处 CMP 指令 EAX 寄存器存的显然是 某个结构体基址指针。看前面的代码可以知道, MOV EAX,DWORD PTR SS:[ESP+4] 得到的是 struct Unit pItem 的基址, MOV EAX,DWORD PTR DS:[EAX+2C] 得到 Path 结构体基址(DWORD),然后 EAX+0C 得到X坐标(DWORD),EAX+10 得到Y坐标(DWORD)。
这两个结构体的结构应该是:
struct Unit {
...
Path * path // 0x2C
....
}
Path {
...
x // 0x0C
y // 0x10
...
}
Unit结构体里面应该会有物品信息,只要能找到物品类型,就能判断是否为大板子,后面的程序就好写了。
目前我正在翻 PlugY 大箱子的源代码 ,The Phrozen Keep 还有 d2Common.dll 的汇编代码。争取解决这个问题。