Newer
Older
PixelPaintWar / apps / server / src / domains / game / entities / player / playerSpawn.ts
/**
 * playerSpawn
 * プレイヤー初期生成時のスポーン座標設定を提供する
 */
import { config } from "@server/config";
import { Player } from "./Player.js";

type SpawnMapSize = {
  gridCols: number;
  gridRows: number;
};

/** プレイヤーを生成し,初期スポーン座標を設定して返す */
// 💡 引数に teamId を追加
export const createSpawnedPlayer = (
  id: string,
  name: string,
  teamId: number,
  mapSize?: SpawnMapSize,
): Player => {
  const player = new Player(id, name, teamId); // ここにteamIdを渡す!

  const { TEAM_COUNT } = config.GAME_CONFIG;
  const gridCols = mapSize?.gridCols ?? config.GAME_CONFIG.GRID_COLS;
  const gridRows = mapSize?.gridRows ?? config.GAME_CONFIG.GRID_ROWS;

  let baseX = gridCols / 2;
  let baseY = gridRows / 2;

  switch (player.teamId % TEAM_COUNT) {
    case 0: // 左上
      baseX = 2;
      baseY = 2;
      break;
    case 1: // 右下
      baseX = gridCols - 2;
      baseY = gridRows - 2;
      break;
    case 2: // 右上
      baseX = gridCols - 2;
      baseY = 2;
      break;
    case 3: // 左下
      baseX = 2;
      baseY = gridRows - 2;
      break;
  }

  const scatterX = (Math.random() - 0.5) * 2;
  const scatterY = (Math.random() - 0.5) * 2;

  player.x = Math.max(1, Math.min(gridCols - 1, baseX + scatterX));
  player.y = Math.max(1, Math.min(gridRows - 1, baseY + scatterY));

  // リスポーン時に戻る座標として初期位置を保持する
  player.initialX = player.x;
  player.initialY = player.y;

  return player;
};