From 121d668bf2fdc7ff967ff8784c0057b1f9ef0d32 Mon Sep 17 00:00:00 2001 From: Daniel Grigencha Date: Sun, 1 Dec 2024 16:08:14 +0100 Subject: [PATCH] added logic to the 'LobbyState' class --- .../pp/mdga/server/automaton/LobbyState.java | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/LobbyState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/LobbyState.java index a1bfaacf..d265592c 100644 --- a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/LobbyState.java +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/LobbyState.java @@ -1,13 +1,19 @@ package pp.mdga.server.automaton; +import pp.mdga.game.Color; +import pp.mdga.game.Player; import pp.mdga.message.client.*; +import pp.mdga.message.server.LobbyPlayerJoinedMessage; import pp.mdga.message.server.ServerStartGameMessage; import pp.mdga.message.server.UpdateReadyMessage; import pp.mdga.message.server.UpdateTSKMessage; import pp.mdga.server.ServerGameLogic; +import java.util.Map; + /** - * + * This class represents the lobby state of the server. + * It will handle all join and disconnect messages, as well the selection of the color of the player. */ public class LobbyState extends ServerState { /** @@ -36,53 +42,78 @@ public void exit() { } /** - * + * @param msg as the message which was sent by the player as a JoinedLobbyMessage object. + * @param from as the client id of the player as an Integer. + */ + @Override + public void received(JoinedLobbyMessage msg, int from) { + Player player = new Player(msg.getName()); + this.logic.getGame().addPlayer(from, player); + this.logic.getServerSender().broadcast(new LobbyPlayerJoinedMessage(from, player)); + } + + /** * @param msg as the message which was sent by the player as a SelectTSK object. * @param from as the client id of the player as an Integer. */ @Override public void received(SelectTSKMessage msg, int from) { + for (Map.Entry entry : this.logic.getGame().getPlayers().entrySet()) { + if (entry.getValue().getColor() == msg.getColor()) { + return; + } + } + this.logic.getGame().getPlayerById(from).setColor(msg.getColor()); this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, msg.getColor())); } /** - * * @param msg as the message which was sent by the player as a DeselectTSK object. * @param from as the client id of the player as an Integer. */ @Override public void received(DeselectTSKMessage msg, int from) { - this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, msg.getColor())); + this.logic.getGame().getPlayerById(from).setColor(Color.NONE); + this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, Color.NONE)); } /** - * * @param msg as the message which was sent by the player as a LobbyReady object. * @param from as the client id of the player as an Integer. */ @Override public void received(LobbyReadyMessage msg, int from) { + this.logic.getGame().getPlayerById(from).setReady(true); this.logic.getServerSender().broadcast(new UpdateReadyMessage(from, true)); + for (Map.Entry entry : this.logic.getGame().getPlayers().entrySet()) { + if (!entry.getValue().isActive()) { + return; + } + } + + this.logic.getGame().setAllReady(true); } /** - * * @param msg as the message which was sent by the player as a LobbyNotReady object. * @param from as the client id of the player as an Integer. */ @Override public void received(LobbyNotReadyMessage msg, int from) { + this.logic.getGame().getPlayerById(from).setReady(false); + this.logic.getGame().setAllReady(false); this.logic.getServerSender().broadcast(new UpdateReadyMessage(from, false)); } /** - * * @param msg as the message which was sent by the player as a ForceStartGame object. * @param from as the client id of the player as an Integer. */ @Override public void received(StartGameMessage msg, int from) { - this.logic.getServerSender().broadcast(new ServerStartGameMessage()); - this.logic.setCurrentState(this.logic.getGameState()); + if (msg.isForceStartGame() || this.logic.getGame().allReady()) { + this.logic.getServerSender().broadcast(new ServerStartGameMessage()); + this.logic.setCurrentState(this.logic.getGameState()); + } } }