diff --git a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java index 685a985..d210b16 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java @@ -2,9 +2,13 @@ package org.toop.app.canvas; import javafx.scene.paint.Color; import org.toop.app.App; +import org.toop.framework.game.games.reversi.BitboardReversi; +import org.toop.framework.game.players.LocalPlayer; import org.toop.framework.gameFramework.model.game.TurnBasedGame; public class ReversiBitCanvas extends BitGameCanvas { + private TurnBasedGame gameCopy; + private int previousCell; public ReversiBitCanvas() { super(Color.GRAY, new Color(0f, 0.4f, 0.2f, 1f), (App.getHeight() / 4) * 3, (App.getHeight() / 4) * 3, 8, 8, 5, true); canvas.setOnMouseMoved(event -> { @@ -20,6 +24,9 @@ public class ReversiBitCanvas extends BitGameCanvas { break; } } + if (hovered != null) { + checkHoverDots(hovered, cellId); + } }); } @@ -31,9 +38,31 @@ public class ReversiBitCanvas extends BitGameCanvas { @Override public void redraw(TurnBasedGame gameCopy) { + this.gameCopy = gameCopy; clearAll(); long[] board = gameCopy.getBoard(); loopOverBoard(board[0], (i) -> drawDot(Color.WHITE, i)); loopOverBoard(board[1], (i) -> drawDot(Color.BLACK, i)); } + + public void drawLegalDots(TurnBasedGame gameCopy){ + long legal = gameCopy.getLegalMoves(); + loopOverBoard(legal, (i) -> drawInnerDot(gameCopy.getCurrentTurn()==0?new Color(1f,1f,1f,0.65f) :new Color(0f,0f,0f,0.65f), i,false)); + } + + private void checkHoverDots(BitGameCanvas.Cell hovered, int cellId){ + if (previousCell == cellId){ + return; + } + long backflips = ((BitboardReversi)gameCopy).getFlips(1L << previousCell); + loopOverBoard(backflips, (i) -> drawInnerDot(gameCopy.getCurrentTurn()==1?Color.WHITE:Color.BLACK, i,true)); + previousCell = cellId; + if (gameCopy.getPlayer(gameCopy.getCurrentTurn()) instanceof LocalPlayer) { + long legal = gameCopy.getLegalMoves(); + if ((legal & (1L << cellId)) != 0) { + long flips = ((BitboardReversi) gameCopy).getFlips(1L << cellId); + loopOverBoard(flips, (i) -> drawInnerDot(gameCopy.getCurrentTurn() == 0 ? Color.WHITE : Color.BLACK, i, false)); + } + } + } } diff --git a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java index 673e9e1..a301fbe 100644 --- a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java +++ b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java @@ -5,6 +5,7 @@ import javafx.geometry.Pos; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.app.canvas.GameCanvas; +import org.toop.app.canvas.ReversiBitCanvas; import org.toop.app.widget.WidgetContainer; import org.toop.app.widget.view.GameView; import org.toop.framework.eventbus.EventFlow; @@ -153,8 +154,12 @@ public class GenericGameController implements GameController { @Override public void updateUI() { - canvas.redraw(game.deepCopy()); + TurnBasedGame gameCopy = game.deepCopy(); + canvas.redraw(gameCopy); String gameType = game.getClass().getSimpleName().replace("Bitboard",""); gameView.nextPlayer(true, getCurrentPlayer().getName(), game.getPlayer(1-getCurrentPlayerIndex()).getName(),gameType); + if (getCurrentPlayer() instanceof LocalPlayer && gameType.equals("Reversi")){ + ((ReversiBitCanvas)canvas).drawLegalDots(gameCopy); + } } }