Newer
Older
PixelPaintWar / apps / client / src / scenes / game / application / network / handlers / CombatSyncHandler.ts
/**
 * CombatSyncHandler
 * 戦闘関連イベントの受信処理を担当する
 * 爆弾設置と被弾通知を上位へ橋渡しする
 */
import type {
  BombPlacedAckPayload,
  BombPlacedPayload,
  PlayerDeadPayload,
} from "@repo/shared";

/** CombatSyncHandler の初期化入力 */
export type CombatSyncHandlerOptions = {
  onRemoteBombPlaced: (payload: BombPlacedPayload) => void;
  onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void;
  onRemotePlayerDead: (payload: PlayerDeadPayload) => void;
};

/** 戦闘関連イベントの橋渡しを担当する */
export class CombatSyncHandler {
  private readonly onRemoteBombPlaced: (payload: BombPlacedPayload) => void;
  private readonly onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void;
  private readonly onRemotePlayerDead: (payload: PlayerDeadPayload) => void;

  constructor({
    onRemoteBombPlaced,
    onBombPlacementAcknowledged,
    onRemotePlayerDead,
  }: CombatSyncHandlerOptions) {
    this.onRemoteBombPlaced = onRemoteBombPlaced;
    this.onBombPlacementAcknowledged = onBombPlacementAcknowledged;
    this.onRemotePlayerDead = onRemotePlayerDead;
  }

  /** 他プレイヤーの爆弾設置受信イベントを橋渡しする */
  public handleReceivedBombPlaced = (payload: BombPlacedPayload): void => {
    this.onRemoteBombPlaced(payload);
  };

  /** 爆弾設置ACK受信イベントを橋渡しする */
  public handleReceivedBombPlacedAck = (payload: BombPlacedAckPayload): void => {
    this.onBombPlacementAcknowledged(payload);
  };

  /** プレイヤー死亡受信イベントを橋渡しする */
  public handleReceivedPlayerDead = (payload: PlayerDeadPayload): void => {
    this.onRemotePlayerDead(payload);
  };
}