From f25f446232179902f8ea21fc8e4a01d395f5b631 Mon Sep 17 00:00:00 2001 From: Quackster Date: Thu, 8 Feb 2024 21:25:33 +1000 Subject: [PATCH] Fix finishing a game of chess --- .../game/games/gamehalls/GameChess.java | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java index 5af32ae..095b2aa 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java @@ -4,12 +4,15 @@ import com.github.bhlangonijr.chesslib.*; import com.github.bhlangonijr.chesslib.move.Move; import com.github.bhlangonijr.chesslib.move.MoveGenerator; import com.github.bhlangonijr.chesslib.move.MoveGeneratorException; -import org.alexdev.havana.game.games.triggers.GameTrigger; import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; import org.alexdev.havana.game.player.Player; import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.games.triggers.GameTrigger; import org.alexdev.havana.messages.outgoing.rooms.games.ITEMMSG; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -30,12 +33,15 @@ public class GameChess extends GamehallGame { private Board board; private GameToken[] gameTokens; + private Player nextTurn; private HashMap playerSides; public GameChess(List chairs) { super(chairs); } + + @Override public void gameStart() { this.playerSides = new HashMap<>(); @@ -112,9 +118,7 @@ public class GameChess extends GamehallGame { } if (command.equals("MOVEPIECE")) { - char currentSide = this.board.getSideToMove() == Side.BLACK ? 'b' : 'w'; - - if (currentSide != this.playerSides.get(player).getToken()) { + if (this.nextTurn != player) { player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! this.broadcastMap(); return; @@ -140,7 +144,6 @@ public class GameChess extends GamehallGame { Square toSquare = Square.valueOf(args[1].toUpperCase()); if (fromSquare == toSquare) { - player.getRoomUser().getTimerManager().resetRoomTimer(); return; } @@ -149,8 +152,9 @@ public class GameChess extends GamehallGame { try { var moveList = MoveGenerator.generateLegalMoves(this.board); - isLegalMove = moveList.contains(move);//.stream().anyMatch(m -> m.getFrom() == fromSquare && m.getTo() == toSquare); + isLegalMove = moveList.contains(move); + // Add pawn -> promotion if (!isLegalMove && Board.isPromoRank(this.board.getSideToMove(), move)) { // if the move is not legal, check if pawn promotion is legal move = new Move(fromSquare, toSquare, Piece.make(this.board.getSideToMove(), PieceType.QUEEN)); isLegalMove = moveList.contains(move); @@ -160,7 +164,7 @@ public class GameChess extends GamehallGame { if (isLegalMove) { this.board.doMove(move, true); - /*if (this.board.isDraw() || this.board.isInsufficientMaterial()) { + if (this.board.isDraw()) { this.gameFinished = true; this.showChat("The chess game has ended in a draw"); return; @@ -172,9 +176,9 @@ public class GameChess extends GamehallGame { this.gameFinished = true; this.showChat(player.getDetails().getName() + " has won the chess game"); return; - } else if (this.board.isKingAttacked()) { - this.showChat("The king is being attacked!"); - }*/ + } + + this.swapTurns(player); } player.getRoomUser().getTimerManager().resetRoomTimer(); @@ -257,22 +261,43 @@ public class GameChess extends GamehallGame { private String[] getCurrentlyPlaying() { String[] playerNames = new String[]{"", ""}; - if (this.board != null && this.board.getSideToMove() != null) { /*for (int i = 0; i < this.playersInGame.size(); i++) { Player player = this.playersInGame.get(i); playerNames[i] = Character.toUpperCase(this.playerSides.get(player).getToken()) + " " + player.getDetails().getName(); }*/ - char currentSide = this.board.getSideToMove() == Side.BLACK ? 'b' : 'w'; - - if (this.getPlayerBySide(currentSide) != null) { - playerNames[0] = Character.toUpperCase(currentSide) + " " + this.getPlayerBySide(currentSide).getDetails().getName(); - } + if (this.nextTurn != null) { + playerNames[0] = Character.toUpperCase(this.playerSides.get(this.nextTurn).getToken()) + " " + this.nextTurn.getDetails().getName(); } return playerNames; } + private void showChat(String chat) { + for (Player p : this.getPlayers()) { + p.send(new CHAT_MESSAGE(CHAT_MESSAGE.ChatMessageType.CHAT, p.getRoomUser().getInstanceId(), chat, 0)); + } + } + + /** + * Swap who's turn it is to play. + * + * @param player the player to swap away from + */ + private void swapTurns(Player player) { + Player nextPlayer = null; + + if (this.nextTurn == player) { + for (Player p : this.getPlayers()) { + if (p != player) { + nextPlayer = p; + } + } + } + + this.nextTurn = nextPlayer; + } + /** * Reset the game map. */ @@ -282,6 +307,10 @@ public class GameChess extends GamehallGame { new GameToken('b') }; + if (this.getPlayers().size() > 0) { + this.nextTurn = this.getPlayerBySide('w'); // White always goes first, according to chess rules. + } + this.gameFinished = false; this.board = new Board(); } @@ -328,7 +357,7 @@ public class GameChess extends GamehallGame { @Override public int getMinimumPeopleRequired() { - return 1; + return 2; } @Override