`
谁解怨妇心
  • 浏览: 27335 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Gift汉化相关

阅读更多
    虽然大概没什么人来看这个blog,但还是要稍微更新一下的。
    前段时间被人摆脱去搞gift程序的破解,结果因为自己深陷数坑,搞了这么久才提出对白。Gift的脚本文件封装在一个pak文件里面再用zlib压缩,于是textdata.z就是脚本文件。自己用zlib写个程序解压后得到的pak文件就可以解包了。
    值得一提的是虽然解压得出PAK文件里面第一个文件头结构就有指出脚本文件的个数,但实际上在后面还是有很多的空字节,因此用一些提取工具来提取会提取出错误的脚本,以下是自己写的提取脚本程序,代码很挫,没错误处理。
#include "windows.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

struct filehead{
	char name[0x30];
	DWORD offset1;
	DWORD offset2;
	DWORD size;
	DWORD unknown;
};

int chr='\\';
char path[256];

int main(int argc, char* argv[])
{
	fstream is("textdata.z.pak",ios::in|ios::binary);
	char *buff=new char [0x1f400];
	is.read(buff,0x1f400);
	filehead *p=(filehead*)buff;
	int i=1;
	while(p[i].size!=0)
	{
		char *pos1,*pos2;
		char *temp=new char [p[i].size];
		is.read(temp,p[i].size);
		if((pos1=strchr(p[i].name,chr))!=NULL)
		{
			GetCurrentDirectory(256,path);
			char *fuck=new char [pos1-p[i].name+2];
			ZeroMemory(fuck,pos1-p[i].name+2);
			memcpy(fuck,p[i].name,pos1-p[i].name+1);
			lstrcat(path,"\\");
			lstrcat(path,fuck);
			CreateDirectory(path,NULL);
			delete []fuck;
			if((pos2=strchr(pos1+1,chr))!=NULL)
			{
				fuck=new char [pos2-pos1+1];
				ZeroMemory(fuck,pos2-pos1+1);
				memcpy(fuck,pos1+1,pos2-pos1);
				lstrcat(path,fuck);
				CreateDirectory(path,NULL);
				delete []fuck;
			}
			
		}
		fstream write(p[i].name,ios::out|ios::binary);


		
		write.write(temp,p[i].size);
		write.close();
		delete []temp;
		i++;
	}
	delete []buff;
	is.close();

	return 0;
}

    提取出来的脚本有两种,一种是scn脚本,一种是tbl脚本,scn内含控制符以及对白,tbl则是对应scn脚本的索引。然后就可以写程序提取对白出来进行翻译了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics