上次我们基本确定了像素数据的提取,那么现在就只差调色板了,不过我们也知道, 这次的难点就是调色板
本系列已完结,以下是各章节说明,17 之前是 dos 版相关,之后是 2001 版:
我们知道,事件图有一个对应的调色板数据:
const DATA: [u32; 512] = [
0x7AB50000, 0x5A316A73, 0x39AC49EF, 0x1CC62D4A, 0x7B927FD6, 0x770A7B4E, 0x524C66AC,
0x2D6A41CB, 0x77BD7FFF, 0x67396F7B, 0x52945EF7, 0x42104A52, 0x318C39CE, 0x2108294A,
...
];
这组数据通过换算,可以得到调色板,我们要从这组数据入手,找到它们是从哪里来的。
游戏启动时,读取了 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 = 156
(9ch
) 组,
还挺多的,超过了事件图。
既然感觉这就是第二个事件图的调色板,既然我们知道像素数据是在 Redevent.paf 的 0x398e2
位置,
调色板是在 0x2208090
,,我们就试着画一画好了:
第二张图也被我们解出来了,那么看来我们可以确认调色板的位置了, 总结一下我们目前已知的有用信息:
0221BEC0
开始,共 363 组,可能是底图和眼睛组合。02207E80
开始,共 156 组