夜行侦探 EVE burst error 游戏文件分析(四)

ghidra / imhex / eve / dosbox / pc98

今天我们基本可以把 gdt 文件的内容捋出来了

目录

本系列基本完结,以下是目录供快速翻阅:

  1. 启动、GDT 文件分析一:19 个函数
  2. GDT 文件分析二:ghidra 偏移量、读取、初次绘画
  3. GDT 文件分析三:多次读取、偏移量、调色板
  4. GDT 文件分析四:完整解开及遗留问题
  5. 游戏文本解码
  6. 汉化方案制定
  7. 游戏文本编码
  8. 汉字日文编码、字库、以及第一个汉化文件
  9. 配置一个汉化 demo
  10. 手机游玩、程序文字汉化

解决遗留问题

我们的主要问题,其实都在 19 个绘图函数的实现上,因为对代码感兴趣的朋友是少数,所以我们这方面也不会多做篇幅,简单罗列一下修复中遇到的问题:

  1. 位移操作的执行顺序:位移操作比加减的优先级要低,所以有时候需要用括号,比如 (bl << 4) + bl
  2. 负数的表示方式:有些指令形如 ADD SI,0xfb00,但其实是减法,负数的表示方式是全取反然后加一,所以 0xfb00 其实是 -500

解决完绘图函数的问题,logo 其实我们就可以画出来了:

稍微有些色差,然后我们就可以开始讨论上次我们提到但是没说的一个小问题,这个图有些偏左了,重新看一下原图:

这个对于 logo 这张图来说,问题不算大,但是对于其他文件,会有相当数量的图画不出来,这是因为有一个偏移量我们忽略了。也就是说画图的位置并不是边界处,这可以解释为什么有些图画不出来,因为有些绘图是要去复制前面的图像,如果我们没有引入偏移量,而程序又偏偏要复制偏移量之前的数据这时候就会报错,可能会有朋友觉得有些奇怪:引入偏移量是因为偏移量之前没有现有图像的数据,那么为什么还会去复制偏移量前的图像数据。我觉得不需要太纠结于这个,程序反正是用到了,那么我们就引入就好了。解决完这些问题,那么大部分图像我们就都能解开了:

我不晓得这幅图的原画大家有没有见过,因为我还没有开始玩,不晓得哪里会放这张图,不过这张图是我能放出来的文件第二大的 gdt 文件,最大那个为啥不能放,我想大家也猜得到。

又遗留的问题

前面我们说了,还是有些 gdt 文件是解不开的,除此之外,还有一些文件会画出纯色或杂讯类的图像:

解不开的文件有以下几个:

  • 1104b.gdt
  • 1140b.gdt
  • 1150b.gdt
  • 3060c.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 文件的研究就告一段落了,因为其实这算是有些跑题,我应该先去找文字部分,不过我的系列一贯以图像为主,加上去也不算多,接下来,我们继续寻找文字。