红楼梦十二金钗游戏资源分析(十五)

感觉我离卡壳越来越近了,不过在那之前,我知道了中文字的格式。

目录

本系列已完结,以下是各章节说明,17 之前是 dos 版相关,之后是 2001 版:

  1. 背景、简单分析
  2. 显存位置
  3. 事件图保存算法: LZW
  4. 调色板
  5. MGP2
  6. 结局图
  7. 事件图中的眼睛
  8. 音频文件
  9. 按位读取
  10. 循环之前
  11. 读取循环
  12. 重现 LZW
  13. PAT 的图形格式
  14. STAFF 调色板
  15. 字体文件
  16. 脚本解密
  17. 版本比较
  18. 第一张图
  19. 调色板1
  20. 第二张图
  21. 调色板2
  22. 调色板处理
  23. 静态事件图、结局图
  24. 动态图、鉴赏模式

FON 文件

我们可以轻易猜出,字体文件其实就是这几个 FON 扩展名的文件:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2013/5/4      3:45           3871 ASC16.FON
-a----          2013/5/4      3:45          12322 ASC24.FON
-a----          2013/5/4      3:45        1211115 CL24.FON
-a----          2013/5/4      3:45         523743 CM16.FON
-a----          2013/5/4      3:45        1211115 CM24.FON
-a----          2013/5/4      3:45           6175 LCD.FON
-a----          2013/5/4      3:45           3135 SETUP.FON
-a----          2013/5/4      3:45           3199 SETUPCD.FON

根据文件大小也很容易确认,C 开头的是中文字体,其他大概率是英文。有两个文件大小一样大对不对, 但是其实他们是不同文件,为什么这样,我们后面再说。

FON 文件的格式

解析格式,最有效的方法,我想还是用 dosbox 的调试功能,去看文件是如何读取的。读过本系列的老朋友, 应该有个大概的思路了,我也就不在这里凑字,大致就是首先 bpint 21 3d, 找到字体文件在哪里打开,然后 bpint 21 3f,观察程序是如何读取字体文件的。

长度 类型 说明
4 字体标识 英文:MGEF,中文:MGCF
1 CM16: 0, ASC16: 1
1 字体宽度 CM24: 18h
1 字体高度 CM24: 18h
2 字体字节大小 CM24: 48h
4 字体个数 CM24: 3feeh
2 CM16: 1, ASC16: 0
[1f, 7ffa] 可能是字典
[7ffb, 7fdde] 文字数据

有一个比较有意思的事情,不晓得你发现了没有:

$$ 宽度 \times 高度 = 24 \times 24 = 576 \\ 字体字节大小 = 48h = 72 $$

两者正好相差 8 倍,所以每个字节其实是代表 8 个点,也就是说,字体是单色。

那其实知道这么多以后,我们直接画也画得出来了:

总结

中文字体基本上都是这个结构,CM16 因为字体小一点,所以大小也会小一些, 而这也是为什么 CM24 和 CL24 虽然一样大,但是文件其实不同,因为字的图像会有些差异, 这里没有讲字典的部分,字典的长度是文字个数的两倍,也就是说两个字节代表一个字, 那么从那个时代开始玩游戏的朋友应该猜得到,作为一个台湾游戏,文字编码应该是 Big5, 事实它确实是 Big5,至于程序是怎么根据文字编码来画出文字的,我先按下不表,各位猜一猜。

话说这么看来,这个游戏的简中化其实我都可以做了,把几个 FON 文件中的繁体字换成简体字,结束。