传颂之物 虚伪的假面 汉化技术

作者:銀の契约者 时间:2017-05-21


文中已PS3版为例(PSV版高低位不同,其他没什么区别)

首先解 sdat 文件,使用ps3的 make_npdata 可以解出(psv版跳过这个步骤)


-------------------------------------------------------------------


数据以 Filename 开头的包解析


8字节 文本 标识

4字节 整数 包内文件名区域大小(包含前面的12字节 实际大小需要4字节对齐)


4字节 整数 文件名位置

...

然后跟着文件名

...


8字节 文本 标识

4字节 整数 索引大小

4字节 整数 索引数量


4字节 整数 数据位置

4字节 整数 数据大小

...

后面跟着数据内容


------------------------------------------------------------------


fnt 字库文件


8字节 文本 标识

4字节 整数 码表大小(实际大小要4字节对齐)


4字节 整数 文字像素大小 ps3=32  psv=24

4字节 整数 文字数量


4字节 整数 UTF8编码的数值

4字节 小数 文字的 x坐标      x=图片宽度*数值

4字节 小数 文字的 y坐标      y=图片高度*数值


...


后面是 tex图片格式 后面说明

经过测试 ps3极限是 4096*4096 图片超过就死机 也就是 字库最大能容纳 16384 个字,汉化足够了


---------------------------------------------------------------------


tex 图片(内置多种格式 很棘手)


hex 21022000 开头的


4字节 整数 标识

4字节 整数 大小

4字节 整数 图片宽度

4字节 整数 图片高度


后面的数据用 dex5 解压 可转png


--------------------------------------


Texture 开头的


8字节 文本 标识

4字节 整数 参数位置(Parts 开头)

4字节 整数 图片类型


4字节 整数 大小

4字节 整数 宽度

4字节 整数 高度


根据类型  

有直接就是 png的图片  直接保存就是了

有 经过 lz77 + dxt1 后可转png

有 经过 lz77 + dex5 后可转png

有 其他格式未继续研究


Parts 开头

可以将图片内的素材切出


8字节 文本 标识

4字节 整数 大小

4字节 整数 数量


4字节 小数 坐标x

4字节 小数 坐标y

4字节 小数 宽度

4字节 小数 高度

4字节 小数 坐标x1

4字节 小数 坐标y1

4字节 小数 坐标x2

4字节 小数 坐标y2


...


-------------------------------------------------


lz77


4字节 文本 标记

4字节 整数 原大小

4字节 整数 和算法有关

4字节 整数 头大小


得到2部分的数据 传入算法解压


void lz77_decompress(BYTE *out_data, BYTE *in_first, BYTE *in_second, DWORD in_len)

{

DWORD i = 0;

BYTE flags = 0, len = 0;

BYTE *data = 0;


do

{

if (0 == i)

{

i = 8;

flags = *in_first;

in_first++;

}


if (flags & 0x80)

{

len = *(in_second + 1);

if (-3 != len)

{

data = out_data - ((len | ((unsigned int)*in_second << 8)) >> 8);

len += 3;

do

{

*out_data = *data;

out_data++;

data++;

len--;

}

while (len);

}


in_second += 2;

}

else

{

*out_data = *in_second;

in_second++;

out_data++;

}


flags *= 2;

in_len--;

i--;


}

while (in_len);

}


---------------------------------------------------


dxt压缩算法

是通用的网上能找到


---------------------------------------------------


乱码图片解析

ps3版本大部分图片都解出了

但是有几个图出了个情况 看上去像雪花点 完全是乱码

虽然只有几张,但碰巧那个图是必须汉化的。


经过研究


图片像素点排列格式


1 2 3 4


变成


1 2

3 4


-------


1 2 3 4 5 6 7 8


变成


1 2 5 6

3 4 7 8


-------


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


变成 


01 02 05 06

03 04 07 08

09 10 13 14

11 12 15 16


-------


规律就是这样子,重新排列后显示出正常图案


-----------------------------------------------


游戏文本

没有去研究格式。直接暴力导出 导入。缺点是 汉化文本不能超出原文长度


-----------------------------------------------


JIS转UTF8

EBOOT内,存在编码转换表,格式为:

2字节(sjis)

2字节(euc-jp)

4字节(utf-8)

2字节(ucs-2)

2字节(未知)


-----------------------------------------------

psv 汉化插件源码 https://github.com/hz86/mask_of_truth