package chess.io; import chess.io.commands.MoveCommand; import chess.model.Game; public class CommandExecutor { private Game game; private OutputSystem outputSystem; public CommandExecutor() { this.game = null; this.outputSystem = null; } public CommandResult executeCommand(Command command) { assert this.game != null : "No input game specified !"; assert this.outputSystem != null : "No output system specified !"; CommandResult result = command.execute(this.game, this.outputSystem); if (result == CommandResult.Moved) { this.game.checkPromotion(((MoveCommand) command).getMove().getFinish()); this.game.checkGameStatus(); this.game.switchPlayerTurn(); } return result; } public void setOutputSystem(OutputSystem outputSystem) { unbindListeners(); this.outputSystem = outputSystem; bindListeners(); } public void setGame(Game game) { unbindListeners(); this.game = game; bindListeners(); } private void unbindListeners() { if (this.game == null || this.outputSystem == null) return; this.game.OnCheck.disconnect(outputSystem::kingIsInCheck); this.game.OnMat.disconnect(outputSystem::kingIsInMat); this.game.OnPat.disconnect(outputSystem::patSituation); this.game.OnPromote.disconnect(outputSystem::promotePawn); this.game.OnWin.disconnect(outputSystem::winnerIs); this.game.OnPlayerTurn.disconnect(outputSystem::playerTurn); } private void bindListeners() { if (this.game == null || this.outputSystem == null) return; this.game.OnCheck.connect(outputSystem::kingIsInCheck); this.game.OnMat.connect(outputSystem::kingIsInMat); this.game.OnPat.connect(outputSystem::patSituation); this.game.OnPromote.connect(outputSystem::promotePawn); this.game.OnWin.connect(outputSystem::winnerIs); this.game.OnPlayerTurn.connect(outputSystem::playerTurn); } }