50指令的编写方式
1.保存现场。主要是ebx,edi,esi,ebp四个基本寄存器,eax和ecx均直接使用,不予保存。
2.从栈中提取参数。
2.处理标志位。方法是压入标志位位置标识,标志位,和参数。调用另一子程,返回标志位指定的数值或变量的值到eax。
3.指令功能。变量从内存120000H开始。有些是自编子程,完成某些系统功能的是引用原有的子程。
4.恢复现场,返回。
战场在内存中的保存方式
共3层:
第一层:26个人物数据。每个人物占据1CH字节,保存的数据主要有:人物战场id,人物实际id,敌友信息,坐标等。
第二层:效果信息。格式为40H*y+x+基址。在播放效果的时候会首先清空此层,之后根据所使用的招式重新对这一层的某些位置赋值为1,在播放效果的时候不为0的位置均会有效果。
第三层:保存整个战场信息。格式为(40H*y+x)*2+基址,每个位置占据一个字长,是战场上的人物信息,如对应位置有人,则是人物的战场id,如无人则是-1。
基址的位置在代码段和重定位表里面不同,需以重定位表中的值+20000H为准。
SwimmingFish未发现的
3B717H:人物最高等级。之前的修改器在30级之后一直不正常是因为漏了这个地址。
第二层战场信息的含义。
绘制背景矩形子程中第一个参数是透明度。对话框为4,其余大多为3。故对话框比其余很多框黑一些。
杂项
人物内场景坐标:1D295CH,1D295AH。
需要修改重定位表的有:属性引用,显示内存,直接用寄存器标示子程。
进入场景子程:28E40,参数一个,为场景编号,直接引用可进入某场景,如需切换场景则只引用部分。
游戏中使用的wav文件为11025bps,8bit,用其他软件生成的基本不能直接使用。
push会将字算术扩展为双字再入栈,提取时很可能已经不是原来的样子。需设法处理掉高位字的数据。
No comments:
Post a Comment