星空的记忆HD汉化移植

最后由 Tabing010102 更新于 2023年8月1日

这个事情实际上在三个月前就想做并且尝试着做了,不过当时由于各种原因最后以失败告终。

注:Steam本体已经更新为HD版(商店链接),EH暂时只有英文版

注意:汉化文本没有授权(想授权也找不到原来的那些大佬了)请尊重原汉化组成员的劳动成果,请务必在合法范围内进行操作,由此文章产生的任何问题与作者无关。此外,以下想法都不是我想出来的,我就是个臭copy想法然后xjb折腾的fw。

当时翻了翻GitHub,发现了fvp引擎脚本文件hcb文件(虚拟机代码文件)的编译/反编译器(项目地址),然而这个并不能拆10年前澄空大佬们汉化打包的最终汉化包(本篇 V1.2、EH V1.1,下面称为原版汉化、原版EH汉化),但可以解steam官方中文的hcb(虽然大概也是同一批人搞的),不过steam版的并没有hs汉化(虽然并不是非要有,不过当时感觉对offset好麻烦就放弃了),整到最后也没有整出个所以然来,然后就不了了之了。

三个月后的2021年5月,在无意间水群的时候听说在贴吧上有人出了星空的记忆(下面简称星空)HD汉化移植教程(传送门),简单的看了看,感觉可以再尝试一手,然后就在大创中期答辩啥也不知道、6月初考试啥也没复习的状态下折腾了5天(520-524),最后好歹是能勉强能动了。

首先是原版exe文件的修改(文件版本1.0.0.95),原程序设计只在日文系统中运行,读取hcb文件的字符串时所用的编码为Shift-JIS,虽然这个编码可以显示相当一部分简体中文字符,但终究还是不全,所以我们需要让fvp引擎以中文字符集GBK读取hcb文件(具体为什么选GBK编码,我不是特别懂,不过大概是因为GBK和Shift-JIS编码方式相似吧),在星空HD中我们需要把偏移量0x2C62E处的0x80改为0x86,以此使fvp引擎以GBK编码读取,如图:

接下来,为了不影响原版文件,我们还需要修改fvp引擎读取的文件扩展名,在星空HD中需要把偏移量0x5C5B4处开始的*.hcb文本替换为其他扩展名(这里用的*.hcn),如图:

这样就完成了exe文件的修改。至于星空EHHD或者之后版本更新(上述offset只适用于1.0.0.95),效仿上面的方法修改即可,修改编码可以搜索16进制08516A006A006A006A006880,修改扩展名搜索文本hcb,依次进行替换即可,不过这里的星空EHHD对应offset和本篇相同。

接下来我们需要解析原版汉化hcb的结构以提取对应文本以供移植,一开始提到的开源工具是2015年才有(开源)的,虽然fvp引擎虚拟机字节码分析很早就有了,不过当时汉化组的程序并没有完整地解析hcb文件,而是用了一种很巧妙的方法来规避分析整个虚拟机字节码。澄空大佬的fvp字节码分析:传送门,备份文件:传送门

这里我们需要知道2个字节码的作用及用法,分别为0x06(jmp u32)0x0E(pushstring)jmp后4字节为一个32位无符号整数偏移值offset,整条指令表示无条件跳转至offset处,pushstring后1字节为一个8位无符号整数长度len,接下来len字节为字符串的内容,用伪代码表示可以分别表示为jmp(u32 offset)pushstring(u8 len, char str[len])

原汉化组在汉化文本比原始文本短时使用0x00提前结束字符串,如图:

在汉化文本比原始文本短长时使用jmp指令跳转至hcb文件后增加的pushstring指令,然后使用jmp跳转回正确的位置继续执行,如图:

不过星空EH原版汉化后面添加的pushstring长度没有包括0x00,处理时需要注意。

下面的辣鸡代码可能有部分参考作用:HCBExtractorHCBExtractor3

另:星空EH原版汉化和原始日文hcb的offset不对应,至于各位怎么处理那就请各显神通了。EH需要官方v1.1补丁,和EH原版汉化对应。

接下来我们需要重写编译/反编译器来让他读取UTF-8编码的文件,并识别我们定义的符号(这里为’@’)来使用GBK编码编译。主要需要改parser.cpp文件的insertStrings函数,使用UTF-8编码读取,其中loadScriptUTF8readUTF8函数按照原函数依葫芦画瓢就行了:

结果处理部分检测当前行有没有’@’字符,有的话使用GBK编码,否则使用Shift-JIS编码:

改完之后使用MinGW编译即可(需要QT5环境),修改过的编译/反编译器:项目地址

接下来我们需要把文本替换进HD版的反编译脚本,先转换为UTF-8编码保存,然后将需要替换的pushstring后的文本加一个’@’替换掉,最后编译回去就好了。需要注意各种符号也需要使用GBK编译,否则会出现乱码;还有和资源加载有关的pushstring后文本不可用GBK编码,否则会出现崩溃。

最后我们需要FVPLoader才能正确运行,目前已知Ver0.6可以正确运行,使用方法参见GitHub(项目地址)。

现在可以不需要FVPLoader了:传送门

Views: 548

发布者:Tabing010102

???

加入对话

1条评论

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据