脚本的编码转换

免转区的实现

先用GARbro去查看所有封包,确认哪些封包存在了脚本文件,然后解包的时候这些封包全部都要解,然后再将所有的脚本文件移出来

解出来之后,在游戏目录下搜索脚本格式,常见的脚本格式为:

.asd

.func

.tjs

.ks

.txt

.ini(desktop.ini除外)

.csv

将所有能搜索到的脚本文件复制一份出来备用,然后新建文件夹将所有脚本文件移进去,打开emeditor

然后导入所有的脚本文件,并将所有的脚本文件指定编码保存为UTF-16LE 有签名,然后保存,再将这个新建文件夹命名为patch然后打包

将这个刚打包好的patch.xp3丢到游戏目录下,然后直接打开游戏,仔细测试每一个部分有没有出错

报错可能会有比较多的类型,比如立绘无法加载的问题

这个时候直接找到Initialize.tjs,然后往下翻,找到所有句末带有立ち絵フォルダ的脚本,有多少句就复制多少句

然后将一整段定义立绘的脚本复制粘贴到Config.tjs的// Config.tjs - KAG 設定上面

// Config.tjs - KAG 設定
// Copyright (C) 2001-2007 W.Dee and contributors 改変・配布は自由です
;global.config_version = "3.32 stable"; // この行を消さないでください

保存之后再打包成patch.xp3放在游戏目录下,打开游戏去确认是否解决问题

压缩ks/tjs

当你解包之后,发现脚本文件不能解析成明文,什么编码都没法显示出来字符

打开WinHex,将脚本文件拖进去,看文件头是否写了TJS 2100,如果是的话那么脚本为tjs2;如果没有的话,那么脚本可能是被压缩过了

非tjs2脚本,仅为压缩过脚本时,可以用KrkrTextDecryption.exe将被压缩的脚本解析成明文,用法也是将脚本文件拖动到exe上面打开,稍后就会在KrkrTextDecryption.exe的目录下生成ks.out/tjs.out的解析后脚本

CSV修正

当发现plugin文件夹里出现了csvParser.dll这个插件的时候,处理起来就会稍微难一些

搜索名为Override.tjs的脚本,打开之后可以发现第一句就是Plugins.link("csvParser.dll");,然后我们将下面这一段覆盖掉原来的Plugins.link("csvParser.dll");

Plugins.link("csvParser.dll");
with(global.CSVParser) {
.origParseStorage = .parseStorage;
.parseStorage = function (filename, utf8) {this.parse([].load(filename).join('\n'));} //for utf-16 CSV
.intStorage = function (filename) {this.StorageBuffer = [].load(filename); this.StorageBuffer.reverse();};
.getNextLine = function () {
if (this.StorageBuffer!==void) {
var retData=this.StorageBuffer.pop();
if (retData!==void) return retData.split('\t');
}
};
};

如果发现还是没有加载出来立绘的话,一般就是路径问题导致的,这一个问题将会放在实战演练中以图文的形式讲解

像Hulotte的俺の恋天使がポンコツすぎてコワ~い,对话框里面有头像的,然后plugin里面也有csvParser这个插件

当你改动了其他脚本的编码打包之后,会发现对话框的头像不显示了

原因其实就在于system里面的charData.csv,它只认Shift-JIS编码

想改动其实也很简单,直接搜索全部脚本文件中的initStorage,然后就可以看到以下脚本

function CharDataInit()(
var csv = new CSVParser();
csv.initStorage("charData.csv");

根据GitHub上的manual.tjs所写,如若是true就可以开启csv读取UTF-8的功能

那么更改范例如下:

function CharDataInit()(
var csv = new CSVParser();
csv.initStorage("charData.csv,true");

贴出一个GitHub的链接,是已经被修过的csvParser插件,有兴趣的可以自己看看:https://github.com/crskycode/csvParser

文本编辑与修改

一般是三种格式,前两种格式比较常见

.ks

.scn

.txt

ks的脚本基本上就不需要什么其他的处理,除了压缩过的需要Decryption成明文

.scn就比较多样,工具也非常多,像Marcus André(GitHub ID:marcussacana)写的KrKrZSceneManager、UlyssesWu写的FreeMote等等都可以处理成可修改状态

KrKrZSceneManager的release更新截止于去年的3月份,本身就支持中日英三种语言(没能让NeXAS的那个也支持中文实在是遗憾),使用方法也是非常的一键自动化;右键open file选中需要修改的scn脚本,修改完了之后再右键save file保存到其他位置(如果保存在原脚本位置会覆盖掉)

修改完的脚本习惯性保存编码为UTF-16LE 有签名

特殊图片格式的处理

大部分的图片都是用的png和bmp格式,区别无外乎就是加密与非加密

但有些游戏用的格式就比较奇葩,比如pimg、psb以及TLG,但处理起来其实也是非常简单的,多走一两步的步骤而已

关于pimg的解包与封包工具,FreeMote里面就有,可以去GitHub上下载,批处理程序非常简单

然后TLG就更加简单,可以去找开发工具包里面的krkrtpc.exe,这个工具就可以实现图片格式的转换,非常方便

可以看到有些什么TLG5、TLG6之类的选项,如何判断TLG图片的后缀数字也是非常简单,将TLG文件拖进WinHex里面查看文件头

通常都会有TLG0.0开头,然后不远处又跟了一个TLG5.0/6.0,根据这个数字去选哪个带有α通道的TLG选项就行了

字体修正思路

kikiri2

如果修改完文本之后进行测试,出现对话框内字体大小粗细不一致的情况

打开WinHex,将游戏的exe拖进去,快捷键Ctrl+Alt+X搜索十六进制数值,搜索C6431780,然后将80改成86,保存之后打开游戏就可以看到字体显示效果已经统一

但如果仍然对字体的显示效果不满意,可以到Config.tjs里面看一看,只要开发商没搞什么骚操作,一般字体定义就写在里面可以自行更改

还有一种方法,非常方便快捷,但有没有效果得看你怎么用了

打开first.ks,在最上面加上这两句

[mappfont storage="字体名.tft"]

[font face="字体名"]

font face可以随便填,但上面的字体名.tft一定要严格对应

保存之后将tft字体文件和first.ks一起打包成patch.xp3放在游戏目录下

kirikiriZ

1.font文件夹内无embfontlist.tjs或其他tjs控制

先试着在tjs脚本里面搜索font,看看能不能跟到字体定义的地方

仅适用于ttf/otf字体:如果嫌麻烦,可以直接将所有字体文件替换为自己下载下来的免费可商用字体(风险较小,免得到时候被人抓马脚)

当字体文件格式为tft时,则使用开发工具包里的krkrfont.exe制作tft字体,注意字号大小

2.font文件夹内有embfontlist.tjs控制

这种情况三言两语比较难说清楚,将会在之后放在实战演练中以图文的方式讲解


闲暇的时候会研究一下