Galgamesisterxsister汉化
这里有一段引言:
有人想把sisterXsister汉化,所以昨天研究了一天,研究出了包装的方法。结果他今天不干了,把结果公布出来,希望能帮到一些人。
不知道这个游戏用的系统叫什么?Crage的崔叫它DenSDK,就用这个名字吧。这种格式的扩展是。dat,文件头为DAF1/DAF2。
先说基本格式。在文件头之后,有一个int1,然后有两个dwords来表示资源的数量。接下来的两个dword是压缩前后索引表的大小,后面跟一个int1,接下来的dword表示第一个文件的起始地址。
但是所有的数字都不是明文,需要用一个dword进行异或,dword由四个字节组成,文件偏移量从左到右分别为20h、25h、2Ah、2Fh。
头后面是索引表,用zlib的uncompress解压,文件长度参数就是头给的两个。解压缩后,索引表的结构比较简单,和上面差不多。下面的每个文件都需要解压缩。
不想打字就给代码,看得懂就打包...
该代码中使用的几个常量与游戏sisterXsister有关,当使用该系统打包其他游戏时,可能需要进行一些更改。我会在相关位置注明。
包程序用的是zlib1.dll如果你不知道怎么用dll,不要往下看。
# include & ltwindows.h & gt
#包含“zlib.h”
#define BASE 0x1c2acb88 //该常量由四个字节组成,文件偏移量从左到右分别为20h、25h、2Ah、2Fh。
#define STARTOFFSET 0x308 //第一个文件的起始地址设置得较大。生成dat后,确保文件偏移前至少有一个00。
int WINAPI WinMain(h instance h instance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
处理hScFile,hFileMap,hFile
BYTE *pcFile,*pcNewFile,*pNewFile,*pNewIndex,* pBuff
字节索引[0x3a 38];//3a38h是原索引表解压缩后的长度,即基常数和文件头开始第六个dword XOR后的结果。
BYTE new indexes[0x3a 38];//这个数还在用,因为包还需要解压缩,长度相对富余。
BYTE * pInd =索引;
内部温度;
int index[4];
if((HSC FILE = create FILE(TEXT(" script . dat "),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,
OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)
return-1;
hFileMap = create file mapping(HSC file,NULL,PAGE_READONLY,0,0,NULL);
PC FILE =(BYTE *)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
pNewFile = pcNewFile =(BYTE *)global alloc(GPTR,512000);
pNewIndex = NewIndexes
memcpy(pNewFile,pcFile,0x 30);//30h是指头部的大小,应该不会改变。
pNewFile+= start offset;
pBuff=(BYTE*)GlobalAlloc(GPTR,128000);
temp = 0x3a38
解压缩(索引,(ulong *)& amp;temp,pcFile+0x30,0x2ca);//2cah的获取//与上面3a38h的获取相同,BASE与第五个dword进行异或。
index[0]= 0x 1 C2 acbac;//这是解压缩后的索引表的第一个dword,没有更改过。
for(int I = 1;我& lt=46;I++) //46是文件数,是BASE和第三个dword异或的结果。
{
pInd+= 20;
if((hFile = create filea((LPCSTR)pInd,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)
{
index[1]= *(int *)(pInd-16);
index[2]= *(int *)(pInd-12);
index[3]= *(int *)(pInd-8);
memcpy(pnewfile,(index[1]^base)+0x2fc+pcfile,index[2]^base);//2fch是BASE与第八个dword,也就是原脚本的第一个文件偏移量异或的结果。
*(int *)pNewIndex = index[0];
pNewIndex+= 4;
*(int*)pnewindex=((pnewfile-pcnewfile-startoffset)^base);
pNewIndex+= 4;
*(int *)pNewIndex = index[2];
pNewIndex+= 4;
*(int *)pNewIndex = index[3];
pNewIndex+= 4;
*(int *)pNewIndex = 1;
pNewIndex+= 4;
memcpy(pNewIndex,pInd,16);
pNewIndex+= 16;
pInd+= 16;
pnewfile+=index[2]^base;
}
其他
{
ReadFile(hFile,pBuff,128000,(lpd word)& amp;temp,0);
close handle(hFile);
index[3]=temp^base;
压缩(pNewFile,(ulong f *)& amp;temp,pBuff,temp);
index[2]=temp^base;
for(int j = 0;j & lt4-温度% 4;如果j++) //小于4整数倍,补0xCC。
{
*(pNewFile+temp+j)=(BYTE)0x cc;
}
index[1]=((pnewfile-pcnewfile-startoffset)^base);
memcpy(pNewIndex,Index,16);
pNewIndex+= 16;
*(int *)pNewIndex = 1;
pNewIndex+= 4;
memcpy(pNewIndex,pInd,16);
pNewIndex+= 16;
pInd+= 16;
pNewFile+= temp+4-temp % 4;
}
}
temp = 0x3a38
compress(pcNewFile+0x30,(ul onf *)& amp;temp,NewIndexes,temp);//索引表压缩并修正头。
*(int*)(pcnewfile+16)=temp^base;
*(int*)(pcnewfile+28)=startoffset^base;
hFile = create FILE(TEXT(" script 1 . dat "),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,pcNewFile,pNewFile-pcNewFile,(lpd word)& amp;temp,NULL);
close handle(hFile);
UnmapViewOfFile(PC file);
close handle(hFileMap);
close handle(HSC file);
global free(pBuff);
global free(pcNewFile);
返回0;
}
就这样...有问题再问。
澄空2009年7月帖子
原帖不再贴,成空没有账号进不去。