From 85ea4d340c3529992993c974afecc21cc1effc23 Mon Sep 17 00:00:00 2001 From: Daniel Grigencha Date: Sun, 24 Nov 2024 15:27:10 +0100 Subject: [PATCH] added more logic for the server state diagram --- .../src/main/java/pp.mdga/game/Game.java | 21 +++++++++++++ .../pp.mdga/message/client/DeselectTSK.java | 12 ++++++++ .../pp.mdga/message/server/UpdateTSK.java | 1 + .../pp.mdga/server/DetermineStartPlayer.java | 7 +++-- .../src/main/java/pp.mdga/server/Lobby.java | 30 +++++++++++++++---- .../java/pp.mdga/server/ServerGameLogic.java | 14 +++++++++ .../pp.mdga/server/ServerStateMachine.java | 4 +-- .../src/main/java/pp.mdga/server/Turn.java | 2 +- 8 files changed, 80 insertions(+), 11 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 7807061f..427ea384 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 @@ -29,6 +29,8 @@ public class Game { private Boolean allRanked = false; private Boolean movablePieces = false; + private Boolean allReady = false; + private static final int AMOUNT_OF_TURBO_CARDS = 16; private static final int AMOUNT_OF_SHIELD_AND_SWAP_CARDS = 12; @@ -397,6 +399,25 @@ public void setStartPlayer(Player startPlayer) { this.startPlayer = startPlayer; } + /** + * This method returns the all ready state. + * + * @return the all ready state + */ + public Boolean allReady() { + return allReady; + } + + /** + * This method sets the all ready state. + * + * @param allReady the new all ready state + */ + public void setAllReady(Boolean allReady) { + this.allReady = allReady; + if (allReady) notifyObservers(); + } + /** * This method notifies the observers. */ diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/message/client/DeselectTSK.java b/Projekte/mdga/model/src/main/java/pp.mdga/message/client/DeselectTSK.java index 21e0d39d..854c1995 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/message/client/DeselectTSK.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/message/client/DeselectTSK.java @@ -1,6 +1,18 @@ package pp.mdga.message.client; +import pp.mdga.game.Color; + public class DeselectTSK extends ClientMessage { + private final Color color; + + public DeselectTSK(Color color) { + this.color = color; + } + + public Color getColor() { + return color; + } + @Override public String toString() { return "null"; diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/message/server/UpdateTSK.java b/Projekte/mdga/model/src/main/java/pp.mdga/message/server/UpdateTSK.java index c3d8e7fa..e3280085 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/message/server/UpdateTSK.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/message/server/UpdateTSK.java @@ -19,6 +19,7 @@ public String getName() { public Color getColor() { return color; } + @Override public void accept(ServerInterpreter interpreter) { diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/server/DetermineStartPlayer.java b/Projekte/mdga/model/src/main/java/pp.mdga/server/DetermineStartPlayer.java index 0ff4b48e..89020007 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/server/DetermineStartPlayer.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/server/DetermineStartPlayer.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class DetermineStartPlayer extends ServerState { private final List player = new ArrayList<>(); @@ -17,9 +18,9 @@ public DetermineStartPlayer(ServerState parent, ServerGameLogic logic) { @Override public void receivedRequestDice(RequestDice msg, int from) { - logic.send(); - - broadcastUpdate(new Dice()); + final Random random = new Random(); + final int dice = random.nextInt(6) + 1; + broadcastUpdate(new Dice(dice, new ArrayList<>())); } @Override diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/server/Lobby.java b/Projekte/mdga/model/src/main/java/pp.mdga/server/Lobby.java index a612f0f2..86da598f 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/server/Lobby.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/server/Lobby.java @@ -1,6 +1,9 @@ package pp.mdga.server; +import pp.mdga.game.Color; +import pp.mdga.game.Player; import pp.mdga.message.client.*; +import pp.mdga.message.server.ServerMessage; import pp.mdga.message.server.ServerStartGame; import pp.mdga.message.server.UpdateReady; import pp.mdga.message.server.UpdateTSK; @@ -26,7 +29,7 @@ public Lobby(ServerState parent, ServerGameLogic logic) { */ @Override public void receivedDeselectTSK(DeselectTSK msg, int from) { - broadcastUpdate(new UpdateTSK()); + broadcastUpdate(new UpdateTSK(logic.getPlayerById(from).getName(), msg.getColor())); } /** @@ -36,7 +39,7 @@ public void receivedDeselectTSK(DeselectTSK msg, int from) { */ @Override public void receivedNotReady(LobbyNotReady msg, int from) { - broadcastUpdate(new UpdateReady()); + broadcastUpdate(new UpdateReady(getPlayerColor(from), false)); } /** @@ -46,7 +49,24 @@ public void receivedNotReady(LobbyNotReady msg, int from) { */ @Override public void receivedReady(LobbyReady msg, int from) { - broadcastUpdate(new UpdateReady()); + broadcastUpdate(new UpdateReady(getPlayerColor(from), true)); + } + + /** + * Helper method to get the color associated with a player ID. + * + * @param playerId The ID of the player. + * @return The Color associated with the player, or null if not found. + */ + private Color getPlayerColor(int playerId) { + Player player = logic.getPlayerById(playerId); + + for (var entry : logic.getGame().getPlayers().entrySet()) { + if (entry.getValue().equals(player)) { + return entry.getKey(); + } + } + return null; } /** @@ -56,7 +76,7 @@ public void receivedReady(LobbyReady msg, int from) { */ @Override public void receivedSelectTSK(SelectTSK msg, int from) { - broadcastUpdate(new UpdateTSK()); + broadcastUpdate(new UpdateTSK(logic.getPlayerById(from).getName(), msg.getColor())); } /** @@ -66,7 +86,7 @@ public void receivedSelectTSK(SelectTSK msg, int from) { */ @Override public void receivedStartGame(ClientStartGame msg, int from) { - if (Boolean.TRUE.equals(logic.getGame().allRanked())) { + if (Boolean.TRUE.equals(logic.getGame().allReady())) { broadcastUpdate(new ServerStartGame()); parent.gotoState(new GameState(parent, logic)); } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerGameLogic.java b/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerGameLogic.java index 2dbb77f5..64761cf6 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerGameLogic.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerGameLogic.java @@ -125,6 +125,20 @@ public Game getGame() { return game; } + /** + * Returns the player representing the client with the specified connection ID. + * + * @param id the ID of the client + * @return the player associated with the client ID, or null if not found + */ + public Player getPlayerById(int id) { + for (var entry : game.getPlayers().entrySet()) + if (entry.getValue().getId() == id) + return entry.getValue(); + LOGGER.log(Logger.Level.ERROR, "no player found with connection {0}", id); //NON-NLS + return null; + } + public ServerState getState() { return state; } diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerStateMachine.java b/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerStateMachine.java index a55c0ef0..7c30384e 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerStateMachine.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/server/ServerStateMachine.java @@ -204,9 +204,9 @@ public void sentPossibleCard(PossibleCard msg, int from) { } /** - * This method is called when a RankingResponce message is sent. + * This method is called when a RankingResponse message is sent. * - * @param msg the RankingResponce message + * @param msg the RankingResponse message */ @Override public void sentRankingResponse(RankingResponce msg, int from) { diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/server/Turn.java b/Projekte/mdga/model/src/main/java/pp.mdga/server/Turn.java index d2eacc7b..4be9f928 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/server/Turn.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/server/Turn.java @@ -29,7 +29,7 @@ public void exit() { this.getParent().getParent().exit(); } else { // todo: next player - broadcastUpdate(new ActivePlayer()); + broadcastUpdate(new ActivePlayer(null)); parent.gotoState(new Animation(parent, logic)); } }