终于,我们可以在原版《DOOM》里运行《DOOM》了

更新时间:2022-07-16 15:10:47作者:佚名

终于,我们可以在原版《DOOM》里运行《DOOM》了


距离在《DOOM》运行的《DOOM》里玩《DOOM》也不远了。

“你说的这个东西,他能不能运行《DOOM》?”(Will it run Doom?)

自1993年《DOOM》初代发售至今,人类一直在挑战这个问题的极限,探索能够运行这部游戏的任何潜在媒介:数码相机,打印机,智能冰箱,ATM取款机,麦当劳点餐机,电子验孕棒,乐高积木,乃至没有物理实体的《我的世界》和GIF动图……

现在,与其问什么东西能运行《DOOM》,不如问什么东西不能运行《DOOM》。


这种探索精神固然值得赞许,但也会让我们好高骛远,进而忽略一个最基础的、本源性的问题:《DOOM》游戏本身,能不能运行《DOOM》?

这个套娃问题已经在改版的《DOOM》——GZDoom中得到了解答。早在2015年,就有玩家推出了在GZDoom里游玩初代《DOOM》的模组。


图源Youtube@TheZombieKiller

GZDoom是一个经过玩家爆改的特殊版本,基于初代游戏添加了大量扩展功能,以及一部支持如命名脚本与函数等高级编程操作的改进版编辑器。玩家们已经试过在GZDoom里创建和还原各种各样的游戏,重现出一部二十多年前的《DOOM》也不在话下。


“毁灭战士街机厅”

图源Youtube@RJbanshee21

不过,GZDoom终归是受过大量修改的版本,显然不够原教旨主义,不该是“用《DOOM》运行《DOOM》”这一问题的终极答案。

直到2022年7月11日,一位网名叫做Kgsws的技术宅,交上了一部更令人满意的答卷。他在原汁原味的DOS版本《DOOM2》里,成功运行了《DOOM2》。

根据Kgsws在Youtube上传的视频,他在研究《DOOM2》源代码的过程中,留意到了处处可见的“SpawnMapThing”命令。这一命令会根据预设的物件ID,在游戏的关卡/地图中生成对应的物件,如武器、敌人、升级道具、背景装饰等。

预设ID中的1至4号,对应着多人模式下的四名玩家。由于生成玩家的代码触发条件是“ID小于等于4”,这意味着物件ID可以是负数。


生成负数ID所对应的“不存在”物件,就会触发Bug,覆盖掉游戏运行时内存中的“状态”一栏(State)。

“状态”会显示一项物件正在播放的动画文件ID。举个例子,一个敌人可能会故意闪烁吸引玩家注意,射击手上的武器,或者被玩家击杀开始播放死亡动画。至于应该加载哪种动画,均由这个“状态”ID对应的文件所决定。


主角奔跑的动画对应ID150-153

物件没有实体模型,因此不必和动画文件匹配,只要修改内存里的“状态”,一个物件就有可能播放另一个物件的动画。


夜视仪变成了主角

动画的内容也没有作文件格式的强制要求,不一定非得是动画文件,完全能够替换为一段可执行的代码或程序——比如另一部《DOOM》。

Kgsws选择了“巧克力版DOOM”(Chocolate Doom),这套开源版本的游戏,在保留DOS版原有代码的基础上,兼容现在的电脑操作系统。

Kgsws又花了两天时间,添加了大量视频没有提及的代码细节,利用原生编辑器制作了仅有一个房间的关卡,最终在房间的一面墙上成功映出了巧克力版,除了没有声音之外,游戏完美运行,甚至支持输入作弊码。


Kgsws还添加了一个无缝切换两部游戏按键控制的功能。因为这个“关卡”同时且独立运行了两部DOOM,运行设备也需要双倍的内存,“至少16MB”。

因为自己设计出的房间有点像电影放映室,Kgsws便结合平日里制作关卡和模组的技术借题发挥,造出了一个和内置DOOM配套的“电影院”完整关卡。影院内设计了多个可交互物件,包括可以切换影院灯光亮度的开关、能够关掉用户界面的按钮,以及通往“私人包厢”的传送门。



Kgsws将完整关卡及源代码上传到了Github。在鼓励玩家们尝试用《DOOM2》运行其他游戏的同时,Kgsws也指出,这个漏洞仅适用于DOS原版,不适用于修改过的版本,比如上文提到的GZDoom。

好在Steam平台上的《DOOM2》就是DOS版,任何人都能使用DOSbox之类的模拟器运行游戏,体验Kgsws的杰作。


Kgsws的发现看似为玩家们近三十年来的朝圣之旅划上了一个句号,却也打开了新的潘多拉魔盒。在《DOOM》里运行《DOOM》,只是一种“开始的结束”,我们不必再问什么东西还没运行过《DOOM》,而是要问《DOOM》还没运行过什么东西。

本文标签: doom  动画  毁灭战士  游戏  关卡