TeamPBCN / Metroid-Samus-Returns

《密特罗德:萨姆斯回归》汉化项目/Metroid: Samus Returns (Nintendo 3DS) Chinese fans localization project.
GNU General Public License v3.0
18 stars 3 forks source link

关于字库生成问题 #5

Closed Hambaka closed 2 years ago

Hambaka commented 2 years ago

系统为 Windows 10,使用的 64 位的 Python,版本为 2.7.18,已安装第三方库 python-fire 与 pygame。
项目中的导出文本,生成文本二进制;导出 Logo,生成 Logo 都没有问题。但是我在生成字库时遇到了问题,输出失败,所有文件只有 1KB 大小,不是很清楚该如何解决。
这是运行 build_font.bat 之后的输出结果
还有一个问题,字库生成只支持 OTF 格式的字体文件吗?

LITTOMA commented 2 years ago

从输出来看,是某个字形的参数值超出短整形的取值范围了。

你可以在fnt.py第121行前面把这些值打印出来观察一下: Snipaste_2021-10-14_14-26-17

字库工具支持OTF和TTF,你可以在build_font.bat开头修改字体文件路径: Snipaste_2021-10-14_14-27-34

Hambaka commented 2 years ago

我不太懂Python,就去搜了一下打印语句,确实有两行输出很可疑。

(65535, 65535, 4, 4, 0, 0, 8)
(65535, 65535, 7, 6, 0, 9, 7)

这个结果所使用的本地化文件是贵组的汉化补丁中的 japanese.txt 导出的。刚刚试了一下游戏原版的 japanese.txt 和修改了几个汉字的 japanese.txt,生成字体就没有这个报错了,可能是我导出汉化版的文本的时候有过误操作导致有异常字形?可能需要使用日文源文件从头开始慢慢进行修改了。

虽然我不知道何时能完成翻译文件,但是想提前问一下,如果到时候发布汉化补丁,我需要注意哪些问题,例如工具来源和内容来源等问题,因为我有基于贵组的汉化 Logo 进行简单修改(“萨姆斯回归” 改为 “萨姆斯归来”,且保留“PB汉化组”字样),而且也不知道会有多少相似的译文,因为会对现有译文进行参考。我到时候需要标注哪些内容创作者和开发者?

编辑:目前已舍弃贵组的汉化 Logo,自己在尝试仿原版那样只改副标题文字了,因为我 PS 技术力实在是不行。

LITTOMA commented 2 years ago

你遇到的问题应该是由于生成的字库字符过多引起的,我们当初的做法是对不同游戏界面上字体大小所用到的字符进行过滤来裁减字库容量。

例如:标题类的文本,它们的字体大小是20*20像素,然而并不是文本中每一个字符都需要以这么大的尺寸显示的,如果将所有字符导入到字库中就会导致字库容量过大。

具体的做法是通过标签来过滤文本,例如第一个标签GUI_MENU001,文本是按" 开始,它的字体大小是20*20,那么把它的标签添加到对应的.lbl文件中,工具就会生成对应的过滤器,最终生成的 2020 字库就只会包含按" 开始这几个字。

根据我们之前的分析,标题类字体对应的是0x00002880_0xa3db960c这个字库,对应的 lbl 文件位于 font\0x00002880_0xa3db960c.lbl,你可以试试将以下内容填进这个文件中:

GUI_MENU001
GUI_YES
GUI_NO
GUI_SAMUS_DATA_TITLE
GUI_OPTIONS.*
Hambaka commented 2 years ago

我刚刚试了一下,把这些内容覆盖进font\0x00002880_0xa3db960c.lbl之后,拿回之前贵组的汉化过的语言文件进行输出,报错只剩下这一条了

