From e05b057190902623851a2e10da17ed79e7b4640e Mon Sep 17 00:00:00 2001 From: Benjamin Feyer Date: Mon, 9 Dec 2024 04:32:55 +0100 Subject: [PATCH 01/12] reenvented the wheel (; , rewrite the canMove-logic, etc --- .../src/main/java/pp/mdga/game/Game.java | 11 +- .../mdga/server/automaton/game/TurnState.java | 1 + .../ChoosePieceAutomatonState.java | 200 ++++++++++++++++-- .../game/turn/choosepiece/NoPieceState.java | 4 + .../turn/choosepiece/SelectPieceState.java | 102 ++++++++- 5 files changed, 291 insertions(+), 27 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index b5ac8ff3..9d854c94 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java @@ -85,7 +85,7 @@ public Game() { gameStatistics = new Statistic(); initializeDrawPile(); board = new Board(); - die = new Die(2,5,6,3,6); + die = new Die(5,5,5,5,5,5,5,5,5,1,1,6,2,4,6,5,5,5,5,5); } /** @@ -208,6 +208,15 @@ public Player getPlayerByColor(Color color) { return null; } + /** + * This method will be used to the get the active player + * + * @return the active player + */ + public Player getActivePlayer(){ + return getPlayerByColor(activeColor); + } + /** * This method will be used to return all connected players as a list. * 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 c135410e..a752ca15 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 @@ -190,6 +190,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 b4d5c679..b395d7fa 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 @@ -1,5 +1,6 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import com.jme3.util.SortUtil; import pp.mdga.game.*; import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.server.ServerGameLogic; @@ -17,20 +18,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,52 +40,60 @@ 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(); - if (occupant != null){ + if (occupant != null) { return occupant.getColor() != piece.getColor(); } 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; } } @@ -91,9 +101,163 @@ 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){ + System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()"+piece.getState()); + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + System.out.println("Server: ChoosePieceStateAutomaton: canMove:"+canPieceMoveInHome(piece,steps)); + if(canPieceMoveInHome(piece,steps)){ + System.out.println("Server: ChoosePieceStateMachine:canMove: entered canMove/canPieceMoveInHome"); + return true; + } + 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; + if(40> targetIdx){ + Color activeColor = logic.getGame().getActiveColor(); + System.out.println("ChoosePieceAutomaton: targetindex:"+ (pieceIdx+steps)%40); + Node tartgetNode =logic.getGame().getBoard().getInfield()[(pieceIdx+steps)%40]; + if(!tartgetNode.isOccupied(activeColor)){ + if(!tartgetNode.isOccupied()||tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE){ + return true; + } + } + return true; + } + 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()); + if(piece.getState()==PieceState.HOME){ + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:reached if(piece.getState()==PieceState.HOME)"); + int homeIdx =logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); + 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 + 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); + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: targetIdx:" +targetIdx); + if(targetIdx >= 40){ + int stepsToHome = 39- normPieceIdx; + int restMovement = steps-stepsToHome; + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" +stepsToHome); + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: restMovement:" +restMovement); + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: jumpOver:" +jumpOver(restMovement,0,true)); + if(4> restMovement){ + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" +true); + return !jumpOver(restMovement,0,true); + } + } + } + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: 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){ + for(int i =0;i < stepsInHome;i++){ + if(logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; + } + } + //tests if the piece jumps over a piece inside the home + else{ + for(int i = 1+homeIdx; i moveablePieces = new ArrayList<>(); for (Piece piece : activePlayer.getPieces()){ if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){ + System.out.println("Server: NoPieceState: movablePieces.size()"+piece.getState()); 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/SelectPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/SelectPieceState.java index 9aca4089..a49f34c9 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 @@ -1,9 +1,6 @@ package pp.mdga.server.automaton.game.turn.choosepiece; -import pp.mdga.game.Node; -import pp.mdga.game.Piece; -import pp.mdga.game.PieceState; -import pp.mdga.game.ShieldState; +import pp.mdga.game.*; import pp.mdga.message.client.RequestMoveMessage; import pp.mdga.message.server.MoveMessage; import pp.mdga.message.server.SelectPieceMessage; @@ -39,6 +36,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."); @@ -55,18 +53,103 @@ 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); + System.out.println("Server: SelectPieceState: enter in canPieceMoveInHome: targetIndex:"+target); + targetIndex.add(target); + isHomeMove.add(true); + } + else{ + int target = getInfieldTarget(piece); + 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){ if(!moveablePieces.contains(msg.getPiece())){ throw new RuntimeException("invalid Piece"); } - 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()==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); + Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + if (targetHomeIdx == 3) { + piece.setState(PieceState.HOMEFINISHED); + } + else{ + piece.setState(PieceState.HOME); + } + } + 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); + Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + + if (targetHomeIdx == 3) { + piece.setState(PieceState.HOMEFINISHED); + } + piece.setState(PieceState.HOME); + System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): setPiece(Home)"+piece.getState()); + } + } + else{ + 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]; + + oldNode.clearOccupant(); + targetNode.setOccupant(piece); + + Piece occ = targetNode.getOccupant(); + if (occ != null) { + logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); + } + + if(targetNode instanceof StartNode){ + if(piece.getShield()== ShieldState.ACTIVE) piece.setShield(ShieldState.SUPPRESSED); + } + + } + + System.out.println("Server: SelectPieceMessage: received(RequestMoveMessage): pieceState: wichtig"+piece.getState()); boolean homeMove = isHomeMove.get(indexOfPiece); int targIdx = targetIndex.get(indexOfPiece); - + /* Node oldNode = logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(movePiece)]; oldNode.clearOccupant(); if (homeMove) { @@ -88,7 +171,10 @@ public void received(RequestMoveMessage msg, int from){ } targetNode.setOccupant(msg.getPiece()); } - logic.getServerSender().broadcast(new MoveMessage(movePiece, homeMove, targIdx)); + + */ + logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx)); + System.out.println("Server changes from SelectPieceState to movePieceState"); this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); } From 08db05a7d62a822decd48150a88fff4712b2d025 Mon Sep 17 00:00:00 2001 From: Benjamin Feyer Date: Mon, 9 Dec 2024 14:15:05 +0100 Subject: [PATCH 02/12] added more logic for the move --- .../choosepiecestate/SelectPieceState.java | 21 +++ .../src/main/java/pp/mdga/game/Game.java | 2 +- .../ChoosePieceAutomatonState.java | 134 ++++++++++-------- .../game/turn/choosepiece/NoPieceState.java | 1 - .../turn/choosepiece/SelectPieceState.java | 20 +-- 5 files changed, 106 insertions(+), 72 deletions(-) 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..038d049d 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,30 @@ 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); + 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); + 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/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index a6f2deeb..1cc9758f 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java @@ -87,7 +87,7 @@ public Game() { gameStatistics = new Statistic(); initializeDrawPile(); board = new Board(); - die = new Die(2,5,6,3,6); + die = new Die(5,5,5,5,5,5,5,5,1,2,1,2,2,6,3,6); } /** 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 97f8b0ed..19476493 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 @@ -120,93 +120,97 @@ protected int calculateTargetIndex(Piece piece) { * @param piece the piece that will be checked * @return true, if the piece can move */ - protected boolean canMove(Piece piece){ - System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()"+piece.getState()); + protected boolean canMove(Piece piece) { + System.out.println("Server: ChoosePieceStateMachine: canMove: piece.getState()" + piece.getState()); int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); - System.out.println("Server: ChoosePieceStateAutomaton: canMove:"+canPieceMoveInHome(piece,steps)); - if(canPieceMoveInHome(piece,steps)){ + 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; } int pieceIdx = logic.getGame().getBoard().getInfieldIndexOfPiece(piece); - System.out.println("ChoosePieceAutomaton: pieceIndex:"+ pieceIdx); + System.out.println("ChoosePieceAutomaton: pieceIndex:" + pieceIdx); int startIdx = logic.getGame().getActivePlayer().getStartNodeIndex(); - int normPieceIdx = (-startIdx+pieceIdx+40)%40; - int targetIdx = normPieceIdx+steps; - if(40> targetIdx){ + int normPieceIdx = (-startIdx + pieceIdx + 40) % 40; + int targetIdx = normPieceIdx + steps; + //checks if the piece will not go over its home-field + if (40 > targetIdx) { Color activeColor = logic.getGame().getActiveColor(); - System.out.println("ChoosePieceAutomaton: targetindex:"+ (pieceIdx+steps)%40); - Node tartgetNode =logic.getGame().getBoard().getInfield()[(pieceIdx+steps)%40]; - if(!tartgetNode.isOccupied(activeColor)){ - if(!tartgetNode.isOccupied()||tartgetNode.getOccupant().getShield() != ShieldState.ACTIVE){ + 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; } } - 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){ + 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()); - if(piece.getState()==PieceState.HOME){ + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:" + piece.getState()); + steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + if (piece.getState() == PieceState.HOME) { System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: pieceState:reached if(piece.getState()==PieceState.HOME)"); - int homeIdx =logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); - if((4-homeIdx)>steps){ - System.out.println("Server: canPieceMoveInHome: !jumpOver"+ !jumpOver(steps,homeIdx,false)); - return !jumpOver(steps,homeIdx,false); + 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 - if(piece.getState()==PieceState.ACTIVE){ + 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); - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: targetIdx:" +targetIdx); - if(targetIdx >= 40){ - int stepsToHome = 39- normPieceIdx; - int restMovement = steps-stepsToHome; - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: stepsToHome:" +stepsToHome); - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: restMovement:" +restMovement); - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: jumpOver:" +jumpOver(restMovement,0,true)); - if(4> restMovement){ - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" +true); - return !jumpOver(restMovement,0,true); - } + 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); } } - System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: return:" +false); + System.out.println("Server: ChoosePieceStateMachine: canPieceMoveInHome: 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 + * @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){ + private boolean jumpOver(int stepsInHome, int homeIdx, boolean outside) { //tests if the piece comes from the outside in the home - if(outside){ - for(int i =0;i < stepsInHome;i++){ - if(logic.getGame().getActivePlayer().getHomeNodes()[i].isOccupied()) return true; + if (outside) { + 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 inside the home - else{ - for(int i = 1+homeIdx; i moveablePieces = new ArrayList<>(); for (Piece piece : activePlayer.getPieces()){ if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){ - System.out.println("Server: NoPieceState: movablePieces.size()"+piece.getState()); moveablePieces.add(piece); } } 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 ff53a471..93d0d956 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 @@ -64,13 +64,13 @@ public void enter(){ for (Piece piece : moveablePieces) { if(canPieceMoveInHome(piece,steps)){ - int target= getHomeTargetIdx(piece); + 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); + int target = getInfieldTarget(piece,steps); System.out.println("Server: SelectPieceState: enter in else: targetIndex:"+target); targetIndex.add(target); isHomeMove.add(false); @@ -85,6 +85,7 @@ public void received(RequestMoveMessage msg, int from){ if(!moveablePieces.contains(msg.getPiece())){ throw new RuntimeException("invalid Piece"); } + int indexOfPiece = moveablePieces.indexOf(msg.getPiece()); int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); Piece piece = moveablePieces.get(indexOfPiece); @@ -96,7 +97,7 @@ public void received(RequestMoveMessage msg, int from){ int homeIndex = logic.getGame().getActivePlayer().getHomeIndexOfPiece(piece); Node oldNode = logic.getGame().getActivePlayer().getHomeNodes()[homeIndex]; //gets the targetNode - int targetHomeIdx = getHomeTargetIdx(piece); + int targetHomeIdx = getHomeTargetIdx(piece,steps); Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; oldNode.clearOccupant(); @@ -114,7 +115,7 @@ public void received(RequestMoveMessage msg, int from){ Node oldNode = logic.getGame().getBoard().getInfield()[oldNoteIdx]; //gets the targetNode - int targetHomeIdx = getHomeTargetIdx(piece); + int targetHomeIdx = getHomeTargetIdx(piece,steps); Node targetNode = logic.getGame().getActivePlayer().getHomeNodes()[targetHomeIdx]; oldNode.clearOccupant(); @@ -126,26 +127,28 @@ public void received(RequestMoveMessage msg, int from){ piece.setState(PieceState.HOME); 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]; - oldNode.clearOccupant(); - targetNode.setOccupant(piece); - Piece occ = targetNode.getOccupant(); if (occ != null) { logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); } - if(targetNode instanceof StartNode){ + 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()); @@ -186,6 +189,7 @@ public void received(RequestMoveMessage msg, int from){ } */ + LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState: end:"+piece.getState()); logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx)); System.out.println("Server changes from SelectPieceState to movePieceState"); this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); From db16b0d8b630441f312e314babf74b99667627ff Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 14:45:41 +0100 Subject: [PATCH 03/12] Fix shield card issue --- .../gamestate/turnstate/PlayPowerCardState.java | 12 ++---------- .../powercardstate/ChoosePowerCardState.java | 1 - .../turnstate/powercardstate/ShieldState.java | 4 ++-- 3 files changed, 4 insertions(+), 13 deletions(-) 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..2637d324 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 @@ -13,7 +13,6 @@ public class PlayPowerCardState extends TurnStates { private final TurnState parent; private PlayCardMessage playCardMessage; - private int animationCounter = 0; public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { super(parent, logic); @@ -22,11 +21,7 @@ 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++; - } handlePowerCard(playCardMessage); } @@ -41,10 +36,7 @@ public void setPlayCard(PlayCardMessage playCardMessage) { @Override public void selectAnimationEnd(){ - animationCounter--; - if(animationCounter == 0){ - logic.send(new AnimationEndMessage()); - parent.setState(parent.getRollDice()); - } + logic.send(new AnimationEndMessage()); + parent.setState(parent.getRollDice()); } } 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 From 6a4bdfa455b98eaa989f456cb4bee7420c58e98f Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 14:50:29 +0100 Subject: [PATCH 04/12] Fix swap card issue --- .../gamestate/turnstate/PlayPowerCardState.java | 13 +++++++++++++ .../mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) 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 2637d324..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,6 +15,7 @@ public class PlayPowerCardState extends TurnStates { private final TurnState parent; private PlayCardMessage playCardMessage; + private int extraAnimationCounter = 0; public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { super(parent, logic); @@ -21,7 +24,12 @@ public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { + if(playCardMessage.getCard() instanceof SwapCard) { + extraAnimationCounter++; + } + logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard().getCard())); + handlePowerCard(playCardMessage); } @@ -36,6 +44,11 @@ public void setPlayCard(PlayCardMessage playCardMessage) { @Override public void selectAnimationEnd(){ + if(extraAnimationCounter > 0) { + extraAnimationCounter--; + return; + } + logic.send(new AnimationEndMessage()); parent.setState(parent.getRollDice()); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index 5e297189..4a6bb1fe 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java @@ -94,8 +94,8 @@ public Game() { * This method initializes the draw pile with the predefined number of bonus cards. */ private void initializeDrawPile() { -// this.addBonusCards(new TurboCard(), AMOUNT_OF_TURBO_CARDS); -// this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); + this.addBonusCards(new TurboCard(), AMOUNT_OF_TURBO_CARDS); + this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); Collections.shuffle(this.drawPile); } From de0f04b5b72baab01605df3dee58b1dc891d6337 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:07:26 +0100 Subject: [PATCH 05/12] Quality of live improvement --- .../src/main/java/pp/mdga/client/view/GameView.java | 8 +++++++- .../src/main/java/pp/mdga/client/view/MdgaView.java | 7 +++++-- .../turnstate/choosepiecestate/NoPieceState.java | 1 - 3 files changed, 12 insertions(+), 4 deletions(-) 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..163b1ab2 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,8 @@ public class GameView extends MdgaView { private FilterPostProcessor fpp; + public boolean needConfirm = false; + private Node guiHandlerNode = new Node(); public GameView(MdgaApp app) { @@ -116,10 +118,14 @@ public Color getOwnColor() { public void needConfirm() { noPowerButton.hide(); confirmButton.show(); + + needConfirm = true; } public void noConfirm() { confirmButton.hide(); + + needConfirm = false; } public void showNoPower() { 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..7f483c81 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,11 @@ public void pressForward() { } if (this instanceof GameView gameView) { - app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT); + if(gameView.needConfirm) { + 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/choosepiecestate/NoPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java index f43beea9..31931335 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)); From 39d5b43cb888f8cb7dc86c0588b94a7e1b1aa94f Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:10:15 +0100 Subject: [PATCH 06/12] Quality of live improvement --- .../client/src/main/java/pp/mdga/client/view/GameView.java | 4 ++++ .../client/src/main/java/pp/mdga/client/view/MdgaView.java | 2 ++ 2 files changed, 6 insertions(+) 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 163b1ab2..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 @@ -29,6 +29,7 @@ public class GameView extends MdgaView { private FilterPostProcessor fpp; public boolean needConfirm = false; + public boolean needNoPower = false; private Node guiHandlerNode = new Node(); @@ -131,10 +132,13 @@ public void noConfirm() { 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 7f483c81..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 @@ -198,6 +198,8 @@ public void pressForward() { if (this instanceof GameView gameView) { if(gameView.needConfirm) { app.getModelSynchronize().confirm(); + } else if(gameView.needNoPower) { + app.getModelSynchronize().confirm(); } else { app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT); } From d37b9ee2693cd023706171aebaea20bc72179c56 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:36:07 +0100 Subject: [PATCH 07/12] Add powercard drawing --- .../mdga/model/src/main/java/pp/mdga/game/Game.java | 2 +- .../game/turn/choosepiece/SelectPieceState.java | 13 +++++++++++++ .../game/turn/choosepiece/StartPieceState.java | 10 ++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index 9905209a..7e4eba00 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java @@ -87,7 +87,7 @@ public Game() { gameStatistics = new Statistic(); initializeDrawPile(); board = new Board(); - die = new Die(5, 5,5,5,5,5,5,5,5,3, 6 ,5,5,5,5,5,5,5,5,3 ); + die = new Die(); } /** 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 1d11f0c5..9b8c214b 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 @@ -160,6 +160,19 @@ public void received(RequestMoveMessage msg, int from){ 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]; + + 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(); 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..dbc211ca 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 @@ -70,6 +70,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()); } } From 50dc634a9445bcd6594553113dc56d1af27297b8 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:37:08 +0100 Subject: [PATCH 08/12] Add powercard drawing --- .../game/turn/choosepiece/StartPieceState.java | 10 ---------- 1 file changed, 10 deletions(-) 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 dbc211ca..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)); From 55328e9e695a359884ba67c529377e5bd94b80c1 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:43:21 +0100 Subject: [PATCH 09/12] Fixe dice --- .../src/main/java/pp/mdga/client/NotificationSynchronizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..e467384a 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; @@ -207,7 +208,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()); } From a56f68efdcd5eb23b9159520df87eb850c77f2b0 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 16:54:26 +0100 Subject: [PATCH 10/12] fixed Turbo card with zero modifier --- Projekte/.run/MdgaApp.run.xml | 6 +++--- .../java/pp/mdga/client/gamestate/TurnState.java | 5 ----- .../client/gamestate/turnstate/ChoosePieceState.java | 2 +- .../turnstate/choosepiecestate/NoPieceState.java | 2 +- .../game/turn/choosepiece/NoPieceState.java | 12 +++++------- .../automaton/game/turn/choosepiece/NoTurnState.java | 1 + .../main/java/pp/mdga/visitor/ServerCardVisitor.java | 10 ++++++---- 7 files changed, 17 insertions(+), 21 deletions(-) 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/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/choosepiecestate/NoPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/NoPieceState.java index 31931335..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 @@ -70,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/server/automaton/game/turn/choosepiece/NoPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/NoPieceState.java index b4f04e9b..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) { 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/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); + } } } From e699f4556e3bc35cbc1e0ca32178bbf07df0994d Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 16:58:05 +0100 Subject: [PATCH 11/12] Fix error --- .../automaton/game/turn/choosepiece/SelectPieceState.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 9b8c214b..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 @@ -163,6 +163,9 @@ public void received(RequestMoveMessage msg, int from){ 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()) { @@ -208,8 +211,6 @@ public void received(RequestMoveMessage msg, int from){ } */ - LOGGER.log(System.Logger.Level.INFO,"Server : SelectPieceState: PieceState: end:"+piece.getState()); - logic.getServerSender().broadcast(new MoveMessage(piece, homeMove, targIdx)); System.out.println("Server changes from SelectPieceState to movePieceState"); this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); } From 7f92d8183b4c2a5ee87ca39a52cf60107a3b0bc0 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 17:05:42 +0100 Subject: [PATCH 12/12] Adjust delays --- .../src/main/java/pp/mdga/client/NotificationSynchronizer.java | 2 ++ .../client/src/main/java/pp/mdga/client/board/BoardHandler.java | 2 ++ 2 files changed, 4 insertions(+) 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 e467384a..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 @@ -167,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) { 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(); } /**