From 8c22d935a9566226f6f0c796abb65ecc6fc9bf0d Mon Sep 17 00:00:00 2001 From: Hanno Fleischer Date: Sun, 8 Dec 2024 01:59:29 +0100 Subject: [PATCH] implemented rest of the server logic in choosepiece substates, and began to fix bugs after testing --- .../java/pp/mdga/client/view/GameView.java | 1 - .../mdga/client/dialogstate/LobbyState.java | 2 + .../gamestate/DetermineStartPlayerState.java | 2 +- .../mdga/client/gamestate/SpectatorState.java | 2 +- .../mdga/client/gamestate/WaitingState.java | 2 +- .../determinestartplayerstate/Intro.java | 1 - .../RollRankingDiceState.java | 4 + .../WaitRankingState.java | 5 +- .../gamestate/turnstate/RollDiceState.java | 1 + .../choosepiecestate/NoPieceState.java | 12 ++- .../choosepiecestate/SelectPieceState.java | 2 +- .../choosepiecestate/StartPieceState.java | 6 ++ .../choosepiecestate/WaitingPieceState.java | 2 +- .../src/main/java/pp/mdga/game/Game.java | 2 +- .../src/main/java/pp/mdga/game/Node.java | 19 +++++ .../src/main/java/pp/mdga/game/Player.java | 51 +++++++++++++ .../message/client/RequestMoveMessage.java | 18 +++-- .../pp/mdga/message/server/MoveMessage.java | 19 +++-- .../message/server/SelectPieceMessage.java | 8 +- .../pp/mdga/server/automaton/GameState.java | 10 ++- .../server/automaton/game/AnimationState.java | 1 - .../game/DetermineStartPlayerState.java | 3 - .../mdga/server/automaton/game/TurnState.java | 10 ++- .../automaton/game/turn/ChoosePieceState.java | 6 +- .../automaton/game/turn/MovePieceState.java | 37 ++++++++++ .../automaton/game/turn/PowerCardState.java | 12 ++- .../automaton/game/turn/RollDiceState.java | 8 +- .../ChoosePieceAutomatonState.java | 74 +++++++++++++++++++ .../game/turn/choosepiece/NoPieceState.java | 52 ++++++++++++- .../game/turn/choosepiece/NoTurnState.java | 14 ++++ .../turn/choosepiece/SelectPieceState.java | 54 ++++++++++++++ .../turn/choosepiece/StartPieceState.java | 21 ++++++ .../turn/choosepiece/WaitingPieceState.java | 23 ++++++ .../turn/powercard/ChoosePowerCardState.java | 13 +++- .../game/turn/rolldice/FirstRollState.java | 30 ++++---- .../game/turn/rolldice/SecondRollState.java | 5 +- .../game/turn/rolldice/ThirdRollState.java | 9 +-- 37 files changed, 467 insertions(+), 74 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 4f77a6a9..bd77237a 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 @@ -52,7 +52,6 @@ public GameView(MdgaApp app) { @Override public void onEnter() { - setOwnColor(Color.AIRFORCE); camera.init(ownColor); boardHandler.init(); guiHandler.init(ownColor); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/dialogstate/LobbyState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/dialogstate/LobbyState.java index c75da3ba..d0bae598 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/dialogstate/LobbyState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/dialogstate/LobbyState.java @@ -80,6 +80,7 @@ public void received(ServerStartGameMessage msg) { } } logic.getGame().setBoard(msg.getBoard()); + System.out.println(logic.getGame().getPlayerById(logic.getOwnPlayerId()).toString()); logic.addNotification(new GameNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor())); for (var player : logic.getGame().getPlayers().values()) { List pieces = new ArrayList<>(); @@ -94,6 +95,7 @@ public void received(ServerStartGameMessage msg) { @Override public void received(LobbyPlayerJoinedMessage msg) { if (msg.getPlayer().getName().equals(logic.getOwnPlayerName())) { + System.out.println(msg.getId()); logic.setOwnPlayerId(msg.getId()); } if (msg.isHost() && msg.getId() == logic.getOwnPlayerId()) { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/DetermineStartPlayerState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/DetermineStartPlayerState.java index 9ac6f912..f16eff99 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/DetermineStartPlayerState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/DetermineStartPlayerState.java @@ -61,8 +61,8 @@ public void setState(DetermineStartPlayerStates state) { if(this.state != null){ this.state.exit(); } - state.enter(); this.state = state; + this.state.enter(); } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/SpectatorState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/SpectatorState.java index 48a12c28..1b999ef8 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/SpectatorState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/SpectatorState.java @@ -63,7 +63,7 @@ public void received(ActivePlayerMessage msg) { @Override public void received(MoveMessage msg) { - Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getIdentifier()); + Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); if (msg.isHomeMove()) { logic.addNotification(new HomeMoveNotification(pieceToMove.getUuid(), msg.getTargetIndex())); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(pieceToMove)].clearOccupant(); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/WaitingState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/WaitingState.java index 3ceffeb9..dc67c07e 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/WaitingState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/WaitingState.java @@ -67,7 +67,7 @@ public void received(ActivePlayerMessage msg) { @Override public void received(MoveMessage msg) { - Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getIdentifier()); + Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); if (msg.isHomeMove()) { logic.addNotification(new HomeMoveNotification(pieceToMove.getUuid(), msg.getTargetIndex())); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(pieceToMove)].clearOccupant(); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/Intro.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/Intro.java index 4583ac21..6fa6ba61 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/Intro.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/Intro.java @@ -44,7 +44,6 @@ public DetermineStartPlayerState getParent(){ @Override public void enter() { for(Map.Entry entry : logic.getGame().getPlayers().entrySet()){ - //logic.addNotification(new WaitMoveNotification(entry.getValue().getPieces()[0].getUuid())); logic.addNotification(new MovePieceNotification(entry.getValue().getPieces()[0].getUuid(), entry.getValue().getStartNodeIndex(), true)); logic.getGame().getBoard().getInfield()[entry.getValue().getStartNodeIndex()].setOccupant(entry.getValue().getPieces()[0]); animationCounter++; diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/RollRankingDiceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/RollRankingDiceState.java index 292c6748..b2476bcd 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/RollRankingDiceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/RollRankingDiceState.java @@ -10,6 +10,8 @@ public class RollRankingDiceState extends DetermineStartPlayerStates { + private final System.Logger LOGGER = System.getLogger(this.getClass().getName()); + private final DetermineStartPlayerState parent; public RollRankingDiceState(ClientState parent, ClientGameLogic logic) { @@ -19,11 +21,13 @@ public RollRankingDiceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { + LOGGER.log(System.Logger.Level.INFO, "Entering RollRankingDiceState"); logic.addNotification(new DiceNowNotification()); } @Override public void exit() { + LOGGER.log(System.Logger.Level.INFO, "Exiting RollRankingDiceState"); } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/WaitRankingState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/WaitRankingState.java index c1d61a16..946200fd 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/WaitRankingState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/determinestartplayerstate/WaitRankingState.java @@ -9,6 +9,8 @@ public class WaitRankingState extends DetermineStartPlayerStates { + private final System.Logger LOGGER = System.getLogger(this.getClass().getName()); + private final DetermineStartPlayerState parent; private boolean canChange = false; @@ -27,11 +29,12 @@ private void changeToIntro(){ @Override public void enter() { + LOGGER.log(System.Logger.Level.INFO, "Entering WaitRankingState"); } @Override public void exit() { - + LOGGER.log(System.Logger.Level.INFO, "Exiting WaitRankingState"); } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/RollDiceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/RollDiceState.java index 9b160ec2..da78fb0d 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/RollDiceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/RollDiceState.java @@ -47,6 +47,7 @@ public void received(DieMessage msg){ @Override public void selectAnimationEnd(){ logic.send(new AnimationEndMessage()); + parent.setState(parent.getChoosePiece()); } // @Override 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 bed4a04a..8305ca87 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 @@ -16,6 +16,8 @@ public class NoPieceState extends ChoosePieceStates { + private final System.Logger LOGGER = System.getLogger(this.getClass().getName()); + private final ChoosePieceState parent; public NoPieceState(ClientState parent, ClientGameLogic logic) { @@ -25,7 +27,7 @@ public NoPieceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - + LOGGER.log(System.Logger.Level.INFO, "Entering NoPieceState"); } @Override @@ -35,14 +37,16 @@ public void exit() { @Override public void received(SelectPieceMessage msg) { - parent.setState(parent.getSelectPiece()); - ArrayList pieces = msg.getPieces().stream().map(piece -> logic.getGame().getPieceThroughUUID(piece)).collect(Collectors.toCollection(ArrayList::new)); + ArrayList pieces = msg.getPieces().stream().map(piece -> logic.getGame().getPieceThroughUUID(piece.getUuid())).collect(Collectors.toCollection(ArrayList::new)); parent.getSelectPiece().setPossiblePieces(pieces); + LOGGER.log(System.Logger.Level.INFO, "Received " + msg.getPieces().size() + " pieces"); logic.addNotification(new SelectableMoveNotification(pieces.stream().map(Piece::getUuid).collect(Collectors.toCollection(ArrayList::new)), msg.getTargetIndex(), msg.getIsHomeMove())); + parent.setState(parent.getSelectPiece()); } @Override public void received(WaitPieceMessage msg){ + LOGGER.log(System.Logger.Level.INFO, "Received WaitPieceMessage"); logic.addNotification(new WaitMoveNotification(msg.getPieceID())); parent.setState(parent.getWaitingPiece()); } @@ -56,6 +60,8 @@ public void received(StartPieceMessage msg){ listPiece.add(piece.getUuid()); listIndex.add(msg.getTargetIndex()); homeMove.add(false); + parent.getStartPiece().setMoveablePiece(piece); + LOGGER.log(System.Logger.Level.INFO, "Received start piece " + listPiece.get(0)); logic.addNotification(new SelectableMoveNotification(listPiece, listIndex, homeMove)); parent.setState(parent.getStartPiece()); } 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 23c87668..6af1900a 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 @@ -46,7 +46,7 @@ public void selectPiece(Piece piece) { @Override public void received(MoveMessage msg) { - Piece piece = logic.getGame().getPieceThroughUUID(msg.getIdentifier()); + Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); if (msg.isHomeMove()) { logic.addNotification(new HomeMoveNotification(piece.getUuid(), msg.getTargetIndex())); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/StartPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/StartPieceState.java index 4c9801d2..9d029d90 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/StartPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/StartPieceState.java @@ -11,6 +11,8 @@ public class StartPieceState extends ChoosePieceStates { + private final System.Logger LOGGER = System.getLogger(this.getClass().getName()); + private final ChoosePieceState parent; private Piece moveablePiece; @@ -27,7 +29,11 @@ public void enter() { @Override public void exit() { + moveablePiece = null; + } + public void setMoveablePiece(Piece moveablePiece) { + this.moveablePiece = moveablePiece; } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/WaitingPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/WaitingPieceState.java index 8aff30a8..26b345a9 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/WaitingPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/WaitingPieceState.java @@ -41,7 +41,7 @@ public void selectPiece(Piece piece){ @Override public void received(MoveMessage msg){ - Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getIdentifier()); + Piece pieceToMove = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); pieceToMove.setState(PieceState.ACTIVE); parent.getParent().setState(parent.getParent().getMovePiece()); } 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 bd7667d4..93fb9193 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 @@ -71,7 +71,7 @@ public class Game { /** * The dice modifier. */ - private int diceModifier; + private int diceModifier = 1; /** * The number of eyes on the dice. diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java index 62180b61..23a58ccb 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java @@ -49,6 +49,25 @@ public void setOccupant(Piece occupant) { this.occupant = occupant; } + /** + * This method handles the event when a new occupant is moved to the node, + * it then returns the old occupant. + * + * @param newOccupant the new occupant of the node + * @return the old occupant of the node + */ + public Piece moveOccupant(Piece newOccupant) { + if (occupant == null) { + setOccupant(newOccupant); + return null; + } else { + occupant.setShield(ShieldState.NONE); + occupant.setState(PieceState.WAITING); + setOccupant(newOccupant); + return occupant; + } + } + /** * This method is used to clear the node of its occupant */ 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 16a181d9..136154c6 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 @@ -152,6 +152,57 @@ public PowerCard getPowerCardByType(BonusCard bonusCard) { return null; } + public Piece getWaitingPiece(){ + for (Piece piece : this.waitingArea) { + if (piece != null){ + return piece; + } + } + return null; + + } + + /** + * This method returns a boolean based on if the Player has a piece in its waiting area + * + * @return the boolean if the waiting area contains a piece + */ + public boolean hasPieceInWaitingArea(){ + for (Piece piece : this.waitingArea) { + if (piece != null){ + return true; + } + } + return false; + } + + public int getHomeIndexOfPiece(Piece piece) { + for (int i = 0; i < Resources.MAX_PIECES; i++) { + if (this.homeNodes[i].getOccupant().equals(piece)) { + return i; + } + } + return -1; + } + + public boolean pieceInsideOfHome(Piece piece) { + for (Node node : this.homeNodes) { + if (node.getOccupant().equals(piece)) { + return true; + } + } + return false; + } + + public boolean isHomeFinished(Piece piece) { + for (int i = getHomeIndexOfPiece(piece); i < Resources.MAX_PIECES; i++) { + if (!this.homeNodes[i].isOccupied()) { + return false; + } + } + return true; + } + /** * This method returns the give name of the Player * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestMoveMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestMoveMessage.java index be1d803c..4367efad 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestMoveMessage.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestMoveMessage.java @@ -1,6 +1,7 @@ package pp.mdga.message.client; import com.jme3.network.serializing.Serializable; +import pp.mdga.game.Piece; import java.util.UUID; @@ -12,22 +13,22 @@ public class RequestMoveMessage extends ClientMessage { /** * The identifier for the piece. */ - private final UUID pieceIdentifier; + private final Piece piece; /** * Constructor for RequestMove * - * @param pieceIdentifier the piece identifier + * @param piece the piece */ - public RequestMoveMessage(UUID pieceIdentifier) { - this.pieceIdentifier = pieceIdentifier; + public RequestMoveMessage(Piece piece) { + this.piece = piece; } /** * Default constructor for serialization purposes. */ private RequestMoveMessage() { - pieceIdentifier = null; + piece = null; } /** @@ -35,8 +36,8 @@ private RequestMoveMessage() { * * @return the piece identifier */ - public UUID getPieceIdentifier() { - return pieceIdentifier; + public Piece getPiece() { + return piece; } /** @@ -46,7 +47,8 @@ public UUID getPieceIdentifier() { */ @Override public String toString() { - return "RequestMove{pieceIdentifier = " + pieceIdentifier + '}'; + assert piece != null; + return "RequestMove{pieceIdentifier = " + piece.toString() + '}'; } /** diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/MoveMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/MoveMessage.java index 769a8152..b40ae2eb 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/MoveMessage.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/MoveMessage.java @@ -1,6 +1,7 @@ package pp.mdga.message.server; import com.jme3.network.serializing.Serializable; +import pp.mdga.game.Piece; import java.util.UUID; @@ -12,7 +13,7 @@ public class MoveMessage extends ServerMessage { /** * The identifier of the piece that should be moved. */ - private final UUID pieceUUID; + private final Piece piece; /** * The index of the target node; @@ -27,11 +28,13 @@ public class MoveMessage extends ServerMessage { /** * Constructs a new MoveMessage instance. * - * @param identifier the identifier of the piece that should be moved + * @param piece the identifier of the piece that should be moved + * @param isHomeMove boolean flag declaring home move or not + * @param targetIndex the targetIndex */ - public MoveMessage(UUID identifier, boolean isHomeMove, int targetIndex) { + public MoveMessage(Piece piece, boolean isHomeMove, int targetIndex) { super(); - this.pieceUUID = identifier; + this.piece = piece; this.isHomeMove = isHomeMove; this.targetIndex = targetIndex; } @@ -41,7 +44,7 @@ public MoveMessage(UUID identifier, boolean isHomeMove, int targetIndex) { */ private MoveMessage() { super(); - pieceUUID = null; + piece = null; targetIndex = 0; isHomeMove = false; } @@ -51,8 +54,8 @@ private MoveMessage() { * * @return the identifier of the piece that should be moved */ - public UUID getIdentifier() { - return pieceUUID; + public Piece getPiece() { + return piece; } /** @@ -90,6 +93,6 @@ public void accept(ServerInterpreter interpreter) { */ @Override public String toString() { - return "MoveMessage{" + "pieceUUID=" + pieceUUID + ", targetIndex=" + targetIndex + ", isHomeMove=" + isHomeMove + '}'; + return "MoveMessage{" + "pieceUUID=" + piece.getUuid() + ", targetIndex=" + targetIndex + ", isHomeMove=" + isHomeMove + '}'; } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/SelectPieceMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/SelectPieceMessage.java index d9d57b86..e52dbf0b 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/SelectPieceMessage.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/SelectPieceMessage.java @@ -3,7 +3,7 @@ import com.jme3.network.serializing.Serializable; import java.util.List; -import java.util.UUID; +import pp.mdga.game.Piece; /** * A message sent by the server to the active player to select a piece to move. @@ -13,7 +13,7 @@ public class SelectPieceMessage extends ServerMessage { /** * The list of pieces */ - private final List pieces; + private final List pieces; /** * The list of booleans of isHomeMove of the pieces @@ -32,7 +32,7 @@ public class SelectPieceMessage extends ServerMessage { * @param isHomeMove the List of booleans of isHomeMove of the pieces * @param targetIndex the List of indexes of target nodes of the pieces */ - public SelectPieceMessage(List pieces, List isHomeMove, List targetIndex) { + public SelectPieceMessage(List pieces, List isHomeMove, List targetIndex) { super(); this.pieces = pieces; this.isHomeMove = isHomeMove; @@ -54,7 +54,7 @@ public SelectPieceMessage() { * * @return the pieces */ - public List getPieces() { + public List getPieces() { return pieces; } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java index c6368f05..e2dc4962 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java @@ -1,9 +1,6 @@ package pp.mdga.server.automaton; -import pp.mdga.message.client.AnimationEndMessage; -import pp.mdga.message.client.DisconnectedMessage; -import pp.mdga.message.client.LeaveGameMessage; -import pp.mdga.message.client.RequestDieMessage; +import pp.mdga.message.client.*; import pp.mdga.message.server.CeremonyMessage; import pp.mdga.message.server.PauseGameMessage; import pp.mdga.server.automaton.game.AnimationState; @@ -88,6 +85,11 @@ public void received(LeaveGameMessage msg, int from) { } } + @Override + public void received(NoPowerCardMessage msg, int from){ + this.currentState.received(msg, from); + } + /** * This method will be called whenever the server received a RequestDieMessage message. * It will also get the client id of the player who send this message. diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/AnimationState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/AnimationState.java index 8d6b634c..28282d10 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/AnimationState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/AnimationState.java @@ -54,7 +54,6 @@ public void received(AnimationEndMessage msg, int from) { this.messageReceived.add(from); if (this.messageReceived.size() == this.logic.getGame().getPlayers().size()) { this.gameAutomaton.setCurrentState(this.gameAutomaton.getTurnState()); - this.gameAutomaton.getTurnState().setCurrentState(this.gameAutomaton.getTurnState().getPowerCardState()); } } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java index 05ca6be9..0e3816d9 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java @@ -79,9 +79,6 @@ else if (maximumRoll < entry.getValue()) { this.playersHaveToRoll.clear(); this.playersHaveToRoll.add(entry.getKey()); } - else { - this.logic.getServerSender().send(entry.getKey(), new EndOfTurnMessage()); - } } for (int id: this.playersHaveToRoll) { 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 4ed6feb8..82e254e2 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 @@ -1,10 +1,7 @@ package pp.mdga.server.automaton.game; import pp.mdga.game.Player; -import pp.mdga.message.client.NoPowerCardMessage; -import pp.mdga.message.client.RequestDieMessage; -import pp.mdga.message.client.RequestMoveMessage; -import pp.mdga.message.client.SelectedPiecesMessage; +import pp.mdga.message.client.*; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.GameState; import pp.mdga.server.automaton.game.turn.ChoosePieceState; @@ -111,6 +108,11 @@ public void received(RequestMoveMessage msg, int from) { this.currentState.received(msg, from); } + @Override + public void received(AnimationEndMessage msg, int from) { + this.currentState.received(msg, from); + } + /** * This method will be used to return currentState attribute of TurnState class. * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/ChoosePieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/ChoosePieceState.java index 06765f8f..8f61c98f 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/ChoosePieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/ChoosePieceState.java @@ -34,17 +34,17 @@ public ChoosePieceState(TurnState turnAutomaton, ServerGameLogic logic) { this.waitingPieceState = new WaitingPieceState(this, logic); this.startPieceState = new StartPieceState(this, logic); this.selectPieceState = new SelectPieceState(this, logic); - this.setCurrentState(this.noPieceState); } @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Exited ChoosePieceState state."); + LOGGER.log(System.Logger.Level.DEBUG, "Entered ChoosePieceState state."); + this.setCurrentState(this.noPieceState); } @Override public void exit() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered ChoosePieceState state."); + LOGGER.log(System.Logger.Level.DEBUG, "Exited ChoosePieceState state."); } /** diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/MovePieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/MovePieceState.java index ab9d8507..444c0d2f 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/MovePieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/MovePieceState.java @@ -1,13 +1,24 @@ package pp.mdga.server.automaton.game.turn; +import pp.mdga.game.Color; +import pp.mdga.game.Player; +import pp.mdga.message.client.AnimationEndMessage; +import pp.mdga.message.server.ActivePlayerMessage; +import pp.mdga.message.server.DiceNowMessage; +import pp.mdga.message.server.EndOfTurnMessage; +import pp.mdga.message.server.SpectatorMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.TurnState; +import java.util.HashSet; +import java.util.Set; + public class MovePieceState extends TurnAutomatonState { /** * Create LobbyState constants. */ private static final System.Logger LOGGER = System.getLogger(MovePieceState.class.getName()); + private Set finishedAnimations = new HashSet<>(); /** * Constructs a server state of the specified game logic. @@ -24,8 +35,34 @@ public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered MovePieceState state."); } + private void setActivePlayer(Color color) { + if (!logic.getGame().getPlayerByColor(color.next()).isFinished()) { + logic.getGame().setActiveColor(logic.getGame().getActiveColor().next()); + logic.getServerSender().broadcast(new ActivePlayerMessage(color.next())); + } else { + setActivePlayer(color.next()); + } + } + + @Override + public void received(AnimationEndMessage msg, int from){ + finishedAnimations.add(logic.getGame().getPlayerById(from)); + if (finishedAnimations.size() == logic.getGame().getPlayers().size()) { + if (logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).isFinished()){ + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(logic.getGame().getActiveColor()), new SpectatorMessage()); + setActivePlayer(logic.getGame().getActiveColor()); + } else if (logic.getGame().getDiceEyes() == 6){ + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(logic.getGame().getActiveColor()), new DiceNowMessage()); + } else { + logic.getServerSender().send(logic.getGame().getPlayerIdByColor(logic.getGame().getActiveColor()), new EndOfTurnMessage()); + setActivePlayer(logic.getGame().getActiveColor()); + } + } + } + @Override public void exit() { + finishedAnimations.clear(); LOGGER.log(System.Logger.Level.DEBUG, "Exited MovePieceState state."); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PowerCardState.java index c34ec6ba..b83a6c43 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PowerCardState.java @@ -2,6 +2,7 @@ import pp.mdga.game.Piece; import pp.mdga.game.card.PowerCard; +import pp.mdga.message.client.NoPowerCardMessage; import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.DiceNowMessage; import pp.mdga.message.server.PossibleCardsMessage; @@ -51,12 +52,12 @@ public PowerCardState(TurnState turnAutomaton, ServerGameLogic logic) { this.shieldCardState = new ShieldCardState(this, logic); this.swapCardState = new SwapCardState(this, logic); this.turboCardState = new TurboCardState(this, logic); - this.setCurrentState(this.choosePowerCardState); } @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Exited PowerCardState state."); + LOGGER.log(System.Logger.Level.INFO, "Enter PowerCardState state."); + this.setCurrentState(this.choosePowerCardState); this.visitor = new ServerCardVisitor(this.logic); for (PowerCard card : this.turnAutomaton.getPlayer().getHandCards()) { card.accept(this.visitor); @@ -73,7 +74,12 @@ public void enter() { @Override public void exit() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered PowerCardState state."); + LOGGER.log(System.Logger.Level.DEBUG, "Exit PowerCardState state."); + } + + @Override + public void received(NoPowerCardMessage msg, int form){ + currentState.received(msg, form); } /** diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/RollDiceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/RollDiceState.java index a343abfe..7f7ce11d 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/RollDiceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/RollDiceState.java @@ -1,5 +1,6 @@ package pp.mdga.server.automaton.game.turn; +import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.message.client.RequestDieMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.TurnState; @@ -33,12 +34,12 @@ public RollDiceState(TurnState turnAutomaton, ServerGameLogic logic) { this.firstRollState = new FirstRollState(this, logic); this.secondRollState = new SecondRollState(this, logic); this.thirdRollState = new ThirdRollState(this, logic); - this.setCurrentState(this.firstRollState); } @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered RollDiceState state."); + this.setCurrentState(this.firstRollState); } @Override @@ -58,6 +59,11 @@ public void received(RequestDieMessage msg, int from) { this.currentState.received(msg, from); } + @Override + public void received(AnimationEndMessage msg, int from){ + this.currentState.received(msg, from); + } + /** * This method will be used to return currentState attribute of RollDiceState class. * 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 ba0e2ede..e852f7d3 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,7 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.game.*; +import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.ServerState; import pp.mdga.server.automaton.game.turn.ChoosePieceState; @@ -20,4 +22,76 @@ public ChoosePieceAutomatonState(ChoosePieceState choosePieceAutomaton, ServerGa super(logic); this.choosePieceAutomaton = choosePieceAutomaton; } + + protected boolean canMove(Piece piece){ + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + if (piece.getState().equals(PieceState.HOME)){ + return canHomeMove(piece, steps); + } else { + int homeMoves = getHomeMoves(piece, steps); + if (homeMoves > 0){ + return canHomeMove(piece, homeMoves); + } else { + return canInfieldMove(piece, 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); + } + moveIndex %= logic.getGame().getBoard().getInfield().length; + if (moveIndex >= startIndex){ + return moveIndex - startIndex + 1; + } + return 0; + } + if (pieceIndex < startIndex && startIndex <= moveIndex){ + return moveIndex - startIndex + 1; + } + return 0; + } + + 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){ + return occupant.getColor() != piece.getColor(); + } + return true; + } + + 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)){ + index = player.getHomeIndexOfPiece(piece); + } else { + index = 0; + } + if (index + moveIndex >= homeNodes.length){ + return false; + } else { + for (int i = index; i <= index + moveIndex; i++){ + if(homeNodes[i].isOccupied()){ + return false; + } + } + return true; + } + } + + 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; + } } 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 584940d1..9ba29805 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 @@ -1,8 +1,13 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.Resources; +import pp.mdga.game.*; +import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.ChoosePieceState; +import java.util.ArrayList; + public class NoPieceState extends ChoosePieceAutomatonState { /** * Create FirstRollState constants. @@ -19,12 +24,57 @@ public NoPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic super(choosePieceAutomaton, logic); } + 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()); + } + 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) { + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getWaitingPieceState()); + } else { + checkSelectPiece(activePlayer); + } + } else if (canMove(logic.getGame().getBoard().getInfield()[activePlayer.getStartNodeIndex()].getOccupant())){ + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getStartPieceState()); + } + } else { + checkSelectPiece(activePlayer); + } + } + + private void checkSelectPiece(Player activePlayer){ + ArrayList moveablePieces = new ArrayList<>(); + for (Piece piece : activePlayer.getPieces()){ + if (piece.getState().equals(PieceState.ACTIVE) || piece.getState().equals(PieceState.HOME)){ + moveablePieces.add(piece); + } + } + moveablePieces.removeIf(piece -> !canMove(piece)); + if (moveablePieces.isEmpty()) { + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getNoTurnState()); + } else { + this.choosePieceAutomaton.getSelectPieceState().setMoveablePieces(moveablePieces); + this.choosePieceAutomaton.setCurrentState(this.choosePieceAutomaton.getSelectPieceState()); + + } + } + /** * This method will be used whenever this state will be entered. */ @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered NoPieceState state."); + LOGGER.log(System.Logger.Level.INFO, "Entered NoPieceState state."); + initialize(); } /** 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 206ae4db..83e97d8d 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 @@ -1,5 +1,8 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.game.Color; +import pp.mdga.message.server.ActivePlayerMessage; +import pp.mdga.message.server.EndOfTurnMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.ChoosePieceState; @@ -19,12 +22,23 @@ public NoTurnState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) super(choosePieceAutomaton, logic); } + private void setActivePlayer(Color color) { + if (!logic.getGame().getPlayerByColor(color.next()).isFinished()) { + logic.getGame().setActiveColor(logic.getGame().getActiveColor().next()); + logic.getServerSender().broadcast(new ActivePlayerMessage(color.next())); + } else { + setActivePlayer(color.next()); + } + } + /** * This method will be used whenever this state will be entered. */ @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered NoTurnState state."); + logic.getServerSender().send(logic.getGame().getActivePlayerId(), new EndOfTurnMessage()); + setActivePlayer(logic.getGame().getActiveColor()); } /** 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 c688a40a..fab99f72 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,14 +1,26 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.game.Piece; +import pp.mdga.game.PieceState; +import pp.mdga.game.ShieldState; +import pp.mdga.message.client.RequestMoveMessage; +import pp.mdga.message.server.MoveMessage; +import pp.mdga.message.server.SelectPieceMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.ChoosePieceState; +import java.util.ArrayList; + public class SelectPieceState extends ChoosePieceAutomatonState { /** * Create FirstRollState constants. */ private static final System.Logger LOGGER = System.getLogger(SelectPieceState.class.getName()); + private ArrayList moveablePieces = new ArrayList<>(); + private final ArrayList isHomeMove = new ArrayList<>(); + private final ArrayList targetIndex = new ArrayList<>(); + /** * Constructs a server state of the specified game logic. * @@ -19,12 +31,51 @@ public SelectPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic l super(choosePieceAutomaton, logic); } + public void setMoveablePieces(ArrayList moveablePieces) { + this.moveablePieces = 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."); + int steps = logic.getGame().getDiceModifier() * logic.getGame().getDiceEyes(); + for (Piece piece : moveablePieces) { + int homeMoves = getHomeMoves(piece, steps); + if (homeMoves > 0) { + isHomeMove.add(true); + targetIndex.add(homeMoves); + } else { + isHomeMove.add(false); + targetIndex.add(calculateTargetIndex(piece)); + } + } + logic.getServerSender().send(logic.getGame().getActivePlayerId(), new SelectPieceMessage(moveablePieces, isHomeMove, targetIndex)); + } + + @Override + public void received(RequestMoveMessage msg, int from){ + if (moveablePieces.contains(msg.getPiece())) { + int indexOfPiece = moveablePieces.indexOf(msg.getPiece()); + if (isHomeMove.get(indexOfPiece)) { + logic.getGame().getPlayerByColor(msg.getPiece().getColor()).setPieceInHome(targetIndex.get(indexOfPiece), logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid())); + if (logic.getGame().getPlayerByColor(msg.getPiece().getColor()).isHomeFinished(logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()))) { + logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()).setState(PieceState.HOMEFINISHED); + } else { + logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()).setState(PieceState.HOME); + } + logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()).setShield(ShieldState.NONE); + } else { + Piece occ = logic.getGame().getBoard().getInfield()[targetIndex.get(indexOfPiece)].moveOccupant(moveablePieces.get(indexOfPiece)); + if (occ != null) { + logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); + } + } + logic.getServerSender().broadcast(new MoveMessage(moveablePieces.get(indexOfPiece), isHomeMove.get(indexOfPiece), targetIndex.get(indexOfPiece))); + this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); + } } /** @@ -33,5 +84,8 @@ public void enter() { @Override public void exit() { LOGGER.log(System.Logger.Level.DEBUG, "Exited SelectPieceState state."); + moveablePieces.clear(); + isHomeMove.clear(); + targetIndex.clear(); } } 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 6b2be8ac..e7fb8648 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 @@ -1,5 +1,9 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.game.Piece; +import pp.mdga.message.client.RequestMoveMessage; +import pp.mdga.message.server.MoveMessage; +import pp.mdga.message.server.StartPieceMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.ChoosePieceState; @@ -9,6 +13,8 @@ public class StartPieceState extends ChoosePieceAutomatonState { */ private static final System.Logger LOGGER = System.getLogger(StartPieceState.class.getName()); + private Piece piece; + /** * Constructs a server state of the specified game logic. * @@ -25,6 +31,20 @@ public StartPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic lo @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Exited StartPieceState state."); + piece = logic.getGame().getBoard().getInfield()[logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getStartNodeIndex()].getOccupant(); + logic.getServerSender().send(logic.getGame().getActivePlayerId(), new StartPieceMessage(piece.getUuid(), calculateTargetIndex(piece))); + } + + @Override + public void received(RequestMoveMessage msg, int from){ + if (piece.equals(msg.getPiece())) { + Piece occ = logic.getGame().getBoard().getInfield()[logic.getGame().getPlayerByColor(piece.getColor()).getStartNodeIndex()].getOccupant(); + if (occ != null){ + logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); + } + logic.getServerSender().broadcast(new MoveMessage(piece, false, calculateTargetIndex(piece))); + this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); + } } /** @@ -33,5 +53,6 @@ public void enter() { @Override public void exit() { LOGGER.log(System.Logger.Level.DEBUG, "Entered StartPieceState state."); + piece = null; } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/WaitingPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/WaitingPieceState.java index ff3dc0ca..ce54a5f2 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/WaitingPieceState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/choosepiece/WaitingPieceState.java @@ -1,5 +1,11 @@ package pp.mdga.server.automaton.game.turn.choosepiece; +import pp.mdga.game.Piece; +import pp.mdga.game.PieceState; +import pp.mdga.game.ShieldState; +import pp.mdga.message.client.RequestMoveMessage; +import pp.mdga.message.server.MoveMessage; +import pp.mdga.message.server.WaitPieceMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.rolldice.FirstRollState; @@ -9,6 +15,7 @@ public class WaitingPieceState extends ChoosePieceAutomatonState { * Create FirstRollState constants. */ private static final System.Logger LOGGER = System.getLogger(WaitingPieceState.class.getName()); + private Piece piece; /** * Constructs a server state of the specified game logic. @@ -26,6 +33,21 @@ public WaitingPieceState(ChoosePieceState choosePieceAutomaton, ServerGameLogic @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered WaitingPieceState state."); + this.piece = logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getWaitingPiece(); + logic.getServerSender().send(logic.getGame().getActivePlayerId(), new WaitPieceMessage(this.piece.getUuid())); + } + + @Override + public void received(RequestMoveMessage msg, int from){ + if (msg.getPiece().equals(this.piece)) { + piece.setState(PieceState.ACTIVE); + Piece thrownOcc = logic.getGame().getBoard().getInfield()[logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getStartNodeIndex()].moveOccupant(this.piece); + if (thrownOcc != null) { + logic.getGame().getPlayerByColor(thrownOcc.getColor()).addWaitingPiece(thrownOcc); + } + logic.getServerSender().broadcast(new MoveMessage(this.piece, false, logic.getGame().getPlayerById(logic.getGame().getActivePlayerId()).getStartNodeIndex())); + this.choosePieceAutomaton.getTurnAutomaton().setCurrentState(this.choosePieceAutomaton.getTurnAutomaton().getMovePieceState()); + } } /** @@ -34,5 +56,6 @@ public void enter() { @Override public void exit() { LOGGER.log(System.Logger.Level.DEBUG, "Exited WaitingPieceState state."); + piece = null; } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java index 04f24f3c..3958a338 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java @@ -4,13 +4,18 @@ import pp.mdga.game.card.ShieldCard; import pp.mdga.game.card.SwapCard; import pp.mdga.game.card.TurboCard; +import pp.mdga.message.client.NoPowerCardMessage; import pp.mdga.message.client.SelectCardMessage; +import pp.mdga.message.server.DiceNowMessage; import pp.mdga.message.server.IncorrectRequestMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.PowerCardState; import pp.mdga.visitor.Visitor; public class ChoosePowerCardState extends PowerCardAutomatonState implements Visitor { + + private static final System.Logger LOGGER = System.getLogger(ChoosePowerCardState.class.getName()); + /** * Constructs a server state of the specified game logic. * @@ -26,7 +31,7 @@ public ChoosePowerCardState(PowerCardState powerCardAutomaton, ServerGameLogic l */ @Override public void enter() { - + LOGGER.log(System.Logger.Level.INFO, "Entered ChoosePowerCard state."); } /** @@ -47,6 +52,12 @@ public void received(SelectCardMessage msg, int from) { } } + @Override + public void received(NoPowerCardMessage msg, int from) { + this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getRollDiceState()); + logic.getServerSender().send(from, new DiceNowMessage()); + } + /** * This method will be used to change the state of the power card automaton depending on the given card parameter. * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/FirstRollState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/FirstRollState.java index 3b67da2f..3d3174df 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/FirstRollState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/FirstRollState.java @@ -3,6 +3,7 @@ import pp.mdga.Resources; import pp.mdga.game.Piece; import pp.mdga.game.PieceState; +import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.message.client.RequestDieMessage; import pp.mdga.message.server.DiceAgainMessage; import pp.mdga.message.server.DiceNowMessage; @@ -18,6 +19,8 @@ public class FirstRollState extends RollDiceAutomatonState { * Create FirstRollState constants. */ private static final System.Logger LOGGER = System.getLogger(FirstRollState.class.getName()); + private List moveablePieces; + private int roll; /** * Constructs a server state of the specified game logic. @@ -31,12 +34,19 @@ public FirstRollState(RollDiceState rollDiceAutomaton, ServerGameLogic logic) { @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered FirstRollState state."); + LOGGER.log(System.Logger.Level.INFO, "Entered FirstRollState state."); + roll = 0; + moveablePieces = new ArrayList<>(); + for (Piece piece : this.rollDiceAutomaton.getTurnAutomaton().getPlayer().getPieces()) { + if (piece.getState() == PieceState.HOME || piece.getState() == PieceState.ACTIVE) { + moveablePieces.add(piece); + } + } } @Override public void exit() { - LOGGER.log(System.Logger.Level.DEBUG, "Exited FirstRollState state."); + LOGGER.log(System.Logger.Level.INFO, "Exited FirstRollState state."); } /** @@ -48,25 +58,19 @@ public void exit() { */ @Override public void received(RequestDieMessage msg, int from) { - List moveablePieces = new ArrayList<>(); - for (Piece piece : this.rollDiceAutomaton.getTurnAutomaton().getPlayer().getPieces()) { - if (piece.getState() == PieceState.HOME || piece.getState() == PieceState.ACTIVE) { - moveablePieces.add(piece); - } - } - - int roll = this.logic.getGame().getDie().shuffle(); + roll = this.logic.getGame().getDie().shuffle(); this.logic.getGame().setDiceEyes(roll); + this.logic.getServerSender().broadcast(new DieMessage(roll)); + } + @Override + public void received(AnimationEndMessage msg, int from) { if (!moveablePieces.isEmpty()) { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll)); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); } else { if (roll == Resources.MAX_EYES) { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll)); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); } else { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceNowMessage()); this.rollDiceAutomaton.setCurrentState(this.rollDiceAutomaton.getSecondRollState()); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/SecondRollState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/SecondRollState.java index 0787a9f1..5453259e 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/SecondRollState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/SecondRollState.java @@ -2,6 +2,7 @@ import pp.mdga.message.client.RequestDieMessage; import pp.mdga.message.server.DiceAgainMessage; +import pp.mdga.message.server.DiceNowMessage; import pp.mdga.message.server.DieMessage; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.RollDiceState; @@ -24,6 +25,7 @@ public SecondRollState(RollDiceState rollDiceAutomaton, ServerGameLogic logic) { @Override public void enter() { + this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceNowMessage()); LOGGER.log(System.Logger.Level.DEBUG, "Entered SecondRollState state."); } @@ -42,11 +44,10 @@ public void exit() { @Override public void received(RequestDieMessage msg, int from) { int roll = this.logic.getGame().getDie().shuffle(); + this.logic.getServerSender().broadcast(new DieMessage(roll)); if (roll == 6) { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll)); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); } else { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceAgainMessage()); this.rollDiceAutomaton.setCurrentState(this.rollDiceAutomaton.getThirdRollState()); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/ThirdRollState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/ThirdRollState.java index ffb81db6..5782f139 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/ThirdRollState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/rolldice/ThirdRollState.java @@ -1,11 +1,7 @@ package pp.mdga.server.automaton.game.turn.rolldice; import pp.mdga.message.client.RequestDieMessage; -import pp.mdga.message.server.ActivePlayerMessage; -import pp.mdga.message.server.CeremonyMessage; -import pp.mdga.message.server.DieMessage; -import pp.mdga.message.server.NoTurnMessage; -import pp.mdga.message.server.SpectatorMessage; +import pp.mdga.message.server.*; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.game.turn.RollDiceState; @@ -27,6 +23,7 @@ public ThirdRollState(RollDiceState rollDiceAutomaton, ServerGameLogic logic) { @Override public void enter() { + this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceNowMessage()); LOGGER.log(System.Logger.Level.DEBUG, "Exited ThirdRollState state."); } @@ -45,8 +42,8 @@ public void exit() { @Override public void received(RequestDieMessage msg, int from) { int roll = this.logic.getGame().getDie().shuffle(); + this.logic.getServerSender().broadcast(new DieMessage(roll)); if (roll == 6) { - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll)); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); } else { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new NoTurnMessage());