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月帖子

原帖不再贴,成空没有账号进不去。