MapApi.isVisibleTile(tile, playerName, tileElevation?)

| Chrono Divide | 1 Reads

 

在 MapApi 中,isVisibleTile(tile, playerName, tileElevation?) 用來判斷某格子在指定高度是否已被玩家揭露(即不在迷霧或戰爭迷霧之下)。
型別聲明位於 index.d.ts,並給出簡短說明:

705      findPath(speedType: SpeedType, from: PathNode, to: PathNode, options?: PathFinderOptions): PathNode[];
706      /** If the tile is not covered by shroud for the specified player */
707      isVisibleTile(tile: Tile, playerName: string, tileElevation?: number): boolean;
708      getTileResourceData(tile: Tile): TileResourceData | undefined;

在壓縮後的實現中,函數會先取得玩家對象,再利用地圖的 mapShroudTrait 檢查該位置是否被迷霧遮蔽。如果未遮蔽,就返回 true

}isVisibleTile(e,t,i=0){var s=Op(this,Ip,"f").getPlayerByName(t);if(!s)throw new Error(`Player "${t}" doesn't exist`);return!Op(this,Ip,"f").mapShroudTrait.getPlayerShroud(s)?.isShrouded(e,i)}getTileResourceData(e){...
【F:node_modules/@chronodivide/game-api/dist/index.js†byte787840-788099】

使用情境

倉庫中的多個模組會借由 isVisibleTile 判斷目標地點是否已被探明,例如在偵查任務完成後移除目標:

if (gameApi.mapApi.isVisibleTile(targetTile, playerData.name)) {
    this.logger(
        `Scout target ${this.scoutTarget.x},${this.scoutTarget.y} successfully scouted, moving to next`,
    );
    this.setScoutTarget(null, gameApi.getCurrentTick());
}

另一處例子是在地圖模組計算可見格數時遍歷範圍並統計:

for (let xx = startPoint.x; xx < endPoint.x; ++xx) {
    for (let yy = startPoint.y; yy < endPoint.y; ++yy) {
        let tile = mapApi.getTile(xx, yy);
        if (tile) {
            ++validTiles;
            if (mapApi.isVisibleTile(tile, playerData.name)) {
                ++visibleTiles;
            }
        }
    }
}

簡易示例

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

class VisibilityCheckBot extends Bot {
    onGameStart(game: GameApi) {
        const tile = game.mapApi.getTile(40, 30);
        if (!tile) return;

        // 默認只檢查地表 (tileElevation = 0)
        const visible = game.mapApi.isVisibleTile(tile, this.name);
        console.log(`Tile (40,30) visible: ${visible}`);

        // 若要檢查其他高度,可傳入第三個參數
        const bridgeVisible = game.mapApi.isVisibleTile(tile, this.name, 1);
        console.log(`Tile (40,30) at elevation 1 visible: ${bridgeVisible}`);
    }
}

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

此 bot 在開局時取得 (40,30) 的格子,然後分別檢查默認高度與指定高度是否對自己可見。isVisibleTile 的第三個參數可用來處理高架橋等情況;若省略則默認為 0。


綜合來看,isVisibleTile 適用於判定某格是否已被我方視野探測到,常用於偵查邏輯或統計地圖上已探索區域。通過取得玩家的霧罩數據並確認格子是否被遮蔽,就能快速獲知當前可見狀況。

 

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

This article was last edited at