PublicApi.init(mixDir)
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1238
PublicApi.init(mixDir) 與初始化流程
在安裝套件後,PublicApi 是進入點,cdapi 即為其實例。
於 dist/index.d.ts
中可以看到此類別的宣告,其中 init
方法會接收一個 MIX 資料夾路徑並回傳 Promise<void>
:
export declare class PublicApi {
#private;
init(mixDir: string): Promise<void>;
getAvailableMaps(): string[];
getAvailableGameModes(mapName: string): number[];
...
}
在編譯後的 index.js
裡可找到 init
的實作。程式首先建立若干私有欄位,接著於 init
內載入 Blob polyfill、定位資源目錄並初始化檔案系統。
重點步驟如下:
Vm = a.resolve((0, e.default)(), "./res");
class Hm {
constructor() {
Ym.add(this),
Gm.set(this, void 0),
$m.set(this, void 0),
qm.set(this, void 0),
Xm.set(this, void 0),
Zm.set(this, !1),
Qm.set(this, void 0)
}
async init(e) {
Wm(this, Ym, "m", Km).call(this),
globalThis.Blob || (globalThis.Blob = (await Promise.resolve()
.then(__webpack_require__.bind(__webpack_require__, 91))).Blob);
var t = await (0, n.getOriginPrivateDirectory)(o.default, a.resolve(e)),
i = await (0, n.getOriginPrivateDirectory)(o.default, Vm),
e = await (0, n.getOriginPrivateDirectory)(o.default, process.cwd());
Dt.initGameResSource(vt.Local);
let s = await Dt.initRfs(t);
s.addDirectoryHandle(i),
s.addDirectoryHandle(e);
let r = await Dt.initVfs(s, Tr.get("vfs"));
await r.loadStandaloneFiles(),
await r.loadExtraMixFiles(Dt.getActiveEngine()),
await r.addMixFile("ra2cd.mix"),
await r.loadImplicitMixFiles(Dt.getActiveEngine()),
Dt.loadRules(),
zm(this, Qm, await Dt.loadMapList(), "f"),
zm(this, Gm, Dt.getMpModes(), "f"),
zm(this, Zm, !0, "f")
}
...
}
此處流程為:
-
透過
getOriginPrivateDirectory
取得:-
mixDir
指向的 RA2 安裝資料夾。 -
套件自身的
res
目錄。 -
目前工作目錄。
-
-
建立 RFS (resource file system),並將上述三個資料夾都加入搜尋路徑。
-
建立 VFS,載入獨立檔案與額外的 MIX 檔,包含
ra2cd.mix
,以及引擎預設的 MIX 檔。 -
載入規則檔與地圖清單 (
loadRules
,loadMapList
),同時取得各地圖支援的遊戲模式 (getMpModes
)。 -
設定初始化完成的旗標,之後才能呼叫
getAvailableMaps
、createGame
等其他方法。
使用範例
官方 README 的示例程式於開始時呼叫 cdapi.init
,並傳入 RA2 的 MIX 目錄:
class ExampleBot extends Bot {}
async function main() {
const mapName = "mp03t4.map";
// Replace MIX_DIR with your original RA2 installation folder
await cdapi.init(process.env.MIX_DIR || "./");
const game = await cdapi.createGame({
agents: [
new ExampleBot("AgentRed", "Americans"),
new ExampleBot("AgentBlue", "French")
],
...
});
}
init
完成後即可使用 createGame
建立離線或線上對戰。
若在呼叫 init
前嘗試取得地圖或建立遊戲,程式會拋出 “API is not initialized” 的錯誤。
總結而言,PublicApi.init(mixDir)
會根據提供的 RA2 資料夾初始化檔案系統、載入必要的 MIX 與規則檔,並儲存可用地圖及其遊戲模式。
這是使用 @chronodivide/game-api
的第一步,呼叫後才能進一步建立遊戲或查詢相關資料。
→返回《@chronodivide/game-api 使用教學與完整 API 對照表》
This article was last edited at