汉化教程: ps3闪之轨迹破解和汉化例程

转载自:http://tieba.baidu.com/p/2768824631?pn=1

1、闪之轨迹的下载

下载完解压后,你会在闪轨的游戏文件里发现一个名为“data.psarc”的好东西,这就是闪轨的资源文件包。

2、data.psarc的解包
*.psarc是在ps3上常见的一个通用打包格式,其目的是为了防止零散文件造成的读取和存储效率低下的问题。使用PSARC-Tools就能很轻易的完成对他的拆包操作,相关程式网上各种分布。解包完毕后你就会看到我大闪轨的真身了。
                      

3、pkg的解包
通过第二步解包粗来的尽是些奇葩的pkg,显然我们无法直接调戏这些文件。就凭法老控的尿性,比如scena.pkg里那必须有我们想要的妹子……呃……文本了。那么这个pkg需要如何解包呢?按照汉化碧轨的经验,把pkg拖到UE或者WinHex里一看就明白了。有人会很兴奋,妈蛋你看这不就是明文么?呵呵呵呵呵,如果我没猜错的话,这应是falcom自己脑洞大开想出来的一个格式吧……

略懂霓虹语的同志应该明白,这里的明文是不完整的,其间似乎被“过滤”了什么?

回到pkg文件的开头,我们发现这里依照某种方式排列着这个文件包中保存的文件信息。

这里先给大家分析一下头部索引的含义:
pkg文件最开始的4个字节对我们的解包没用,无需关心。后四个字节表示的是文件包中文件的个数(采用低位在前高位在后的保存方式)。
比如scena.pkg,说明了里头保存有0x00000142个(十进制=322个)的文件。


之后的0x0142*0x50的区间就是文件索引的保存区域了,正如这里提到的一样,每个文件用了0x50个字节来进行记录。我们把这0x50个字节成为文件索引(划线部分),其含义如下:

蓝色部分(64字节)表示文件名,ASCII码哦。
红线部分(4字节)表示这个文件的真实大小,单位是字节。
黄线部分(4字节)表示这个文件在包中的大小,单位是字节。
绿色部分(4字节)表示这个文件在pkg包中的起始偏移地址。
黑色部分(4字节)表示压缩类型。压缩类型下面会具体说明。

这里的压缩类型目测是有三种:
00 00 00 00,这种称为未压缩类型,也就是文件的确是以明文方式保存在pkg中,直接提取即可。
01 00 00 00,这种被我称为F*ckFalcom压缩标记,表示文件经过了F*ckFalcom的算法压缩。
03 00 00 00,这种被我称为F*ckFalcomEx压缩标记,表示文件经过了F*ckFalcom的算法压缩,并在头部放置了意味不明的4个字节(做校验?)。

F*ckFalcom压缩算法如下:
头部有11个字节被定义成了压缩参数。前4个字节是解压后大小,单位字节;后4个字节是压缩体大小,单位字节;最后3个字节是压缩指针预定义。处理完毕压缩参数后,解压过程开始读取压缩体,以流的形式“排列”在内存中。解压过程从头依次遍历数据流,当读取到的字节与上面提到的压缩指针预定义的第一个字节相同时,继续读取后两个字节(我们这里按顺序定义这两个字节为ROLLBACK/COPY),并启动解码子过程,否则原样输出到输出流中。解码子过程会将输出流末尾往前ROLLBACK字节处复制COPY个字节的内容直接输出。如此反复,直到文件处理完毕。简单编写代码后,得以顺利解压所有pkg文件:

(这里要补充一下压缩指针会遇到的一个特殊情况:ROLLBACK>指针的第一个字节时含义会有所不同。此时ROLLBACK在输出流中回滚的数字要少1)



再读取看看,齐活儿了~

现在,我们已经能完全弄到文本进行汉化了。


4、字库的处理
首先我们必须明确字库在哪里?fonts.pkg长得就像字库,解压他吧。解压后获得fonts.itf文件,这个就是这回闪轨的字库。拖到CT里一看,呵呵呵,和碧轨的字库还略有几分相似,但是Falcom肯定又做了手脚,不然怎么能适应PS3的“高”分辨率?

字库采用GBA 4bpp的颜色制式,该制式用4bit表示一个像素点,调色板(实际上是调透明度板?)无反转,无倒序,直接与bit相关,第一个颜色表示100%透明,第16个颜色表示100%不透明,其他颜色透明度依次递减。每字节所表示的像素点位置高4位在右,低4位在左。不过按照这样的设置,在CT中仍然无法调出字模,因为我没告诉你字模的宽度和高度,哈哈哈哈哈。

(PS:开头指针跳跃的地点就会指出该字的宽高跟位置后面接的就是该字,然后顺序是用日文 unicode排列,研究到这跟解密后就没研究phyre了)

字模有三个很重要的参数,起始偏址、高度、宽度。在闪轨的字库中,这三个参数是动态的,而且要经过两次的计算才能得到。

5、图片的处理
字库搞定之后汉化就简直不是个问题,为了完美汉化不被喷,处理图片素材尤为重要。闪轨的图片藏在phyre后缀的文件里,一看到这个字符我就开心,这玩意儿是骚尼开源的一个图像处理引擎。我在这里是把phyre导出成两类文件,一类是dds文件,另一类是png文件。DDS没见过的童鞋不用担心,网上有大把的工具可以把dds转换成带透明通道的png或者bmp。比如DXTBmp之类。
phyre -> dds的导出过程非常简单,甚至无需通读phyre引擎的源码,常见的一个算法(或者叫拮取)过程如下:
step1、创建DDS头

(以下代码COPY自国外大神asmodean)

struct DDSHDR {
uint8_t signature[4]; // "DDS "
uint32_t unknown1;
uint32_t unknown2;
uint32_t height;
uint32_t width;
uint32_t length;
uint32_t unknown3[15];
uint8_t type[4]; // "DXT1" etc
uint32_t depth;
uint32_t unknown4[9];
};

DDSHDR ddshdr = {
{ 0x44, 0x44, 0x53, 0x20 }, 0x0000007C, 0x000A1007, 0x00000000, 
0x00000000, 0x00000000, 0x00000000, 0x00000001, 
0x00000000, 0x00000000, 0x00000000, 0x00000000, 
0x00000000, 0x00000000, 0x00000000, 0x00000000, 
0x00000000, 0x00000000, 0x00000000, 0x00000020, 
0x00000005, { 0 }, 0x00000000, 0x00000000, 
0x00000000, 0x00000000, 0x00000000, 0x00401008, 
0x00000000, 0x00000000, 0x00000000, 0x00000000, 
};
step2、读取Type到DDSHDR.TYPE,该Type在碧轨中要么是DXT5,要么是ARGB(8)。
step3、设置宽度和高度,高度分别等于出现DXT5或DXT1字符(设为P)开始往回143/139字节处。
step4、从P往后42字节处开始复制所有的DDS流(通常为文件末尾)即可。
弄好之后,就能看到图片本体了。

闪轨中除了这种简单的DDS之外,还有一种经过混淆的PNG算法这个算法在phyre引擎中是有代码的,位于Core\Platform\Tools目录中,名为PhyreTextureSwizzle.cpp里。我这里就不再赘述,有经验的程序员分分钟就看明白的,毕竟用自然语言描述这玩意儿很吃力。
为了防止大家下载庞大的phyre引擎,我这里也直接贴上这个cpp的下载:pan.baidu.com/s/1b0YBA



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值