
虽然乐高主题的电子游戏如今已成为一种主流,但在1997年,它们却颇为稀奇。1997年,《乐高岛》成为首款在日本以外发行的乐高电子游戏,并取得了巨大的成功,销量超过一百万份。这款游戏深受粉丝喜爱,也为之后更多乐高电子游戏的诞生奠定了基础。出于对乐高游戏的热爱,[MattKC]组建了一个团队对这款游戏进行逆向工程。
团队最初的目标是近乎完美地重现代码库,依靠定制工具对重写编译和原始二进制文件进行字节检查。虽然项目功能齐全,但 [MattKC] 认为不可能获得精确到字节的代码库。这是因为团队所谓的“编译器熵”。当时微软的 Visual C++ 编译器内部存在一些奇怪的行为,代码中的微小更改似乎会对二进制文件中不相关的部分产生随机影响。要缓解这个问题,可能需要对 Visual C++ 进行部分逆向工程或暴力破解代码,这两种方法都需要耗费大量的精力和时间,却得不到真正的好处。
团队需要解决的另一个有趣的问题是游戏如何处理图形。在所使用的 Direct X 版本中,开发者可以选择立即模式和保留模式。两者的区别主要在于模型和资源的处理方式。在立即模式下,Direct X 基本上只是一个渲染引擎,其他一切都由开发者处理。在保留模式下,Direct X 的工作方式更类似于游戏引擎,所有模型和资源管理都由 Direct X 处理。几乎所有开发者最终都使用了立即模式,以至于微软最终放弃了对保留模式的支持。因此,如果你在现代 Windows PC 上下载并运行《乐高岛》,它会抱怨你没有合适的库。关于如何更好地处理这个问题,目前存在争议。团队可以依赖微软不受支持的库,对该库进行逆向工程,只实现所需的功能,或者使用泄露的源代码。
逆向工程完成后,工程工作便可正式启动。例如,一个恼人且持续存在的bug会导致游戏在退出时崩溃。虽然退出游戏很有效,但也会导致进度丢失。该bug只需初始化游戏前端的一个变量即可修复。有趣的是,该bug在游戏后期测试版中并不存在,而这些测试版是从互联网深处挖掘出来的,这引发了人们的疑问:为什么在开发后期才需要重写前端?现在,游戏正在努力将游戏移植到其他平台,但这也带来了新的难题,包括为OpenGL重写代码,以及如何在游戏历史准确性和现代开发需求之间取得平衡。
原文: https://hackaday.com/2025/05/24/reverse-engineering-lego-island/