From d37db688384d86c4895aeba46d1679f206dbea5e Mon Sep 17 00:00:00 2001 From: Hanno Fleischer Date: Mon, 9 Dec 2024 12:05:28 +0100 Subject: [PATCH 1/6] fixed bug with too early state transition after playing a powercard --- .../gamestate/turnstate/PlayPowerCardState.java | 13 +++++++++++-- .../game/turn/rolldice/FirstRollState.java | 10 +++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java index 1ecae283..41464e64 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/client/gamestate/turnstate/PlayPowerCardState.java @@ -3,6 +3,7 @@ import pp.mdga.client.ClientGameLogic; import pp.mdga.client.ClientState; import pp.mdga.client.gamestate.TurnState; +import pp.mdga.game.BonusCard; import pp.mdga.message.client.AnimationEndMessage; import pp.mdga.message.server.PlayCardMessage; import pp.mdga.notification.PlayCardNotification; @@ -12,6 +13,7 @@ public class PlayPowerCardState extends TurnStates { private final TurnState parent; private PlayCardMessage playCardMessage; + private int animationCounter = 0; public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { super(parent, logic); @@ -20,7 +22,11 @@ public PlayPowerCardState(ClientState parent, ClientGameLogic logic) { @Override public void enter() { + animationCounter++; logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard().getCard())); + if(!playCardMessage.getCard().getCard().equals(BonusCard.TURBO)){ + animationCounter++; + } handlePowerCard(playCardMessage); } @@ -35,7 +41,10 @@ public void setPlayCard(PlayCardMessage playCardMessage) { @Override public void selectAnimationEnd(){ - logic.send(new AnimationEndMessage()); - parent.setState(parent.getRollDice()); + animationCounter--; + if(animationCounter == 0){ + logic.send(new AnimationEndMessage()); + parent.setState(parent.getRollDice()); + } } } 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 09b518b0..9d101bb0 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 @@ -22,6 +22,7 @@ public class FirstRollState extends RollDiceAutomatonState { private static final System.Logger LOGGER = System.getLogger(FirstRollState.class.getName()); private List moveablePieces; private int roll; + private boolean isDied = false; /** * Constructs a server state of the specified game logic. @@ -37,6 +38,7 @@ public FirstRollState(RollDiceState rollDiceAutomaton, ServerGameLogic logic) { public void enter() { LOGGER.log(System.Logger.Level.INFO, "Entered FirstRollState state."); roll = 0; + isDied = false; moveablePieces = new ArrayList<>(); for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) { if (piece.getState() == PieceState.HOME || piece.getState() == PieceState.ACTIVE) { @@ -62,14 +64,16 @@ public void received(RequestDieMessage msg, int from) { roll = this.logic.getGame().getDie().shuffle(); this.logic.getGame().setDiceEyes(roll); this.logic.getServerSender().broadcast(new DieMessage(roll)); + isDied = true; } @Override public void received(AnimationEndMessage msg, int from) { if (from != this.logic.getGame().getActivePlayerId()) { - return; - } - if (!moveablePieces.isEmpty()) { + LOGGER.log(System.Logger.Level.INFO, "Received AnimationEndMessage from wrong player."); + } else if (!isDied){ + LOGGER.log(System.Logger.Level.INFO, "Received AnimationEndMessage without the active player rolling a die."); + } else if (!moveablePieces.isEmpty()) { this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new ChoosePieceStateMessage()); this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState()); } else { From 0e9ff609ec65519ec2cd71eb6306efb9844a195c Mon Sep 17 00:00:00 2001 From: Hanno Fleischer Date: Mon, 9 Dec 2024 12:57:47 +0100 Subject: [PATCH 2/6] fixed a bug where if two player rolled the same number in DSP u would be stuck in an infinite loop --- .../pp/mdga/server/automaton/GameState.java | 2 +- .../game/DetermineStartPlayerState.java | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java index 8e5e955a..4d856635 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/GameState.java @@ -37,7 +37,6 @@ public GameState(ServerGameLogic logic) { this.determineStartPlayerState = new DetermineStartPlayerState(this, logic); this.animationState = new AnimationState(this, logic); this.turnState = new TurnState(this, logic); - this.setCurrentState(this.determineStartPlayerState); } /** @@ -46,6 +45,7 @@ public GameState(ServerGameLogic logic) { @Override public void enter() { LOGGER.log(System.Logger.Level.DEBUG, "Entered GameState state."); + this.setCurrentState(this.determineStartPlayerState); } /** diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java index 0e3816d9..d1481445 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/DetermineStartPlayerState.java @@ -30,8 +30,10 @@ public class DetermineStartPlayerState extends GameAutomatonState { * Create DetermineStartPlayerState attributes. */ private final Map diceResults = new HashMap<>(); + private final Map finalDiceResults = new HashMap<>(); private final List playersHaveToRoll = new ArrayList<>(); private final Set messageReceived = new HashSet<>();; + private int playerToStart; /** * Constructs a server state of the specified game logic. @@ -45,12 +47,13 @@ public DetermineStartPlayerState(GameState gameAutomaton, ServerGameLogic logic) @Override public void enter() { - LOGGER.log(System.Logger.Level.DEBUG, "Entered DetermineStartPlayerState state."); + LOGGER.log(System.Logger.Level.INFO, "Entered DetermineStartPlayerState state."); + playerToStart = this.logic.getGame().getPlayers().size(); } @Override public void exit() { - LOGGER.log(System.Logger.Level.DEBUG, "Exited DetermineStartPlayerState state."); + LOGGER.log(Level.INFO, "Exited DetermineStartPlayerState state."); this.diceResults.clear(); this.messageReceived.clear(); } @@ -67,23 +70,21 @@ public void received(RequestDieMessage msg, int from) { int roll = this.logic.getGame().getDie().shuffle(); this.logic.getServerSender().send(from, new DieMessage(roll)); this.diceResults.put(from, roll); - if (this.diceResults.size() == this.logic.getGame().getPlayers().size()) { + if (this.diceResults.size() == playerToStart) { int maximumRoll = 0; for (Map.Entry entry : this.diceResults.entrySet()) { if (maximumRoll == entry.getValue()) { this.playersHaveToRoll.add(entry.getKey()); + LOGGER.log(Level.INFO, "Players have to roll(RD same as maximum): {0}", this.playersHaveToRoll.size()); } else if (maximumRoll < entry.getValue()) { maximumRoll = entry.getValue(); this.playersHaveToRoll.clear(); this.playersHaveToRoll.add(entry.getKey()); + LOGGER.log(Level.INFO, "Players have to roll(RD higher as maximum): {0}", this.playersHaveToRoll.size()); } } - - for (int id: this.playersHaveToRoll) { - this.diceResults.remove(id); - } } } @@ -97,18 +98,24 @@ else if (maximumRoll < entry.getValue()) { @Override public void received(AnimationEndMessage msg, int from) { this.messageReceived.add(from); - if (this.messageReceived.size() == this.logic.getGame().getPlayers().size()) { + if (this.messageReceived.size() == playerToStart) { this.messageReceived.clear(); + LOGGER.log(Level.INFO, "Players have to roll(Animation End): {0}", this.playersHaveToRoll.size()); if (this.playersHaveToRoll.size() > 1) { + playerToStart = this.playersHaveToRoll.size(); for (Integer id : this.playersHaveToRoll) { + diceResults.remove(id); this.logic.getServerSender().send(id, new DiceNowMessage()); } + finalDiceResults.putAll(this.diceResults); + diceResults.clear(); } else { + finalDiceResults.putAll(this.diceResults); LOGGER.log(Level.INFO, "Players have to roll: %s".formatted(this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0)))); Color color = this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0)).getColor(); this.logic.getGame().setActiveColor(color); - this.logic.getServerSender().broadcast(new RankingResponseMessage(this.diceResults)); + this.logic.getServerSender().broadcast(new RankingResponseMessage(this.finalDiceResults)); this.logic.getServerSender().broadcast(new ActivePlayerMessage(color)); this.gameAutomaton.setCurrentState(this.gameAutomaton.getAnimationState()); } From 64f11eb99b3adffc645c2e0d11e62f38f8b8baeb Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 13:42:15 +0100 Subject: [PATCH 3/6] Adjust diceRoll time --- .../client/src/main/java/pp/mdga/client/gui/DiceControl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 42e356aa..a8c4fb3c 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 @@ -21,7 +21,7 @@ public class DiceControl extends AbstractControl { private Quaternion targetRotation; private final Vector3f angularVelocity = new Vector3f(); - private float deceleration = 0.5f; + private float deceleration = 1.7f; private float timeElapsed = 0.0f; private float rollDuration = 1f; private static final int ANGULAR_MIN = 5; From 8943dfb15e7d43dbe59f265a444e8420f74e331b Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 13:48:05 +0100 Subject: [PATCH 4/6] Allow all bonusCards --- .../mdga/client/src/main/java/pp/mdga/client/MdgaApp.java | 2 +- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- 2 files changed, 3 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 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/model/src/main/java/pp/mdga/game/Game.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java index e7e06348..4a6bb1fe 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java @@ -94,9 +94,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 bf3d800c10e85ba997a85bd44221afdca8f7c216 Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Mon, 9 Dec 2024 13:57:16 +0100 Subject: [PATCH 5/6] Add turboCardLogic --- .../src/main/java/pp/mdga/visitor/ServerCardVisitor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java b/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java index 64efdc03..6050d29d 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/visitor/ServerCardVisitor.java @@ -41,7 +41,13 @@ public ServerCardVisitor(ServerGameLogic logic) { */ @Override public void visit(TurboCard card) { - this.cards.add(card); + for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) { + if (piece.getState() == PieceState.ACTIVE) { + if (!this.cards.contains(card)) { + this.cards.add(card); + } + } + } } /** From dfd361d8be3f5849745469f2ee85ff0af14a9bc9 Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Mon, 9 Dec 2024 14:14:15 +0100 Subject: [PATCH 6/6] added isStart + (DU) --- .../src/main/java/pp/mdga/client/gui/PlayerNameHandler.java | 2 +- .../src/main/java/pp/mdga/client/gamestate/GameStates.java | 6 +++++- Projekte/mdga/model/src/main/java/pp/mdga/game/Game.java | 4 ++-- Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java | 4 ++++ .../mdga/model/src/main/java/pp/mdga/game/StartNode.java | 5 +++++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/PlayerNameHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/PlayerNameHandler.java index 014c00a9..083319e6 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/PlayerNameHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/PlayerNameHandler.java @@ -128,7 +128,7 @@ private BitmapText createName(String name, boolean first, boolean own){ //renderedSize = 45 hudText.setSize(TEXT_SIZE); hudText.setColor(first ? ACTIVE_COLOR : own ? OWN_COLOR : NORMAL_COLOR); - hudText.setText(name); + hudText.setText(own ? name + " (Du)" : name); hudText.setLocalTranslation(PADDING_LEFT,hudText.getHeight()/2, 0); return hudText; } 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 ccc1734b..049820b0 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 @@ -47,8 +47,12 @@ protected void throwPiece(Piece piece) { } private void handleShield(UUID uuid) { - if (logic.getGame().getBoard().getInfieldIndexOfPiece(logic.getGame().getPieceThroughUUID(uuid)) % 10 != 0) { + Board board = logic.getGame().getBoard(); + Piece piece = logic.getGame().getPieceThroughUUID(uuid); + Node node = board.getInfield()[board.getInfieldIndexOfPiece(piece)]; + if (node.isStart()) { logic.getGame().getPieceThroughUUID(uuid).setShield(ShieldState.SUPPRESSED); + logic.addNotification(new ShieldActiveNotification(uuid)); logic.addNotification(new ShieldSuppressedNotification(uuid)); } else { logic.getGame().getPieceThroughUUID(uuid).setShield(ShieldState.ACTIVE); 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 e7e06348..5e297189 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 @@ -95,8 +95,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/game/Node.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/Node.java index 0dc1d98a..a06df7f7 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 @@ -99,4 +99,8 @@ public boolean isOccupied() { public boolean isOccupied(Color color) { return isOccupied() && this.occupant.getColor() == color; } + + public boolean isStart() { + return false; + } } diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/game/StartNode.java b/Projekte/mdga/model/src/main/java/pp/mdga/game/StartNode.java index 0033738f..5a62eaba 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/game/StartNode.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/game/StartNode.java @@ -47,4 +47,9 @@ public Color getColor() { public void setColor(Color color) { this.color = color; } + + @Override + public boolean isStart() { + return true; + } }