百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2025-06-24 11:54 3 浏览


距离在《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》还没运行过什么东西。

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...