Skip to content

Commit

Permalink
2024-07-28:《女神异闻录Q2 迷宫电影院》汉化笔记
Browse files Browse the repository at this point in the history
  • Loading branch information
Xzonn committed Jul 28, 2024
1 parent 894b5ec commit 5627bf8
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 15 deletions.
28 changes: 14 additions & 14 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
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)
algoliasearch (1.27.5)
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)
Expand Down Expand Up @@ -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)
Expand All @@ -110,4 +110,4 @@ DEPENDENCIES
webrick (~> 1.8)

BUNDLED WITH
2.5.6
2.5.16
2 changes: 1 addition & 1 deletion _includes/video.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{ include.blank }}<div class="video">{% if include.youtube %}
{{ include.blank }} <div class="youtube-video"><iframe class="youtube-video-iframe" src="https://www.youtube.com/embed/{{ include.youtube }}" title="{% capture _default %}{% t video-player-youtube %}{% endcapture %}{{ include.title | default: _default }}}" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy" ></iframe></div>{% endif %}{% if include.aid or include.bvid %}
{{ include.blank }} <div class="bilibili-video"><iframe class="bilibili-video-iframe" src="https://player.bilibili.com/player.html?{% if include.aid %}aid={{ include.aid }}{% elsif include.bvid %}bvid={{ include.bvid }}{% endif %}{% if include.page %}&page={{ include.page }}{% endif %}" title="{% capture _default %}{% t video-player-bilibili %}{% endcapture %}{{ include.title | default: _default }}" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>{% endif %}
{{ include.blank }} <div class="bilibili-video"><iframe class="bilibili-video-iframe" src="https://player.bilibili.com/player.html?autoplay=false&{% if include.aid %}aid={{ include.aid }}{% elsif include.bvid %}bvid={{ include.bvid }}{% endif %}{% if include.page %}&page={{ include.page }}{% endif %}" title="{% capture _default %}{% t video-player-bilibili %}{% endcapture %}{{ include.title | default: _default }}" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>{% endif %}
{{ include.blank }}</div>
44 changes: 44 additions & 0 deletions _posts/2024-07-10-Persona-Q2-Chinese-Localization.md
Original file line number Diff line number Diff line change
@@ -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公司开发的[<span lang="ja">ハミング</span>](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`中原有的文件一起打包,生成补丁。

0 comments on commit 5627bf8

Please sign in to comment.