Newer
Older
PixelPaintWar / apps / client / src / scenes / game / application / GameEventFacade.ts
/**
 * GameEventFacade
 * ゲーム中に受信したイベントの適用窓口を提供する
 * セッション開始同期と爆弾反映の処理を集約する
 */
import type { BombPlacedAckPayload, BombPlacedPayload } from "@repo/shared";
import type { BombManager } from "../entities/bomb/BombManager";

/** GameEventFacade の初期化入力 */
export type GameEventFacadeOptions = {
  onGameStart: (startTime: number) => void;
  getBombManager: () => BombManager | null;
};

/** 受信イベントの適用窓口を提供する */
export class GameEventFacade {
  private readonly onGameStart: (startTime: number) => void;
  private readonly getBombManager: () => BombManager | null;

  constructor({ onGameStart, getBombManager }: GameEventFacadeOptions) {
    this.onGameStart = onGameStart;
    this.getBombManager = getBombManager;
  }

  /** サーバー同期のゲーム開始時刻を適用する */
  public handleGameStart(startTime: number): void {
    this.onGameStart(startTime);
  }

  /** 他プレイヤー爆弾設置を反映する */
  public handleBombPlacedFromOthers(payload: BombPlacedPayload): void {
    this.getBombManager()?.applyPlacedBombFromOthers(payload);
  }

  /** 爆弾設置ACKを反映する */
  public handleBombPlacedAck(payload: BombPlacedAckPayload): void {
    this.getBombManager()?.applyPlacedBombAck(payload);
  }
}