大富翁 3 游戏文件分析(五)

从这一期开始要变得精彩了,我们终于要见到一些游戏资源了, 这里要特别感谢 gamebase 骨灰集散地的青杉大大, 没有他的帮助我估计还在摸索中

1 BLK 文件

这类文件有一个特点,每个文件的头部四位数字在文件中会重复出现很多次, 而且分布非常均匀,以 CARD.BLK 文件为例,这个文件以 15 00 e0 00 开头, 共 26 处,所以把文件分割为 26 个 18820 大小的区块, 这么看来我们可以推测 blk 就是 block 的意思。

15 00 e0 00 其实也有其含义, 00 15 代表宽度(21,但是并不等于宽度), 00 e0 表示图像的高度(224),如果你有手工截取过游戏中的卡片截图, 就更清楚这两个数字的意思:

卡片的大小是 168 x 224,结合前面的数字,我们不难发现, 168 正好是 21 的 8 倍,所以 0x15 确实代表宽度,但为何要乘以 8, 我们还不得而知。

既然卡片大小是 168 x 224,我们又知道对于 16 色图像, 一个 byte 可以表示两个颜色,那么所需的空间就是 168 x 224 / 2 = 18816, 加上四字节的尺寸信息,正好是 18820!是不是很令人激动, 现在我们基本可以确定,文件保存的就是完整的卡片图像。

于是我就尝试直接读取文件内容然后依据长宽来直接绘制卡片了, 不过很遗憾,没有成功:

无论横竖都被切成了四块,不过虽然没有成功,我们也可以确实是改建卡没错, 因为基本还是看得出形状的。

这个问题困扰我好久了之后,我选择去 gamebase 问了青衫大大, 没想到他很快就认出了这是 4plane 的图像格式。

所谓 4plane,是针对 16 色图片,由于颜色数可以用 4 个 bit 表示, 那么就可以把一张图拆成四层,每一层都只记录 1 个 bit 的颜色信息, 四层颜色信息叠加在一起,才是实际的颜色, 所以如果直接绘制就会横竖都四等份,而且颜色错误, 这也是为何宽度要用 0x15 来表示, 0x15 * 0xe0 就是一层的尺寸。

2 结论

这时我们就可以还原很多图片出来啦, 卡片、日历、机会和新闻都是采用这种格式:

三幅图分别是机会、日历、新闻的第一张图, 感觉机会和新闻都没有见过对不对,这就是福利内容了, 应该是开发测试用但后期未采纳的图片吧, 新闻还玩了 flying windows 屏保的梗,老玩家可能会会心一笑, 看来大宇虽然那时还在坚守 dos 平台,但是 windows 其实他们也在用。 为什么中元节是日历第一张, 那就不得而知了。