/**
* BombHitContextProvider
* 爆弾当たり判定で利用するローカルプレイヤー情報を供給する
* プレイヤー管理構造から最小の判定DTOへ変換して返す
*/
import { config } from "@client/config";
import { LocalPlayerController } from "@client/scenes/game/entities/player/PlayerController";
import type { TeamCollisionCircle } from "@client/scenes/game/entities/bomb/BombHitDetector";
import type { GamePlayers } from "./game.types";
/** 被弾判定と報告に利用するプレイヤー円情報 */
export type ReportablePlayerCircle = TeamCollisionCircle & {
playerId: string;
};
/** 判定用コンテキスト供給クラスの初期化入力 */
type BombHitContextProviderOptions = {
players: GamePlayers;
myId: string;
};
/** 爆弾当たり判定に必要なローカルプレイヤー情報を返す */
export class BombHitContextProvider {
private players: GamePlayers;
private myId: string;
constructor({ players, myId }: BombHitContextProviderOptions) {
this.players = players;
this.myId = myId;
}
/** ローカルプレイヤーの判定用DTOを取得する */
public getLocalPlayerCircle(): TeamCollisionCircle | null {
const me = this.players[this.myId];
if (!me || !(me instanceof LocalPlayerController)) {
return null;
}
const position = me.getPosition();
const snapshot = me.getSnapshot();
return {
x: position.x,
y: position.y,
radius: config.GAME_CONFIG.PLAYER_RADIUS,
teamId: snapshot.teamId,
};
}
/** 被弾報告対象として扱うプレイヤー円情報を取得する */
public getReportablePlayerCircles(): ReportablePlayerCircle[] {
const reportablePlayers = Object.entries(this.players).filter(([playerId]) => {
return playerId === this.myId || this.isBotPlayerId(playerId);
});
return reportablePlayers.map(([playerId, controller]) => {
const position = controller.getPosition();
const snapshot = controller.getSnapshot();
return {
playerId,
x: position.x,
y: position.y,
radius: config.GAME_CONFIG.PLAYER_RADIUS,
teamId: snapshot.teamId,
};
});
}
/** BotプレイヤーIDかどうかを判定する */
private isBotPlayerId(playerId: string): boolean {
return playerId.startsWith("bot:");
}
}