距離在《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》還沒運行過什麼東西。
,