你的意思我没有完全看明白,因为我对你在战斗中是如何调用事件的并不清楚。但是我讲一下我是如何编写50 43指令的你可能就会明白了。
z.dat中解析事件的函数Call_event只有一个参数,就是事件编号。但是它是把这个事件读入内存固定地址的。如果嵌套调用,则后面的事件会覆盖前面的事件。因此我在设计43指令时,在调用前先分配一块内存,然后把当前事件地址的内容复制到内存中。然后再调用call_event。调用完成后再复制回来。
addkdef.txt 中有这段代码:
68 00 20 00 00 ;push 2000H
e8 &3ed5b ;call 3ed5b malloc
83 c4 04 ;add esp,04
8b d8 ;mov ebx,eax 分配的内存
be *1d9e90 ;mov esi,offset 1d9e90
8b fb ;mov edi,ebx
b9 00 08 00 00 ;mov ecx,800h
f3 a5 ;rep movsd ; 把原来的事件内容复制到分配内存
55 ;push ebp
e8 &2c319 ;call 2c319 call event
83 c4 04 ;add esp,04
8b f3 ;mov esi,ebx
bf *1d9e90 ;mov edi,offset 1d9e90
b9 00 08 00 00 ;mov ecx,800h
f3 a5 ;rep movsd ; 把原来的事件内容从分配内存复制回来
53 ;push ebx
e8 &45229 ;call 45229 free
83 c4 04 ;add esp,04
1d9e90,在原始z.dat中是d9e90,就是保存一条事件全部指令的起始地址,共2000H个字节。因此一个事件的指令字节数不能超过这个值。
我不知道你在战斗中是如何调用事件的。如果不进行处理,仍然避免不了重入问题。至于你说的问题具体是什么原因我也不太清楚。现在有源代码,你可以试着直接调用43指令的函数sub_2b,估计就没有问题了。有问题再说吧!