Onscripter移植笔记(以SFA引擎的ツクモノツキ为例)

本文详细记录了将基于SFA引擎的Galgame资源和脚本移植到Onscripter的过程,涉及素材提取、语音压缩、图片处理、脚本结构分析及转换等多个步骤。作者通过Perl脚本实现了从SFA到Ons的转换,并分享了遇到的问题及解决方案,旨在为同类移植工作提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于百度空间下线,暂且将东西转移到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,怎么得到基名,怎么去掉扩展名也不知道。。

另外还有按钮图片,SFA引擎图片的动画分隔是纵向的,如图:

要改成这样:

抽出所有这种形式的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。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值