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

现在这个「MGP2」格式应该不会对我们再造成什么障碍了吧, 我们这次完整检查一下 MGP2 的文件结构

目录

本系列已完结,以下是各章节说明,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. 动态图、鉴赏模式

文件头

文件头以 MGP2 开头,一直到 1ch 结束:

Untitled

04h 05h 不太明确,其他应该就是普通字符串,可以直接读取 。接下来 00 00 00 7c 推测是图片数(124),然后 3d 03 推测是图片的索引起始位置。接下来 23h3ch 的意义不明。

主调色板

主调色板从 3dh 开始,到 033ch 结束,这个我们上一次有讲到,主要用于人物的绘制,其他调色板会在此基础上替换部分颜色。

Untitled

Untitled

图片索引

从 033dh 开始就是图片位置的索引了,索引数据按以下顺序排列:

  1. 四字节:文件位置索引,例如 1d 07 00 00 表示第一个文件位置在 0000071dh
  2. 双字节:图像宽度,例如 80 02 表示宽度 640
  3. 双字节:图像高度,例如 67 01 表示高度 359

每个索引数据共 8 字节,而我们又知道了第一个文件在 071dh,这样我们可以算出索引的数目,索引的总长度为 071dh - 033dh = 3e0h = 992,992 / 8 = 124,正好对应图片数 7c

图片数据

接下来的部分就是图片数据了,对于单一图片来说我们不知道图片的大小,只能通过下一图片位置减去当前图片位置来计算得出,原因现在我们也知道了,因为图像的解析是通过控制字符结束的,当解析到 0101h,就意味着图形内容结束了,接下来紧跟着的是 112 色调色板,用来表示图像的特殊颜色,所以图片数据是按如下顺序保存:

  1. 压缩后图像数据,无固定长度
  2. 336 字节调色板数据

EVENT.PAT

EVENT.PAT 确实是严格按照上面格式组织的数据,但是这也不代表解析时没有遇到问题,又有未想到的情况发生了。

我们在第三篇的解析中,有一个假设,允许程序插入不存在的索引,但是,也加入一个限定,不允许插入的索引高于当前未插入的索引,现在,这个例外也来了,我没有去追实际程序是怎么处理的,只是默默把程序改成了连续插入不存在的索引:

Untitled

这样解析出的图像似乎也没什么问题,就没有再深究。另外事件图确实是 124 张,比我这里的看图档多了一张,不过我只瞄了一眼,没有仔细比对,而且还感觉有些图有重复。

其他 PAT

EVENT.PAT 我们已经搞定了,那么其他 PAT 文档呢,我也全部测试了一下

  1. AREA.PAT: 可以解析,但是 106 会报错
  2. END.PAT: 无法解析
  3. EVENT.PAT:可以解析
  4. EVENTEYE.PAT: 无法解析
  5. FACE.PAT: 部分可以解析
  6. ITEM.PAT:无法解析
  7. MAP.PAT:可以解析
  8. MARK.PAT:非 MGP2,vlc 可以直接打开
  9. MOUSE.PAT:无法解析
  10. OPEN.PAT:非 MGP2,vlc 可以直接打开
  11. PERSON.PAT:无法解析
  12. SAREA.PAT:无法解析
  13. SETUP.PAT:非 MGP2,vlc 可以直接打开
  14. STAFF.PAT:可以解析,但是调色板有误
  15. SYSTEM.PAT:无法解析
  16. TITLE.PAT:无法解析
  17. WINICON.PAT:无法解析

总结

我们注意到了一些挂羊头卖狗肉的情况,有些文件虽然不是 MGP2 的格式,也被命名为 PAT,除去这些,剩余文件虽以 MGP2 格式打包,但是实际内容格式如何解析,恐怕需要具体问题具体分析。