using Minesweeper.Core; using Minesweeper.ECS; namespace Minesweeper.Commands { public sealed class SelectFieldCommandHandler : IGameCommandHandler { private readonly IGameStateService gameStateService; public SelectFieldCommandHandler(IGameStateService gameStateService) { this.gameStateService = gameStateService; } public void Handle(SelectFieldCommand command) { gameStateService.SetState(GameState.FieldSelection); } } public sealed class StartGameCommandHandler : IGameCommandHandler { private readonly IBoardEcsSyncService boardEcsSyncService; private readonly IBoardService boardService; private readonly IGameStateService gameStateService; public StartGameCommandHandler(IBoardService boardService, IBoardEcsSyncService boardEcsSyncService, IGameStateService gameStateService) { this.boardService = boardService; this.boardEcsSyncService = boardEcsSyncService; this.gameStateService = gameStateService; } public void Handle(StartGameCommand command) { boardService.InitializeEmptyBoard(); gameStateService.SetState(GameState.Preparing); boardEcsSyncService.SyncBoard(boardService); boardEcsSyncService.SyncGameState(gameStateService.Current, false); } } public sealed class OpenCellCommandHandler : IGameCommandHandler { private readonly IBoardEcsSyncService boardEcsSyncService; private readonly IBoardService boardService; private readonly IGameStateService gameStateService; public OpenCellCommandHandler(IBoardService boardService, IBoardEcsSyncService boardEcsSyncService, IGameStateService gameStateService) { this.boardService = boardService; this.boardEcsSyncService = boardEcsSyncService; this.gameStateService = gameStateService; } public void Handle(OpenCellCommand command) { var state = gameStateService.Current; if (state != GameState.Preparing && state != GameState.Playing) { return; } if (state == GameState.Preparing) { if (boardService.TryGetCell(command.X, command.Y, out var cell) && cell.IsFlagged) { return; } if (!boardService.GenerateAfterFirstClick(command.X, command.Y)) { return; } } var result = boardService.OpenCell(command.X, command.Y); if (result.Invalid || !result.Changed) { return; } if (result.HitMine) { gameStateService.SetState(GameState.Lost); } else if (result.Won) { gameStateService.SetState(GameState.Won); } else if (state == GameState.Preparing) { gameStateService.SetState(GameState.Playing); } boardEcsSyncService.SyncBoard(boardService); boardEcsSyncService.SyncGameState(gameStateService.Current, boardService.IsGenerated); } } public sealed class ToggleFlagCommandHandler : IGameCommandHandler { private readonly IBoardEcsSyncService boardEcsSyncService; private readonly IBoardService boardService; private readonly IGameStateService gameStateService; public ToggleFlagCommandHandler(IBoardService boardService, IBoardEcsSyncService boardEcsSyncService, IGameStateService gameStateService) { this.boardService = boardService; this.boardEcsSyncService = boardEcsSyncService; this.gameStateService = gameStateService; } public void Handle(ToggleFlagCommand command) { var state = gameStateService.Current; if (state != GameState.Preparing && state != GameState.Playing) { return; } var result = boardService.ToggleFlag(command.X, command.Y); if (result.Invalid || !result.Changed) { return; } boardEcsSyncService.SyncBoard(boardService); boardEcsSyncService.SyncGameState(gameStateService.Current, boardService.IsGenerated); } } public sealed class RestartCommandHandler : IGameCommandHandler { private readonly IBoardEcsSyncService boardEcsSyncService; private readonly IBoardService boardService; private readonly IGameStateService gameStateService; public RestartCommandHandler(IBoardService boardService, IBoardEcsSyncService boardEcsSyncService, IGameStateService gameStateService) { this.boardService = boardService; this.boardEcsSyncService = boardEcsSyncService; this.gameStateService = gameStateService; } public void Handle(RestartCommand command) { boardService.InitializeEmptyBoard(); gameStateService.SetState(GameState.Preparing); boardEcsSyncService.SyncBoard(boardService); boardEcsSyncService.SyncGameState(gameStateService.Current, false); } } public sealed class PauseCommandHandler : IGameCommandHandler { public void Handle(PauseCommand command) { } } public sealed class ResumeCommandHandler : IGameCommandHandler { public void Handle(ResumeCommand command) { } } public sealed class GoToMenuCommandHandler : IGameCommandHandler { private readonly IBoardEcsSyncService boardEcsSyncService; private readonly IGameStateService gameStateService; public GoToMenuCommandHandler(IBoardEcsSyncService boardEcsSyncService, IGameStateService gameStateService) { this.boardEcsSyncService = boardEcsSyncService; this.gameStateService = gameStateService; } public void Handle(GoToMenuCommand command) { gameStateService.SetState(GameState.FieldSelection); boardEcsSyncService.SyncGameState(gameStateService.Current, false); } } }