由于百度空间下线,暂且将东西转移到csdn。。。
(一)素材的提取和处理
酝酿了半年终于开始摸索galgame的移植了,不知能坚持多久。想着把自己摸索的东西记下来,供以后查阅,如果被别人翻到又对其工作有所帮助,就是幸运之至了。
这里拿《九十九之月》(ツクモノツキ)开刀,完全是个人研究,也没有向汉化组申请授权,直接搬日文的脚本
一、提取
首先要得到PC平台的游戏,一般我喜欢搜游戏名的贴吧,在置顶楼里找资源,另外百度搜索 site:pan.baidu.com[空格][游戏名]也很可能搜到游戏的资源。
接下来就是拆包了。galgame成品的资源和脚本几乎都是打包的,不同公司的作品,不同引擎,资源包的格式也不一样。这里并没有自己写代码拆包的能力,只能靠前人的工作。
比较著名的通用工具有古老的ExtractData,国人写的Crass,以及最近以推倒椎名里绪著名的arc_conv。关于资源提取工具的一个比较详细的索引贴:http://tieba.baidu.com/p/2138930285。有些著名的引擎,这些工具可以直接提取,例如Nscripter和手机上的Onscripter引擎,游戏的资源文件打包的文件名为arc.nsa;吉里吉里的data.xp3。很多工具通过插件运作以识别和提取不同引擎对应的资源文件,一些比较新的游戏要用这些工具提取,可能需要搜索插件。
另外还介绍一个网站http://asmodean.reverse.net,可以找到各种公司、引擎对应的游戏解包的源代码和工具,目前仍在更新,有兴趣的读者也可以下载下来研究,成为新一代大神~还是那句话,善用搜索工具,前人做过的事放出了资源尽量找,重新发明轮子是很糟糕的事。╮(╯▽╰)╭
九十九之月的游戏目录下有grp.aos(graph,图片), cv.aos(Character Voice,配音), bgm.aos(background music,背景音乐), se.aos(sound effect,音效), scr.aos(script,脚本)这几个文件。用不同工具尝试后,arc_conv效果最好。用Crass也能提取,但是得到的文件名被重新编号,不能保持本来的名字。估计arc_conv的原理是首先扫描要拆包文件的目录,上传到服务器端判断这是什么游戏,然后得到方法拆包(从断网后发现不灵了提出的假设,也可能不是这样)。
于是得到了各种资源,加起来有几G,如果直接用这些资源我的充话费送的低端安卓机是跑不动的,如果别人这么做,我的小水管也是拖不下来的_(:з」∠)_所以需要压缩。。。
二、语音的压缩
于是需要压缩。。首先拿人物语音开刀。语音都是ogg格式,采样率44100kHz,码率92kbps。按照大计基课的说法,人声采样率8kHz,电话未压缩时传输码率64kbps,又参照之前下载的几个Ons移植游戏,决定输出设置为采样率44100kHz,码率32kbps。首先用格式工厂弄,可是格式工厂导出单声道ogg老是失败;后来又下了一个名为xrecode的批量音频转码的工具,可这货会事先载入每个选中文件的详细信息,一万多个文件啊,就卡在那里了。遂用ffmpeg命令行下直接转换。ffmpeg是用的小丸工具箱里自带的。ffmpeg是一个非常强大的音视频转码与混流软件。
批处理如下:
@echo off
echo ======================
echo 批量语音压缩
echo 将此文件放在ogg文件所在的同一个文件夹下
echo 确认ffmpeg.exe和本脚本处于同一级目录下,或者ffmpeg已在PATH中!
echo ======================
for %%a in (cv~\*.ogg) do ffmpeg -loglevel error -y -i "%%a" -vn -acodec libvorbis -b:a 32k -f ogg "cv/%%~na.ogg"
echo 编码转换已经完成,请检查转换后的文件是否正确
echo 转换后的文件在cv中。
pause
效果是多出一个cv_low文件夹,里面是经过压缩,码率变为32kbps的语音文件
三、图片的转换与压缩
Crass转码得到的清一色的bmp文件,但是文件名都丢失了,这不是我们想要的。arc_conv拆包出来有bmp和tga文件,还有后缀名为msk的遮罩文件,实际上也是bmp。这些都是无损的图片,不过分损失质量前提下压缩空间很大。这些文件中,bmp用于背景,可以直接转成jpg;tga用于带透明度的立绘和按钮等,就是bmp的RGB三个通道加上记录透明的alpha通道。
图片格式的转换这里介绍一个软件XnView,“是一款的图像查看程序,自身支持100多种图片格式,安装插件后支持图片格式近500种。”(引自百度百科),支持批量带附加效果转换,支持不受扩展名干扰的文件格式判断。打开软件,菜单栏工具->批量转换,点击“格式”一栏的“选项”按钮设置输出格式为转换成质量为90%的jpg,
返回,点击“添加文件”按钮,找到所在目录,在文件名文本框中输入“*.bmp”回车,然后全选上面的文件,确定,这样就选中了所有的bmp,再次点击“添加文件”按钮,这次是用“*.msk”,以把所有的遮罩图片转成jpg
接下来是带透明度的tga了。可以用XnView转成png,保留透明。但是作为无损压缩的png一张图有100多kB大小,估测了下不带OP最后打包的文件会有将近800MB。也许对于土豪们的手机并不算什么,但我还是得为自己的屌丝机着想,把带alpha通道的tga转成Nscripter发明的左边RGB通道右边反过来的alpha通道的jpg,如图:
这里需要首先用到批量文件转换的“变换”选项卡,提取通道,选择alpha,以及负片。选择导出的目录,我这里是原图下新建的mask目录。
然后是漫长的导出。。
接下来要做的就是拼接原图和mask图片,我研究了半天还是不知道怎样用XnView拼接./*.tga和./mask/*.bmp,这样文件名对应的,遂找了个据说日本那边同人游戏常用的一个图片工具(imageUtility,下载地址http://pan.baidu.com/s/1F0pvC,原地址一时找不到了)
这个工具有GUI,可是日文环境直接打开有乱码,apploc打开出错。不过我们用到的是其命令行工具
首先用XnView把所有tga转成bmp,放在./ori/文件夹下
在遮罩所在目录(grp.aos~\mask\)新建一个批处理文件toNsjpg.bat,贴出我的代码
for %%a in (*.png) do F:\ACG\汉化工具\imageUtility059d\imageUtility.exe -FMT,JPG,24,90,1 -OUT,..\result\%%a -CNT,1 ..\ori\%%a %%a
cd ..\result
rename *.png *.jpg
cd ..\mask
F:\ACG\汉化工具\imageUtility059d\imageUtility.exe是我的imageUtility所在位置,需要修改。
我的bat技术也不好,for获取的文件名*.bmp储存到%%1,怎么得到基名,怎么去掉扩展名也不知道。。
抽出所有这种形式的tga,先用XnView转成透明的png,保存至一目录,还是用ImageUtility把每张图片按行切成3等分,再横向组合,新建批处理如下:
for %%a in (*.png) do (
F:\ACG\汉化工具\imageUtility059d\imageUtility.exe -FMT,PNG -DIV,1,3 -OUT,tmp\%%a %%a
F:\ACG\汉化工具\imageUtility059d\imageUtility.exe -FMT,PNG -CNT,1 -OUT,out\%%a tmp\*.png
del tmp\*.png
)
于是此目录下out文件夹里就是转换好的按钮图片了。
这样图像部分也大都处理好了。此外以后翻译脚本过程中碰到Ns难以实现的图片特效,例如黑白等,还需要修图。
四、脚本
脚本需要批量从日文编码转成中文的。网上肯定有“xx转换专家”这样的软件,不过我是用的Perl脚本。以后用到正则表达式的地方多得是,所以python和Perl还是选至少一种学了吧。
在scr.aos~文件夹创建scr.pl,输入以下内容:
use Encode;
use Encode::CN;
use Win32::File;
my @files = <*.txt>;
mkdir 'scr_GBK';
foreach my $file (@files) {
my $attr;
Win32::File::GetAttributes($file, $attr);
my $newfile = 'scr_GBK\\'.$file;
open OLD, $file or die "open $file failed: $!";
open NEW, ">$newfile" or die "open $newfile failed: $!";
while (my $line = <OLD>) {
$line = decode("Shift-JIS", $line);
print NEW encode("GBK", $line);
}
close OLD;
close NEW;
print "$file change to GBK\n";
}
这样就将所有文本转成了GBK编码。新文件保存在scr_GBK目录下。
五、OP
原OP是mpg编码的,文件将近200M。由于Onscripter本身支持的视频编码十分有限,折腾老半天,尝试的结果记下:
视频编码AVC的mp4是不支持的;avi用Ons测试出现崩溃;经过压缩的mpg出不了图画,就连原文件播放也有神奇的声音降调的效果(Nscripter2.96无此毛病),故最终舍掉了OP。