Thursday, March 27, 2008

一些笔记

 

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: