ProductionApi.getAvailableObjects(queueType?)

| Chrono Divide | 3 Reads

ProductionApi.getAvailableObjects 會列出目前可投入生產佇列的單位或建築。
其型別與參數定義於 @chronodivide/game-api 中:

export declare class ProductionApi {
    #private;
    isAvailableForProduction(objRules: TechnoRules): boolean;
    getAvailableObjects(queueType?: QueueType): TechnoRules[];
    getQueueTypeForObject(objRules: TechnoRules): QueueType;
    getQueueData(queueType: QueueType): QueueData;
}

QueueType 的列舉值如下,代表不同的生產佇列種類:

export declare enum QueueType {
    Structures = 0,
    Armory = 1,
    Infantry = 2,
    Vehicles = 3,
    Aircrafts = 4,
    Ships = 5
}

在壓縮後的實作中,方法會先取得可生產的所有物件,再依需要按佇列類型進一步篩選:

getAvailableObjects(t){
    let e = Kp(this, Hp, "f").getAvailableObjects();
    return void 0 !== t && (e = e.filter(e => this.getQueueTypeForObject(e) === t)), e
}
【F:node_modules/@chronodivide/game-api/dist/index.js†byte799820-800031】

使用範例

queueController.ts 便利用此方法依佇列取得可生產物件並計算其優先度:

this.queueStates = QUEUES.map((queueType) => {
    const options = productionApi.getAvailableObjects(queueType);
    const items = this.getPrioritiesForBuildingOptions(
        game,
        options,
        threatCache,
        playerData,
        unitTypeRequests,
        logger,
    );
    const topItem = items.length > 0 ? items[items.length - 1] : undefined;
    return {
        queue: queueType,
        items,
        // only if the top item has a priority above zero
        topItem: topItem && topItem.priority > 0 ? topItem : undefined,
    };
});

簡易示例

以下範例會在開局時列出每個佇列目前可建造的物件名稱:

import { cdapi, Bot, GameApi, QueueType } from "@chronodivide/game-api";

class BuildListBot extends Bot {
    onGameStart(game: GameApi) {
        const prod = game.productionApi;
        for (const q of [
            QueueType.Structures,
            QueueType.Infantry,
            QueueType.Vehicles,
            QueueType.Aircrafts,
            QueueType.Ships,
        ]) {
            const options = prod.getAvailableObjects(q);
            const names = options.map(r => r.name).join(", ");
            console.log(`Queue ${QueueType[q]}: ${names}`);
        }
    }
}

async function main() {
    await cdapi.init(process.env.MIX_DIR!);
    await cdapi.createGame({
        agents: [new BuildListBot("Inspector", "Americans")],
        mapName: "mp03t4.map",
        shortGame: true,
        online: false,
    });
}
main().catch(console.error);

在此程式中,getAvailableObjects(queueType) 會根據指定的佇列類型(建築、步兵、載具等)回傳目前符合建造條件的物件。
若省略參數則會取得所有佇列的可生產項目,再由外部自行分類。
利用這些資訊可建立自動建造邏輯或呈現可建造清單。

 

→返回《@chronodivide/game-api 使用教學與完整 API 對照表》

This article was last edited at