diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index cd8ff80..048ed13 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -46,26 +46,26 @@ { key: "currentHurricanes", run: ({ roomId, output, tickData }) => { - if (tickData.hurricaneSync.snapshotUpdates.length === 0) { + if (tickData.hurricaneSync.currentUpdates.length === 0) { return; } output.publishCurrentHurricanesToRoom( roomId, - tickData.hurricaneSync.snapshotUpdates, + tickData.hurricaneSync.currentUpdates, ); }, }, { key: "updateHurricanes", run: ({ roomId, output, tickData }) => { - if (tickData.hurricaneSync.deltaUpdates.length === 0) { + if (tickData.hurricaneSync.updateUpdates.length === 0) { return; } output.publishUpdateHurricanesToRoom( roomId, - tickData.hurricaneSync.deltaUpdates, + tickData.hurricaneSync.updateUpdates, ); }, }, diff --git a/apps/server/src/domains/game/loop/HurricaneSystem.ts b/apps/server/src/domains/game/loop/HurricaneSystem.ts index cca4002..681cbf4 100644 --- a/apps/server/src/domains/game/loop/HurricaneSystem.ts +++ b/apps/server/src/domains/game/loop/HurricaneSystem.ts @@ -5,17 +5,19 @@ */ import { config } from "@server/config"; import { Player } from "../entities/player/Player.js"; -import { HurricaneMotionService } from "./hurricane/HurricaneMotionService.js"; -import { HurricaneSyncService } from "./hurricane/HurricaneSyncService.js"; -import { HurricaneHitService } from "./hurricane/HurricaneHitService.js"; +import { + HurricaneHitService, + HurricaneMotionService, + HurricaneSyncService, +} from "./hurricane/index.js"; import type { HurricaneState, HurricaneSyncOutputs, MapGridSize, -} from "./hurricane/hurricaneTypes.js"; +} from "./hurricane/index.js"; /** 1ティック分のハリケーン同期出力 */ -export type { HurricaneSyncOutputs } from "./hurricane/hurricaneTypes.js"; +export type { HurricaneSyncOutputs } from "./hurricane/index.js"; /** ハリケーン状態の生成更新と被弾判定を管理する */ export class HurricaneSystem { diff --git a/apps/server/src/domains/game/loop/hurricane/HurricaneSyncService.ts b/apps/server/src/domains/game/loop/hurricane/HurricaneSyncService.ts index 343e341..554e5a2 100644 --- a/apps/server/src/domains/game/loop/hurricane/HurricaneSyncService.ts +++ b/apps/server/src/domains/game/loop/hurricane/HurricaneSyncService.ts @@ -11,9 +11,6 @@ HurricaneSyncSnapshot, } from "./hurricaneTypes.js"; -const HURRICANE_RELIABLE_RESYNC_INTERVAL_MS = - config.GAME_CONFIG.NETWORK_SYNC.HURRICANE_RELIABLE_RESYNC_INTERVAL_MS; - const quantizeValue = (value: number, scale: number): number => { return Math.round(value * scale) / scale; }; @@ -56,7 +53,6 @@ /** ハリケーン同期データを生成する */ export class HurricaneSyncService { private hasInitialSyncPending = false; - private lastReliableSyncElapsedMs = -1; private readonly lastSentSnapshotByHurricaneId = new Map< string, HurricaneSyncSnapshot @@ -69,58 +65,40 @@ /** 1ティック分の current/update 同期配列を返す */ public consumeSyncOutputs( - elapsedMs: number, + _elapsedMs: number, hurricanes: HurricaneState[], ): HurricaneSyncOutputs { - const snapshotUpdates = this.consumeSnapshotUpdates(elapsedMs, hurricanes); - const deltaUpdates = this.consumeDeltaUpdates(hurricanes); + const currentUpdates = this.consumeCurrentUpdates(hurricanes); + const updateUpdates = this.consumeUpdateUpdates(hurricanes); return { - snapshotUpdates, - deltaUpdates, + currentUpdates, + updateUpdates, }; } /** 同期状態を初期化する */ public clear(): void { this.hasInitialSyncPending = false; - this.lastReliableSyncElapsedMs = -1; this.lastSentSnapshotByHurricaneId.clear(); } - /** current-hurricanes 用の全量同期を返す */ - private consumeSnapshotUpdates( - elapsedMs: number, - hurricanes: HurricaneState[], - ): HurricaneStatePayload[] { + /** current-hurricanes 用の初回全量同期を返す */ + private consumeCurrentUpdates(hurricanes: HurricaneState[]): HurricaneStatePayload[] { if (hurricanes.length === 0) { return []; } if (this.hasInitialSyncPending) { this.hasInitialSyncPending = false; - this.lastReliableSyncElapsedMs = elapsedMs; return this.buildSnapshotPayloadAndCommit(hurricanes); } - if (this.lastReliableSyncElapsedMs < 0) { - this.lastReliableSyncElapsedMs = elapsedMs; - return []; - } - - if ( - elapsedMs - this.lastReliableSyncElapsedMs - < HURRICANE_RELIABLE_RESYNC_INTERVAL_MS - ) { - return []; - } - - this.lastReliableSyncElapsedMs = elapsedMs; - return this.buildSnapshotPayloadAndCommit(hurricanes); + return []; } /** 差分同期配信用のハリケーン状態配列を返す */ - private consumeDeltaUpdates( + private consumeUpdateUpdates( hurricanes: HurricaneState[], ): HurricaneStatePayload[] { return collectSyncDeltaEntries( diff --git a/apps/server/src/domains/game/loop/hurricane/hurricaneTypes.ts b/apps/server/src/domains/game/loop/hurricane/hurricaneTypes.ts index 329741f..fb99ca4 100644 --- a/apps/server/src/domains/game/loop/hurricane/hurricaneTypes.ts +++ b/apps/server/src/domains/game/loop/hurricane/hurricaneTypes.ts @@ -31,6 +31,6 @@ /** 1ティック分のハリケーン同期出力 */ export type HurricaneSyncOutputs = { - snapshotUpdates: HurricaneStatePayload[]; - deltaUpdates: HurricaneStatePayload[]; + currentUpdates: HurricaneStatePayload[]; + updateUpdates: HurricaneStatePayload[]; }; diff --git a/apps/server/src/domains/game/loop/hurricane/index.ts b/apps/server/src/domains/game/loop/hurricane/index.ts new file mode 100644 index 0000000..231b825 --- /dev/null +++ b/apps/server/src/domains/game/loop/hurricane/index.ts @@ -0,0 +1,13 @@ +/** + * hurricane index + * ハリケーン関連サービスと型の再公開をまとめる + */ +export { HurricaneMotionService } from "./HurricaneMotionService.js"; +export { HurricaneSyncService } from "./HurricaneSyncService.js"; +export { HurricaneHitService } from "./HurricaneHitService.js"; +export type { + HurricaneState, + HurricaneSyncOutputs, + HurricaneSyncSnapshot, + MapGridSize, +} from "./hurricaneTypes.js"; diff --git a/packages/shared/src/config/gameConfig.ts b/packages/shared/src/config/gameConfig.ts index b1f5d2c..f3670ce 100644 --- a/packages/shared/src/config/gameConfig.ts +++ b/packages/shared/src/config/gameConfig.ts @@ -9,7 +9,6 @@ POSITION_QUANTIZE_SCALE: 100, HURRICANE_POSITION_QUANTIZE_SCALE: 10, HURRICANE_ROTATION_QUANTIZE_SCALE: 4, - HURRICANE_RELIABLE_RESYNC_INTERVAL_MS: 200, } as const; /** AOI同期で利用する1セルのグリッド幅 */ @@ -68,7 +67,6 @@ POSITION_QUANTIZE_SCALE: NETWORK_SYNC_CONFIG.POSITION_QUANTIZE_SCALE, // 後方互換のため維持 HURRICANE_POSITION_QUANTIZE_SCALE: NETWORK_SYNC_CONFIG.HURRICANE_POSITION_QUANTIZE_SCALE, // 後方互換のため維持 HURRICANE_ROTATION_QUANTIZE_SCALE: NETWORK_SYNC_CONFIG.HURRICANE_ROTATION_QUANTIZE_SCALE, // 後方互換のため維持 - HURRICANE_RELIABLE_RESYNC_INTERVAL_MS: NETWORK_SYNC_CONFIG.HURRICANE_RELIABLE_RESYNC_INTERVAL_MS, // 後方互換のため維持 // AOI設定(クライアント/サーバー契約) AOI_CELL_SIZE, diff --git a/packages/shared/src/domains/game/tick/tick.type.ts b/packages/shared/src/domains/game/tick/tick.type.ts index ff7bd8f..100342c 100644 --- a/packages/shared/src/domains/game/tick/tick.type.ts +++ b/packages/shared/src/domains/game/tick/tick.type.ts @@ -11,10 +11,10 @@ /** 1ティック分のハリケーン同期データ */ export type HurricaneSyncData = { - /** 初回同期や定期再同期で配信する全量スナップショット */ - snapshotUpdates: HurricaneStatePayload[]; - /** スナップショット間で配信する差分更新 */ - deltaUpdates: HurricaneStatePayload[]; + /** 初回同期や定期再同期で配信する全量更新 */ + currentUpdates: HurricaneStatePayload[]; + /** current 同期間で配信する差分更新 */ + updateUpdates: HurricaneStatePayload[]; }; /** 1ティック分のプレイヤー差分更新とマップ差分を表す共有データ */