Newer
Older
PixelPaintWar / apps / server / src / network / handlers / game / aoi / aoiVisibility.ts
/**
 * aoiVisibility
 * ゲーム送信で利用するAOI可視判定ロジックを提供する
 * 受信者視点のAOI窓計算と対象可視判定を共通化する
 */
import { domain } from "@repo/shared";
import { config } from "@server/config";

/** AOI窓の境界型 */
export type AoiWindow = domain.game.aoi.AoiWindow;

/** グリッド座標を持つ可視判定対象型 */
export type AoiTarget = {
  x: number;
  y: number;
};

/** 受信者座標からAOI窓を解決する */
export const resolveViewerAoiWindow = (
  viewer: AoiTarget,
): AoiWindow => {
  const centerCell = domain.game.aoi.resolveAoiCellFromPosition(
    viewer.x,
    viewer.y,
    config.GAME_CONFIG.AOI_CELL_SIZE,
  );

  return domain.game.aoi.resolveAoiWindowFromCell(
    centerCell,
    config.GAME_CONFIG.AOI_WINDOW_COLS,
    config.GAME_CONFIG.AOI_WINDOW_ROWS,
  );
};

/** 対象座標がAOI窓に含まれるか判定する */
export const isTargetInAoiWindow = (
  target: AoiTarget,
  aoiWindow: AoiWindow,
): boolean => {
  return domain.game.aoi.isPositionInAoiWindow(
    target.x,
    target.y,
    aoiWindow,
    config.GAME_CONFIG.AOI_CELL_SIZE,
  );
};

/** 受信者座標からAOIセルを解決する */
export const resolveViewerAoiCell = (viewer: AoiTarget): domain.game.aoi.AoiCell => {
  return domain.game.aoi.resolveAoiCellFromPosition(
    viewer.x,
    viewer.y,
    config.GAME_CONFIG.AOI_CELL_SIZE,
  );
};