diff --git a/Gemfile.lock b/Gemfile.lock index af6213a..82be19d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algolia_html_extractor (2.6.4) json (~> 2.0) nokogiri (~> 1.10) @@ -10,15 +10,15 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) colorator (1.1.0) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.16.3) + ffi (1.17.0) filesize (0.2.0) forwardable-extended (2.6.0) - google-protobuf (3.25.3) + google-protobuf (3.25.4) http_parser.rb (0.8.0) httpclient (2.8.3) i18n (1.14.5) @@ -68,22 +68,22 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) - mini_portile2 (2.8.6) - nokogiri (1.16.5) + mini_portile2 (2.8.7) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) progressbar (1.13.0) - public_suffix (5.0.5) - racc (1.7.3) + public_suffix (6.0.1) + racc (1.8.0) rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.8) - strscan (>= 3.0.9) - rouge (4.2.1) + rexml (3.3.2) + strscan + rouge (4.3.0) safe_yaml (1.0.5) sass-embedded (1.69.5) google-protobuf (~> 3.23) @@ -110,4 +110,4 @@ DEPENDENCIES webrick (~> 1.8) BUNDLED WITH - 2.5.6 + 2.5.16 diff --git a/_includes/video.html b/_includes/video.html index a31d2c2..b83ae7d 100644 --- a/_includes/video.html +++ b/_includes/video.html @@ -1,4 +1,4 @@ {{ include.blank }}
{% if include.youtube %} {{ include.blank }}
{% endif %}{% if include.aid or include.bvid %} -{{ include.blank }}
{% endif %} +{{ include.blank }}
{% endif %} {{ include.blank }}
\ No newline at end of file diff --git a/_posts/2024-07-10-Persona-Q2-Chinese-Localization.md b/_posts/2024-07-10-Persona-Q2-Chinese-Localization.md new file mode 100644 index 0000000..a82364c --- /dev/null +++ b/_posts/2024-07-10-Persona-Q2-Chinese-Localization.md @@ -0,0 +1,44 @@ +--- +date: 2024-07-10 11:38 +head_image: 5c52b3c327fc15bb18174c55784b4787.webp +head_image_height: 480 +head_image_width: 1200 +info: 格式复杂。 +last_modified_at: 2024-07-28 14:23 +tags: 3DS Atlus 汉化笔记 +title: 《女神异闻录Q2 迷宫电影院》汉化笔记 +--- +《女神异闻录Q2 迷宫电影院》(简称“PQ2”)发售以来已经将近6年了,这期间一直没有汉化。最近经人介绍,我参考了前辈们的经验,研究了一下本作的文件结构,在这里也分享一下我的经验。 + +{% include video.html bvid="BV15m421V7Bt" title="3DS《女神异闻录Q2 新电影迷宫》汉化预览" %} + +## 拆包/打包 +3DS游戏的拆包其实没什么难的,一般情况下要完成汉化只需要修改romfs里的文件,而romfs使用Citra模拟器就能提取,然后只需要利用Luma的重定向补丁功能即可。当然,之所以我说是“一般情况”,是因为本作属于“不一般情况”——首先,部分文本是在可执行文件(`code.bin`)中的,而可执行文件位于exefs里,Citra提取不了,还是需要[3dstool](https://github.com/dnasdw/3dstool)。 + +除此之外,可能是为了节省空间,romfs里只有3个cpk文件,这是Criware的打包格式。这3个文件分别是`data.cpk`、`patch101.cpk`和`patch102.cpk`,其中`data.cpk`是游戏本体,而`patch101.cpk`和`patch102.cpk`是更新文件。更新文件中包含的文件会覆盖游戏本体的文件,而游戏本体有2 GiB以上,更新文件只有几个MiB,所以很容易就想到,可以先把所有的cpk解包,然后筛选需要汉化的文件,修改后统一放到更新文件里,最后再打包,这样可以减小打包的工作量。 + +到这里还算简单,而且打包好的文件放在Citra的补丁文件夹中也能被正常识别,但是——实机运行会死机。分析了一下,既然Citra能运行,说明整个流程是没有问题的;而实机运行会死机,推测是修改后的文件太大了,导致了某种内存溢出。所以,对于实际运行,似乎只能放弃这种方法,改为把所有的文件都放到游戏本体里,然后打包。 + +## 字库 +本作的字库是3DS游戏常见的`.bcfnt`文件格式,这个文件格式处理起来都有现成的工具,我选用了[3dstools](https://github.com/ObsidianX/3dstools),因为这个工具是拿python写的,修改起来比较方便。只不过游戏使用的编码方案是Shift-JIS,而3dstools默认是UTF-16-LE,所以需要稍微修改一下。 + +在字体方面,原版的字体选用了Fontworks公司开发的[ハミング](https://fontplus.jp/font-list/hummingstd-b)系列字体,而方正字库恰好和Fontworks合作开发了[方正FW轻吟体](https://www.foundertype.com/index.php/FontInfo/index/id/4985),可以直接拿来用。略微有些美中不足的就是,方正FW轻吟体的部分字形仍然是日本标准,例如“今”中的点是横着写的,而大陆标准是从左上到右下的点。 + +## 文本/图片 +本作的文本可谓是地狱。这些文本以不同的格式分散在了不同的文件里,而每个文件的后缀名和打包方式也不完全一样,修改起来非常费力。 + +最初我参考了[lraty-li](https://github.com/lraty-li)的方法,采用[Atlus-Script-Tools](https://github.com/tge-was-taken/Atlus-Script-Tools)对游戏脚本反编译后,修改文本再重新编译。但是这样会遇到一些问题——部分脚本反编译出来的结果有问题,无法被重新导入。之后我分析了文件结构,发现并不需要做反编译这件事——因为我所需要的只是修改文本,而不用修改游戏的逻辑。因此,我改用了[PersonaEditor](https://github.com/Meloman19/PersonaEditor),这个工具可以直接修改文本,而不用反编译。 + +除此之外,PersonaEditor还提供了对归档文件解包/打包的功能,这对于汉化来说也很有帮助。前文已经说过,有些文本是被打包进了归档文件中,而通过PersonaEditor遍历文件夹下的文件,可以方便地提取需要编辑的文本,同时也可以导出需要修改的图片。不过,PersonaEditor对于PQ2文件格式的支持不完全,cgfx、ctpx和spr3格式无法支持。而我又懒得重头开始写工具处理,因此我又引用了[Kuriimu](https://github.com/IcySon55/Kuriimu)的库,对这些格式进行处理。 + +当然,还有一些文本是硬编码在`code.bin`里的,还有一些特殊格式的文件,这些文件都可以用python来处理。 + +## 总结 +总结一下,本作的汉化工作主要分为以下几个步骤: + +- 解包`patch102.cpk`,作为补丁包的基底。 +- 采用修改后的PersonaEditor提取需要编辑的文本和图片,并用python脚本处理其他格式的文件。 +- 根据已翻译的文本生成字库,同时生成简体中文汉字到Shift-JIS的映射表。 +- 根据映射表导入文本。 +- 导入图片。 +- 将修改后的文件与`patch102.cpk`中原有的文件一起打包,生成补丁。