网站首页 > 精选文章 正文
距离在《DOOM》运行的《DOOM》里玩《DOOM》也不远了。
“你说的这个东西,他能不能运行《DOOM》?”(Will it run Doom?)
自1993年《DOOM》初代发售至今,人类一直在挑战这个问题的极限,探索能够运行这部游戏的任何潜在媒介:数码相机,打印机,智能冰箱,ATM取款机,麦当劳点餐机,电子验孕棒,乐高积木,乃至没有物理实体的《我的世界》和GIF动图……
现在,与其问什么东西能运行《DOOM》,不如问什么东西不能运行《DOOM》。
这种探索精神固然值得赞许,但也会让我们好高骛远,进而忽略一个最基础的、本源性的问题:《DOOM》游戏本身,能不能运行《DOOM》?
这个套娃问题已经在改版的《DOOM》——GZDoom中得到了解答。早在2015年,就有玩家推出了在GZDoom里游玩初代《DOOM》的模组。
GZDoom是一个经过玩家爆改的特殊版本,基于初代游戏添加了大量扩展功能,以及一部支持如命名脚本与函数等高级编程操作的改进版编辑器。玩家们已经试过在GZDoom里创建和还原各种各样的游戏,重现出一部二十多年前的《DOOM》也不在话下。
不过,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对应的文件所决定。
物件没有实体模型,因此不必和动画文件匹配,只要修改内存里的“状态”,一个物件就有可能播放另一个物件的动画。
动画的内容也没有作文件格式的强制要求,不一定非得是动画文件,完全能够替换为一段可执行的代码或程序——比如另一部《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》还没运行过什么东西。
- 上一篇: 我的世界:世界这么大,想去mc边界外看看?老玩家教你11个方法
- 下一篇: 凝思系统自动加载U盘脚本
猜你喜欢
- 2025-01-09 我的世界联机服务器类指令大全
- 2025-01-09 方舟:异特龙驯养方法及介绍|方舟异特龙代码
- 2025-01-09 我的世界0.10.0作弊码介绍 minecraft作弊码分享
- 2025-01-09 我的世界死亡不掉落指令解答
- 2025-01-09 Linux 中用 expect 自动执行 MySQL 语句
- 2025-01-09 七日杀上帝模式指令与作弊代码大全
- 2025-01-09 《我的世界:移动版》作弊码有什么 作弊码分享
- 2025-01-09 我的世界ess指令作用详解
- 2025-01-09 内网横向移动—NTLM-Relay重放,Responder中继攻击,Ldap,Ews
- 2025-01-09 我的世界服务器常用指令大全
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)