
距離在《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》還沒運行過什么東西。
原文地址:http://www.myzaker.com/article/62d18ec68e9f0941ed460bc1