事件、动态,我们都有了,但是如何把动态图和底图结合起来, Redevent.paf 中似乎没有这个信息。换句话说,一定有另一个文件保存了两者的关联关系。
本系列已完结,以下是各章节说明,17 之前是 dos 版相关,之后是 2001 版:
这应该也不是什么问题,DOS 版也是这么做的,重新检查一下启动游戏时的读取文件日志, 我们就可以很快找到怀疑目标:
起这么一个名字,那么多半就是你了:
第一个数字应该是数据的数量,123 这个数字也对得上事件图个数, 后面的部分就是加密的了,同样是类似 ROT13 的做法, 根据一定规则对每个 byte 做一个转换,需要解密一下:
let content = read::from_bin(path);
let count = u32_from_vec_u8(&content, 0x0) as usize;
// FUN_0040f510
let mut parsed_content = vec![];
let mut secret = 0x11;
let len = 0xd4;
for i in 0..count {
let offset = 4 + i * len;
let mut piece_vec = vec![];
for j in 0..len {
secret = (j as u8).wrapping_mul(secret).wrapping_add(1);
let c = content[offset + j] ^ secret;
parsed_content.push(c);
piece_vec.push(c);
}
}
这样我们就有了解密后的数据,对应的结构我也写了出来:
一共 123 组,对应 123 个事件图,每组四个眼睛,是的,和 dos 的资源完全一样, index 如果是 0xffffffff 表示这个眼睛没有用到,其他数字的话, 就是用到了从 index 开始的 count 个眼睛图,注意这个编号是从 0 开始的,也就是说, 我们从 Redevent.paf 中提取出三组资源(事件、动态、结局), 编号 0 对应动态资源的第一个。
全部的细节都已经有了,画图就很轻松了。2001 版的图与原版图有多相似, 其实用四美图就可以说明了:
对,宝钗脸上的抖动依然没修,我们之前分析过这个问题, 因为后三张动态比第一张宽了一个像素,之前我是认为可能是疏忽,对错了一个像素, 后来发现类似这样的情况不止一处,所以可能是作者故意用这个位移来表达面部的动作。 我现在觉得红楼梦 2001 应该算是原版的 windows 移植版,七彩狼可能只出了一个程序, 就完成了这个作品,程序老哥借此机会掌握了 windows 下的编程技术, 不要小看轻描淡写的一句「掌握了 windows 下的编程技术」,这个其实很难, 经历过的人都知道,或者我举个例子,仙剑的姚仙,可能就没有跨过这个门槛, 因为传闻仙剑 95/98 和大富翁 4 的程序是外包。
事情到了这里,我对红楼梦 2001 的研究应该是完全结束了, 总体 windows 版的难度要比 dos 版高出不少,但是收获却和之前差不多, 说起来还有些失望,代码部分我还在整理, 可能后面哪天就没声没响地出现在我的 gitlab 上了,不过对代码感兴趣的可能还是少数, 很多看我这个系列的朋友可能还是冲着「十二金钗全 CG 图档」来的,别着急, 图档我是不会给的,而且网络上所有的图档都没做出来自然的眼睛特效,所以我给大家提供 了另一份东西:
替换掉游戏原始文档(注意备份),你会发现,游戏中多了鉴赏的部分。
这部分包含了全事件图、全结局图,以及所有攻略对象事件, 完全是使用游戏提供的脚本功能实现的,应该比图档有意思多了吧。 不过脚本部分我没有做完整的测试,所以可能会有些地方会有问题, 如果有遇到问题可以联系我修复。
眼睛部分的分析内容其实大概一个月前我就已经完成了,这段时间一直在准备这个鉴赏功能, 平时空闲不多,目前两个版本的事件鉴赏都弄完了,总体说来,我的看法是画面 dos 版占优, 游戏脚本 2001 版占优。
好了,这个系列差不多也该结束了,对于两个版本的十二金钗,我的系列停在二十四, 我想再合适不过了,我们就下个游戏见吧。