遊戲規則MOD
(GAME RULE MODS)

簡介
預先需求
實作概觀
BIG檔案格式
<遊戲規則>.LUA
MOD的方言化(Localization)
建立遊戲規則
顯示特定的螢幕介面
聲明

簡介

這份文件解釋如何為萬艦二的引擎建立新的遊戲規則(Game Rule).遊戲規則 Mod 是一種定義了多人遊戲規則的 Mod .不要將遊戲規則 Mod 和指令列 Mod (command-line mod)搞混了.指令列 Mod 會在另外一份文件中提到.

這一份文件附帶了一個用來當作範例的遊戲規則 Mod "Resource Race",你可以從http://www.relic.com/rdn/取得.這個遊戲模式非常單純,第一個採集到足夠數量資源的人得到勝利.我們會利用這個Mod來說明:

  1. 為你的Mod命名,以及內容描述
  2. 為那些給你的遊戲模式專用的關卡指定目錄
  3. 指定你的遊戲模式特定的選項
  4. 建立用來確定勝負玩家的遊戲規則
  5. 顯示特定的螢幕介面
需求

要建立一個遊戲模式Mod,你會需要下列這些工具和文件.這些檔案都可以在http://www.relic.com/rdn/取得.

Archive.exe — 用來建立.big檔的工具.遊戲模式 Mod 要以這種格式來工作.
SCAR文件 — 萬艦二的 AI script 是以這種格式寫成的.這個基本上就是 Lua(譯註:一種Script Language),只是裡面有一些 HW2 專用的延伸內容.
未壓縮的ResourceRace — ResourceRace.big的內容,以及建立這個檔案所需要的script.

(譯註:你可以透過下列的連結直接取得這些資源:SCAR文件 , ResourceRace的原始內容 , ResourceRace.big)

實作概觀

遊戲模式Mod會製作成 big 檔案,也就是一個壓縮檔(副檔名是 .big),並存放在 bin\GAMERULES 資料夾下.在萬艦二啟動的時候,會去掃描這個目錄,並且從任何找到的big檔案中載入有關的敘述資訊.當建立一個多人遊戲或是和CPU對戰的遊戲時,使用者可以選擇可用的遊戲模式.最基本的遊戲方式-死鬥模式-總是會顯示出來.而任何在這台電腦上找到的遊戲模式也會加入到可用遊戲模式的列表中.

不論是透過Gamespy或者是區域網路LAN連線,在多人連線大廳中會顯示遊戲規則的名稱.如果要連線的電腦沒有對應的.big檔,那就不能加入使用那些規則的遊戲.

當遊戲開始的時候,big檔會被載入,存在於遊戲的主要big檔案(像是Homeworld2.big)中的檔案若是和這裡的檔案有所重複,那麼遊戲本身的資料將會被忽略,會以所載入的遊戲模式Mod的檔案為主.

BIG檔案格式

Big 檔案格式是一種用來把一堆檔案打包成一個大檔案的方法.這樣會讓讀取的速度比較快,並且也會讓遊戲的配給比較容易.在 big 檔案中,有很多的檔案被編排成不同的 TOC (Table of Content,這裡意指排列成表的資料內容).遊戲規則 Mod 最少需要一個 TOC : data.在 data 中至少需要一個檔案:LevelData\Multiplayer\<遊戲規則>.lua.其中<遊戲規則>就和你要新增的遊戲規則名字相同.這個檔案為你的Mod定義了多人遊戲的遊戲規則,指定需要的選項,以及其他項目.

在表格中可以有任何數量的關卡(level)檔案,方言化資訊,甚至是其他一般性的資料,像是新的船隻.

<遊戲規則>.LUA

要定義一個新的遊戲模式,你需要建立一個<遊戲規則>.lua檔案,並且把他放在 Data/LevelData/Multiplayer 目錄下.這個檔案可以被放在打包成 big 檔的mod裡面,或者是直接放在硬碟上.不管怎樣都必須放在 LevelData/Multiplayer 內.在啟動的時候遊戲會建立這個檔案的 MD5 checksum,可以用來作為辨認檔案用,確保在多人遊戲中每個玩家的這個檔案都會相同.

