皇牌空战3 汉化说明 - 基本实现方式
aikika
编辑于 2025年04月17日 10:50
收录于文集
共7篇

汉化AC3的契机是,某日在冲浪时发现AC3有现成的拆包工具,而且AC3汉化比较特殊,对于对话,菜单以及各种资料条目,数据上不是以文本类型进行储存的,而全部是图片,是的,AC3连对话在内的所有文字都是写在一张张图片上,游戏程序读取这些图片后分割显示各行文字。

想汉化,把这些图片上的字换成中文就行了,三个字概括AC3汉化就是:改图片。所以本文虽名为技术篇,但实际并没有什么高深的东西。

拆解文件

拿到ISO后查看目录:

AC3所有的贴图,包括含有文本的图片,各地图场景的3D贴图,菜单,人物头像,以及飞机提示的各个语音等等都放在那个90MB大小的ACE.BPB里面,这个文件在CD1和CD2里面完全一致,因此只需修改一个,另一个直接复用。两张盘有区别的地方在ACE.SPH,这里面装的是配音音频和过场动画视频。

由于在大概十年前AC3就开始了英化工作,所有有现成的BPB文件拆包工具,而其中的loadwordteam组开源了其AC3文件处理工具ac3es-tools:https://github.com/loadwordteam/ac3es-tools

功能包括拆包BPB文件,解压ULZ文件,拆包bin文件,以及反过来的压缩,再打包,这是一套python写的命令行工具,并且做成了包的形式,可以通过pip install .安装到本地python环境。

(做英文化的有两个不同的组织,对应的英化版也有两个,loadwordteam是其中一个)

拆解过程大概是这样:

了解TIM

ACE.BPB拆包完可以得到18000多个TIM图片文件以及若干其他文件,但是大部分是场景贴图,飞机贴图之类的,真正带字的大概几百个的样子,数量不大于1000,AC3的汉化实际就是修改这些图片。

TIM是索尼给PS1开发的专用图片格式,谷歌搜到TIM的文档了解了一下,很像BMP,按照颜色深度分成4、8、16、24BPP,其中4和8位TIM带CLUT,就是调色板,图片数据部分储存索引,AC3绝大部分文字图都是4bpp,单个图容量很小,只有少数百科的图片是8bpp。

16和24位的TIM则是直接储存具体颜色,AC3只有几个动画的字幕文件用到了24bpp,这种TIM最容易修改,因为根本不用管调色板,和现代修改图片的方法一样,改了保存成原格式就行。

与BMP最大的不同在于,TIM的文件头里面储存了显存坐标信息,其中4和8位的包括图片坐标和调色板坐标,而24位只有图片坐标。PS在工作时,显存会有一个类似画布的东西,图片、调色板等资源会摆在画布上面,TIM的坐标就是记录自己在显存的摆放位置。这个坐标很重要,如果错了会造成游戏画面显示异常,效果大概是这样:

在TIM文档的基础上,首先自己实现了一个TIM工具,主要是可以预览TIM和查看调色板、TIM信息,以及修改显存的坐标。

另外,集成ac3es_tools的功能到图形界面,把一堆需要敲几次命令的繁琐操作做成一键化。最后仿照游戏里的Data Swallow将其命名为AC3TIMSwallow。

https://github.com/Ailyth99/AC3TimSwallow

字体的选择

对话文字

对于原版的皇牌空战3,其大部分字体是某种圆体字。比如和这个1993年推出的“スーラ Pro DB”很像

游戏里面的字体(原始分辨率过低,细节只能靠脑补):

