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

上次我们基本确定了像素数据的提取,那么现在就只差调色板了,不过我们也知道, 这次的难点就是调色板

目录

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

前情提要

我们知道,事件图有一个对应的调色板数据:

const DATA: [u32; 512] = [
  0x7AB50000, 0x5A316A73, 0x39AC49EF, 0x1CC62D4A, 0x7B927FD6, 0x770A7B4E, 0x524C66AC,
  0x2D6A41CB, 0x77BD7FFF, 0x67396F7B, 0x52945EF7, 0x42104A52, 0x318C39CE, 0x2108294A,
...
];

这组数据通过换算,可以得到调色板,我们要从这组数据入手,找到它们是从哪里来的。

PAF 读取

游戏启动时,读取了 4 个 PAF 文件:

根据名字我们知道,第三个文件是 Redevent.paf,每次读取 paf 的函数也都相同, 我改了名字,不过保留了地址,所以我们可以在日志文件中查找 0041b6d0, 来确定日志从哪行开始在读取 Redevent.paf:

所以 1309642~2188356 中间的内容,是启动时读取 Redevent.paf 的日志,接下来, 我们要在日志中找调色板数据了。我们在日志中找调色板数据了:

所以 1578526 这行,是程序在读取 Redevent.paf 的事情,对应的程序在 0041A84E, 所以我们再搜下这个位置:

也是从这行开始,我们看下这行日志前后的内容:

这段确实很像是在处理调色板,有两个原因:

  • 001F001F:我们之前也是用类似的掩码去取颜色
  • DEC EDX:这行的结果是 EDX 变为 7Fh,说明前面它是 80h(128),因为一个寄存器正好保存两个颜色,所以数目也对应上了 256

这个数据的源头来自 0041A83A,那我们可以先看一下源数据:

下面我们可以看下文件里有没有这块:

还挺多的,所以我们确定不了是哪里,而且我们也不知道是哪里读取的,简单一点的做法, 我想还是看日志,找最近的一次读文件的操作:

所以应该是 02207E80 开始的 13CE0 (81120.) 个 byte:

有 8 个 byte 我不知道是什么意思,但是后面应该就是调色板了,两个 byte 一个颜色, 所以调色板的数据是 512(200h) 个 byte,那么第二组调色板在 02207E80 + 8 + 200h = 02208088

依然是 8 个 byte 加调色板数据,那么调色板一共是 81120 / 520 = 1569ch) 组, 还挺多的,超过了事件图。

既然感觉这就是第二个事件图的调色板,既然我们知道像素数据是在 Redevent.paf 的 0x398e2 位置, 调色板是在 0x2208090,,我们就试着画一画好了:

总结

第二张图也被我们解出来了,那么看来我们可以确认调色板的位置了, 总结一下我们目前已知的有用信息:

  • 图像表从 0221BEC0 开始,共 363 组,可能是底图和眼睛组合。
  • 调色板数据从 02207E80 开始,共 156 组
  • 图像序号和调色板数据序号相同(本结论后续会推翻)