經過十年斷斷續續的工作,我釋出了對 1998 年《創世紀 online》試玩版伺服器的完整逆向工程:https://github.com/draxinar/ouo。約 5,000 個函數已從 MSVC x86 反組譯並轉換為可攜式 C99,每個函數都與二進位檔進行了逐條指令的比較。
對於不熟悉的人來說,《創世紀 online》是一款由 Origin Systems Inc. 於 1997 年開發的大型多人線上角色扮演遊戲 (MMORPG)。它是最早商業上成功的 MMORPG 之一。客戶端運行在 Windows 上,每個伺服器(稱為「shard」)運行在多台 Solaris 機器上(地圖按區域分割)。
「Ultima Online: The Second Age」擴充包的首個版本(1998 年 10 月)附帶了一個獨立的《創世紀 online》試玩版(UoDemo.exe 和 UoDemo.dat),其中包含客戶端和完整伺服器程式碼及數據的 Windows 版本。UoDemo.exe 的日期是 1998-09-02,伺服器數據是於 1998 年 6 月 2 日從生產伺服器提取的。試玩版中一些功能被設為存根,可玩地圖被縮減到 Ocllo 島(Britannia 南海岸一個小型 NPC 城鎮),但其餘部分是 1998 年中期在線運行之 UO 的實際生產伺服器程式碼。試玩版有一個簡單的任務,要求在 Ocllo 島上擊殺一條龍,並概述了基本遊戲機制(對話、交易、戰鬥等)。許多 UO 伺服器模擬器都重用了其中的部分程式碼,但到目前為止,沒有一個完全逆向工程過它。
UoDemo.exe 是使用 Microsoft Visual C++ 5.0 (Visual Studio 97) 編譯的,目標是 C++98 之前的 C++ 方言。
我斷斷續續地在這個專案上工作了 10 年,直到最近大型語言模型 (LLM) 的發展最終使我能夠完成這項看似永無止境的任務。
類別層次結構是早期最重要的部分:CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458),透過 vtable 插槽進行虛擬分派(vtable[0x18] 是 IsPlayer,[0xD0] 是 IsMobile,[0xE4] 是 IsNPC 等)。一旦確定了這些佈局,二進位檔的大部分內容就很容易轉換了。
結果是一個幾乎完美的 1998 年《創世紀 online》伺服器複製品,儘管存在一些差異。
與原始程式碼相比,我修復了穩定性問題(崩潰、溢位、未初始化的變數等)和遊戲性問題(技能提升、聲望/聲譽方向、重生密度等)。每個修復都在原始碼中進行了標記,因此任何與 UoDemo.exe 進行差異比較的人都可以精確地看到哪些地方發生了變化以及為什麼。
一些功能是損壞的,例如重生系統和衰敗系統,這可能是因為它們被部分禁用或專門為試玩版發行版而設為存根:程式碼是完整的,但沒有活動的呼叫點能夠觸及它們。單獨反編譯它們並重新連接分派就足以讓它們再次工作。一些數據也丟失了:例如,遊戲地圖只涵蓋了 Ocllo 島。我編寫了一套完整的工具來處理伺服器數據格式,並為世界上的其他區域完全重建了門、標誌、裝飾品、傳送器、陷阱、寶箱和重生點。
更令人驚訝的是,著名的已退休生態系統仍然存在於程式碼中,儘管這些函數不再被呼叫。我重新連接了捕食者/獵物/食腐動物系統,這非常酷:你現在可以看到狼追逐兔子或烏鴉吃物品。然而,由於缺乏精確的數據,這並沒有實現完整的資源/生產系統。請參閱 Raph Koster 關於 UO 生態系統和 UO 資源系統的部落格文章:1、2 和 3。
我還添加了一些直接的新功能,例如冥想、潛行和移除陷阱技能,這些技能是 OSI 在 1999 年 2 月添加的,儘管程式碼中已經存在一些早期痕跡。大多數新功能都可以使用 -features 參數在啟動時啟用或禁用。
由於試玩版伺服器完全沒有帳戶系統,我透過猜測原始開發者可能會如何實現它來重新實現了它,儘管進行了一些現代化改造。
雖然試玩版伺服器僅支援客戶端 1.25.33,但我已添加對從 1.25.30 到 5.0.9.1 (2007-03-27) 的所有客戶端的支援,無論是否加密。由於多年來有五種完全不同的加密機制,我不得不逆向工程客戶端二進位檔中的每一種。
原始二進位檔是 32 位元,但預設建置現在目標是 64 位元。類別層次結構使用 C 結構嵌入來重現原始 C++ 繼承,因此 CMobile* 仍然可以傳遞給預期 CContainer* 的地方。否則,64 位元上的指標擴展會導致繼承欄位移位,因此某些結構會故意填充以在兩種模式下保持繼承和 vtable 佈局與二進位檔匹配。
我強烈建議您閱讀程式碼和數據,因為其中包含無數關於《創世紀 online》內部細節的鮮為人知的信息,這些信息可以解釋其歷史和設計的許多方面。
OUO 仍處於早期階段,可能仍然存在許多問題。請回報您遇到的任何問題。非常感謝您的貢獻。
如果有人擁有 1997-2003 年左右原始《創世紀 online》伺服器的 dynamic0.mul 或 dynamic0.bkp(伺服器存檔)或 regions.txt(重生定義)或 resbank.mul(資源定義)文件,我將非常感激您能將它們發送給我。原始 dynamic0.mul 或 dynamic0.bkp 文件似乎不太可能真正丟失,因為它們肯定被備份在多個安全的地方。
我擁有從 dynamic0.mul 文件中剝離玩家數據所需的所有工具,以便在分發它們之前保護隱私。
這些文件對於製作高度準確的《創世紀 online》世界內容複製品將極具價值。