不过到底是哪个也不重要,主要是要找到一个中文字体和这个接近的,最后选了开源的寒蝉全圆体,字重bold。(https://github.com/Warren2060/ChillRound)

实际在游戏中的表现:

不过鉴于某些PS游戏独特的性质..字体还不能直接拿来用,拿AC3来说,他实际输出的画面和机器内部处理的画面有区别,简单的说,就是实际显示的画面被拉宽了:

其实AC3所有美术素材都是这样,最终显示时需要拉宽。

所以,如果用原版的字体,把它嵌入图片,那么实际显示时,字就会变扁:

对比原版

需要想办法,把整个字体按照画面拉伸的比例进行改动,正好,以前用过python的一个字体库fontTools,用它可以改每个字符的宽度,把原字符的原始宽度×0.5475就行了,最后获得一个新的“瘦寒蝉全圆体”:

放进游戏就会发现拉宽后就正常了

由于AC3为了保持字体和自己精心设计的用户界面的风格统一,没有采有大部分PS游戏都用的点阵字体(大部分是11*11px),比如这些

而点阵字体在低分辨率的情况下,文字的可读性可以得到保证,显然AC3是牺牲了这一点。但也不是说不能用非点阵字体,但前提是要字号足够大才行,这样才能保证字体的显示效果和可读性,但AC3的字号也不够大。

不过为了保持原始游戏的风格,汉化时还是使用了类似的字体并保留边缘过渡效果,毛糙感也和原版一样,如果加上滤镜的话效果会好一些。

无线电字幕

如果说对话的字号不够大,那任务中的无线电通话字幕更极限,这里的字体还是用了圆体字,还加了边缘过渡,文字高度高达10px,这种情况下一些笔画多的字直接粘成一坨了:

任务的字幕又是自动出现和关闭的,持续时间很短,加上任务时玩家注意力更多的放在了游玩画面,所以这里字幕首先保证的是易读性,让人可以在极短时间内阅读完毕。所以我改成了点阵字显示这部分

具体用的点阵开源字体是缝合像素,这个字体恰好能卡住游戏这里的像素高度而保持字形,确保显示效果。

Fusion-pixel:https://github.com/TakWolf/fusion-pixel-font

动态对比(测试用画面,非正式汉化文本)

任务的动画字幕和无线电是同一个来源,因此这部分也一样变成了点阵:

所有这些都是为了保证易读性。除此之外,在飞机选择时,名称用了另一个粗体的略显硬朗的免费字体“创客贴金刚体”,和显示型号的英文字体风格相适应:

文本图片的制作

这部分有现成的工具,在Nemo team做英化版的时候,其中Dashman大佬做了AC3-Text-Editor(https://github.com/DashmanGC/AC3-Text-Editor),主要用于生成一些包含文本的图片,就是对话,资料库用的那种。

不过这个工具不支持生成中文,因为字体是写死的。需要改代码,把瘦寒蝉字体写进去,再重新修改各种间距的参数,参数要一个个实验,和英文字体的间距参数差异很大。这样生成的图片里面的文字能够被游戏程序正确的分割显示。

这个文本图片生成工具的方便之处在于,他可以按照游戏里面固定的调色板输出BMP,这点很重要,如果不是原版调色板,显示可能出问题。因为这游戏有一种TIM是双调色板,需要靠不同的调色板切换来表示不同的文字内容,一张图存两份内容,相当节省资源:

因此,如果调色板不对,那么生成的TIM无法达到这种切换的效果。

这就需要在把BMP转TIM的时候保留BMP的调色板,有现成的IMG2BMP工具(https://github.com/Lameguy64/img2tim),但是这个工具转成TIM后的调色板会做调整,和原始的不一样。因此要自己弄一个函数去实现BMP2TIM,然后保留原始调色板。

给AC3TIMSwallow弄了个处理这种图片的功能,实现快捷组合两个BMP,并生成最终的TIM,也可以再压缩为ULZ。

这样得到一个中文的双调色板TIM

把做好的文本图片,压缩为ulz格式,放到原始位置就好了。

菜单的修改

AC3的用户界面是游戏中虚构的操作系统“DATA SWALLOW”的界面,如果要说是哪种风格,那复古未来retro-futurism是最适合,玩家会带入主角的视角去体会这个操作系统,和之后的皇牌空战游戏界面设计理念完全不同,很多元素是纯展示性质。

为了保持原风格,菜单的很多装饰性的英文不会去汉化,玩过AC系列的玩家应该都知道,这系列的界面本来就包含大量英文,AC7作为系列第一款官方中文,其中也保留了一堆英文内容。

但是一些具有明显指示信息的内容还是汉化了,比如记录游玩数据的部分,日版原版也全部是英文:

汉化菜单的工作,基本上就是螺蛳壳里做道场,因为大量图片素材的分辨率极低,低到可以直接数像素的地步。比如这个启动画面的文字为88*12px

只能用点阵字,而且不能左右压缩太多,不然像素点会挤在一起,无法维持文字的形态。

实际显示到游戏的效果(右下角)

菜单很多TIM图片的调色板也要和原始的一致,不然可能出问题。还有一点值得注意,PS1在处理tim时,会把黑色(0,0,0)当做透明处理,所以要避免改的图片使用黑色,比如把字颜色变成#000000,那样进游戏会发现,字镂空了..

因为黑色变透明了,这种情况需要把纯黑色改成别的肉眼看不出来,但又不是#000000的颜色,比如#​050505这样的黑色.

改好的菜单元素的图片,放进原来的文件夹,由于南梦宫的压缩方法ULZ不支持压缩多个文件,所以需要用之前的工具,把整个文件夹封包为一个bin,再压缩为ULZ,最后覆盖原始的ULZ。

重建镜像

这部分就简单了,按照之前拆包的那张图,把文件全部按照原始位置导入,该打包bin的就打包,该压缩为ulz的就压缩。最好整个打包成一个新的ACE.BPB,用psx-mode2这个命令行工具,专门给PS1镜像替换文件的:https://www.romhacking.net/utilities/848,替换原镜像中的ACE.BPB,生成新镜像。最后写个批处理,把重打包BPB和重建镜像整合在一起进行操作,这样更高效。

其他

由于所有场景和飞机贴图也能一并导出并修改,因此理论上也可以修改飞机的贴图

或者场景贴图,做出一些自定义内容,不过我没试过改这些,感兴趣的可以试试。

-END-