From fa18ae4280c79714f972d0129a9df6e4bdc3f916 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Sun, 8 Dec 2024 22:28:51 +0100 Subject: [PATCH 01/46] added swap functionality in model for server & client --- .../pp/mdga/client/gamestate/GameStates.java | 23 ++++++--- .../game/turn/powercard/SwapCardState.java | 48 ++++++++++++++----- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java index 68f86ca3..d4cb87ef 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java @@ -2,7 +2,9 @@ import pp.mdga.client.ClientGameLogic; import pp.mdga.client.ClientState; +import pp.mdga.game.Board; import pp.mdga.game.BonusCard; +import pp.mdga.game.Node; import pp.mdga.game.Piece; import pp.mdga.game.PieceState; import pp.mdga.game.ShieldState; @@ -12,6 +14,7 @@ import pp.mdga.notification.SwapPieceNotification; import pp.mdga.notification.ThrowPieceNotification; +import java.util.List; import java.util.UUID; public abstract class GameStates extends ClientState { @@ -28,13 +31,7 @@ protected void handlePowerCard(PlayCardMessage msg) { } else if (msg.getCard().getCard().equals(BonusCard.SHIELD)) { handleShield(msg.getPieces().get(0).getUuid()); } else { - Piece ownPiece = logic.getGame().getPieceThroughUUID(msg.getPieces().get(0).getUuid()); - Piece enemyPiece = logic.getGame().getPieceThroughUUID(msg.getPieces().get(1).getUuid()); - LOGGER.log(System.Logger.Level.INFO, "Swapping"); - int ownIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(ownPiece); - logic.addNotification(new SwapPieceNotification(ownPiece.getUuid(), enemyPiece.getUuid())); - logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(enemyPiece)].setOccupant(ownPiece); - logic.getGame().getBoard().getInfield()[ownIndex].setOccupant(enemyPiece); + swapPieces(msg.getPieces().get(0), msg.getPieces().get(1)); } logic.getGame().getDiscardPile().add(msg.getCard()); } @@ -57,4 +54,16 @@ private void handleShield(UUID uuid) { logic.addNotification(new ShieldActiveNotification(uuid)); } } + + private void swapPieces(Piece messageOwn, Piece messageEnemy) { + //swap Pieces in Model + Board board = logic.getGame().getBoard(); + Piece modelOwn = logic.getGame().getPieceThroughUUID(messageOwn.getUuid()); + Piece modelEnemy = logic.getGame().getPieceThroughUUID(messageEnemy.getUuid()); + Node ownNode = board.getInfield()[board.getInfieldIndexOfPiece(modelOwn)]; + Node enemyNode = board.getInfield()[board.getInfieldIndexOfPiece(modelEnemy)]; + + ownNode.setOccupant(modelEnemy); + enemyNode.setOccupant(modelOwn); + } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java index cd4ddbfe..e8074773 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java @@ -1,6 +1,10 @@ package pp.mdga.server.automaton.game.turn.powercard; +import pp.mdga.game.Board; +import pp.mdga.game.Color; +import pp.mdga.game.Node; import pp.mdga.game.Piece; +import pp.mdga.game.card.SwapCard; import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.IncorrectRequestMessage; import pp.mdga.message.server.PlayCardMessage; @@ -9,6 +13,7 @@ import pp.mdga.server.automaton.game.turn.PowerCardState; import java.util.ArrayList; +import java.util.List; public class SwapCardState extends PowerCardAutomatonState { @@ -51,20 +56,27 @@ public void exit() { @Override public void received(SelectedPiecesMessage msg, int from) { if (msg.getPieces().size() == 2) { - Piece first = msg.getPieces().get(0); - Piece second = msg.getPieces().get(1); - if ((this.powerCardAutomaton.getVisitor().getSwapOwnPieces().contains(first) - && this.powerCardAutomaton.getVisitor().getSwapOtherPieces().contains(second)) - || (this.powerCardAutomaton.getVisitor().getSwapOwnPieces().contains(second) - && this.powerCardAutomaton.getVisitor().getSwapOtherPieces().contains(first))) { - this.powerCardAutomaton.addSelectedPiece(first); - this.powerCardAutomaton.addSelectedPiece(second); + Piece selOwn = msg.getPieces().get(0); + Piece selEnemy = msg.getPieces().get(1); + List ownPieces = this.powerCardAutomaton.getVisitor().getSwapOwnPieces(); + List enemyPieces = this.powerCardAutomaton.getVisitor().getSwapOtherPieces(); - ArrayList temp = new ArrayList<>(); - temp.add(first); - temp.add(second); + //if selOwn and selEnemy is in wrong order + if(ownPieces.contains(selEnemy) && enemyPieces.contains(selOwn)){ + Piece temp = selEnemy; + selEnemy = selOwn; + selOwn = temp; + } - logic.getServerSender().broadcast(new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), temp, 1)); + if (ownPieces.contains(selOwn) && enemyPieces.contains(selEnemy)) { + this.powerCardAutomaton.addSelectedPiece(selOwn); + this.powerCardAutomaton.addSelectedPiece(selEnemy); + + if(!(powerCardAutomaton.getSelectedCard() instanceof SwapCard)) throw new RuntimeException("getSelectedCard is not swapCard"); + + swapPieces(selOwn, selEnemy); + + logic.getServerSender().broadcast(new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), msg.getPieces(), 1)); this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); } @@ -72,4 +84,16 @@ public void received(SelectedPiecesMessage msg, int from) { this.logic.getServerSender().send(from, new IncorrectRequestMessage(4)); } } + + private void swapPieces(Piece messageOwn, Piece messageEnemy) { + //swap Pieces in Model + Board board = logic.getGame().getBoard(); + Piece modelOwn = logic.getGame().getPieceThroughUUID(messageOwn.getUuid()); + Piece modelEnemy = logic.getGame().getPieceThroughUUID(messageEnemy.getUuid()); + Node ownNode = board.getInfield()[board.getInfieldIndexOfPiece(modelOwn)]; + Node enemyNode = board.getInfield()[board.getInfieldIndexOfPiece(modelEnemy)]; + + ownNode.setOccupant(modelEnemy); + enemyNode.setOccupant(modelOwn); + } } From 7256cde020b3ccfc7677e396edc53847d01050d4 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Sun, 8 Dec 2024 22:52:42 +0100 Subject: [PATCH 02/46] changed the ionput list for selectableMoveNotification --- .../gamestate/turnstate/choosepiecestate/NoPieceState.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 c011f949..cad3dc6f 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 @@ -41,8 +41,9 @@ 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)); 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())); + logic.addNotification(new SelectableMoveNotification(listPiece, msg.getTargetIndex(), msg.getIsHomeMove())); parent.setState(parent.getSelectPiece()); } From 00902d2e6bfa5d681fd0517a686fb975df36fa87 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Sun, 8 Dec 2024 23:05:30 +0100 Subject: [PATCH 03/46] Add move throw sync --- .../src/main/java/pp/mdga/client/ModelSynchronizer.java | 8 ++++++-- .../java/pp/mdga/client/NotificationSynchronizer.java | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java index 7c500115..cea98141 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java @@ -23,7 +23,11 @@ public class ModelSynchronizer { } public void animationEnd() { - app.getGameLogic().selectAnimationEnd(); + if(app.getNotificationSynchronizer().waitForAnimation) { + app.getNotificationSynchronizer().waitForAnimation = false; + } else { + app.getGameLogic().selectAnimationEnd(); + } } public void select(UUID a, UUID b){ @@ -94,7 +98,7 @@ public void confirm() { a = null; b = null; card = null; - + gameView.noConfirm(); gameView.hideNoPower(); } 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 64aadb52..7bc98b81 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 @@ -22,12 +22,18 @@ public class NotificationSynchronizer { private static final float STANDARD_DELAY = 2.5f; + public boolean waitForAnimation = false; + NotificationSynchronizer(MdgaApp app) { this.app = app; } public void update() { while (timer.getTimeInSeconds() >= delay) { + if(waitForAnimation) { + return; + } + Notification n = app.getGameLogic().getNotification(); if(n == null) { @@ -161,6 +167,7 @@ private void handleGame(Notification notification) { guiHandler.hideText(); } else if (notification instanceof ThrowPieceNotification n) { boardHandler.throwPiece(n.getPieceId(), n.getThrowColor()); + waitForAnimation = true; } else if (notification instanceof NoShieldNotification n) { boardHandler.unshieldPiece(n.getPieceId()); } else if (notification instanceof PlayCardNotification n) { From d4cbd0dda67283bcbd63f1315e11fcebb2e8eaae Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Sun, 8 Dec 2024 23:08:59 +0100 Subject: [PATCH 04/46] added swapnotification --- .../model/src/main/java/pp/mdga/client/gamestate/GameStates.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java index d4cb87ef..98165adc 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java @@ -65,5 +65,6 @@ private void swapPieces(Piece messageOwn, Piece messageEnemy) { ownNode.setOccupant(modelEnemy); enemyNode.setOccupant(modelOwn); + logic.addNotification(new SwapPieceNotification(modelOwn.getUuid(), modelEnemy.getUuid())); } } From 76b3e18dbeadc80c213ad849c767add83171c8e3 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Sun, 8 Dec 2024 23:23:21 +0100 Subject: [PATCH 05/46] added jet_noGear --- Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java | 1 + Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java index 6c210b7a..9317f11d 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java @@ -11,6 +11,7 @@ public enum Asset { cir, heer, jet, + jet_noGear("Models/jet/jet_noGear.j3o", "Models/jet/jet_diff.png"), lw, marine, node_home_blue("Models/node_home/node_home.j3o", "Models/node_home/node_home_blue_diff.png"), 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..eaa43c13 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(2,1,6,2,1,3); } /** From f4e774ee5ba27ef06e8990d66311453a9a151193 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Sun, 8 Dec 2024 23:28:26 +0100 Subject: [PATCH 06/46] Minor change --- .../main/java/pp/mdga/client/animation/JetAnimation.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java index 6607dd58..13dc23ee 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java @@ -76,13 +76,13 @@ public void start() { * Spawns the jet model at the designated spawn point, applying material, scaling, and rotation. */ private void spawnJet() { - jetModel = app.getAssetManager().loadModel(Asset.jet.getModelPath()); + jetModel = app.getAssetManager().loadModel(Asset.jet_noGear.getModelPath()); jetModel.setLocalTranslation(spawnPoint); - jetModel.scale(Asset.jet.getSize()); + jetModel.scale(Asset.jet_noGear.getSize()); jetModel.rotate(FastMath.HALF_PI, 0, 0); jetModel.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); - mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(Asset.jet.getDiffPath())); + mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(Asset.jet_noGear.getDiffPath())); jetModel.setMaterial(mat); rootNode.attachChild(jetModel); From 1646526ce10528ba2b206aa9baa8dd49e4a121e0 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 00:36:38 +0100 Subject: [PATCH 07/46] Try fix error --- Projekte/mdga/model/src/main/java/pp/mdga/game/Player.java | 2 ++ 1 file changed, 2 insertions(+) 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 3203770b..e7b8aa2e 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 @@ -114,6 +114,8 @@ public void removeHandCard(PowerCard card) { * @param piece as the piece which should be added to the waitingArea attribute of Player class as a Piece object. */ public void addWaitingPiece(Piece piece) { + piece.setState(PieceState.WAITING); + for (int i = 0; i < Resources.MAX_PIECES; i++) { if (this.waitingArea[i] == null) { this.waitingArea[i] = piece; From 4efc5578494f932793bf74f1b939c07a5ca18f25 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 01:06:12 +0100 Subject: [PATCH 08/46] added node hover/select with piece --- .../pp/mdga/client/InputSynchronizer.java | 14 ++++--- .../pp/mdga/client/board/BoardHandler.java | 13 ++++++- .../pp/mdga/client/board/NodeControl.java | 37 +++++++++++++++---- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java index 090261ad..a643f203 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java @@ -250,12 +250,13 @@ private void hoverPiece() { PieceControl control = checkPiece(); if (control != null) { if (control != hoverPiece) { - pieceOff(); + pieceOff(gameView); hoverPiece = control; - hoverPiece.hover(); +// hoverPiece.hover(); + gameView.getBoardHandler().pieceHoverOn(hoverPiece); } } else { - pieceOff(); + pieceOff(gameView); } } } @@ -305,8 +306,11 @@ private CardControl checkCard(GameView gameView) { /** * Disables the hover effect on the currently hovered piece, if any. */ - private void pieceOff() { - if (hoverPiece != null) hoverPiece.hoverOff(); + private void pieceOff(GameView gameView) { + if (hoverPiece != null) { + gameView.getBoardHandler().pieceHoverOff(hoverPiece); +// hoverPiece.hoverOff(); + } hoverPiece = null; } 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 08ee128c..0cb0c76a 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 @@ -670,6 +670,7 @@ public void pieceSelect(PieceControl pieceSelected) { if(selectableOwnPieces.contains(pieceSelected)){ for(PieceControl p : selectableOwnPieces) { p.unSelect(); + if(selectedPieceNodeMap.get(p) != null) selectedPieceNodeMap.get(p).unSelect(); } if (!isSelected) { pieceSelected.select(); @@ -678,7 +679,7 @@ public void pieceSelect(PieceControl pieceSelected) { } else { pieceSelected.unSelect(); - if(selectedPieceNodeMap.get(pieceSelected) != null) selectedPieceNodeMap.get(pieceSelected).highlight(); + if(selectedPieceNodeMap.get(pieceSelected) != null) selectedPieceNodeMap.get(pieceSelected).unSelect(); selectedOwnPiece = null; } } @@ -700,6 +701,16 @@ else if(selectableEnemyPieces.contains(pieceSelected)) { app.getModelSynchronize().select(getKeyByValue(pieces, selectedOwnPiece), getKeyByValue(pieces, selectedEnemyPiece)); } + public void pieceHoverOn(PieceControl hoverPiece){ + hoverPiece.hover(); + if(selectedPieceNodeMap.get(hoverPiece) != null) selectedPieceNodeMap.get(hoverPiece).hover(); + } + + public void pieceHoverOff(PieceControl hoverPiece){ + hoverPiece.hoverOff(); + if(selectedPieceNodeMap.get(hoverPiece) != null) selectedPieceNodeMap.get(hoverPiece).hoverOff(); + } + /** * Clears all highlighted, selectable, and selected pieces and nodes. */ diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/NodeControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/NodeControl.java index 5976e6ba..9f37b9be 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/NodeControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/NodeControl.java @@ -17,7 +17,11 @@ public class NodeControl extends OutlineControl { private static final ColorRGBA OUTLINE_HIGHLIGHT_COLOR = ColorRGBA.White; private static final int OUTLINE_HIGHLIGHT_WIDTH = 6; private static final ColorRGBA OUTLINE_SELECT_COLOR = ColorRGBA.Cyan; - private static final int OUTLINE_SELECT_WIDTH = 6; + private static final int OUTLINE_SELECT_WIDTH = 8; + private static final ColorRGBA OUTLINE_HOVER_COLOR = ColorRGBA.Yellow; + private static final int OUTLINE_HOVER_WIDTH = 6; + private boolean select = false; + private boolean highlight = false; /** * Constructs a {@link NodeControl} with the specified application and post processor. @@ -40,15 +44,34 @@ public Vector3f getLocation(){ return this.getSpatial().getLocalTranslation(); } - /** - * Highlights the node by applying an outline effect. - * The outline color and width are predefined as white and 6, respectively. - */ - public void highlight() { + public void highlight(){ + highlight = true; super.outline(OUTLINE_HIGHLIGHT_COLOR, OUTLINE_HIGHLIGHT_WIDTH); } - public void select() { + public void unHighlight(){ + highlight = false; + deOutline(); + } + + public void select(){ + select = true; super.outline(OUTLINE_SELECT_COLOR, OUTLINE_SELECT_WIDTH); } + + public void unSelect(){ + select = false; + if(highlight) highlight(); + else deOutline(); + } + + public void hover(){ + super.outline(OUTLINE_HOVER_COLOR, OUTLINE_HOVER_WIDTH); + } + + public void hoverOff(){ + if(select) select(); + else if(highlight) highlight(); + else deOutline(); + } } From 3af6e94920193089ee25d1a85b9fff4cce9eda77 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 01:16:31 +0100 Subject: [PATCH 09/46] added DrawCardMessageSupport --- .../pp/mdga/client/server/MdgaServer.java | 1 + .../java/pp/mdga/client/ClientGameLogic.java | 8 +++++ .../main/java/pp/mdga/client/ClientState.java | 5 +++ .../main/java/pp/mdga/client/GameState.java | 5 +++ .../mdga/client/gamestate/SpectatorState.java | 7 ++++ .../pp/mdga/client/gamestate/TurnState.java | 5 +++ .../mdga/client/gamestate/WaitingState.java | 7 ++++ .../src/main/java/pp/mdga/game/BonusNode.java | 5 +++ .../src/main/java/pp/mdga/game/Node.java | 4 +++ .../mdga/message/server/DrawCardMessage.java | 34 +++++++++++++++++++ .../message/server/ServerInterpreter.java | 2 ++ .../game/turn/rolldice/FirstRollState.java | 2 +- 12 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/MdgaServer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/MdgaServer.java index 5caa6192..14b5436e 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/MdgaServer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/MdgaServer.java @@ -153,6 +153,7 @@ private void initializeSerializables() { Serializer.registerClass(ShieldCard.class); Serializer.registerClass(HiddenCard.class); Serializer.registerClass(ChoosePieceStateMessage.class); + Serializer.registerClass(DrawCardMessage.class); Serializer.registerClass(Color.class, new EnumSerializer()); Serializer.registerClass(PieceState.class, new EnumSerializer()); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientGameLogic.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientGameLogic.java index 6a6735fa..f32d8603 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientGameLogic.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientGameLogic.java @@ -424,6 +424,14 @@ public void received(ChoosePieceStateMessage choosePieceStateMessage) { state.received(choosePieceStateMessage); } + /** + * @param drawCardMessage + */ + @Override + public void received(DrawCardMessage drawCardMessage) { + state.received(drawCardMessage); + } + /** * This method calls the method received of the state * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientState.java index e9b5c5e6..d210b7d7 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/ClientState.java @@ -100,6 +100,11 @@ public void received(ChoosePieceStateMessage msg) { LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg.toString()); } + @Override + public void received(DrawCardMessage msg){ + LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg.toString()); + } + @Override public void received(MoveMessage msg) { LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg.toString()); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java index 100a8072..a41d66c7 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java @@ -286,6 +286,11 @@ public void received(ChoosePieceStateMessage msg){ state.received(msg); } + @Override + public void received(DrawCardMessage msg){ + state.received(msg); + } + /** * This method returns the current state * 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 c840e997..39602bed 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 @@ -31,6 +31,13 @@ public void received(CeremonyMessage msg) { logic.setState(logic.getCeremony()); } + @Override + public void received(DrawCardMessage msg){ + logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard())); + logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseActivatedBonusNodes(); + logic.getGame().getGameStatistics().increaseActivatedBonusNodes(); + } + @Override public void received(DieMessage msg) { //logic.getGame().setDiceEyes(msg.getDiceEye()); 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 80f57ae5..0521dda2 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 @@ -143,6 +143,11 @@ public void received(ChoosePieceStateMessage msg){ state.received(msg); } + @Override + public void received(DrawCardMessage msg){ + state.received(msg); + } + public ChoosePieceState getChoosePiece() { return choosePieceState; } 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 002ce1cd..30287096 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,6 +67,13 @@ public void received(ActivePlayerMessage msg) { } } + @Override + public void received(DrawCardMessage msg){ + logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard())); + logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseActivatedBonusNodes(); + logic.getGame().getGameStatistics().increaseActivatedBonusNodes(); + } + @Override public void received(MoveMessage msg) { Piece piece = logic.getGame().getPieceThroughUUID(msg.getPiece().getUuid()); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/BonusNode.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/BonusNode.java index cfb1f89d..27642566 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/BonusNode.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/BonusNode.java @@ -13,4 +13,9 @@ public class BonusNode extends Node { BonusNode() { super(null); } + + @Override + public boolean isBonus() { + return true; + } } 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 c9482b30..0dc1d98a 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,10 @@ public void setOccupant(Piece occupant) { this.occupant = occupant; } + public boolean isBonus(){ + return false; + } + /** * This method handles the event when a new occupant is moved to the node, * it then returns the old occupant. diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java new file mode 100644 index 00000000..6ccc1411 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java @@ -0,0 +1,34 @@ +package pp.mdga.message.server; + +import com.jme3.network.serializing.Serializable; +import pp.mdga.game.card.PowerCard; + +@Serializable +public class DrawCardMessage extends ServerMessage{ + + private final PowerCard card; + + public DrawCardMessage(PowerCard card){ + super(); + this.card = card; + } + + private DrawCardMessage(){ + super(); + card = null; + } + + /** + * Accepts a visitor to process this message. + * + * @param interpreter the visitor to process this message + */ + @Override + public void accept(ServerInterpreter interpreter) { + interpreter.received(this); + } + + public PowerCard getCard(){ + return card; + } +} diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/ServerInterpreter.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/ServerInterpreter.java index 5ac5be99..be0c2184 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/ServerInterpreter.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/ServerInterpreter.java @@ -223,4 +223,6 @@ public interface ServerInterpreter { void received(IncorrectRequestMessage msg); void received(ChoosePieceStateMessage choosePieceStateMessage); + + void received(DrawCardMessage drawCardMessage); } 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 e7eee0f9..7dc061e1 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 @@ -38,7 +38,7 @@ public void enter() { LOGGER.log(System.Logger.Level.INFO, "Entered FirstRollState state."); roll = 0; moveablePieces = new ArrayList<>(); - for (Piece piece : this.rollDiceAutomaton.getTurnAutomaton().getPlayer().getPieces()) { + for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) { if (piece.getState() == PieceState.HOME || piece.getState() == PieceState.ACTIVE) { moveablePieces.add(piece); } From 5a12d8e96f7051af52c9bf158c514b7183504313 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 01:18:29 +0100 Subject: [PATCH 10/46] Fix dice more than once error --- .../pp/mdga/client/gamestate/turnstate/RollDiceState.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 90d473d3..2d2c1258 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 @@ -6,6 +6,7 @@ import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.message.client.RequestDieMessage; import pp.mdga.message.server.ChoosePieceStateMessage; +import pp.mdga.message.server.DiceNowMessage; import pp.mdga.message.server.DieMessage; import pp.mdga.message.server.NoTurnMessage; import pp.mdga.notification.DiceNowNotification; @@ -59,4 +60,9 @@ public void received(ChoosePieceStateMessage msg){ public void received(NoTurnMessage msg){ parent.getParent().setState(parent.getParent().getWaiting()); } + + @Override + public void received(DiceNowMessage msg){ + logic.addNotification(new DiceNowNotification()); + } } From 5e79a4a64cb1a6c5765c0c0c082d746063d04d37 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 01:35:37 +0100 Subject: [PATCH 11/46] added remove handcard --- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 2 +- .../server/automaton/game/turn/powercard/ShieldCardState.java | 3 +++ .../server/automaton/game/turn/powercard/SwapCardState.java | 3 +++ .../server/automaton/game/turn/powercard/TurboCardState.java | 2 ++ 4 files changed, 9 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 eaa43c13..2c6486f0 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 @@ -92,7 +92,7 @@ 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 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); diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java index 1d095895..cf7eaff0 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java @@ -3,6 +3,7 @@ import pp.mdga.game.Piece; import pp.mdga.game.PieceState; import pp.mdga.game.ShieldState; +import pp.mdga.game.card.PowerCard; import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.IncorrectRequestMessage; import pp.mdga.message.server.PlayCardMessage; @@ -56,6 +57,8 @@ public void received(SelectedPiecesMessage msg, int from) { } } this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); + this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); + this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); } else { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java index e8074773..ab297dc8 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java @@ -78,6 +78,9 @@ public void received(SelectedPiecesMessage msg, int from) { logic.getServerSender().broadcast(new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), msg.getPieces(), 1)); + this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); + this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); + this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); } } else { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java index 6cbf91ec..74d40d0d 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java @@ -26,6 +26,8 @@ public void enter() { this.logic.getGame().getDie().modify(); this.logic.getGame().setDiceModifier(this.logic.getGame().getDie().getDieModifier()); this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); + this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); + this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); } From daa7d31bdddc1bc5b310ab8e0563064ff07cd964 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 01:42:59 +0100 Subject: [PATCH 12/46] working on shield --- .../turnstate/powercardstate/ChoosePowerCardState.java | 3 +++ Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- .../java/pp/mdga/message/client/RequestPlayCardMessage.java | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) 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 1a90cda8..acf023bf 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 @@ -4,6 +4,7 @@ import pp.mdga.client.ClientState; import pp.mdga.client.gamestate.turnstate.PowerCardState; import pp.mdga.game.BonusCard; +import pp.mdga.game.Piece; import pp.mdga.game.card.*; import pp.mdga.message.client.NoPowerCardMessage; import pp.mdga.message.client.SelectCardMessage; @@ -12,6 +13,7 @@ import pp.mdga.message.server.PossibleCardsMessage; import pp.mdga.message.server.PossiblePieceMessage; import pp.mdga.notification.SelectableCardsNotification; +import pp.mdga.notification.SelectableShieldNotification; import java.util.ArrayList; import java.util.stream.Collectors; @@ -108,6 +110,7 @@ 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/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index eaa43c13..c7859758 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 @@ -93,8 +93,8 @@ public Game() { */ private void initializeDrawPile() { // this.addBonusCards(new TurboCard(), AMOUNT_OF_TURBO_CARDS); - this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); -// this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); +// this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); + this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); Collections.shuffle(this.drawPile); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestPlayCardMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestPlayCardMessage.java index f9cc057b..f97f2fee 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestPlayCardMessage.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/client/RequestPlayCardMessage.java @@ -41,9 +41,9 @@ public RequestPlayCardMessage(BonusCard card, UUID ownPieceIdentifier, UUID enem * Default constructor for serialization purposes. */ private RequestPlayCardMessage() { - card = null; - ownPieceIdentifier = null; - enemyPieceIdentifier = null; + card = BonusCard.HIDDEN; + ownPieceIdentifier = UUID.randomUUID(); + enemyPieceIdentifier = UUID.randomUUID(); } /** From 8af3b2d9d42831f4cf4a5e1d1efbdb8dbc922f54 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 01:47:32 +0100 Subject: [PATCH 13/46] Fix uuid serialisation error --- .../client/src/main/java/pp/mdga/client/MdgaApp.java | 2 ++ .../java/pp/mdga/client/NotificationSynchronizer.java | 11 +++++++++-- .../java/pp/mdga/client/server/UUIDSerializer.java | 5 ++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 518feb52..6a69b6ba 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -66,6 +66,8 @@ public class MdgaApp extends SimpleApplication { private ServerConnection networkConnection; + public static final int DEBUG_MULTIPLIER = 0; + public MdgaApp() { networkConnection = new NetworkSupport(this); this.clientGameLogic = new ClientGameLogic(networkConnection); 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 7bc98b81..67ef7b53 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 @@ -7,6 +7,7 @@ import pp.mdga.client.view.CeremonyView; import pp.mdga.client.view.GameView; import pp.mdga.client.view.LobbyView; +import pp.mdga.game.BonusCard; import pp.mdga.game.Color; import pp.mdga.notification.*; @@ -171,6 +172,12 @@ private void handleGame(Notification notification) { } else if (notification instanceof NoShieldNotification n) { boardHandler.unshieldPiece(n.getPieceId()); } else if (notification instanceof PlayCardNotification n) { + if(n.getCard() == BonusCard.TURBO) { + guiHandler.turbo(); + app.getModelSynchronize().animationEnd(); + return; + } + if(n.getColor() == ownColor) guiHandler.playCardOwn(n.getCard()); else guiHandler.playCardEnemy(n.getColor(), n.getCard()); } else if (notification instanceof PlayerInGameNotification n) { @@ -203,7 +210,7 @@ private void handleGame(Notification notification) { boardHandler.swapPieceAnim(n.getFirstPiece(), n.getSecondPiece()); guiHandler.swap(); } else if (notification instanceof WaitMoveNotification) { - //TODO ??? + //nothing } else if (notification instanceof SelectableMoveNotification n) { boardHandler.outlineMove(n.getPieces(), n.getMoveIndices(), n.getHomeMoves()); modelSynchronizer.setSwap(false); @@ -214,7 +221,7 @@ private void handleGame(Notification notification) { boardHandler.outlineShield(n.getPieces()); modelSynchronizer.setSwap(false); } else if (notification instanceof TurboActiveNotification){ - guiHandler.turbo(); + //nothing } else if (notification instanceof FinishNotification n){ guiHandler.finish(n.getColorFinished()); } else { diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java index c892e6d7..a99522bf 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java @@ -21,6 +21,9 @@ public T readObject(ByteBuffer data, Class c) throws IOException public void writeObject(ByteBuffer buffer, Object object) throws IOException { UUID uuid = (UUID) object; - buffer.put(uuid.toString().getBytes()); + + if(uuid != null) { + buffer.put(uuid.toString().getBytes()); + } } } From daa8c0bf9d39b72ae89655d292ec0468c12e66b3 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 01:53:18 +0100 Subject: [PATCH 14/46] 500IQ --- .../main/java/pp/mdga/client/server/UUIDSerializer.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java index a99522bf..ffc81778 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/server/UUIDSerializer.java @@ -14,7 +14,11 @@ public T readObject(ByteBuffer data, Class c) throws IOException byte[] uuid = new byte[36]; data.get(uuid); - return (T) UUID.fromString(new String(uuid)); + if(uuid.equals(new UUID(1, 1))) { + return null; + } else { + return (T) UUID.fromString(new String(uuid)); + } } @Override @@ -24,6 +28,8 @@ public void writeObject(ByteBuffer buffer, Object object) throws IOException if(uuid != null) { buffer.put(uuid.toString().getBytes()); + } else { + buffer.put(new UUID(1, 1).toString().getBytes()); } } } From e457fe23d45ca1e96e27cb2708fedf2b64289885 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 02:03:57 +0100 Subject: [PATCH 15/46] added a reset for the dice modifier in the server --- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- .../mdga/server/automaton/game/turn/RollDiceState.java | 9 +++++++++ .../automaton/game/turn/powercard/TurboCardState.java | 1 + 3 files changed, 12 insertions(+), 2 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 c7859758..88292f25 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 @@ -92,9 +92,9 @@ 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 TurboCard(), AMOUNT_OF_TURBO_CARDS); // this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); - this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); +// this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); Collections.shuffle(this.drawPile); } 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 7f7ce11d..225c79a0 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 @@ -22,6 +22,7 @@ public class RollDiceState extends TurnAutomatonState { private final FirstRollState firstRollState; private final SecondRollState secondRollState; private final ThirdRollState thirdRollState; + private boolean resetModifier = true; /** * Constructs a server state of the specified game logic. @@ -39,12 +40,16 @@ public RollDiceState(TurnState turnAutomaton, ServerGameLogic logic) { @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered RollDiceState state."); + if (resetModifier){ + logic.getGame().setDiceModifier(1); + } this.setCurrentState(this.firstRollState); } @Override public void exit() { LOGGER.log(System.Logger.Level.DEBUG, "Exited RollDiceState state."); + resetModifier = true; } /** @@ -73,6 +78,10 @@ public RollDiceAutomatonState getCurrentState() { return this.currentState; } + public void setResetModifier(boolean resetModifier) { + this.resetModifier = resetModifier; + } + /** * This method will be used to return firstRollState attribute of RollDiceState class. * diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java index 74d40d0d..38f04f5a 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java @@ -28,6 +28,7 @@ public void enter() { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); + this.powerCardAutomaton.getTurnAutomaton().getRollDiceState().setResetModifier(false); this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); } From 4ca7c38170a210d6bb0d45af91c3f83fd613da52 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 02:09:09 +0100 Subject: [PATCH 16/46] Minor change in notification processing --- .../src/main/java/pp/mdga/client/NotificationSynchronizer.java | 1 - 1 file changed, 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 67ef7b53..f07679eb 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 @@ -175,7 +175,6 @@ private void handleGame(Notification notification) { if(n.getCard() == BonusCard.TURBO) { guiHandler.turbo(); app.getModelSynchronize().animationEnd(); - return; } if(n.getColor() == ownColor) guiHandler.playCardOwn(n.getCard()); From cb60cb1c42e8edd05dccd48c9cf8d33e74f5d158 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 02:19:43 +0100 Subject: [PATCH 17/46] Add bonus node logic --- .../turn/choosepiece/SelectPieceState.java | 18 ++++++++++++++---- .../game/turn/choosepiece/StartPieceState.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 4 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 9aca4089..e389da54 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,10 +1,9 @@ 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.game.card.HiddenCard; import pp.mdga.message.client.RequestMoveMessage; +import pp.mdga.message.server.DrawCardMessage; import pp.mdga.message.server.MoveMessage; import pp.mdga.message.server.SelectPieceMessage; import pp.mdga.server.ServerGameLogic; @@ -82,6 +81,17 @@ public void received(RequestMoveMessage msg, int from){ movePiece.setShield(ShieldState.NONE); } else { Node targetNode = logic.getGame().getBoard().getInfield()[targIdx]; + + if(targetNode.isBonus()) { + for (Player p : logic.getGame().getPlayersAsList()) { + if(p.isActive()) { + 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())); + } + } + } + Piece occ = targetNode.getOccupant(); if (occ != null) { logic.getGame().getPlayerByColor(occ.getColor()).addWaitingPiece(occ); 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 ff3e62e0..8c595d87 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 @@ -2,7 +2,10 @@ import pp.mdga.game.Node; import pp.mdga.game.Piece; +import pp.mdga.game.Player; +import pp.mdga.game.card.HiddenCard; import pp.mdga.message.client.RequestMoveMessage; +import pp.mdga.message.server.DrawCardMessage; import pp.mdga.message.server.MoveMessage; import pp.mdga.message.server.StartPieceMessage; import pp.mdga.server.ServerGameLogic; @@ -42,6 +45,17 @@ public void received(RequestMoveMessage msg, int from){ if (piece.equals(msg.getPiece())) { int targetIndex = calculateTargetIndex(piece); Node targetNode = logic.getGame().getBoard().getInfield()[targetIndex]; + + if(targetNode.isBonus()) { + for (Player p : logic.getGame().getPlayersAsList()) { + if(p.isActive()) { + 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 41ac04f69dbcc669754346af6f9656bcf52dd7cd Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 02:15:45 +0100 Subject: [PATCH 18/46] added in can infield move to return false when occupant is shielded --- .../game/turn/choosepiece/ChoosePieceAutomatonState.java | 3 +++ 1 file changed, 3 insertions(+) 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..48fe982a 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 @@ -64,6 +64,9 @@ private boolean canInfieldMove(Piece piece, int steps){ int moveIndex = (pieceIndex + steps) % logic.getGame().getBoard().getInfield().length; Piece occupant = logic.getGame().getBoard().getInfield()[moveIndex].getOccupant(); if (occupant != null){ + if (occupant.isShielded()){ + return false; + } return occupant.getColor() != piece.getColor(); } return true; From cc72b82be931236d06585b5704f37e7683d0ef7f Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 02:18:30 +0100 Subject: [PATCH 19/46] added shield Messages --- .../gamestate/turnstate/powercardstate/ShieldState.java | 7 ++++++- .../automaton/game/turn/powercard/ShieldCardState.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) 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 75a99c63..95a53dd0 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 @@ -5,10 +5,12 @@ import pp.mdga.client.gamestate.turnstate.PowerCardState; import pp.mdga.game.Piece; import pp.mdga.message.client.RequestPlayCardMessage; +import pp.mdga.message.client.SelectedPiecesMessage; import pp.mdga.message.server.PlayCardMessage; import java.lang.System.Logger.Level; import java.util.ArrayList; +import java.util.List; public class ShieldState extends PowerCardStates { @@ -40,7 +42,10 @@ public void setPossiblePieces(ArrayList possiblePieces) { public void selectPiece(Piece piece) { if (possiblePieces.contains(piece)) { - logic.send(RequestPlayCardMessage.requestPlayShield(piece.getUuid())); +// logic.send(RequestPlayCardMessage.requestPlayShield(piece.getUuid())); + ArrayList temp = new ArrayList<>(); + temp.add(piece); + logic.send(new SelectedPiecesMessage(temp)); } else { LOGGER.log(Level.DEBUG, "Invalid piece selected"); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java index cf7eaff0..c7024e6c 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java @@ -56,7 +56,9 @@ public void received(SelectedPiecesMessage msg, int from) { piece.setShield(ShieldState.ACTIVE); } } - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); + ArrayList temp = new ArrayList<>(); + temp.add(msg.getPieces().get(0)); + this.logic.getServerSender().broadcast(new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), temp, 1)); this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState()); From 6ecf5a66bf04bc2a790ad2f89c80938a06153a73 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 02:30:15 +0100 Subject: [PATCH 20/46] added animation end in playCardNotification --- .../main/java/pp/mdga/client/NotificationSynchronizer.java | 4 ++-- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 f07679eb..7ae04de1 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 @@ -174,11 +174,11 @@ private void handleGame(Notification notification) { } else if (notification instanceof PlayCardNotification n) { if(n.getCard() == BonusCard.TURBO) { guiHandler.turbo(); - app.getModelSynchronize().animationEnd(); } - if(n.getColor() == ownColor) guiHandler.playCardOwn(n.getCard()); else guiHandler.playCardEnemy(n.getColor(), n.getCard()); + + app.getModelSynchronize().animationEnd(); } else if (notification instanceof PlayerInGameNotification n) { boardHandler.addPlayer(n.getColor(),n.getPiecesList()); guiHandler.addPlayer(n.getColor(),n.getName()); 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 88292f25..c7859758 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 @@ -92,9 +92,9 @@ 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 TurboCard(), AMOUNT_OF_TURBO_CARDS); // this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); -// this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); + this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); Collections.shuffle(this.drawPile); } From 1c87b566e9c20ba5ad9b59fe6459502357cfd431 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 02:40:45 +0100 Subject: [PATCH 21/46] Add DrawCardMessage logic --- .../java/pp/mdga/client/gamestate/TurnState.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 0521dda2..15d8e772 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 @@ -11,7 +11,13 @@ import pp.mdga.client.gamestate.turnstate.TurnStates; import pp.mdga.game.BonusCard; import pp.mdga.game.Piece; +import pp.mdga.game.card.HiddenCard; +import pp.mdga.game.card.ShieldCard; +import pp.mdga.game.card.SwapCard; +import pp.mdga.game.card.TurboCard; import pp.mdga.message.server.*; +import pp.mdga.notification.AcquireCardNotification; +import pp.mdga.notification.DrawCardNotification; public class TurnState extends GameStates { @@ -145,7 +151,13 @@ public void received(ChoosePieceStateMessage msg){ @Override public void received(DrawCardMessage msg){ - state.received(msg); + switch (msg.getCard()) { + case HiddenCard hiddenCard -> logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), BonusCard.HIDDEN)); + case TurboCard turboCard -> logic.addNotification(new AcquireCardNotification(BonusCard.TURBO)); + case ShieldCard shieldCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SHIELD)); + case SwapCard swapCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SWAP)); + case null, default -> throw new RuntimeException(); + } } public ChoosePieceState getChoosePiece() { From 8922cb8f1ca6f01aea864def913d98405e22b434 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 02:41:44 +0100 Subject: [PATCH 22/46] added removeshield notification --- .../java/pp/mdga/client/gamestate/TurnState.java | 8 ++++++++ .../notification/RemoveShieldNotification.java | 15 +++++++++++++++ .../pp/mdga/server/automaton/game/TurnState.java | 5 +++++ .../automaton/game/turn/PlayPowerCardState.java | 1 - 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/notification/RemoveShieldNotification.java 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 eec65ac0..2b1e83e7 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 @@ -11,11 +11,13 @@ import pp.mdga.client.gamestate.turnstate.TurnStates; import pp.mdga.game.BonusCard; import pp.mdga.game.Piece; +import pp.mdga.game.ShieldState; import pp.mdga.game.card.HiddenCard; import pp.mdga.game.card.ShieldCard; import pp.mdga.game.card.SwapCard; import pp.mdga.game.card.TurboCard; import pp.mdga.message.server.*; +import pp.mdga.notification.RemoveShieldNotification; import pp.mdga.notification.AcquireCardNotification; import pp.mdga.notification.DrawCardNotification; @@ -38,6 +40,12 @@ public TurnState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { this.setState(this.powerCardState); + for (Piece piece : logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPieces()) { + if (piece.isShielded() || piece.isSuppressed()){ + piece.setShield(ShieldState.NONE); + logic.addNotification(new RemoveShieldNotification(piece.getUuid())); + } + } } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/notification/RemoveShieldNotification.java b/Projekte/mdga/model/src/main/java/pp/mdga/notification/RemoveShieldNotification.java new file mode 100644 index 00000000..8c808f5c --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/notification/RemoveShieldNotification.java @@ -0,0 +1,15 @@ +package pp.mdga.notification; + +import java.util.UUID; + +public class RemoveShieldNotification extends Notification { + private final UUID pieceUuid; + + public RemoveShieldNotification(UUID pieceUuid) { + this.pieceUuid = pieceUuid; + } + + public UUID getPieceUuid() { + return pieceUuid; + } +} 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..464b0e70 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,6 +1,8 @@ package pp.mdga.server.automaton.game; +import pp.mdga.game.Piece; import pp.mdga.game.Player; +import pp.mdga.game.ShieldState; import pp.mdga.message.client.*; import pp.mdga.server.ServerGameLogic; import pp.mdga.server.automaton.GameState; @@ -52,6 +54,9 @@ public TurnState(GameState gameAutomaton, ServerGameLogic logic) { public void enter() { LOGGER.log(Level.INFO, "Entered TurnState state."); this.player = this.logic.getGame().getPlayerById(this.logic.getGame().getActivePlayerId()); + for (Piece piece : this.player.getPieces()) { + piece.setShield(ShieldState.NONE); + } this.setCurrentState(this.powerCardState); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PlayPowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PlayPowerCardState.java index b4df46c6..fe877ffc 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PlayPowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/PlayPowerCardState.java @@ -32,7 +32,6 @@ public PlayPowerCardState(TurnState turnAutomaton, ServerGameLogic logic) { @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered PlayPowerCardState state."); } From de592cfa48564dd95036d97d2e69daf9a91531ef Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 02:43:02 +0100 Subject: [PATCH 23/46] Move receive DrawCardMessage to GameState --- .../src/main/java/pp/mdga/client/GameState.java | 14 +++++++++++++- .../java/pp/mdga/client/gamestate/TurnState.java | 7 ------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java index a41d66c7..99e2264b 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java @@ -3,8 +3,14 @@ import pp.mdga.client.gamestate.*; import pp.mdga.game.BonusCard; import pp.mdga.game.Piece; +import pp.mdga.game.card.HiddenCard; +import pp.mdga.game.card.ShieldCard; +import pp.mdga.game.card.SwapCard; +import pp.mdga.game.card.TurboCard; import pp.mdga.message.client.LeaveGameMessage; import pp.mdga.message.server.*; +import pp.mdga.notification.AcquireCardNotification; +import pp.mdga.notification.DrawCardNotification; import pp.mdga.notification.InterruptNotification; import pp.mdga.notification.StartDialogNotification; @@ -288,7 +294,13 @@ public void received(ChoosePieceStateMessage msg){ @Override public void received(DrawCardMessage msg){ - state.received(msg); + switch (msg.getCard()) { + case HiddenCard hiddenCard -> logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), BonusCard.HIDDEN)); + case TurboCard turboCard -> logic.addNotification(new AcquireCardNotification(BonusCard.TURBO)); + case ShieldCard shieldCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SHIELD)); + case SwapCard swapCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SWAP)); + case null, default -> throw new RuntimeException(); + } } /** 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 15d8e772..eec65ac0 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 @@ -151,13 +151,6 @@ public void received(ChoosePieceStateMessage msg){ @Override public void received(DrawCardMessage msg){ - switch (msg.getCard()) { - case HiddenCard hiddenCard -> logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), BonusCard.HIDDEN)); - case TurboCard turboCard -> logic.addNotification(new AcquireCardNotification(BonusCard.TURBO)); - case ShieldCard shieldCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SHIELD)); - case SwapCard swapCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SWAP)); - case null, default -> throw new RuntimeException(); - } } public ChoosePieceState getChoosePiece() { From 69d160d0fd77bdd7613f8c3a71569875729293fc Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 02:50:45 +0100 Subject: [PATCH 24/46] Java23 --- .../src/main/java/pp/mdga/client/GameState.java | 16 ++++++++++------ .../java/pp/mdga/client/gamestate/TurnState.java | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java index 99e2264b..bb1d4333 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/GameState.java @@ -294,12 +294,16 @@ public void received(ChoosePieceStateMessage msg){ @Override public void received(DrawCardMessage msg){ - switch (msg.getCard()) { - case HiddenCard hiddenCard -> logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), BonusCard.HIDDEN)); - case TurboCard turboCard -> logic.addNotification(new AcquireCardNotification(BonusCard.TURBO)); - case ShieldCard shieldCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SHIELD)); - case SwapCard swapCard -> logic.addNotification(new AcquireCardNotification(BonusCard.SWAP)); - case null, default -> throw new RuntimeException(); + if(msg.getCard() instanceof HiddenCard){ + logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), BonusCard.HIDDEN)); + } else if(msg.getCard() instanceof TurboCard) { + logic.addNotification(new AcquireCardNotification(BonusCard.TURBO)); + } else if(msg.getCard() instanceof ShieldCard) { + logic.addNotification(new AcquireCardNotification(BonusCard.SHIELD)); + } else if(msg.getCard() instanceof SwapCard) { + logic.addNotification(new AcquireCardNotification(BonusCard.SWAP)); + } else { + throw new RuntimeException(); } } 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 eec65ac0..61967276 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 @@ -151,6 +151,7 @@ public void received(ChoosePieceStateMessage msg){ @Override public void received(DrawCardMessage msg){ + } public ChoosePieceState getChoosePiece() { From 935577462bdc82323616fb59f977e906b410fe22 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 02:55:52 +0100 Subject: [PATCH 25/46] added shieldRing move --- .../client/src/main/java/pp/mdga/client/board/BoardHandler.java | 1 - .../client/src/main/java/pp/mdga/client/board/PieceControl.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) 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 0cb0c76a..04d0e5bb 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 @@ -529,7 +529,6 @@ private void throwPiece(UUID uuid){ * @param uuid the UUID of the piece to shield */ public void shieldPiece(UUID uuid){ - pieces.get(uuid).activateShield(); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java index 87da54ee..8db0b9b1 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java @@ -113,6 +113,7 @@ public Vector3f getLocation(){ protected void controlUpdate(float delta) { if(shieldRing != null){ shieldRing.rotate(0, 0, delta * SHIELD_SPEED); + shieldRing.setLocalTranslation(spatial.getLocalTranslation().add(new Vector3f(0,0,SHIELD_Z))); } } From fb3a663db162e44fe27be84aac6a4a847beaa69b Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 03:07:12 +0100 Subject: [PATCH 26/46] added overwrite of dicemodifier when receiving PlayCard Turbo message --- .../gamestate/turnstate/powercardstate/ChoosePowerCardState.java | 1 + 1 file changed, 1 insertion(+) 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 acf023bf..17b57254 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 @@ -87,6 +87,7 @@ public void selectCard(BonusCard card){ @Override public void received(PlayCardMessage msg){ if(msg.getCard().getCard().equals(BonusCard.TURBO)){ + logic.getGame().setDiceModifier(msg.getDiceModifier()); parent.getParent().getPlayPowerCard().setPlayCard(msg); parent.getParent().setState(parent.getParent().getPlayPowerCard()); } From 536c14bf7c9c2190e62022a2203be96f63b45a7b Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:11:43 +0100 Subject: [PATCH 27/46] working on turbocard --- .../mdga/client/NotificationSynchronizer.java | 4 +-- .../src/main/java/pp/mdga/game/Game.java | 4 +-- .../notification/NoShieldNotification.java | 29 ------------------- 3 files changed, 4 insertions(+), 33 deletions(-) delete mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/notification/NoShieldNotification.java 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 7ae04de1..b735655c 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 @@ -169,8 +169,8 @@ private void handleGame(Notification notification) { } else if (notification instanceof ThrowPieceNotification n) { boardHandler.throwPiece(n.getPieceId(), n.getThrowColor()); waitForAnimation = true; - } else if (notification instanceof NoShieldNotification n) { - boardHandler.unshieldPiece(n.getPieceId()); + } else if (notification instanceof RemoveShieldNotification n) { + boardHandler.unshieldPiece(n.getPieceUuid()); } else if (notification instanceof PlayCardNotification n) { if(n.getCard() == BonusCard.TURBO) { guiHandler.turbo(); 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 c7859758..88292f25 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 @@ -92,9 +92,9 @@ 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 TurboCard(), AMOUNT_OF_TURBO_CARDS); // this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS); - this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); +// this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS); Collections.shuffle(this.drawPile); } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/notification/NoShieldNotification.java b/Projekte/mdga/model/src/main/java/pp/mdga/notification/NoShieldNotification.java deleted file mode 100644 index 8c7fa970..00000000 --- a/Projekte/mdga/model/src/main/java/pp/mdga/notification/NoShieldNotification.java +++ /dev/null @@ -1,29 +0,0 @@ -package pp.mdga.notification; - -import java.util.UUID; - -/** - * Notification that a piece has no shield. - */ -public class NoShieldNotification extends Notification{ - /** - * The id of the piece that has no shield. - */ - private final UUID pieceId; - - /** - * Constructor. - * @param pieceId the id of the piece that has no shield. - */ - public NoShieldNotification(UUID pieceId) { - this.pieceId = pieceId; - } - - /** - * Get the id of the piece that has no shield. - * @return the id of the piece that has no shield. - */ - public UUID getPieceId() { - return pieceId; - } -} From 3dd6fc9f377f2f5b44cae8064f5b08d3fd240cdc Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 03:17:28 +0100 Subject: [PATCH 28/46] Add DEBUG_MULTIPLIER --- .../client/src/main/java/pp/mdga/client/MdgaApp.java | 2 +- .../src/main/java/pp/mdga/client/ModelSynchronizer.java | 2 ++ .../java/pp/mdga/client/NotificationSynchronizer.java | 7 +++++-- .../src/main/java/pp/mdga/client/gui/DiceControl.java | 9 ++++----- .../src/main/java/pp/mdga/client/gui/GuiHandler.java | 1 + 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 6a69b6ba..9dcf17cc 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -66,7 +66,7 @@ public class MdgaApp extends SimpleApplication { private ServerConnection networkConnection; - public static final int DEBUG_MULTIPLIER = 0; + public static final int DEBUG_MULTIPLIER = 1; public MdgaApp() { networkConnection = new NetworkSupport(this); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java index cea98141..9971038b 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java @@ -83,6 +83,8 @@ public void confirm() { GameView gameView = (GameView) app.getView(); + gameView.getGuiHandler().hideText(); + if(a != null && b != null) { app.getGameLogic().selectPiece(a); app.getGameLogic().selectPiece(b); 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 7ae04de1..c90838de 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 @@ -69,7 +69,9 @@ public void update() { throw new RuntimeException("no notification expected: " + n.getClass().getName()); } - delay = 0; + if(0 == MdgaApp.DEBUG_MULTIPLIER) { + delay = 0; + } } } } @@ -151,6 +153,7 @@ private void handleGame(Notification notification) { guiHandler.showDice(); } else if (notification instanceof DrawCardNotification n) { guiHandler.drawCard(n.getColor()); + delay = STANDARD_DELAY; } else if (notification instanceof HomeMoveNotification home) { boardHandler.movePieceHomeAnim(home.getPieceId(), home.getHomeIndex()); guiHandler.hideText(); @@ -188,13 +191,13 @@ private void handleGame(Notification notification) { gameView.getGuiHandler().hideText(); if(n.getColor() == ownColor){ guiHandler.rollDice(n.getEyes(), n.isTurbo() ? n.getMultiplier() : -1); + waitForAnimation = true; } else { boardHandler.hideDice(); if (n.isTurbo()) guiHandler.showRolledDiceMult(n.getEyes(), n.getMultiplier(), n.getColor()); else guiHandler.showRolledDice(n.getEyes(), n.getColor()); } - delay = 7; } else if (notification instanceof SelectableCardsNotification n) { guiHandler.setSelectableCards(n.getCards()); gameView.showNoPower(); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/DiceControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/DiceControl.java index 5c08d93d..42e356aa 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/DiceControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/DiceControl.java @@ -11,6 +11,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; import pp.mdga.client.Asset; +import pp.mdga.client.MdgaApp; import java.util.Random; @@ -51,8 +52,7 @@ protected void controlUpdate(float tpf) { ); // Stop rolling when angular velocity is close to zero -// if (angularVelocity.lengthSquared() < 3f) { - if(true){ + if (angularVelocity.lengthSquared() <= 3f || MdgaApp.DEBUG_MULTIPLIER == 0) { slerp = true; } } @@ -66,14 +66,13 @@ protected void controlUpdate(float tpf) { spatial.setLocalRotation(interpolated); // Stop rolling once duration is complete -// if (timeElapsed >= 1.0f) { - if(true){ + if (timeElapsed >= 1.0f * MdgaApp.DEBUG_MULTIPLIER) { isRolling = false; slerp = false; actionAfter.run(); } } - }else if(spin){ + } else if(spin){ spinWithAngularVelocity(clampedTpf); } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java index c4024fbe..d57a99f1 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java @@ -52,6 +52,7 @@ public void rollDice(int rollNum, int mult) { else actionTextHandler.ownDiceMult(rollNum, mult); hideDice(); app.getModelSynchronize().animationEnd(); + app.getModelSynchronize().animationEnd(); }); } From a7969d7a681f7f3ffd4d3bbd0842183abef2aecd Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 03:25:04 +0100 Subject: [PATCH 29/46] Minor change+ --- .../java/pp/mdga/client/NotificationSynchronizer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 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 a51e0f9b..22516631 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 @@ -12,6 +12,8 @@ import pp.mdga.notification.*; import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; public class NotificationSynchronizer { private final MdgaApp app; @@ -181,7 +183,12 @@ private void handleGame(Notification notification) { if(n.getColor() == ownColor) guiHandler.playCardOwn(n.getCard()); else guiHandler.playCardEnemy(n.getColor(), n.getCard()); - app.getModelSynchronize().animationEnd(); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + app.getModelSynchronize().animationEnd(); + } + }, 2200 * MdgaApp.DEBUG_MULTIPLIER); } else if (notification instanceof PlayerInGameNotification n) { boardHandler.addPlayer(n.getColor(),n.getPiecesList()); guiHandler.addPlayer(n.getColor(),n.getName()); From ecb751824c4f1298269847b4689aed3040a47e2f Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 03:20:54 +0100 Subject: [PATCH 30/46] created two flags to be able to determine if a turbo card has been played --- .../java/pp/mdga/client/gamestate/TurnState.java | 12 +++++++++++- .../client/gamestate/turnstate/RollDiceState.java | 7 +++++++ .../powercardstate/ChoosePowerCardState.java | 1 + .../mdga/model/src/main/java/pp/mdga/game/Game.java | 10 ++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) 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 a24141b6..97d0238f 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 @@ -31,6 +31,7 @@ public class TurnState extends GameStates { private final PlayPowerCardState playPowerCardState = new PlayPowerCardState(this, logic); private final PowerCardState powerCardState = new PowerCardState(this, logic); private final RollDiceState rollDiceState = new RollDiceState(this, logic); + private boolean canChangeTurbo = false; public TurnState(ClientState parent, ClientGameLogic logic) { super(parent, logic); @@ -39,13 +40,14 @@ public TurnState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - this.setState(this.powerCardState); for (Piece piece : logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPieces()) { if (piece.isShielded() || piece.isSuppressed()){ piece.setShield(ShieldState.NONE); logic.addNotification(new RemoveShieldNotification(piece.getUuid())); } } + logic.getGame().setTurboFlag(false); + this.setState(this.powerCardState); } @Override @@ -189,4 +191,12 @@ public GameState getParent(){ public TurnStates getState(){ return state; } + + public boolean isCanChangeTurbo() { + return canChangeTurbo; + } + + public void setCanChangeTurbo(boolean canChangeTurbo) { + this.canChangeTurbo = canChangeTurbo; + } } 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 2d2c1258..ba6265d9 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 @@ -24,6 +24,13 @@ public RollDiceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { logic.addNotification(new DiceNowNotification()); + if (logic.getGame().getTurboFlag()){ + if (parent.isCanChangeTurbo()){ + logic.getGame().setTurboFlag(false); + } else { + parent.setCanChangeTurbo(true); + } + } } @Override 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 17b57254..59ce519d 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 @@ -89,6 +89,7 @@ public void received(PlayCardMessage msg){ if(msg.getCard().getCard().equals(BonusCard.TURBO)){ logic.getGame().setDiceModifier(msg.getDiceModifier()); parent.getParent().getPlayPowerCard().setPlayCard(msg); + logic.getGame().setTurboFlag(true); parent.getParent().setState(parent.getParent().getPlayPowerCard()); } } 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 88292f25..276ee777 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 @@ -78,6 +78,8 @@ public class Game { */ private int diceEyes; + private boolean turboFlag = false; + /** * This constructor creates a new Game object. */ @@ -300,6 +302,14 @@ public boolean isHost() { return this.host != -1; } + public void setTurboFlag(boolean flag) { + this.turboFlag = flag; + } + + public boolean getTurboFlag() { + return this.turboFlag; + } + /** * This method returns the players. * From 5bccee96a28f0f91b8fc5436f0ad16386ddf4407 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:23:02 +0100 Subject: [PATCH 31/46] working on turbo not --- .../java/pp/mdga/client/gamestate/WaitingState.java | 11 ++++++++++- .../client/gamestate/turnstate/RollDiceState.java | 8 +++++++- .../pp/mdga/notification/RollDiceNotification.java | 7 +++++-- 3 files changed, 22 insertions(+), 4 deletions(-) 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 30287096..9b1671f9 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 @@ -42,7 +42,16 @@ public void received(DiceNowMessage msg) { @Override public void received(DieMessage msg) { logic.getGame().setDiceEyes(msg.getDiceEye()); - logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes())); + if(logic.getGame()){ + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); + } + else { + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); + } +// logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes())); + + + //stats if (msg.getDiceEye() == 6) { logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseDiced6(); logic.getGame().getGameStatistics().increaseDiced6(); 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 2d2c1258..ba398d7a 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 @@ -43,7 +43,13 @@ public void selectDice(){ @Override public void received(DieMessage msg){ logic.getGame().setDiceEyes(msg.getDiceEye()); - logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(),false)); + + if(logic.getGame()){ + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); + } + else { + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); + } } @Override diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/notification/RollDiceNotification.java b/Projekte/mdga/model/src/main/java/pp/mdga/notification/RollDiceNotification.java index 2e6f03e1..dfc5daf3 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/notification/RollDiceNotification.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/notification/RollDiceNotification.java @@ -13,6 +13,7 @@ public class RollDiceNotification extends Notification{ private int multiplier; private boolean isRanking; + //normal /** * Constructor. * @param color the color of the player that rolled the die. @@ -26,6 +27,7 @@ public RollDiceNotification(Color color, int eyes) { this.isRanking = false; } + //ranking public RollDiceNotification(Color color, int eyes, boolean isRanking) { this.color = color; this.eyes = eyes; @@ -34,10 +36,11 @@ public RollDiceNotification(Color color, int eyes, boolean isRanking) { this.isRanking = isRanking; } - public RollDiceNotification(Color color, int eyes, boolean turbo, int multiplier) { + //turbo + public RollDiceNotification(Color color, int eyes, int multiplier) { this.color = color; this.eyes = eyes; - this.turbo = turbo; + this.turbo = true; this.multiplier = multiplier; this.isRanking = false; } From 38687b6d254f870e411caf5dbb263123e0fec626 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:37:35 +0100 Subject: [PATCH 32/46] added turboflag --- .../mdga/client/src/main/java/pp/mdga/client/MdgaApp.java | 2 +- .../main/java/pp/mdga/client/gamestate/WaitingState.java | 2 +- .../pp/mdga/client/gamestate/turnstate/RollDiceState.java | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 9dcf17cc..6a69b6ba 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -66,7 +66,7 @@ public class MdgaApp extends SimpleApplication { private ServerConnection networkConnection; - public static final int DEBUG_MULTIPLIER = 1; + public static final int DEBUG_MULTIPLIER = 0; public MdgaApp() { networkConnection = new NetworkSupport(this); 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 9b1671f9..dbb95455 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 @@ -42,7 +42,7 @@ public void received(DiceNowMessage msg) { @Override public void received(DieMessage msg) { logic.getGame().setDiceEyes(msg.getDiceEye()); - if(logic.getGame()){ + if(logic.getGame().getTurboFlag()){ logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); } else { 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 9d88451e..f2820fbd 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 @@ -51,11 +51,12 @@ public void selectDice(){ public void received(DieMessage msg){ logic.getGame().setDiceEyes(msg.getDiceEye()); - if(logic.getGame()){ - logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); + if(logic.getGame().getTurboFlag()){ + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); } else { - logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); + logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); + } } From be8d4b2d6e5c6f59dec9bfaa0d5752eefccaf518 Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 03:39:24 +0100 Subject: [PATCH 33/46] made turbo flag work with only one flag --- .../src/main/java/pp/mdga/client/gamestate/GameStates.java | 1 + .../main/java/pp/mdga/client/gamestate/SpectatorState.java | 1 + .../main/java/pp/mdga/client/gamestate/WaitingState.java | 1 + .../pp/mdga/client/gamestate/turnstate/RollDiceState.java | 7 ------- .../gamestate/turnstate/choosepiecestate/NoPieceState.java | 1 + .../turnstate/choosepiecestate/SelectPieceState.java | 2 +- .../turnstate/choosepiecestate/StartPieceState.java | 2 +- .../turnstate/choosepiecestate/WaitingPieceState.java | 2 +- 8 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java index 98165adc..ccc1734b 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/GameStates.java @@ -27,6 +27,7 @@ public GameStates(ClientState parent, ClientGameLogic logic) { protected void handlePowerCard(PlayCardMessage msg) { if (msg.getCard().getCard().equals(BonusCard.TURBO)) { + logic.getGame().setTurboFlag(true); logic.getGame().setDiceModifier(msg.getDiceModifier()); } else if (msg.getCard().getCard().equals(BonusCard.SHIELD)) { handleShield(msg.getPieces().get(0).getUuid()); 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 39602bed..d0ae32c9 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 @@ -94,6 +94,7 @@ public void received(MoveMessage msg) { //set new node logic.getGame().getBoard().getInfield()[msg.getTargetIndex()].setOccupant(piece); } + logic.getGame().setTurboFlag(false); parent.setState(parent.getAnimation()); } } 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 dbb95455..e849048b 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 @@ -111,6 +111,7 @@ public void received(MoveMessage msg) { //set new node logic.getGame().getBoard().getInfield()[msg.getTargetIndex()].setOccupant(piece); } + logic.getGame().setTurboFlag(false); parent.setState(parent.getAnimation()); } } 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 f2820fbd..19c631ef 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 @@ -24,13 +24,6 @@ public RollDiceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { logic.addNotification(new DiceNowNotification()); - if (logic.getGame().getTurboFlag()){ - if (parent.isCanChangeTurbo()){ - logic.getGame().setTurboFlag(false); - } else { - parent.setCanChangeTurbo(true); - } - } } @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 cad3dc6f..f43beea9 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 @@ -72,6 +72,7 @@ public void received(StartPieceMessage msg){ @Override public void received(NoTurnMessage msg){ + logic.getGame().setTurboFlag(false); parent.getParent().getParent().setState(parent.getParent().getParent().getWaiting()); } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/choosepiecestate/SelectPieceState.java index 1ff2824b..b85899b5 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 @@ -71,7 +71,7 @@ public void received(MoveMessage msg) { //set new node logic.getGame().getBoard().getInfield()[msg.getTargetIndex()].setOccupant(piece); } - + logic.getGame().setTurboFlag(false); parent.getParent().setState(parent.getParent().getMovePiece()); } } 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 7f601630..9594e356 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 @@ -65,7 +65,7 @@ public void received(MoveMessage msg){ targetNode.setOccupant(msg.getPiece()); logic.addNotification(new MovePieceNotification(msg.getPiece().getUuid(), oldIndex, targetIndex)); - + logic.getGame().setTurboFlag(false); parent.getParent().setState(parent.getParent().getMovePiece()); } } 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 86bcc509..b7c43fa0 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 @@ -49,7 +49,7 @@ public void received(MoveMessage msg){ logic.addNotification(new MovePieceNotification(pieceToMove.getUuid(), logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getStartNodeIndex(), true)); logic.getGame().getBoard().getInfield()[msg.getTargetIndex()].setOccupant(msg.getPiece()); - + logic.getGame().setTurboFlag(false); pieceToMove.setState(PieceState.ACTIVE); parent.getParent().setState(parent.getParent().getMovePiece()); } From 961da990ce714c2105f217dc60ad07ac2fc317fd Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:46:09 +0100 Subject: [PATCH 34/46] fixed no broadcast bug --- .../server/automaton/game/turn/powercard/TurboCardState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java index 38f04f5a..8ab230dd 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java @@ -25,7 +25,7 @@ public TurboCardState(PowerCardState powerCardAutomaton, ServerGameLogic logic) public void enter() { this.logic.getGame().getDie().modify(); this.logic.getGame().setDiceModifier(this.logic.getGame().getDie().getDieModifier()); - this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); + this.logic.getServerSender().broadcast(new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier())); this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).removeHandCard(this.powerCardAutomaton.getSelectedCard()); this.logic.getGame().getDiscardPile().add(this.powerCardAutomaton.getSelectedCard()); this.powerCardAutomaton.getTurnAutomaton().getRollDiceState().setResetModifier(false); From 14699e3edfc5811bd36f3898addaff45b9b0d56f Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:55:51 +0100 Subject: [PATCH 35/46] fixed bug --- .../src/main/java/pp/mdga/client/gamestate/WaitingState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e849048b..ea40471d 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 @@ -43,10 +43,10 @@ public void received(DiceNowMessage msg) { public void received(DieMessage msg) { logic.getGame().setDiceEyes(msg.getDiceEye()); if(logic.getGame().getTurboFlag()){ - logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye())); + logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye())); } else { - logic.addNotification(new RollDiceNotification(logic.getGame().getPlayerById(logic.getOwnPlayerId()).getColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); + logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); } // logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes())); From 9c7a13c5681517755c82a6b87263ec033753ee70 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 03:57:53 +0100 Subject: [PATCH 36/46] fixed bug --- .../src/main/java/pp/mdga/client/gamestate/WaitingState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ea40471d..99e05162 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 @@ -43,10 +43,10 @@ public void received(DiceNowMessage msg) { public void received(DieMessage msg) { logic.getGame().setDiceEyes(msg.getDiceEye()); if(logic.getGame().getTurboFlag()){ - logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye())); + logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); } else { - logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye(), logic.getGame().getDiceModifier())); + logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), msg.getDiceEye())); } // logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes())); From 659fef6c50e4b0ef09fc263cd9b56597d5acddd9 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:07:52 +0100 Subject: [PATCH 37/46] Add bonus sounds --- .../mdga/client/NotificationSynchronizer.java | 5 +++++ .../mdga/client/acoustic/AcousticHandler.java | 9 +++++++++ .../java/pp/mdga/client/acoustic/MdgaSound.java | 5 ++++- .../pp/mdga/client/acoustic/SoundAsset.java | 5 ++++- .../client/src/main/resources/Sounds/shield.ogg | Bin 0 -> 16673 bytes .../client/src/main/resources/Sounds/speed.ogg | Bin 0 -> 18998 bytes .../client/src/main/resources/Sounds/swap.ogg | Bin 0 -> 24930 bytes 7 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/shield.ogg create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/speed.ogg create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/swap.ogg 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 22516631..3c4d5a22 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 @@ -178,7 +178,12 @@ private void handleGame(Notification notification) { boardHandler.unshieldPiece(n.getPieceUuid()); } else if (notification instanceof PlayCardNotification n) { if(n.getCard() == BonusCard.TURBO) { + app.getAcousticHandler().playSound(MdgaSound.TURBO); guiHandler.turbo(); + } else if(n.getCard() == BonusCard.SHIELD) { + app.getAcousticHandler().playSound(MdgaSound.SHIELD); + } else if(n.getCard() == BonusCard.SWAP) { + app.getAcousticHandler().playSound(MdgaSound.SWAP); } if(n.getColor() == ownColor) guiHandler.playCardOwn(n.getCard()); else guiHandler.playCardEnemy(n.getColor(), n.getCard()); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java index 5867a4c3..fa67fc0e 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java @@ -147,6 +147,15 @@ public void playSound(MdgaSound sound) { case TANK_EXPLOSION: assets.add(new SoundAssetDelayVolume(SoundAsset.EXPLOSION_1, 1.0f, 0f)); break; + case SHIELD: + assets.add(new SoundAssetDelayVolume(SoundAsset.SHIELD, 1.0f, 0f)); + break; + case TURBO: + assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 0f)); + break; + case SWAP: + assets.add(new SoundAssetDelayVolume(SoundAsset.SWAP, 1.0f, 0f)); + break; default: break; } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java index d7f93bae..db6a819f 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java @@ -40,5 +40,8 @@ public enum MdgaSound { MATRIX, TURRET_ROTATE, TANK_SHOOT, - TANK_EXPLOSION + TANK_EXPLOSION, + SHIELD, + TURBO, + SWAP, } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java index 09671259..f2d232c0 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java @@ -39,7 +39,10 @@ enum SoundAsset { MATRIX("matrix.wav"), CONNECTED("connected.wav"), TURRET_ROTATE("turret_rotate.ogg"), - TANK_SHOOT("tank_shoot.ogg") + TANK_SHOOT("tank_shoot.ogg"), + SHIELD("shield.ogg"), + SPEED("speed.ogg"), + SWAP("swap.ogg"), ; diff --git a/Projekte/mdga/client/src/main/resources/Sounds/shield.ogg b/Projekte/mdga/client/src/main/resources/Sounds/shield.ogg new file mode 100644 index 0000000000000000000000000000000000000000..57d06f0bd5af87bd9a74de29b74124e7ca923f5b GIT binary patch literal 16673 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 literal 0 HcmV?d00001 diff --git a/Projekte/mdga/client/src/main/resources/Sounds/speed.ogg b/Projekte/mdga/client/src/main/resources/Sounds/speed.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dd3ea7e44e96d33a0173b252e43cdb81ccd2908a GIT binary patch literal 18998 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 literal 0 HcmV?d00001 From 6f34b1fe331064a3a3694eb58e5e259d2fa2b8fc Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:10:14 +0100 Subject: [PATCH 38/46] Adjust delay --- .../src/main/java/pp/mdga/client/acoustic/AcousticHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java index fa67fc0e..6c376c28 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java @@ -151,7 +151,7 @@ public void playSound(MdgaSound sound) { assets.add(new SoundAssetDelayVolume(SoundAsset.SHIELD, 1.0f, 0f)); break; case TURBO: - assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 0f)); + assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 0.2f)); break; case SWAP: assets.add(new SoundAssetDelayVolume(SoundAsset.SWAP, 1.0f, 0f)); From 418145659836feaa71be26399d83a678f0ea01a5 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:13:30 +0100 Subject: [PATCH 39/46] Adjust delay --- .../src/main/java/pp/mdga/client/acoustic/AcousticHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java index 6c376c28..20ac40c4 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java @@ -151,7 +151,8 @@ public void playSound(MdgaSound sound) { assets.add(new SoundAssetDelayVolume(SoundAsset.SHIELD, 1.0f, 0f)); break; case TURBO: - assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 0.2f)); + assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 0.1f)); + assets.add(new SoundAssetDelayVolume(SoundAsset.SPEED, 1.0f, 1.3f)); break; case SWAP: assets.add(new SoundAssetDelayVolume(SoundAsset.SWAP, 1.0f, 0f)); From 3fe2d90d75d87a3736c53b67627b416d5d9bb4c9 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 04:21:06 +0100 Subject: [PATCH 40/46] added toString --- .../java/pp/mdga/client/gamestate/WaitingState.java | 12 ++++++------ .../java/pp/mdga/message/server/DrawCardMessage.java | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) 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 99e05162..82a7d1dc 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 @@ -76,12 +76,12 @@ public void received(ActivePlayerMessage msg) { } } - @Override - public void received(DrawCardMessage msg){ - logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard())); - logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseActivatedBonusNodes(); - logic.getGame().getGameStatistics().increaseActivatedBonusNodes(); - } +// @Override +// public void received(DrawCardMessage msg){ +// logic.addNotification(new DrawCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard())); +// logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseActivatedBonusNodes(); +// logic.getGame().getGameStatistics().increaseActivatedBonusNodes(); +// } @Override public void received(MoveMessage msg) { diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java index 6ccc1411..c26f561d 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/message/server/DrawCardMessage.java @@ -31,4 +31,9 @@ public void accept(ServerInterpreter interpreter) { public PowerCard getCard(){ return card; } + + @Override + public String toString() { + return "DrawCardMessage{" + "PowerCard=" + card +'}'; + } } From a2e85cebc9209ee9c79f4ee09b09989e09f4881b Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:25:36 +0100 Subject: [PATCH 41/46] 99,9 IQ --- .../automaton/game/turn/choosepiece/SelectPieceState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e389da54..3dd0e330 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 @@ -84,7 +84,7 @@ public void received(RequestMoveMessage msg, int from){ if(targetNode.isBonus()) { for (Player p : logic.getGame().getPlayersAsList()) { - if(p.isActive()) { + 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())); From a26a3d171f0b0216ce5be29ef9cc48ebb2751bf9 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:26:16 +0100 Subject: [PATCH 42/46] 99,99 IQ --- .../server/automaton/game/turn/choosepiece/StartPieceState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8c595d87..9a9b7e6a 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 @@ -48,7 +48,7 @@ public void received(RequestMoveMessage msg, int from){ if(targetNode.isBonus()) { for (Player p : logic.getGame().getPlayersAsList()) { - if(p.isActive()) { + 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())); From 84a50ec2153c7f94e88524211973089b86f2c616 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 04:33:21 +0100 Subject: [PATCH 43/46] Fix something --- .../src/main/java/pp/mdga/client/NotificationSynchronizer.java | 1 + 1 file changed, 1 insertion(+) 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 3c4d5a22..87e535c4 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 @@ -159,6 +159,7 @@ private void handleGame(Notification notification) { } else if (notification instanceof HomeMoveNotification home) { boardHandler.movePieceHomeAnim(home.getPieceId(), home.getHomeIndex()); guiHandler.hideText(); + app.getGameLogic().selectAnimationEnd(); } else if (notification instanceof InterruptNotification notification1) { gameView.enterInterrupt(notification1.getColor()); } else if (notification instanceof MovePieceNotification n) { From 15b7aa9e8cfcbdaba2e0cf6898624840d6cece3a Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 04:34:47 +0100 Subject: [PATCH 44/46] fixed 2 dicenow notification --- .../java/pp/mdga/client/gamestate/turnstate/RollDiceState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 19c631ef..63d6b26d 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 @@ -23,7 +23,7 @@ public RollDiceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - logic.addNotification(new DiceNowNotification()); + //logic.addNotification(new DiceNowNotification()); } @Override From f954a24b321ce0571f3f68d3e531ee9cb0aea5db Mon Sep 17 00:00:00 2001 From: Fleischer Hanno Date: Mon, 9 Dec 2024 04:36:08 +0100 Subject: [PATCH 45/46] fixed in firstroll catching of endanimation messages by non active palyers --- .../server/automaton/game/turn/rolldice/FirstRollState.java | 3 +++ .../server/automaton/game/turn/rolldice/SecondRollState.java | 3 +++ .../server/automaton/game/turn/rolldice/ThirdRollState.java | 3 +++ 3 files changed, 9 insertions(+) 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 7dc061e1..09b518b0 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 @@ -66,6 +66,9 @@ public void received(RequestDieMessage msg, int from) { @Override public void received(AnimationEndMessage msg, int from) { + if (from != this.logic.getGame().getActivePlayerId()) { + return; + } if (!moveablePieces.isEmpty()) { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new ChoosePieceStateMessage()); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); 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 6b3f8819..6ad25b89 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 @@ -52,6 +52,9 @@ public void received(RequestDieMessage msg, int from) { @Override public void received(AnimationEndMessage msg, int from) { + if (from != this.logic.getGame().getActivePlayerId()) { + return; + } if (this.logic.getGame().getDiceEyes() == 6) { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new ChoosePieceStateMessage()); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); 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 34f0fb52..9b3ef90e 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 @@ -49,6 +49,9 @@ public void received(RequestDieMessage msg, int from) { @Override public void received(AnimationEndMessage msg, int from) { + if (from != this.logic.getGame().getActivePlayerId()) { + return; + } if (this.logic.getGame().getDiceEyes() == 6) { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new ChoosePieceStateMessage()); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); From 2dbdb1e17b7d0a5aa008eb8e1d7791c3bcc2894e Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 04:42:55 +0100 Subject: [PATCH 46/46] revert 2 dicenow --- .../src/main/java/pp/mdga/client/gui/CardLayerHandler.java | 4 ++++ .../pp/mdga/client/gamestate/turnstate/RollDiceState.java | 2 +- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayerHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayerHandler.java index 636db5ee..88b2351d 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayerHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayerHandler.java @@ -33,6 +33,7 @@ public class CardLayerHandler { private final Set selectableCards = new HashSet<>(); private BonusCard cardSelect = null; + private boolean show = false; public CardLayerHandler(MdgaApp app, Texture2D backTexture) { this.app = app; @@ -64,11 +65,14 @@ public void rollDice(int rollNum, Runnable actionAfter) { } public void showDice() { + if(show) return; + show = true; cardLayer.addSpatial(diceControl.getSpatial()); diceControl.spin(); } public void hideDice() { + show = false; diceControl.hide(); } 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 63d6b26d..19c631ef 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 @@ -23,7 +23,7 @@ public RollDiceState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { - //logic.addNotification(new DiceNowNotification()); + logic.addNotification(new DiceNowNotification()); } @Override 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 276ee777..e7e06348 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); }