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 = {
  onGameStarted: (startTime: number) => void;
  getBombManager: () => BombManager | null;
};

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

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

  /** 内部ゲーム開始イベントを適用する */
  public applyGameStarted(startTime: number): void {
    this.onGameStarted(startTime);
  }

  /** 内部リモート爆弾設置イベントを適用する */
  public applyRemoteBombPlaced(payload: BombPlacedPayload): void {
    this.getBombManager()?.applyPlacedBombFromOthers(payload);
  }

  /** 内部爆弾設置ACKイベントを適用する */
  public applyBombPlacementAcknowledged(payload: BombPlacedAckPayload): void {
    this.getBombManager()?.applyPlacedBombAck(payload);
  }
}