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

终于,我们可以在原版《DOOM》里运行《DOOM》了
文章图片
距离在《DOOM》运行的《DOOM》里玩《DOOM》也不远了 。
终于,我们可以在原版《DOOM》里运行《DOOM》了】“你说的这个东西 , 他能不能运行《DOOM》?”(WillitrunDoom?)
自1993年《DOOM》初代发售至今 , 人类一直在挑战这个问题的极限 , 探索能够运行这部游戏的任何潜在媒介:数码相机 , 打印机 , 智能冰箱 , ATM取款机 , 麦当劳点餐机 , 电子验孕棒 , 乐高积木 , 乃至没有物理实体的《我的世界》和GIF动图……
现在 , 与其问什么东西能运行《DOOM》 , 不如问什么东西不能运行《DOOM》 。
终于,我们可以在原版《DOOM》里运行《DOOM》了
文章图片
这种探索精神固然值得赞许 , 但也会让我们好高骛远 , 进而忽略一个最基础的、本源性的问题:《DOOM》游戏本身 , 能不能运行《DOOM》?
这个套娃问题已经在改版的《DOOM》——GZDoom中得到了解答 。 早在2015年 , 就有玩家推出了在GZDoom里游玩初代《DOOM》的模组 。
终于,我们可以在原版《DOOM》里运行《DOOM》了
文章图片
图源Youtube@TheZombieKiller
GZDoom是一个经过玩家爆改的特殊版本 , 基于初代游戏添加了大量扩展功能 , 以及一部支持如命名脚本与函数等高级编程操作的改进版编辑器 。 玩家们已经试过在GZDoom里创建和还原各种各样的游戏 , 重现出一部二十多年前的《DOOM》也不在话下 。
终于,我们可以在原版《DOOM》里运行《DOOM》了
文章图片
“毁灭战士街机厅”
图源Youtube@RJbanshee21
不过 , GZDoom终归是受过大量修改的版本 , 显然不够原教旨主义 , 不该是“用《DOOM》运行《DOOM》”这一问题的终极答案 。
直到2022年7月11日 , 一位网名叫做Kgsws的技术宅 , 交上了一部更令人满意的答卷 。 他在原汁原味的DOS版本《DOOM2》里 , 成功运行了《DOOM2》 。
根据Kgsws在Youtube上传的视频 , 他在研究《DOOM2》源代码的过程中 , 留意到了处处可见的“SpawnMapThing”命令 。 这一命令会根据预设的物件ID , 在游戏的关卡/地图中生成对应的物件 , 如武器、敌人、升级道具、背景装饰等 。
预设ID中的1至4号 , 对应着多人模式下的四名玩家 。 由于生成玩家的代码触发条件是“ID小于等于4” , 这意味着物件ID可以是负数 。
终于,我们可以在原版《DOOM》里运行《DOOM》了
文章图片
生成负数ID所对应的“不存在”物件 , 就会触发Bug , 覆盖掉游戏运行时内存中的“状态”一栏(State) 。
“状态”会显示一项物件正在播放的动画文件ID 。 举个例子 , 一个敌人可能会故意闪烁吸引玩家注意 , 射击手上的武器 , 或者被玩家击杀开始播放死亡动画 。 至于应该加载哪种动画 , 均由这个“状态”ID对应的文件所决定 。
主角奔跑的动画对应ID150-153
物件没有实体模型 , 因此不必和动画文件匹配 , 只要修改内存里的“状态” , 一个物件就有可能播放另一个物件的动画 。
夜视仪变成了主角
动画的内容也没有作文件格式的强制要求 , 不一定非得是动画文件 , 完全能够替换为一段可执行的代码或程序——比如另一部《DOOM》 。
Kgsws选择了“巧克力版DOOM”(ChocolateDoom) , 这套开源版本的游戏 , 在保留DOS版原有代码的基础上 , 兼容现在的电脑操作系统 。
Kgsws又花了两天时间 , 添加了大量视频没有提及的代码细节 , 利用原生编辑器制作了仅有一个房间的关卡 , 最终在房间的一面墙上成功映出了巧克力版 , 除了没有声音之外 , 游戏完美运行 , 甚至支持输入作弊码 。