Newer
Older
PixelPaintWar / apps / server / src / domains / game / entities / bomb / ActiveBombRegistry.ts
/**
 * ActiveBombRegistry
 * サーバー側で設置済み爆弾のライフサイクルを追跡する
 * 爆発時刻に到達した爆弾を回収してBot被弾判定に利用する
 */

/** アクティブ爆弾の状態表現 */
export type ActiveBomb = {
  bombId: string;
  ownerPlayerId: string;
  x: number;
  y: number;
  explodeAtElapsedMs: number;
  ownerTeamId: number;
};

/** 設置済み爆弾を保持し爆発済みのものを回収するレジストリ */
export class ActiveBombRegistry {
  private bombs = new Map<string, ActiveBomb>();

  /** 新規爆弾を登録する */
  public registerBomb(bomb: ActiveBomb): void {
    this.bombs.set(bomb.bombId, bomb);
  }

  /** 爆発時刻に到達した爆弾を回収して返し,レジストリから除去する */
  public collectExplodedBombs(elapsedMs: number): ActiveBomb[] {
    const exploded: ActiveBomb[] = [];

    this.bombs.forEach((bomb, bombId) => {
      if (elapsedMs >= bomb.explodeAtElapsedMs) {
        exploded.push(bomb);
        this.bombs.delete(bombId);
      }
    });

    return exploded;
  }

  /** 登録済み爆弾をすべて破棄する */
  public clear(): void {
    this.bombs.clear();
  }

  /** 現在アクティブな爆弾のスナップショットを返す */
  public getBombsSnapshot(): ActiveBomb[] {
    return Array.from(this.bombs.values());
  }
}