D:\Projects\Metroid-Samus-Returns-master>python fnt.py --height 512 --width 1024 -c localization\japanese.txt -t build\fonts_discardables\0x00002408_0x03c07881.muct -x build\font\0x00000080_0x4bd1f997.png -g "path=build\fonts_discardables\0x00000080_0xc992c4d5.mfnt:font=font\sarasa-mono-sc-regular.ttf:size=14:filter=.\build\font\0x00000080_0xc992c4d5.flt" "path=build\fonts_discardables\0x000009d4_0x3ddde0c6.mfnt:font=font\sarasa-mono-sc-regular.ttf:size=10:filter=.\build\font\0x000009d4_0x3ddde0c6.flt" "path=build\fonts_discardables\0x00001290_0x5e0dd5fc.mfnt:font=font\sarasa-mono-sc-regular.ttf:size=16:filter=.\build\font\0x00001290_0x5e0dd5fc.flt" "path=build\fonts_discardables\0x00001b4c_0x0e32aea1.mfnt:font=font\sarasa-mono-sc-regular.ttf:size=17:filter=.\build\font\0x00001b4c_0x0e32aea1.flt" --inner-tex-path "system/fonts/textures/defaultfnt.bctex" --inner-tbl-path "system/fonts/symbols/glyphtable.buct"
pygame 2.0.2 (SDL 2.0.16, Python 2.7.18)
Hello from the pygame community. https://www.pygame.org/contribute.html
(882, 508, 4, 4, 0, 0, 8)
(1020, 488, 3, 11, 2, 9, 7)
(65535, 65535, 7, 6, 0, 9, 7)
Traceback (most recent call last):
  File "fnt.py", line 253, in <module>
    main()
  File "fnt.py", line 250, in main
    font.save(texture_path=opts.texture, table_path=opts.table, in_tex_path=opts.inner_tex_path, in_tbl_path=opts.inner_tbl_path)
  File "fnt.py", line 187, in save
    self.save_groups(in_tex_path, in_tbl_path)
  File "fnt.py", line 193, in save_groups
    group.save(in_tex_path, in_tbl_path)
  File "fnt.py", line 122, in save
    fs.write(struct.pack('hhhhhhh', g.x, g.y, g.rect.width, g.rect.height, g.xoffset, g.yoffset, g.xadv))
struct.error: short format requires SHRT_MIN <= number <= SHRT_MAX

其他的输出都没有问题。 而且之前还在纳闷为啥汉化的语言文件里面有制作人员名单,但是我从日文导出的文件里面没有,后来导出了英文文本才发现制作人员名单是在英语里的。

编辑:现在才注意到这里面报错的是那些常规英文字符的通用字库,日文字体没问题。 编辑2:目前在手动筛标题类字体,而且有注意到某些译文调用的是英文通用字库,为了确保原始英文字体的显示效果(例如主菜单的游戏时间的冒号),把部分日文原文就是英语的译文回滚了,英文字体使用游戏自带的。目前我也不清楚如何让原版英文字体和新增汉字的字体共存,暂且这样,日文貌似一切正常。 编辑3:给后来者的信息,由于目前个人只对日文字库进行操作,所以0x00002880_0xa3db960c.lbl包含的内容如下:

GUI_MENU001
GUI_SPECIALABILITIES_SCANNINGPULSE_TITLE
GUI_SPECIALABILITIES_PHASEDISPLACEMENT_TITLE
GUI_SPECIALABILITIES_ENERGYWAVE_TITLE
GUI_SPECIALABILITIES_ENERGYSHIELD_TITLE
GUI_CONTINUE
GUI_QUIT.*
GUI_OPTIONS.*
GUI_CONTROLS.*
GUI_PLAY
GUI_GALLERY.*
GUI_CHOZO_STORY.*
GUI_METROID_II_ART.*
GUI_CONCEPT_ART.*
GUI_MUSIC.*
GUI_AMIIBO_REGISTER_TITLE
GUI_CONTINUE
GUI_CREDITS.*
GUI_MARKERS_EDITOR_REMOVE_ALL_TITLE
GUI_NEW_GAME
GUI_PLEASE_WAIT
GUI_PRESS_START_TO_SKIP
GUI_RESTART_FROM_CHECKPOINT.*
GUI_RESTART_FROM_SAVE_STATION.*
GUI_AMIIBO_MUSIC_GALLERY_TRACK*
Hambaka commented 2 years ago

