PublicApi.init(mixDir)

| Chrono Divide | 3 Reads

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)。

  • 設定初始化完成的旗標,之後才能呼叫 getAvailableMapscreateGame 等其他方法。


使用範例

官方 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