今天我们基本可以把 gdt 文件的内容捋出来了
本系列基本完结,以下是目录供快速翻阅:
我们的主要问题,其实都在 19 个绘图函数的实现上,因为对代码感兴趣的朋友是少数,所以我们这方面也不会多做篇幅,简单罗列一下修复中遇到的问题:
(bl << 4) + bl
ADD SI,0xfb00
,但其实是减法,负数的表示方式是全取反然后加一,所以 0xfb00
其实是 -500
解决完绘图函数的问题,logo 其实我们就可以画出来了:
稍微有些色差,然后我们就可以开始讨论上次我们提到但是没说的一个小问题,这个图有些偏左了,重新看一下原图:
这个对于 logo 这张图来说,问题不算大,但是对于其他文件,会有相当数量的图画不出来,这是因为有一个偏移量我们忽略了。也就是说画图的位置并不是边界处,这可以解释为什么有些图画不出来,因为有些绘图是要去复制前面的图像,如果我们没有引入偏移量,而程序又偏偏要复制偏移量之前的数据这时候就会报错,可能会有朋友觉得有些奇怪:引入偏移量是因为偏移量之前没有现有图像的数据,那么为什么还会去复制偏移量前的图像数据。我觉得不需要太纠结于这个,程序反正是用到了,那么我们就引入就好了。解决完这些问题,那么大部分图像我们就都能解开了:
我不晓得这幅图的原画大家有没有见过,因为我还没有开始玩,不晓得哪里会放这张图,不过这张图是我能放出来的文件第二大的 gdt 文件,最大那个为啥不能放,我想大家也猜得到。
前面我们说了,还是有些 gdt 文件是解不开的,除此之外,还有一些文件会画出纯色或杂讯类的图像:
解不开的文件有以下几个:
解不开的文件和杂讯型的文件名称有一个特点,就是文件名为数字+字母的组合,所以我推测,这些文件可能需要依赖无数字的文件作为底图,然后再把自己的内容画出来,不过我没打算研究这个,我们的小目标是汉化,有兴趣的朋友可以自己试一下。
简单标记了一下文件头:
struct File {
u32 head;
u32 length;
u8 h1;
u8 h2;
u16 h3;
u16 offset;
u16 mark1_8000;
u8 pal[0x18];
u16 plane0_len;
u16 plane1_len;
u16 plane2_len;
u16 plane3_len;
};
offset
就是上文我们提到的偏移量,h1 h2 h3
似乎是满足 h2 = h1 * h3
的关系,其他用途不明,mark1_8000
用途也不太清楚。其他字段相信大家看得懂,文件头后面就是四个平面的图像数据了。
从这一点我们也看出,gdt 文件中,其实已经没有其他内容的数据了,但是很明显 logo 界面是有动画的:
还有一种图像:
看图的话,有一部分内容是缺失的,但是仔细想一下,缺失的部分可以通过镜像显示已有的部分来实现。所以我推测这是特效做出来的镜像和动画。不过同样这也不是我想要研究的部分,我们也放一放。
如果我们把图像的绘制部分保存成动画,其实也挺好玩的。
你会看到程序像是拿着一把刷子把图像沿竖项刷出来的,刷子的宽度是 8 个像素,因为四平面就是一个字节包含 8 个像素的数据。
我们对 gdt 文件的研究就告一段落了,因为其实这算是有些跑题,我应该先去找文字部分,不过我的系列一贯以图像为主,加上去也不算多,接下来,我们继续寻找文字。