diff --git a/Projekte/.run/MdgaApp.run.xml b/Projekte/.run/MdgaApp.run.xml index cfb2a51b..f0626a72 100644 --- a/Projekte/.run/MdgaApp.run.xml +++ b/Projekte/.run/MdgaApp.run.xml @@ -1,9 +1,9 @@ - - + \ No newline at end of file diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java index 87e535c4..be1a4cfb 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java @@ -121,6 +121,7 @@ private void handleGame(Notification notification) { delay = STANDARD_DELAY; } else if (notification instanceof ActivePlayerNotification n) { gameView.getGuiHandler().setActivePlayer(n.getColor()); + boardHandler.hideDice(); if(n.getColor() != ownColor) boardHandler.showDice(n.getColor()); app.getAcousticHandler().playSound(MdgaSound.UI90); delay = STANDARD_DELAY; @@ -166,10 +167,12 @@ private void handleGame(Notification notification) { if(n.isMoveStart()) { //StartMove boardHandler.movePieceStartAnim(n.getPiece(), n.getMoveIndex()); + waitForAnimation = true; } else { //InfieldMove boardHandler.movePieceAnim(n.getPiece(), n.getStartIndex(), n.getMoveIndex()); + waitForAnimation = true; } guiHandler.hideText(); } else if (notification instanceof ThrowPieceNotification n) { @@ -207,7 +210,6 @@ public void run() { waitForAnimation = true; } else { - boardHandler.hideDice(); if (n.isTurbo()) guiHandler.showRolledDiceMult(n.getEyes(), n.getMultiplier(), n.getColor()); else guiHandler.showRolledDice(n.getEyes(), n.getColor()); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java index 04d0e5bb..8022ea36 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java @@ -473,6 +473,7 @@ private void movePieceStart(UUID uuid, int nodeIndex){ removeItemFromMapList(waitingPiecesMap, color, pieceControl); waitingNodes.get(color).remove(uuid); app.getModelSynchronize().animationEnd(); + app.getModelSynchronize().animationEnd(); } /** @@ -486,6 +487,7 @@ private void movePiece(UUID uuid, int curIndex, int moveIndex){ movePieceRek(uuid, curIndex, moveIndex); app.getModelSynchronize().animationEnd(); + app.getModelSynchronize().animationEnd(); } /** diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java index bd77237a..f2a51ee2 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java @@ -18,7 +18,7 @@ public class GameView extends MdgaView { private GuiHandler guiHandler; private ButtonLeft leaveButton; - private ButtonRight confirmButton; + public ButtonRight confirmButton; private ButtonRight noPowerButton; @@ -28,6 +28,9 @@ public class GameView extends MdgaView { private FilterPostProcessor fpp; + public boolean needConfirm = false; + public boolean needNoPower = false; + private Node guiHandlerNode = new Node(); public GameView(MdgaApp app) { @@ -116,19 +119,26 @@ public Color getOwnColor() { public void needConfirm() { noPowerButton.hide(); confirmButton.show(); + + needConfirm = true; } public void noConfirm() { confirmButton.hide(); + + needConfirm = false; } public void showNoPower() { confirmButton.hide(); noPowerButton.show(); + + needNoPower = true; } public void hideNoPower() { noPowerButton.hide(); + needNoPower = false; } public void enterInterrupt(Color color) { diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java index a16cc2d7..a3da3d87 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java @@ -59,7 +59,6 @@ public void enter() { public void leave() { onLeave(); - settingsButton.hide(); while (settingsDepth > 0) { @@ -197,7 +196,13 @@ public void pressForward() { } if (this instanceof GameView gameView) { - app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT); + if(gameView.needConfirm) { + app.getModelSynchronize().confirm(); + } else if(gameView.needNoPower) { + app.getModelSynchronize().confirm(); + } else { + app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT); + } } if (this instanceof CeremonyView ceremonyView) { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/TurnState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/TurnState.java index 97d0238f..ee52b0fc 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/TurnState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/TurnState.java @@ -159,11 +159,6 @@ public void received(ChoosePieceStateMessage msg){ state.received(msg); } - @Override - public void received(DrawCardMessage msg){ - - } - public ChoosePieceState getChoosePiece() { return choosePieceState; } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/ChoosePieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/ChoosePieceState.java index 57b7f257..226a150f 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/ChoosePieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/ChoosePieceState.java @@ -63,7 +63,7 @@ public void received(StartPieceMessage msg){ } @Override - public void received(NoTurnMessage msg){ + public void received(EndOfTurnMessage msg){ currentState.received(msg); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java index 41464e64..d67f8b03 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java @@ -4,6 +4,8 @@ import pp.mdga.client.ClientState; import pp.mdga.client.gamestate.TurnState; import pp.mdga.game.BonusCard; +import pp.mdga.game.card.ShieldCard; +import pp.mdga.game.card.SwapCard; import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.message.server.PlayCardMessage; import pp.mdga.notification.PlayCardNotification; @@ -13,7 +15,7 @@ public class PlayPowerCardState extends TurnStates { private final TurnState parent; private PlayCardMessage playCardMessage; - private int animationCounter = 0; + private int extraAnimationCounter = 0; public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { super(parent, logic); @@ -22,11 +24,12 @@ public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - animationCounter++; - logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard().getCard())); - if(!playCardMessage.getCard().getCard().equals(BonusCard.TURBO)){ - animationCounter++; + if(playCardMessage.getCard() instanceof SwapCard) { + extraAnimationCounter++; } + + logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard().getCard())); + handlePowerCard(playCardMessage); } @@ -41,10 +44,12 @@ public void setPlayCard(PlayCardMessage playCardMessage) { @Override public void selectAnimationEnd(){ - animationCounter--; - if(animationCounter == 0){ - logic.send(new AnimationEndMessage()); - parent.setState(parent.getRollDice()); + if(extraAnimationCounter > 0) { + extraAnimationCounter--; + return; } + + logic.send(new AnimationEndMessage()); + parent.setState(parent.getRollDice()); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java index f43beea9..cb462f60 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java @@ -38,7 +38,6 @@ public void exit() { @Override public void received(SelectPieceMessage msg) { - //TODO ArrayList pieces = msg.getPieces().stream().map(piece -> logic.getGame().getPieceThroughUUID(piece.getUuid())).collect(Collectors.toCollection(ArrayList::new)); parent.getSelectPiece().setPossiblePieces(pieces); ArrayList listPiece = pieces.stream().map(Piece::getUuid).collect(Collectors.toCollection(ArrayList::new)); @@ -71,7 +70,7 @@ public void received(StartPieceMessage msg){ } @Override - public void received(NoTurnMessage msg){ + public void received(EndOfTurnMessage msg){ logic.getGame().setTurboFlag(false); parent.getParent().getParent().setState(parent.getParent().getParent().getWaiting()); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java index b85899b5..99ab6da4 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java @@ -4,6 +4,7 @@ import pp.mdga.client.ClientState; import pp.mdga.client.gamestate.turnstate.ChoosePieceState; import pp.mdga.game.Piece; +import pp.mdga.game.PieceState; import pp.mdga.message.client.RequestMoveMessage; import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.MoveMessage; @@ -49,10 +50,46 @@ public void selectPiece(Piece piece) { public void received(MoveMessage msg) { Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); //logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); + System.out.println("Client: selectPieceState: receivedMoveMessage: msg.isHomeMoved():"+msg.isHomeMove()); if (msg.isHomeMove()) { + System.out.println("Client: selectPieceState: receivedMoveMessage: msg.getPiece.getState():"+piece.getState()); + if(piece.getState().equals(PieceState.ACTIVE)){ + logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex())); + int infieldIndex=logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + System.out.println("Client: SelectState: activePiece in Home: infieldIndex"+infieldIndex); + if(msg.getTargetIndex()==logic.getGame().getActivePlayer().getHighestHomeIdx()){ + piece.setState(PieceState.HOMEFINISHED); + } + else{ + piece.setState(PieceState.HOME); + } + logic.getGame().getBoard().getInfield()[infieldIndex].clearOccupant(); + logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece); + + + } + else{ + System.out.println("Client: SelectPieceState: receivedMoveMessage:reached else"); + logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex())); + System.out.println("Client: electPieceState: homeindex"+logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece)); + int pieceHomeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); + if(msg.getTargetIndex()==logic.getGame().getActivePlayer().getHighestHomeIdx()){ + piece.setState(PieceState.HOMEFINISHED); + } + else{ + piece.setState(PieceState.HOME); + } + logic.getGame().getActivePlayer().getHomeNodes()[pieceHomeIndex].clearOccupant(); + logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece); + + + } + /* logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex())); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); logic.getGame().getPlayerByColor(piece.getColor()).setPieceInHome(msg.getTargetIndex(), piece); + + */ } else { int oldIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ChoosePowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ChoosePowerCardState.java index 59ce519d..f00acea8 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ChoosePowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ChoosePowerCardState.java @@ -112,7 +112,6 @@ public void received(PossiblePieceMessage msg){ if (msg.getEnemyPossiblePieces().isEmpty()){ parent.getShield().setPossiblePieces(msg.getOwnPossiblePieces().stream().map(piece -> logic.getGame().getPieceThroughUUID(piece.getUuid())).collect(Collectors.toCollection(ArrayList::new))); parent.setState(parent.getShield()); - logic.addNotification(new SelectableShieldNotification(msg.getOwnPossiblePieces().stream().map(Piece::getUuid).toList())); } else { System.out.println("Should enter Swap State"); parent.getSwap().setPossibleOwnPieces(msg.getOwnPossiblePieces().stream().map(piece -> logic.getGame().getPieceThroughUUID(piece.getUuid())).collect(Collectors.toCollection(ArrayList::new))); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ShieldState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ShieldState.java index 95a53dd0..87882f2a 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ShieldState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/powercardstate/ShieldState.java @@ -7,6 +7,7 @@ import pp.mdga.message.client.RequestPlayCardMessage; import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.PlayCardMessage; +import pp.mdga.notification.SelectableShieldNotification; import java.lang.System.Logger.Level; import java.util.ArrayList; @@ -27,8 +28,7 @@ public ShieldState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - logic.addNotification(null); - //TODO: selectable piece notification + logic.addNotification(new SelectableShieldNotification(possiblePieces.stream().map(Piece::getUuid).toList())); } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/Player.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Player.java index e7b8aa2e..c0cdf0f0 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Player.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Player.java @@ -205,6 +205,22 @@ public boolean isHomeFinished(Piece piece) { return true; } + /** + * this method will be used to determine the highest index in the home + * + * @return the index + */ + public int getHighestHomeIdx(){ + for (int i =3; i>=0;i--){ + if(!homeNodes[i].isOccupied()) { + System.out.println("Player: highestHomeIndex:"+i); + return i; + } + + } + return -1; + } + /** * This method returns the give name of the Player * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/TurnState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/TurnState.java index 464b0e70..18a6d457 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/TurnState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/TurnState.java @@ -195,6 +195,7 @@ public void setCurrentState(TurnAutomatonState state) { if (this.currentState != null) { this.currentState.exit(); } + System.out.println("Server: the server entered:"+state); this.currentState = state; this.currentState.enter(); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/ChoosePieceAutomatonState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/ChoosePieceAutomatonState.java index 48fe982a..3b0e121c 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/ChoosePieceAutomatonState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/ChoosePieceAutomatonState.java @@ -17,20 +17,21 @@ public abstract class ChoosePieceAutomatonState extends ServerState { * Constructs a server state of the specified game logic. * * @param choosePieceAutomaton as the automaton of the choose piece state as a ChoosePieceState object. - * @param logic the game logic + * @param logic the game logic */ public ChoosePieceAutomatonState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) { super(logic); this.choosePieceAutomaton = choosePieceAutomaton; } - protected boolean canMove(Piece piece){ + /* + protected boolean canMove(Piece piece) { int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); - if (piece.getState().equals(PieceState.HOME)){ + if (piece.getState().equals(PieceState.HOME)) { return canHomeMove(piece, steps); } else { int homeMoves = getHomeMoves(piece, steps); - if (homeMoves > 0){ + if (homeMoves > 0) { return canHomeMove(piece, homeMoves); } else { return canInfieldMove(piece, steps); @@ -38,28 +39,34 @@ protected boolean canMove(Piece piece){ } } - protected int getHomeMoves(Piece piece, int steps){ + */ + /* + protected int getHomeMoves(Piece piece, int steps) { int pieceIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); Color color = piece.getColor(); int startIndex = logic.getGame().getPlayerByColor(color).getStartNodeIndex(); int moveIndex = pieceIndex + steps; - if (moveIndex > logic.getGame().getBoard().getInfield().length){ - if (startIndex > pieceIndex){ - return steps - (startIndex - pieceIndex -1); + if (moveIndex > logic.getGame().getBoard().getInfield().length) { + if (startIndex > pieceIndex) { + return steps - (startIndex - pieceIndex - 1); } moveIndex %= logic.getGame().getBoard().getInfield().length; - if (moveIndex >= startIndex){ + if (moveIndex >= startIndex) { return moveIndex - startIndex + 1; } return 0; } - if (pieceIndex < startIndex && startIndex <= moveIndex){ + if (pieceIndex < startIndex && startIndex <= moveIndex) { return moveIndex - startIndex + 1; } return 0; } - private boolean canInfieldMove(Piece piece, int steps){ + */ + /* + + + private boolean canInfieldMove(Piece piece, int steps) { int pieceIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); int moveIndex = (pieceIndex + steps) % logic.getGame().getBoard().getInfield().length; Piece occupant = logic.getGame().getBoard().getInfield()[moveIndex].getOccupant(); @@ -72,21 +79,23 @@ private boolean canInfieldMove(Piece piece, int steps){ return true; } - private boolean canHomeMove(Piece piece, int moveIndex){ + */ + /* + private boolean canHomeMove(Piece piece, int moveIndex) { Color color = piece.getColor(); Player player = logic.getGame().getPlayerByColor(color); Node[] homeNodes = player.getHomeNodes(); int index; - if (player.pieceInsideOfHome(piece)){ + if (player.pieceInsideOfHome(piece)) { index = player.getHomeIndexOfPiece(piece); } else { index = 0; } - if (index + moveIndex >= homeNodes.length){ + if (index + moveIndex >= homeNodes.length) { return false; } else { - for (int i = index; i <= index + moveIndex; i++){ - if(homeNodes[i].isOccupied()){ + for (int i = index; i <= index + moveIndex; i++) { + if (homeNodes[i].isOccupied()) { return false; } } @@ -94,9 +103,181 @@ private boolean canHomeMove(Piece piece, int moveIndex){ } } - protected int calculateTargetIndex(Piece piece){ + */ + /* + protected int calculateTargetIndex(Piece piece) { int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); return (logic.getGame().getBoard().getInfieldIndexOfPiece(piece) + steps) % logic.getGame().getBoard().getInfield().length; } + + */ + + + /** + * returns true, if the piece can move inside the home or infield or move from the infield to the home + * + * @param piece the piece that will be checked + * @return true, if the piece can move + */ + protected boolean canMove(Piece piece) { + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + System.out.println("ChoosePieceAutomaton: pieceIndex:" + pieceIdx); + int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); + int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; + int targetIdx = normPieceIdx + steps; + + System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState()); + System.out.println("Server: ChoosePieceStateAutomaton: canMove:" + canPieceMoveInHome(piece, steps)); + //checks if the piece can move in the home + if (canPieceMoveInHome(piece, steps)) { + System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome"); + return true; + } + //checks if the piece will not go over its home-field + else if(40 > targetIdx && (!piece.getState().equals(PieceState.HOME)||!piece.getState().equals(PieceState.HOMEFINISHED))) { + Color activeColor = logic.getGame().getActiveColor(); + System.out.println("ChoosePieceAutomaton: targetindex:" + (pieceIdx + steps) % 40); + Node tartgetNode = logic.getGame().getBoard().getInfield()[(pieceIdx + steps) % 40]; + //checks if the target-node is not occupied by an own color + if (!tartgetNode.isOccupied(activeColor)) { + //checks if the targetNode is not occupied or the occupant ha no shield + if (!tartgetNode.isOccupied() || tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE) { + return true; + } + } + } + //returns false it the piece can't move + return false; + } + + /** + * tests if the piece can move in the home or inside the home + * + * @param piece + * @param steps + * @return false, if the piece can't move in the home + */ + protected boolean canPieceMoveInHome(Piece piece, int steps) { + //tests if the piece can move inside the home + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" + piece.getState()); + steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + if (piece.getState().equals(PieceState.HOME)) { + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:reached if(piece.getState()==PieceState.HOME)"); + int homeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); + //tests if the steps are less than the possible movement + System.out.println("Server: ChoosePieceAutomaton: canPieceMoveInHome: reached second if: (4 - homeIdx) > steps:" + ((4 - homeIdx) > steps) + "steps:" + steps + "homeIdx:" + homeIdx); + if ((4 - homeIdx) > steps) { + System.out.println("Server: canPieceMoveInHome: !jumpOver" + !jumpOver(steps, homeIdx, false)); + return !jumpOver(steps, homeIdx, false); + } + } + //tests if the piece can move in the home + else if (piece.getState() == PieceState.ACTIVE) { + int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); + int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; + int targetIdx = normPieceIdx + steps; + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceIndex:" + pieceIdx + "targetIdx:" + targetIdx); + if (targetIdx >= 40) { + int stepsToHome = 39 - normPieceIdx; + int restMovement = steps - stepsToHome - 1; + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" + stepsToHome + "restMovement:" + restMovement + "jumpOver:" + jumpOver(restMovement, 0, true) + "canPieceMoveInHome: return:" + true); + return !jumpOver(restMovement, 0, true); + } + } else { + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" + false); + return false; + } + return false; + } + + + + + /** + * tests if the piece, when moved in or inside a home, must jump over another piece + * + * @param stepsInHome the steps walked inside the home + * @param homeIdx the index of the piece inside, or 0 if come from outside + * @param outside a boolean, if the piece moves inside a house or in a house + * @return false, if there is no piece to jump over + */ + private boolean jumpOver(int stepsInHome, int homeIdx, boolean outside) { + + //tests if the piece comes from the outside in the home + if (outside) { + if (logic.getGame().getActivePlayer().getHomeNodes()[stepsInHome].isOccupied()) return true; + System.out.println("Server: ChoosePieceState: jumpOver: from outside"); + for (int i = 0; i < stepsInHome; i++) { + if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; + } + } + //tests if the piece jumps over a piece from inside the home + else { + if (logic.getGame().getActivePlayer().getHomeNodes()[stepsInHome + homeIdx].isOccupied()) return true; + for (int i = 1 + homeIdx; i < homeIdx + stepsInHome; i++) { + if (logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; + } + } + return false; + } + + /** + * returns the index in the home, where the piece will go in the home + * + * @param piece the give piece + * @return the index in the home, where the piece will go + */ + protected int getHomeTargetIdx(Piece piece, int steps) { + //tests if the piece is active and move in the house + if (piece.getState() == PieceState.ACTIVE) { + //gets the id's + int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); + //normalize the idx + int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; + //calculate the steps to the home + int stepsToHome = 39 - normPieceIdx; + //calculates the rest-movement inside a home + int restMovement = steps - stepsToHome - 1; + return restMovement; + } + //the else handles the logic if the piece is in the home and moves inside the house + else { + int pieceHomeIdx = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); + return pieceHomeIdx + steps; + } + } + + /** + * returns the target index inside the infield + * + * @param piece the piece given + * @return the index in the infield + */ + protected int getInfieldTarget(Piece piece, int steps) { + int index = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + return (steps + index) % 40; + } + + + /** + * this method is used for calculating the targetIndex + * + * @param piece + * @return + */ + protected int calculateTargetIndex(Piece piece) { + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + if (canPieceMoveInHome(piece, steps)) { + System.out.println("Server: ChoosePieceStateAutomaton: calculate index in home:" + getHomeTargetIdx(piece, steps)); + return getHomeTargetIdx(piece, steps); + } + System.out.println("Server: ChoosePieceStateAutomaton: calculate index in Infield:" + getInfieldTarget(piece, steps)); + return getInfieldTarget(piece, steps); + } + + } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoPieceState.java index 1a15946f..af88e20c 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoPieceState.java @@ -28,16 +28,14 @@ private void initialize(){ Player activePlayer = logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()); if(logic.getGame().getDiceModifier() == 0){ if (logic.getGame().getDiceEyes() == 6) { - if (activePlayer.hasPieceInWaitingArea()){ - if (!logic.getGame().getBoard().getInfield()[activePlayer.getStartNodeIndex()].isOccupied(activePlayer.getColor())){ - this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getWaitingPieceState()); - } else { - this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getNoTurnState()); + if (activePlayer.hasPieceInWaitingArea()) { + if (!logic.getGame().getBoard().getInfield()[activePlayer.getStartNodeIndex()].isOccupied(activePlayer.getColor())) { + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getWaitingPieceState()); + return; } - } else { - this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getNoTurnState()); } } + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getNoTurnState()); } else if (activePlayer.hasPieceInWaitingArea()) { if (!logic.getGame().getBoard().getInfield()[activePlayer.getStartNodeIndex()].isOccupied(activePlayer.getColor())){ if (logic.getGame().getDiceEyes() == 6) { @@ -62,7 +60,10 @@ private void checkSelectPiece(Player activePlayer){ moveablePieces.add(piece); } } + System.out.println("Server: NoPieceState: movablePieces.size()"+moveablePieces.size()); + System.out.println("Server: NoPiece: piece.getState"+moveablePieces.get(0).getState()); moveablePieces.removeIf(piece -> !canMove(piece)); + System.out.println("Server: NoPieceState: movablePieces.size(): after deletion:"+moveablePieces.size()); if (moveablePieces.isEmpty()) { this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getNoTurnState()); } else { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoTurnState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoTurnState.java index 368088a4..e6c4770a 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoTurnState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoTurnState.java @@ -29,6 +29,7 @@ private void setActivePlayer(Color color) { } else { setActivePlayer(color.next(logic.getGame())); } + this.choosePieceAutomaton.getTurnAutomaton().getGameAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getGameAutomaton().getTurnState()); } /** diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/SelectPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/SelectPieceState.java index 3dd0e330..3a61365f 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/SelectPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/SelectPieceState.java @@ -38,6 +38,7 @@ public void setMoveablePieces(ArrayList moveablePieces) { /** * This method will be used whenever this state will be entered. */ + /* @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered SelectPieceState state."); @@ -54,6 +55,30 @@ public void enter() { } logic.getServerSender().send(logic.getGame().getActivePlayerId(), new SelectPieceMessage(moveablePieces, isHomeMove, targetIndex)); } + */ + + @Override + public void enter(){ + LOGGER.log(System.Logger.Level.DEBUG, "Entered SelectPieceState state in the Server."); + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + for (Piece piece : moveablePieces) { + + if(canPieceMoveInHome(piece,steps)){ + int target= getHomeTargetIdx(piece,steps); + System.out.println("Server: SelectPieceState: enter in canPieceMoveInHome: targetIndex:"+target); + targetIndex.add(target); + isHomeMove.add(true); + } + else{ + int target = getInfieldTarget(piece,steps); + System.out.println("Server: SelectPieceState: enter in else: targetIndex:"+target); + targetIndex.add(target); + isHomeMove.add(false); + } + } + System.out.println("Server: SelectPiece: enter: send: "+moveablePieces.get(0)+isHomeMove.get(0)+targetIndex.get(0)); + logic.getServerSender().send(logic.getGame().getActivePlayerId(), new SelectPieceMessage(moveablePieces, isHomeMove, targetIndex)); + } @Override public void received(RequestMoveMessage msg, int from){ @@ -62,10 +87,96 @@ public void received(RequestMoveMessage msg, int from){ } int indexOfPiece = moveablePieces.indexOf(msg.getPiece()); - Piece movePiece = moveablePieces.get(indexOfPiece); + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + Piece piece = moveablePieces.get(indexOfPiece); + if(canPieceMoveInHome(piece,steps)){ + System.out.println("Server: SelectPieceState: canPieceMoveInHome(piece,steps)"); + if(piece.getState().equals(PieceState.HOME)) { + System.out.println("Server: SelectPieceState: piece.getState()==PieceState.HOME"); + //gets the oldNode + int homeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); + Node oldNode = logic.getGame().getActivePlayer().getHomeNodes()[homeIndex]; + //gets the targetNode + int targetHomeIdx = getHomeTargetIdx(piece,steps); + Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; + if (targetHomeIdx ==logic.getGame().getActivePlayer().getHighestHomeIdx()) { + piece.setState(PieceState.HOMEFINISHED); + } + else{ + piece.setState(PieceState.HOME); + } + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + System.out.println("sets homefinsihed here:"+ (targetHomeIdx ==logic.getGame().getActivePlayer().getHighestHomeIdx())+"targetIdx:"+targetHomeIdx+"HighestHomeIdx:"+logic.getGame().getActivePlayer().getHighestHomeIdx()); + + } + else{ + System.out.println("Server: SelectPieceState: entered else"); + int oldNoteIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx]; + + //gets the targetNode + int targetHomeIdx = getHomeTargetIdx(piece,steps); + Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; + + if (targetHomeIdx ==logic.getGame().getActivePlayer().getHighestHomeIdx()) { + piece.setState(PieceState.HOMEFINISHED); + } + else{ + piece.setState(PieceState.HOME); + } + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + System.out.println("sets homefinsihed:"+ (targetHomeIdx ==logic.getGame().getActivePlayer().getHighestHomeIdx())+"targetIdx:"+targetHomeIdx+"HighestHomeIdx:"+logic.getGame().getActivePlayer().getHighestHomeIdx()); + + System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): setPiece(Home)"+piece.getState()); + } + LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState()); + } + else{ + LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState:"+piece.getState()); + int oldNoteIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); + Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx]; + + int targetIndex = (oldNoteIdx+steps)%40; + Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex]; + + Piece occ = targetNode.getOccupant(); + if (occ != null) { + logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); + } + + if(targetNode.isStart()){ + if(piece.getShield()== ShieldState.ACTIVE) piece.setShield(ShieldState.SUPPRESSED); + } + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + + } + + System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): pieceState: wichtig"+piece.getState()); boolean homeMove = isHomeMove.get(indexOfPiece); int targIdx = targetIndex.get(indexOfPiece); + Node targetNode = logic.getGame().getBoard().getInfield()[targIdx]; + + LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState: end:"+piece.getState()); + logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx)); + + if(targetNode.isBonus()) { + for (Player p : logic.getGame().getPlayersAsList()) { + if(p.getColor() == logic.getGame().getActiveColor()) { + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(logic.getGame().draw())); + } else { + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(new HiddenCard())); + } + } + } + + /* Node oldNode = logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(movePiece)]; oldNode.clearOccupant(); if (homeMove) { @@ -81,7 +192,7 @@ public void received(RequestMoveMessage msg, int from){ movePiece.setShield(ShieldState.NONE); } else { Node targetNode = logic.getGame().getBoard().getInfield()[targIdx]; - + //TODO durch merge auskommentiert if(targetNode.isBonus()) { for (Player p : logic.getGame().getPlayersAsList()) { if(p.getColor() == logic.getGame().getActiveColor()) { @@ -98,7 +209,9 @@ public void received(RequestMoveMessage msg, int from){ } targetNode.setOccupant(msg.getPiece()); } - logic.getServerSender().broadcast(new MoveMessage(movePiece, homeMove, targIdx)); + + */ + System.out.println("Server changes from SelectPieceState to movePieceState"); this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/StartPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/StartPieceState.java index 9a9b7e6a..700b627e 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/StartPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/StartPieceState.java @@ -46,16 +46,6 @@ public void received(RequestMoveMessage msg, int from){ int targetIndex = calculateTargetIndex(piece); Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex]; - if(targetNode.isBonus()) { - for (Player p : logic.getGame().getPlayersAsList()) { - if(p.getColor() == logic.getGame().getActiveColor()) { - logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(logic.getGame().draw())); - } else { - logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(new HiddenCard())); - } - } - } - //send MoveMessage logic.getServerSender().broadcast(new MoveMessage(piece, false, targetIndex)); @@ -70,6 +60,16 @@ public void received(RequestMoveMessage msg, int from){ //move piece to targetNode targetNode.setOccupant(piece); + if(targetNode.isBonus()) { + for (Player p : logic.getGame().getPlayersAsList()) { + if(p.getColor() == logic.getGame().getActiveColor()) { + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(logic.getGame().draw())); + } else { + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(p.getColor()), new DrawCardMessage(new HiddenCard())); + } + } + } + this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java b/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java index 6050d29d..000828c1 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java @@ -41,7 +41,7 @@ public ServerCardVisitor(ServerGameLogic logic) { */ @Override public void visit(TurboCard card) { - for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) { + for (Piece piece : this.logic.getGame().getActivePlayer().getPieces()) { if (piece.getState() == PieceState.ACTIVE) { if (!this.cards.contains(card)) { this.cards.add(card); @@ -58,7 +58,7 @@ public void visit(TurboCard card) { @Override public void visit(SwapCard card) { List possibleOwnPieces = new ArrayList<>(); - for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) { + for (Piece piece : this.logic.getGame().getActivePlayer().getPieces()) { if (piece.getState() == PieceState.ACTIVE) { if (!possibleOwnPieces.contains(piece)) { possibleOwnPieces.add(piece); @@ -68,7 +68,7 @@ public void visit(SwapCard card) { List possibleOtherPieces = new ArrayList<>(); for (var player : this.logic.getGame().getPlayers().values()) { - if (player != this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor())) { + if (player != this.logic.getGame().getActivePlayer()) { for (Piece piece : player.getPieces()) { if (piece.getState() == PieceState.ACTIVE) { if (!possibleOtherPieces.contains(piece)) { @@ -82,7 +82,9 @@ public void visit(SwapCard card) { if (!possibleOtherPieces.isEmpty() && !possibleOwnPieces.isEmpty()) { this.swapOwnPieces.addAll(possibleOwnPieces); this.swapOtherPieces.addAll(possibleOtherPieces); - this.cards.add(card); + if (!this.cards.contains(card)) { + this.cards.add(card); + } } }