起因
直接原因是我看到了今年 PSP Homebrew Developer Conference 上 Precise Museum 做的报告,其中提到他们刚刚发布的《噗哟噗哟20周年纪念版》PSP版本的英化补丁在制作过程中遇到的一个问题:如果一个字库文件中的非全宽字符(即宽度不等于文件头中描述的最大宽度的字符)出现在字库的第一行以外的行,就会使这个字符无法正常显示。他们后来通过缩小字体的大小、重新排列字符使非全宽字符全都出现在第一行绕开了这个问题。
他们提到这件事引起了我的兴趣,因为我在 5 年前开始研究这个游戏的 Wii 版本的汉化的时候就遇到过这个问题,不过中文字符都是方形,简单重排一下字库文件,把少数的非方形字符放到前面很容易解决这个问题。不过后来噗哟群没找到人翻译,汉化版的工作就搁置了。
我电脑上正好已经装了 Ghidra 以及用于解析 Wii 可执行文件格式的插件,于是决定试试找出这个问题的根源。我之前的逆向经验仅有两个毫无难度的 Unity 游戏(一点混淆没有,符号表全在游戏里),因此这次稍微攒点逆向经验(真能攒到吗)。
背景:关于文件格式
这里需要先介绍一下这个游戏使用的字库和文本的文件格式。英文社区已经有人写了用于编辑这个游戏的大部分文件的工具(Puyo tools 和 Puyo text editor),从这些工具的源码中可以了解到文件格式的信息。下面我借用上文提到的报告视频中的示意图来介绍。

上图展示的是字库文件,即 FNT
文件的格式。文件头中给出了字库中所含字符的尺寸和个数,随后以列表的形式给出了每个字符的 UTF-16 编码和显示宽度。字符表后面直接接一个材质(贴图)文件(PSP版中为 GIM
, Wii版中为 GVR
)。值得注意的是,虽然字符表中规定了每个字符的宽度,但是这个宽度只用于显示字符串时确定下一个字的水平位置。在材质文件中,字符仍然以文件头中的尺寸整齐地排列。
每个 FNT
文件会配套一个 MTX
文件,里面存储游戏中用到的各种字符串。每个字符占 2 个字节,表示这个字符在 FNT
文件中的 index 。比如在图中的字库中,い
的编码就是0000
。
正文
阅读此文
背景(起因?)
事情的起因是我某天在刷 Fediverse 的时候看到了我所在的实例上有人发了这么一条帖子(现在找不到了,内容大概是):
Meshtastic is modern Pictochat
这里提到的 Pictochat 指的是老任在 NDS 掌机上推出的聊天功能,可以与附近的掌机进行无线连接,并通过触摸屏画画来聊天。我恰好有一台 3DS ,它有一个类似的功能叫 Streetpass ,能在休眠状态下和附近的掌机联机,我觉得这个功能还挺酷的。因此我当时对这个 Meshtastic 起了点兴趣,简单了解了一下之后发现是一个开源的离网无线电通讯工具。不过我很快就忘记了这件事。
后来我在油管上又看到了 38C3 上有两个 talk 都介绍了 Meshtastic (这个和这个),其中提到节点的成本相当便宜(DIY成本在5-7刀,我在国内买零件应该会比他更便宜),于是就想试试。
正好 lyc8503 也感兴趣,就决定在学校尝试一下 Meshtastic 。他已经写了一篇博客介绍总体的探索过程,我在这里仅做一些我自己的补充和想法。建议先去看他的博客再看我的。
硬件选择与成本
我当时看完 talk 就去搜了一下 Meshtastic 支持的各种成品硬件(开发板),结果成品硬件的价格都在 100 元以上,远超我的预期。这下不得不自己组装了。
一开始使用的 ESP32 + SX1278(Ra-01) 组合的成本也达到了 40 元,这还没算上天线,也没有带屏幕。虽然有更便宜的 ESP32C3 ,但是我们把固件刷进去之后无法启动,而且没有任何信息输出,抓瞎了一会儿就放弃了。后来尝试的 nRF52840 + SX1268(E22-400MM22S) 的组合相对便宜,算上小天线也只有 20 元出头,但是射频模块其实是以拿样价 6 元购买的,如果原价购买则需要 20 元,算下来总成本也要将近 40 元。而且需要手动焊接。
另外,我还购买了 U-blox NEO-6M GPS 模块,成本为 11 元,可以为节点提供位置信息,虽然精度不高。
阅读此文
本文章含有较多拍屏图片,因为 Live CD 不方便把截图传出来,请读者忍一下(。
前年的时候我把我家的一台旧电脑升级了下硬件改造成了服务器,持续运行至今没出过什么大问题,直到前两天——
红温的开始
我像往常一样连着 ssh 操作服务器,然后命令行突然没反应了,随后执行什么命令都报 输入/输出错误

再过一会儿, ssh 连接也没反应了,我前去查看服务器情况,插上显示器发现没有显示输出,电源也没有断,但是键盘完全无反应,只能硬重启。重启之后发现 BIOS 识别不到系统盘了。我想着可能是接触不良就把硬盘换了个 SATA 接口,启动之后识别到了系统盘并且正常启动了系统,但是没过多久就开始报满屏的 I/O Error
。

大事不妙。这块 SSD 很可能已经坏了。糟糕的是我没有对系统盘做任何备份,虽然上面没有什么重要数据,但是重装系统以及重新配置各种服务还是很烦的。
硬重启之后 BIOS 又识别不到硬盘了,必须断电一段时间才能重新识别到。我启动到 Live CD 试图把盘里的数据 dd
出来,结果读到 4GB 就读不出来了:

阅读此文
UPD 2023.10.27 加入了 Waline 评论系统。欢迎在评论区交换友链;-)
从高中开始想搞的博客,咕了5年终于想起来做了。如你所见这是一个 retro 风格的主题,虽然只是表面上 retro ,但是我之后应该会做一个纯html
,没有任何js
和css
的分站。
现在还没想好这里要写什么,想到了再说。首先排除课程笔记。
此帖也用作本站的 Changelog.
阅读此文