传颂之物 虚伪的假面 汉化技术
作者:銀の契约者 时间: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