<遊戲規則>.lua的格式如下:
名稱 類別 描述
GameRulesName String or quoted locID 方言化的遊戲規則名稱,可以是字串或者是方言化ID( localization ID, 簡寫成locID),例如"$8000"
Description String or quoted locID 方言化的遊戲規則敘述.會在遊戲設定畫面中顯示.長度限制為256個字元.
Directories Table of named strings 這個表格內容為目錄的路徑. Currently only Levels = is supported(譯註:我不確定他這句話的意思...).當這個項目被特別指明的時候,會指定那些專門為了這個遊戲模式設計的關卡要存放在哪個目錄中.
GameSetupOptions Table of tables 記載遊戲設定選項的表格.格式請參考下面的表格.
OnInit Function 當script 開始的時候會被呼叫.用這個來加入規則,規則最少要有一條.

表格"GameSetupOptions"的格式如下
名稱 類別 描述
Name String 這個選項在 Script 中所使用的名稱
locName String or quoted locID 方言化的名字,用來在遊戲設定畫面中顯示
Tooltip String or quoted locID 關於這個選項的敘述.會出現在畫面下方的 tooltip 列
default int 這個選項的預設值,這一項的值是選項表的索引編號,從0開始數.例如預設的選項是表格中的第一個,那這一項會設定為"0"
Visible bool 當設為 0 時表示這個使用者不會在畫面上看到這個選項,只能從原始碼中看到這個選項.當開啟遊戲時會視為選擇預設的選項.這個值可以用來設定一些一些不希望被使用者調整的選項.
choices table of locID/string pairs 儲存了選項的名稱,內容是以 locID 和字串為一個單元所組成的陣列. loc ID 會顯示成方言化的文字.字串則是選項在 Script 中所使用的名稱.

這個檔案後面的部分(包括 OnInit 函式)是標準的 SCAR 碼.請參考 SCAR 文件以瞭解有哪些函數可以使用.

MOD的方言化(Localization)

對於遊戲規則 Mod 來說,你可以藉由建立一個內有許多 TOC 的壓縮檔來加入方言化的內容.如果這些TOC中有一個被 alias 到 "locale"去,那麼他就會改變 locale 內的資料(譯註,遊戲內預設 locale 是對應到 "萬艦二安裝資料夾\data\Locale\English" 這個資料夾下).你也可以在 Mod 中加入不同的語言,方法是將數個 TOC 的 alias 都定義成 "locale".而 TOC 的名稱代表了對應的語言.要注意的是,由於在所有載入的檔案中的 TOC 的名稱都必須不同,所以你應該確保你將語言的名字以及 Mod 的名稱/版本包含在 TOC 的名稱中.

當一個壓縮檔中有許多的 TOC 時,只有萬艦二目前所使用的語言會被對應到檔案系統的 "Locale" 這個位置.如果沒有指定目前的語言的話,會自動指定為 "English".如此一來就可以讓使用不同語言的玩家使用同樣的 Mod 互相對戰.使用不同語言的玩家在畫面上會看到不同的文字,並且不會發生不同步的狀況.

請參考未壓縮的 Resource Race 資料裡面的 script來當作建立內含數個 TOC 的範例.

要注意的是,保留給遊戲規則 Mod 的方言化 ID 範圍是 8000-8999,因此你所使用的方言化 ID 應該要在此範圍內,以避免發生問題.

建立遊戲規則
在 <遊戲規則>.lua 裡面的 OnInit() 函式中,你應該去執行需要的起始化動作,並且建立至少一個監視函式(watch function).監視函式會在每個 simulation step 被呼叫,用來確認遊戲的結束條件.你也可以隨著遊戲的進展增加或是移除額外的規則.
顯示特定的螢幕介面

在你的 <遊戲規則>.lua 中,你可以藉著由 watch function 去呼叫 ATI_xxx() 函式,以顯示特定的介面.達成的方法是去呼叫 ATI (Advanced Tactical Interface,進階戰術介面)的 SCAR 函式.請參考 SCAR 文件以瞭解有關於這些函數的更多資訊.並參考 Resource Race 來當作其用處的範例.

簡單的說,你需要載入一個檔案,這個檔案裡面描述了一個或數個內含要顯示的項目的 ATI 樣本(template).你的 script 可以在螢幕上指定的 2D 位置顯示這些樣本,並且有一些選項可供調整.s

聲明
本文件主要是翻譯自Relic Developers Network所釋出的"HW2_GameRuleMods.pdf".
翻譯者為西加拉宇宙載具改裝中心的CQD.原始文件版權為Relic所有.