存档是固定0x59CB大小,读写前先都要先经过一次xor的处理。结尾0x59C7开始的4个字节是存档文件的CRC,就是把前面所有字节一个一个加起来得到的值。
我直接复制的游戏里的汇编代码来读写的,这段代码的大意如下,不保证是可运行的
void XorRead (LPBYTE FileData, int FileLen)
{
short int xorval= 0xa5;
short int tmp;
for (int i= 0; i<FileLen; ++i)
{
// add tmp, 9014h
// rol tmp, 3
xorval+= 0x9014;
tmp= xorval;
tmp<<= 3;
xorval>>=(16-3);
xorval|= tmp;
FileData[i]^=xorval;
}
}
void XorSave (LPBYTE FileData, int FileLen)
{
FileLen= FileLen- 4;
unsigned int CRC= 0;
for (int i= 0; i<FileLen; ++i)
{
CRC+= FileData[i];
}
FileLen+= 4;
XorRead ( FileData, FileLen);
}
存档的解码后0x3b31处开始总是01000101,所以可以根据这儿判断文件是解码过的,还是编码过的。
这里是一个处理存档的小工具,把fd2.sav放到同级目录再运行,或者后面存档的文件名也可以
fd2savexor.exe “C:\Users\xpoy\Desktop\fd2save\Release\FD2.SAV”
修改存档前先运行一次,修改好了,再运行一次就可以放回游戏试验了