前一陣子因為玩遊戲時遇到的某些需求,覺得恐怕還是得靠自己寫程式的方式處理,於是就初步栽進了 Unreal Engine 早期版本的世界裡。也就是如今都已採免費發佈的《浴血戰場》(Unreal Tournament,1999)及《浴血戰場 2004》(Unreal Tournament 2004,2004)這兩款遊戲,分別是使用第一代及第二代的 Unreal Engine 開發而成。
由於遊戲本身一直以來都有部份的原始碼開放(UnrealScript),可讓人進行修改及延伸。再加上這兩款遊戲已經免費化,並且交由經過特許的社群團隊繼續維護遊戲引擎,使其依然能夠在現代的系統環境上運作。所以倘若可以接受在這樣的框架下做延伸開發,那麼這兩款遊戲其實就代表著兩款免費的跨平台遊戲引擎,開發者可以用來建構出自己想要的東西。
只是雖然遊戲本身是跨平台的,無論是早期官方、或者後來社群接手維護的版本,都有為 Linux 平台提供原生支援。然而在開發這一塊,比方說遊戲隨附的 UnrealEd 編輯器,卻始終只有 Windows 版,所以看似 Linux 不太像是一個可行的開發環境。不過嘗試了一陣,覺得大致上其實是可行的,DR 沒有在研究及編寫 UnrealScript 的過程中,遇到無法在 Linux 系統上實現的事情,於是本文便是一些學習歷程的簡約筆記。
1. 安裝遊戲
獲取遊戲程式就是獲取了遊戲引擎,所以遊戲要先安裝起來,並且確認為可運作的狀態。取決於具體想要使用的的是哪一款遊戲(以及其引擎版本),《浴血戰場》(以下簡稱 UT99)的 Linux How-To 在此,以及《浴血戰場 2004》(以下簡稱 UT2004)的 Linux How-To 在此。
2. 程式碼編輯器
雖然實際上是任何的文字編輯器都可以使用,不過如果想要看得賞心悅目一點,則可以使用例如 Visual Studio Code 搭配第三方的 UnrealScript 支援套件。
3. 使用 UCC 編譯 UnrealScript
UCC 是遊戲隨附的命令行工具,而且有 Linux 版本。而它的眾多功能之一,便是能夠將 UnrealScript 的 *.uc 原始碼編譯至 *.u,所以這是開發環境得以在 Linux 上運作起來的重要基礎。
舉例來說,若要將名為 Foobar 的套件編譯起來,便將該套件的所有 *.uc 原始碼放置到遊戲安裝目錄下的 Foorbar/Classes 子目錄中。然後針對 UT99 的流程,首先是編輯遊戲隱藏目錄內的 *.ini(~/.utpg/System/UnrealTournament.ini),找尋到其中的 [Editor.EditorEngine] 區段,新增以下設定值:
EditPackages=Foobar
接著便執行 UCC make:
- ~/ut/System64/ucc-bin make Foobar
若執行無誤,編譯出來的 Foobar.u 會位於遊戲隱藏目錄「~/.utpg/System」內。至於若出現錯誤,則進一步的錯誤細節,可能會列於 UCC 的日誌檔(~/.utpg/System/ucc.log)內。
重新編譯時,原有已編譯的 Foobar.u 必須要先刪除,否則 UCC make 不會有動作。所以整個過程有可能寫成 Bash 腳本會比較好,然後執行過程中先明確地刪除現有的已編譯檔案:
- rm ~/.utpg/System/Foobar.u
- rm ~/ut/System/Foobar.u
UT2004 的編譯流程則基本上與 UT99 一致,需要編輯的設定檔為「~/.ut2004/System/UT2004.ini」,編輯內容相同,以及執行 UCC make 的指令如下:
- ~/ut2004/System/UCC make Foobar
編譯出來的 Foobar.u,以及一併產出的 Foobar.ucl,皆位於隱藏的「~/.ut2004/System」下。同樣地,UCC 日誌檔(~/.ut2004/System/ucc.log)內會記錄更多執行細節,包含可能更進一步的錯誤資訊。以及重新編譯前,同樣會需要先清除現有的已編譯檔案:
- rm ~/.ut2004/System/Foobar.u
- rm ~/ut2004/System/Foobar.u
除此之外,如果想僅僅從 *.u 產出 *.ucl、而非 *.uc 重新編譯的需求,則使用 UCC exportcache 的指令範例如下:
- ~/ut2004/System/UCC exportcache ~/ut2004/System/Foorbar.u
4. 獲取官方的 UnrealScript 原始碼
如本文前面曾提及的,UT99 及 UT2004 都有將遊戲中使用 UnrealScript 編寫的部份開放出來,作為其 SDK(software development kit,軟體開發套件)的一部份。雖然年代久遠,不過網路上仍可以找到許多複本,上傳至各種不同的地方,可以自行找尋看看。例如以下位址:
5. 反編譯 UnrealScript
除了官方的 UnrealScript 原始碼外,網路上也有許多的擴充模組(mod)或變異器(mutator)程式,只是它們往往並未提供原始碼可供研究。所以一個直接的手段,就是找尋 UnrealScript 的反編譯工具,例如 UE Explorer。儘管這個使用 .NET 開發的工具程式,並未提供 Linux 版本,不過透過 Wine 相容層則是可以運作的。只是前提是得在 Wine 執行環境裡安裝所依賴的 .NET Framework 版本,而無法單純使用 Wine Mono 來執行。
可以透過 winetricks 腳本程式來便利地進行 .NET Framework 的安裝步驟,完成安裝後,再前往 UE Explorer 所在目錄,執行以下指令:
- wine UEExplorer.exe
雖然還是會有一些錯誤訊息顯示出來,不過諸如 *.u 載入及匯出 *.uc 等功能,則確實是能夠運作的。此外可能無法保證,反編譯出來的原始碼,都能夠正常無誤地再編譯回去,或許會再需要經過部份的人工修正。
6. 編寫 UnrealScript 的注意事項
首先或許蠻容易發覺出來的,是 UnrealScript 的程式碼是不區分大小寫的。所以倘若開發者平常是熟練於其它更加嚴謹的程式語言,那麼顯然是需要適應一下。以及開發者若是偏好在 Linux 下使用 grep 去對整個程式碼目錄做內文搜尋,那麼也就需要留意 UnrealScript 是有如此特性。於是可能要用對參數,才好抓出更多想找的東西。
接著另一個需要留意之處,是儘管似乎能夠從多種不同的類別(class)來源呼叫出相同的功能,但其實某些類別及方法是僅有伺服器端能夠存取。這在單人遊戲裡也許不會注意到,然而倘若有多人遊戲的需求,則編寫的程式碼需要留意能否確切在客戶端上執行出想要的結果,否則就必須找尋正確的類別來使用。
UnrealScript 有內建一個 Log() 函式,能夠用來寫入指定的文字訊息到遊戲執行的日誌檔中,以便進行程式碼執行狀況的判讀。UT99 的日誌檔位置為「~/.utpg/System/UnrealTournament.log」;UT2004 則為「~/.ut2004/System/UT2004.log」。
儘管本文並未包含任何的程式碼範例,不過或許可以稍微參考 DR 自製的兩個變異器(CrankMode 及 KFNewbieMode),其內都附有原始碼可做參照。
7. 檢視 *.utx 材質檔
有些時候可能會想要瞭解,程式碼中所載入的材質(texture)究竟長什麼樣子,以及能否在無須開啟遊戲的情況下進行檢視?所幸有一個跨平台的第三方工具程式能夠做到:UE Viewer。下載並解開其 Linux 版本後,可以使用例如以下指令來檢視材質檔內容:
- ./umodel -list ~/ut2004/Textures/WeaponSkins.utx
- ./umodel ~/ut2004/Textures/WeaponSkins.utx AssaultTex0
8. 將 *.ut2 地圖檔匯出至純文字格式
雖然由於遊戲隨附的 UnrealEd 編輯器並未移植到 Linux 平台上,所以並無原生的 Linux 程式可用於檢視地圖檔。不過倘若僅是要查找地圖上的部份資訊,則一個替代方案是將地圖檔匯出至純文字格式。使用 UT2004 的 UCC 執行範例如下:
- ~/ut2004/System/UCC batchexport DM-Deck17.ut2 Level t3d output/
其中需要留意,在前述指令裡,檔案位置是自動從遊戲目錄的 Maps 子目錄裡做搜尋。所以並不是輸入相對路徑或絕對路徑,而是只要輸入檔名本身即可。以及最終輸出的文字檔案(*.t3d),以前述範例來說,則會位於「~/.ut2004/System/output」目錄內。
9. 擴充模組相關之操作方式
以 UT2004 為例,假設要為 KFMod253 模組重新編譯 KFMod 套件(如果有該套件的原始碼位於 ~/ut2004/KFMod253/KFMod/Classes 目錄下),則 UCC make 指令為:
- ~/ut2004/System/UCC make KFMod -mod=KFMod253
以及匯出模組地圖至純文字格式的指令範例如下:
- ~/ut2004/System/UCC batchexport KF-WestLondon.ut2 Level t3d output/ -mod=KFMod253
10. 其它參考資料
- https://beyondunrealwiki.github.io/
- https://unrealarchive.org/
- http://www.koehler-homepage.de/Wormbo/