diff --git a/app/src/main/java/chess/OpenGLMain.java b/app/src/main/java/chess/OpenGLMain.java index 1fadc76..7f80446 100644 --- a/app/src/main/java/chess/OpenGLMain.java +++ b/app/src/main/java/chess/OpenGLMain.java @@ -11,7 +11,7 @@ public class OpenGLMain { Game game = new Game(); CommandExecutor commandExecutor = new CommandExecutor(game); - PgnFileSimulator fileSimulator = new PgnFileSimulator(commandExecutor, "games/FoolCheckmate.pgn"); + PgnFileSimulator fileSimulator = new PgnFileSimulator(commandExecutor, "games/CastlingTest.pgn"); DDDView ddd = new DDDView(commandExecutor); diff --git a/app/src/main/java/chess/ai/minimax/GameSimulation.java b/app/src/main/java/chess/ai/minimax/GameSimulation.java index 9d02d5a..26c995f 100644 --- a/app/src/main/java/chess/ai/minimax/GameSimulation.java +++ b/app/src/main/java/chess/ai/minimax/GameSimulation.java @@ -31,7 +31,7 @@ public class GameSimulation extends GameAdapter implements CommandSender { } @Override - public void onCastling(boolean bigCastling) { + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) { if (bigCastling) sendBigCastling(); else diff --git a/app/src/main/java/chess/controller/CommandSender.java b/app/src/main/java/chess/controller/CommandSender.java index dcc2c54..9bbd5e0 100644 --- a/app/src/main/java/chess/controller/CommandSender.java +++ b/app/src/main/java/chess/controller/CommandSender.java @@ -44,6 +44,16 @@ public interface CommandSender { return cmd.getCastlingResult(); } + default boolean canDoCastling() { + CastlingResult castlings = getAllowedCastlings(); + return castlings == CastlingResult.Both || castlings == CastlingResult.Small; + } + + default boolean canDoBigCastling() { + CastlingResult castlings = getAllowedCastlings(); + return castlings == CastlingResult.Both || castlings == CastlingResult.Big; + } + default Piece getPieceAt(int x, int y) { return getPieceAt(new Coordinate(x, y)); } @@ -77,7 +87,7 @@ public interface CommandSender { } default CommandResult sendBigCastling() { - return sendCommand(new CastlingCommand(false)); + return sendCommand(new CastlingCommand(true)); } default CommandResult sendMove(Move move) { diff --git a/app/src/main/java/chess/controller/commands/CastlingCommand.java b/app/src/main/java/chess/controller/commands/CastlingCommand.java index b53fd2e..c92003f 100644 --- a/app/src/main/java/chess/controller/commands/CastlingCommand.java +++ b/app/src/main/java/chess/controller/commands/CastlingCommand.java @@ -51,7 +51,7 @@ public class CastlingCommand extends PlayerCommand { board.setLastMove(this.kingMove); - outputSystem.onCastling(this.bigCastling); + outputSystem.onCastling(this.bigCastling, kingMove, rookMove); return CommandResult.Moved; } diff --git a/app/src/main/java/chess/controller/event/AsyncGameDispatcher.java b/app/src/main/java/chess/controller/event/AsyncGameDispatcher.java index 6dcc3d7..0dfc6bf 100644 --- a/app/src/main/java/chess/controller/event/AsyncGameDispatcher.java +++ b/app/src/main/java/chess/controller/event/AsyncGameDispatcher.java @@ -96,8 +96,8 @@ public class AsyncGameDispatcher extends GameDispatcher { } @Override - public void onCastling(boolean bigCastling) { - asyncForEachCall((l) -> l.onCastling(bigCastling)); + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) { + asyncForEachCall((l) -> l.onCastling(bigCastling, kingMove, rookMove)); } @Override diff --git a/app/src/main/java/chess/controller/event/EmptyGameDispatcher.java b/app/src/main/java/chess/controller/event/EmptyGameDispatcher.java index 1681d9f..c2ff7b8 100644 --- a/app/src/main/java/chess/controller/event/EmptyGameDispatcher.java +++ b/app/src/main/java/chess/controller/event/EmptyGameDispatcher.java @@ -60,7 +60,7 @@ public class EmptyGameDispatcher extends GameDispatcher { } @Override - public void onCastling(boolean bigCastling) { + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) { } @Override diff --git a/app/src/main/java/chess/controller/event/GameAdapter.java b/app/src/main/java/chess/controller/event/GameAdapter.java index bca81c2..54e0189 100644 --- a/app/src/main/java/chess/controller/event/GameAdapter.java +++ b/app/src/main/java/chess/controller/event/GameAdapter.java @@ -47,7 +47,7 @@ public abstract class GameAdapter implements GameListener { public void onDraw() {} @Override - public void onCastling(boolean bigCastling) {} + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) {} @Override public void onPawnPromoted(PromoteType promotion) {} diff --git a/app/src/main/java/chess/controller/event/GameListener.java b/app/src/main/java/chess/controller/event/GameListener.java index 8cb5a24..83e68b1 100644 --- a/app/src/main/java/chess/controller/event/GameListener.java +++ b/app/src/main/java/chess/controller/event/GameListener.java @@ -90,8 +90,10 @@ public interface GameListener { * Invoked when a castling is done * * @param bigCastling if it's queen side castling + * @param kingMove the king's move + * @param rookMove the rook's move */ - void onCastling(boolean bigCastling); + void onCastling(boolean bigCastling, Move kingMove, Move rookMove); /** * Invoked when a pawn is promoted diff --git a/app/src/main/java/chess/view/DDDrender/DDDView.java b/app/src/main/java/chess/view/DDDrender/DDDView.java index 23f834c..93de0c8 100644 --- a/app/src/main/java/chess/view/DDDrender/DDDView.java +++ b/app/src/main/java/chess/view/DDDrender/DDDView.java @@ -1,12 +1,12 @@ package chess.view.DDDrender; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import chess.controller.commands.*; -import chess.controller.commands.GetAllowedCastlingsCommand.CastlingResult; import imgui.ImGui; import imgui.type.ImBoolean; import org.joml.Vector2f; @@ -48,8 +48,6 @@ public class DDDView extends GameAdapter implements CommandSender { private String waitingPopup = null; private final ImBoolean popupOpened = new ImBoolean(false); - public final Signal0 OnReady = new Signal0(); - public DDDView(CommandExecutor commandExecutor) { this.commandExecutor = commandExecutor; this.world = new World(); @@ -225,14 +223,13 @@ public class DDDView extends GameAdapter implements CommandSender { } private void onFooterRender() { - CastlingResult allowedCastlings = getAllowedCastlings(); - ImGui.beginDisabled(allowedCastlings == CastlingResult.None || allowedCastlings == CastlingResult.Big); + ImGui.beginDisabled(!canDoCastling()); if (ImGui.button("Roque")) { sendCastling(); } ImGui.endDisabled(); ImGui.sameLine(); - ImGui.beginDisabled(allowedCastlings == CastlingResult.None || allowedCastlings == CastlingResult.Small); + ImGui.beginDisabled(!canDoBigCastling()); if (ImGui.button("Grand Roque")) { sendBigCastling(); } @@ -303,39 +300,52 @@ public class DDDView extends GameAdapter implements CommandSender { piece.setPosition(bezierCurve(start, top, end, progress)); } - private void move3DPiece(Move move) { - Vector2f pieceDestBoardPos = DDDPlacement.coordinatesToVector(move.getFinish()); - Vector3f pieceDestWorldPos = new Vector3f(pieceDestBoardPos.x(), 0, pieceDestBoardPos.y()); - - final PieceEntity pEntity = this.world.getPiece(move.getStart()); - final Move pMove = move; + private void move3DPieces(List moves) { + final List pEntities = new ArrayList<>(moves.size()); + final List> consumers = new ArrayList<>(moves.size()); this.moveProgress = 0.0f; - Consumer moveConsumer = (delta) -> { - this.moveProgress += delta / animationTime; - pieceTick(this.moveProgress, pEntity, pMove); - }; - - this.window.addRegularTask(moveConsumer); - + for (Move move : moves) { + final PieceEntity pEntity = this.world.getPiece(move.getStart()); + final Consumer moveConsumer = (delta) -> { + this.moveProgress += delta / animationTime / (float) moves.size(); + pieceTick(this.moveProgress, pEntity, move); + }; + pEntities.add(pEntity); + consumers.add(moveConsumer); + this.window.addRegularTask(moveConsumer); + } + try { Thread.sleep((long) (animationTime * 1000.0f)); } catch (InterruptedException e) { } - this.window.removeRegularTask(moveConsumer); - if (move.getDeadPieceCoords() != null) { - this.world.ejectPiece(move.getDeadPieceCoords()); + for (int i = 0; i < moves.size(); i++) { + final Move move = moves.get(i); + final Consumer moveConsumer = consumers.get(i); + final PieceEntity pEntity = pEntities.get(i); + + this.window.removeRegularTask(moveConsumer); + + Vector2f pieceDestBoardPos = DDDPlacement.coordinatesToVector(move.getFinish()); + Vector3f pieceDestWorldPos = new Vector3f(pieceDestBoardPos.x(), 0, pieceDestBoardPos.y()); + + if (move.getDeadPieceCoords() != null) { + this.world.ejectPiece(move.getDeadPieceCoords()); + } + + pEntity.setPosition(pieceDestWorldPos); + + this.world.movePiece(pEntity, move); } - pEntity.setPosition(pieceDestWorldPos); - this.world.movePiece(pEntity, move); } @Override public void onMove(Move move, boolean captured) { - move3DPiece(move); + move3DPieces(List.of(move)); } private void cameraTick(float delta) { @@ -349,7 +359,7 @@ public class DDDView extends GameAdapter implements CommandSender { Consumer rotationConsumer = this::cameraTick; this.window.addRegularTask(rotationConsumer); try { - Thread.sleep((long) (animationTime * 1000)); + Thread.sleep((long) (animationTime * 1000.0f)); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -431,7 +441,7 @@ public class DDDView extends GameAdapter implements CommandSender { } @Override - public void onCastling(boolean bigCastling) { - + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) { + move3DPieces(List.of(kingMove, rookMove)); } } diff --git a/app/src/main/java/chess/view/audio/GameAudio.java b/app/src/main/java/chess/view/audio/GameAudio.java index 9e798b5..02b379f 100644 --- a/app/src/main/java/chess/view/audio/GameAudio.java +++ b/app/src/main/java/chess/view/audio/GameAudio.java @@ -56,7 +56,7 @@ public class GameAudio extends GameAdapter { } @Override - public void onCastling(boolean bigCastling) { + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) { playSound("castle"); } diff --git a/app/src/main/java/chess/view/simplerender/Window.java b/app/src/main/java/chess/view/simplerender/Window.java index fb6cf87..88b029c 100644 --- a/app/src/main/java/chess/view/simplerender/Window.java +++ b/app/src/main/java/chess/view/simplerender/Window.java @@ -178,11 +178,8 @@ public class Window extends JFrame implements GameListener, CommandSender { } private void updateButtons() { - CastlingResult castlings = getAllowedCastlings(); - this.castlingButton.setEnabled( - castlings == CastlingResult.Small || castlings == CastlingResult.Both); - this.bigCastlingButton.setEnabled( - castlings == CastlingResult.Big || castlings == CastlingResult.Both); + this.castlingButton.setEnabled(canDoCastling()); + this.bigCastlingButton.setEnabled(canDoBigCastling()); } @Override @@ -292,7 +289,7 @@ public class Window extends JFrame implements GameListener, CommandSender { } @Override - public void onCastling(boolean bigCastling) {} + public void onCastling(boolean bigCastling, Move kingMove, Move rookMove) {} @Override public void onPawnPromoted(PromoteType promotion) {}