我的翻译进度也要接近尾声了,目前在检查文字在游戏中显示的排版问题,可能还需要一段时间才能完成,并且amiibo相关的部分文本还在想办法如何在游戏中触发进行验证,而且还没有开始制作banner.bnr,在搜索相关资料中。

但是有一个问题我很在意,由于我不懂技术相关的问题,所以这个问题可能有点蠢,请见谅。
根据我目前翻译中遇到的结果所推测,在日文本地化文件中,如果原文是日文,那么就会使用fonts_jp.pkgfonts_jp_discardables.pkg这两个字库文件,如果原文就是英语,那么大概率使用的就是默认字库,应该是fonts.pkgfonts_discardables.pkg这两个文件吧。
目前找到的已核实的/怀疑的使用默认字库的列表:
Label Value
GUI_YES Yes
GUI_WORLDMAP SR388 MAP
GUI_NO No
GUI_LEGEND MAP ICONS
GUI_SAMUS_DATA_TITLE SAMUS DATA
GUI_GAME_OVER_TITLE GAME OVER
GUI_NEW_FILE New File
GUI_NORMAL NORMAL
GUI_NORMAL_TITLE NORMAL
GUI_HARD HARD
GUI_HARD_TITLE HARD
GUI_FUSION FUSION
GUI_FUSION_TITLE FUSION
GUI_SPECIAL_ABILITIES_TITLE AEION ABILITIES
GUI_ENDING_CLEAR_TIME CLEAR TIME
GUI_ENDING_NEXT_MISSION See you next mission!
GUI_AREA_AREA_1 AREA 1
GUI_AREA_AREA_1_TITLE AREA 1
GUI_AREA_AREA_2 AREA 2
GUI_AREA_AREA_2_TITLE AREA 2
GUI_AREA_AREA_3 AREA 3
GUI_AREA_AREA_3_TITLE AREA 3
GUI_AREA_AREA_4 AREA 4
GUI_AREA_AREA_4_TITLE AREA 4
GUI_AREA_AREA_5 AREA 5
GUI_AREA_AREA_5_TITLE AREA 5
GUI_AREA_AREA_6 AREA 6
GUI_AREA_AREA_6_TITLE AREA 6
GUI_AREA_AREA_7 AREA 7
GUI_AREA_AREA_7_TITLE AREA 7
GUI_AREA_AREA_8 AREA 8
GUI_AREA_AREA_8_TITLE AREA 8
GUI_AREA_SURFACE SURFACE
GUI_AREA_SURFACE_TITLE SURFACE
GUI_MARKERS_EDITOR_TITLE MAP MARKER
GUI_SYSTEM_TITLE SYSTEM
GUI_GAME_OVER_TEXT Try again?

目前在意的问题是,如果要更改这些Label下的内容,就需要构建默认字库并覆盖游戏原始默认字库才不会导致缺字而不显示,但是这样操作之后会导致存档选择界面的游戏内计时器的冒号都不显示,而且那些UI上的数字的大小和原版字库相比有较大的差异,而且我也看到贵组之前翻译的成品里也有计时器中冒号消失的问题。

这是不是意味着目前是无法在游戏原版的默认字库基础上扩充这些少量的标题类汉字,只能从源头进行全新构建?由于我不知道如何实现最佳的效果,所以目前这些文字是和日版一样保持英文不动,且只覆盖游戏的日文字库。

LITTOMA commented 2 years ago

更新了一下工具,把字库容量扩展到原来的2倍,现在把所有语言的字符添加到字库应该是绰绰有余了。

你可以用btxt.py把所有语言的文本导出到localization文件夹(包括翻译后的文本),然后运行build_font.bat,就可以生成完整的字库了。

LITTOMA commented 2 years ago

关于发布新版本的问题,请在发布文中写明:

并声明转载时保留这些信息

Hambaka commented 2 years ago

再次感谢帮助,目前新版汉化已委托银河战士贴吧的微博进行发布,且已在发布文和补丁说明文中末尾注明这些信息。