From dd757b22f0f969f1ebf1ea10b05757c5bd5570c0 Mon Sep 17 00:00:00 2001 From: Seraina Date: Fri, 29 Apr 2022 16:48:02 +0200 Subject: [PATCH 01/15] Added a PTGUI protocol message and class with all parameters for that message, to link gui to server --- .../multiplayer/helpers/GuiParameters.java | 30 +++++++++++++++++++ .../cs108/multiplayer/helpers/Protocol.java | 7 +++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java new file mode 100644 index 0000000..0b50caf --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java @@ -0,0 +1,30 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.helpers; + +/** + * This class contains all parameters for the PTGUI protocol message + */ +public class GuiParameters { + + /** + * Tells GUI to update the gameStateModel, in the form {@code UPDATE$name:role:kickedOff$name:role:kickedOff} ... usw. + */ + public static final String updateGameState = "UPDATE"; + /** + * Tells Gui, that the following statement after $, is a String containing the listOfLobbies + */ + public static final String listOfLobbies = "LOBBIES"; + + /** + * Tells Gui, that what follows is a list of players (per Lobby?) + */ + public static final String listOfPLayers = "PLAYERS"; + + /** + * Tells Gui, that the passenger at position {@code position} has heard some noise + * Form: {@code NOISE$position$} + */ + public static final String noiseHeardAtPosition = "NOISE"; + + + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/Protocol.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/Protocol.java index 2fc4bad..2e8b596 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/Protocol.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/Protocol.java @@ -194,5 +194,12 @@ public class Protocol { */ public static final String changedUserName = "CHNAM"; + /** + * Handles all information that the gui of the client needs. The Form is {@code PTGUI$parameters$msg} + * where the parameter tells the gui to do different things according to {@link GuiParameters} and the message + * contains a certain information i.e. who is where in the train + */ + public static final String printToGUI = "PTGUI"; + } From ba030956472df9bcd962449904b102e409cbd271 Mon Sep 17 00:00:00 2001 From: Seraina Date: Fri, 29 Apr 2022 17:07:40 +0200 Subject: [PATCH 02/15] Added a PTGUI protocol message and class with all parameters for that message, to link gui to server --- .../multiplayer/client/JClientProtocolParser.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java index f497bf0..f7e0718 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java @@ -58,6 +58,19 @@ public class JClientProtocolParser { break; case Protocol.changedUserName: c.changeUsername(msg.substring(6)); + break; + case Protocol.printToGUI: + String substring = msg.substring(6); + int index = msg.indexOf("$"); + String parameter; + String data; + try { + parameter = msg.substring(0,index); + data = msg.substring(index+1); + } catch (Exception e) { + LOGGER.warn("No parameter in PTGUI"); + } + break; default: System.out.println("Received unknown command"); From f058eabb75f2a25a2c73fa455c4db714cab31879 Mon Sep 17 00:00:00 2001 From: Seraina Date: Fri, 29 Apr 2022 16:24:24 +0200 Subject: [PATCH 03/15] Cherry-picked my own commit from master, because I messed up the branch creation, recommitting it on this one --- .../gamelogic/ClientGameInfoHandler.java | 9 ++-- .../dmi/dbis/cs108/gamelogic/GameState.java | 28 ++++------ .../dmi/dbis/cs108/gamelogic/VoteHandler.java | 4 +- .../dbis/cs108/multiplayer/client/Client.java | 51 ++++++++++++++++++ .../client/JClientProtocolParser.java | 3 +- .../client/gui/GameStateModel.java | 50 ++++++++++++++++-- .../client/gui/game/GameController.java | 52 +++++++++++++++++-- .../client/gui/game/GameDayAll.fxml | 2 +- 8 files changed, 164 insertions(+), 35 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientGameInfoHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientGameInfoHandler.java index ba803e8..0ed9285 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientGameInfoHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientGameInfoHandler.java @@ -13,18 +13,21 @@ public class ClientGameInfoHandler { * All messages that are used in VoteHandler * TODO(Seraina-Alex): Adjust strings to be more meaningful */ - //relevant: + //relevant for game logic: public static final String ghostVoteRequest = "Vote on who to ghostify!"; public static final String humanVoteRequest = "Vote for a ghost to kick off!"; public static final String noiseNotification = "Someone passed by you "; public static final String gameOverHumansWin = "Game over: humans win!"; public static final String gameOverGhostsWin = "Game over: ghosts win!"; - //just messages + //relevant for gui public static final String itsNightTime = "Please wait, ghosts are active"; + public static final String itsDayTime = "Please wait, humans are active"; + + //just messages + public static final String youGotGhostyfied = "You are now a ghost!"; public static final String youGotKickedOff = "Bye bye - you've been kicked off"; - public static final String itsDayTime = "Please wait, humans are active"; public static final String humansVotedFor = "Humans voted for: "; public static final String isAHuman = " but they're a human!"; public static final String gotKickedOff = " is a Ghost and got kicked off"; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/GameState.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/GameState.java index a9467e0..06f041e 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/GameState.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/GameState.java @@ -162,27 +162,17 @@ public class GameState { StringBuilder stringBuilder = new StringBuilder(); String[] print = new String[6]; for (int i = 0; i < array.length; i++) { - if (array[i].getKickedOff()) { - print[i] = "| " + array[i].getName() + ", kicked off: " + array[i].getPosition() + " |"; + if(array[i].getIsSpectator()) { + print[i] = array[i].getName() + ":s:" + array[i].getKickedOff(); + } else if (array[i].getIsGhost()) { + print[i] = array[i].getName() + ":g:" + array[i].getKickedOff(); } else { - if (array[i].getIsPlayer()) { - if (array[i].getIsGhost()) { - print[i] = "| " + array[i].getName() + "(ghostPlayer): " + array[i].getPosition() + " |"; - } else { - print[i] = "| " + array[i].getName() + "(humanPlayer): " + array[i].getPosition() + " |"; - } - } else { - if (array[i].getIsGhost()) { - print[i] = "| " + array[i].getName() + "(ghostNPC): " + array[i].getPosition() + " |"; - } else { - print[i] = "| " + array[i].getName() + "(humanNPC): " + array[i].getPosition() + " |"; - } - } + print[i] = "| " + array[i].getName() + ":h:" + array[i].getKickedOff(); } - } + } for (int i = 0; i < array.length; i++) { - stringBuilder.append(print[i]); + stringBuilder.append("$").append(print[i]); } return stringBuilder.toString(); } @@ -198,11 +188,11 @@ public class GameState { StringBuilder stringBuilder = new StringBuilder(); String[] print = new String[6]; for (int i = 0; i < array.length; i++) { - print[i] = "| " + array[i].getName() + ": " + array[i].getPosition() + " |"; + print[i] = array[i].getName() + "::" + array[i].getKickedOff(); } for (int i = 0; i < array.length; i++) { - stringBuilder.append(print[i]); + stringBuilder.append("$").append(print[i]); } return stringBuilder.toString(); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/VoteHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/VoteHandler.java index 93b7a4d..48b3b75 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/VoteHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/VoteHandler.java @@ -52,7 +52,7 @@ public class VoteHandler { //Timer.ghostVoteTimer(game); try { - Thread.sleep(10*1000); + Thread.sleep(20*1000); } catch (InterruptedException e) { LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted"); } @@ -155,7 +155,7 @@ public class VoteHandler { } try { // waits 60 seconds before votes get collected - Thread.sleep(10*1000); + Thread.sleep(20*1000); } catch (InterruptedException e) { LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted"); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 6ad5608..03274f1 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -1,10 +1,13 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientGameInfoHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GUI; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; @@ -32,6 +35,8 @@ public class Client { private ChatApp chatApp; private GUI chatGui; + private GameStateModel gameStateModel; + private GameController gameController; /** * Saves the position of the client, gets refreshed everytime the client gets a vote request. @@ -63,6 +68,8 @@ public class Client { this.chatApp = new ChatApp(new ClientModel(systemName, this)); this.chatGui = new GUI(this.chatApp); clientPinger = new ClientPinger(this, this.socket); + this.gameStateModel = new GameStateModel(); + this.gameController = new GameController(ChatApp.getClientModel(),gameStateModel); } catch (IOException e) { e.printStackTrace(); } @@ -124,6 +131,16 @@ public class Client { //LOGGER.debug("just checked next line"); } + /** + * Extracts infromation about names and positions and roles from string and adds it to + * the GameStateModel + * @param msg + */ + public void gameStateModelSetter(String msg) { + + + } + /** * Starts a thread which listens for incoming chat messages / other messages that the user has to @@ -290,4 +307,38 @@ public class Client { public void sendToChat(String substring) { chatApp.getChatController().addChatMsgToView(substring); } + + /** + * funnels a message to the gui, where depending on the message different functions/controls/methods + * of the gui are targeted. The message contains information on what to do, which are extracted + * @param msg a message of the form {@code parameter$msg} + * + */ + public void sendToGUI(String msg) { + int indexFirstDollar = msg.indexOf('$'); + String header = ""; + try { + header = msg.substring(0,indexFirstDollar); + } catch (IndexOutOfBoundsException e) { + LOGGER.info(e.getMessage()); + } + + switch (header) { + case ClientGameInfoHandler.itsNightTime: + gameStateModel.setDayClone(false); + break; + case ClientGameInfoHandler.itsDayTime: + gameStateModel.setDayClone(true); + break; + + default: + gameController.addMessageToNotificationText(msg); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController? + + + } + + + } + + } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java index f7e0718..6d5782a 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientGameInfoHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import java.io.OutputStreamWriter; import org.apache.logging.log4j.LogManager; @@ -48,7 +49,7 @@ public class JClientProtocolParser { break; case Protocol.serverRequestsGhostVote: LOGGER.debug("Ghost received Vote request"); - System.out.println("Ghost Vote:"); + //c.sendToGUI(ClientGameInfoHandler.ghostVoteRequest); c.positionSetter(msg.substring(6)); break; case Protocol.serverRequestsHumanVote: diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java index 67fa925..b140d25 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java @@ -11,6 +11,12 @@ public class GameStateModel { */ private boolean isDayClone; + /** + * can take the values h/g/s for human/ghost/spectator. Safes the role the client this GamesStateModel + * lives on currently has + */ + private String yourRole; + /** * A primitive clone of the passengerTrain in the GameState of the server. * in passengerTrainClone[0] the names of the passengers are stored, in passengerTrainClone[1] the roles @@ -18,13 +24,19 @@ public class GameStateModel { */ private String[][] passengerTrainClone; + private boolean[] kickedOff; + /** - * Constructs a GamesStateModel with the passengerTrainClone length at nrOfPlayers - * @param nrOfPlayers the amount of different objects to be saved + * Constructs a GamesStateModel with the passengerTrainClone */ - public void GameStateModel(int nrOfPlayers) { - this.nrOfPlayers = nrOfPlayers; + public GameStateModel() { + this.nrOfPlayers = 6; passengerTrainClone = new String[2][nrOfPlayers]; + for(String role : passengerTrainClone[1]) { + role = ""; + } + kickedOff = new boolean[nrOfPlayers]; + isDayClone = false; } /** @@ -37,4 +49,34 @@ public class GameStateModel { passengerTrainClone[1] = roles; } + + public String[][] getPassengerTrainClone() { + return passengerTrainClone; + } + + /** + * Sets your current role to the specified role, must be h for human, g for ghost or s for spectator + * @param yourRole the role to set this role to + */ + public void setYourRole(String yourRole) { + if(yourRole.equals("h") || yourRole.equals("g") || yourRole.equals("s")) { + this.yourRole = yourRole; + } + } + + public String getYourRole() { + return yourRole; + } + + public int getNrOfPlayers() { + return nrOfPlayers; + } + + public void setDayClone(boolean dayClone) { + isDayClone = dayClone; + } + + public boolean getDayClone() { + return isDayClone; + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java index 9e48add..73d5cfd 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java @@ -1,5 +1,6 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel; import javafx.event.EventHandler; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; @@ -35,6 +36,14 @@ public class GameController { private static ClientModel client; + private static GameStateModel gameStateModel; + + //TODO(Seraina, Sebi): Same issue as ChatController? do with setters? + public GameController(ClientModel c, GameStateModel g) { + client = c; + gameStateModel = g; + } + @FXML private AnchorPane gameBG; @FXML @@ -138,14 +147,47 @@ public class GameController { } /** - * Adds a msg to the room Lable at the specified position - * @param names a String array containing all the names + * Updates the labels of the rooms accordingly to the datastructures in GameStateModel */ - public void addRoomLabels(String[] names) { + public void updateRoomLabels() { + String[] names = gameStateModel.getPassengerTrainClone()[0]; + String[] roles = gameStateModel.getPassengerTrainClone()[1]; + Text name0 = new Text(names[0]); + Text name1 = new Text(names[1]); + Text name2 = new Text(names[2]); + Text name3 = new Text(names[3]); + Text name4 = new Text(names[4]); + Text name5 = new Text(names[5]); + Text role0 = new Text(roles[0]); + Text role1 = new Text(roles[1]); + Text role2 = new Text(roles[2]); + Text role3 = new Text(roles[3]); + Text role4 = new Text(roles[4]); + Text role5 = new Text(roles[5]); + lableRoom0.getChildren().clear(); + lableRoom0.getChildren().add(name0); + lableRoom0.getChildren().add(role0); + lableRoom1.getChildren().clear(); + lableRoom1.getChildren().add(name1); + lableRoom1.getChildren().add(role1); + lableRoom2.getChildren().clear(); + lableRoom2.getChildren().add(name2); + lableRoom2.getChildren().add(role2); + lableRoom3.getChildren().clear(); + lableRoom3.getChildren().add(name3); + lableRoom3.getChildren().add(role3); + lableRoom4.getChildren().clear(); + lableRoom4.getChildren().add(name4); + lableRoom4.getChildren().add(role4); + lableRoom5.getChildren().clear(); + lableRoom5.getChildren().add(name5); + lableRoom5.getChildren().add(role5); } - - + public void setGameStateModel( + GameStateModel gameStateModel) { + GameController.gameStateModel = gameStateModel; + } } diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml index a08b086..f36cb4a 100644 --- a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml @@ -97,7 +97,7 @@ - From c5293bc8ee5352c8f5b260390c047c047d17012d Mon Sep 17 00:00:00 2001 From: Seraina Date: Fri, 29 Apr 2022 18:56:15 +0200 Subject: [PATCH 04/15] Implemented the gameState Update parameter of the the printToGUI message in client, with its needed methods --- .../dbis/cs108/multiplayer/client/Client.java | 38 +++++++-------- .../client/JClientProtocolParser.java | 5 +- .../client/gui/GameStateModel.java | 46 +++++++++++++++++++ 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 03274f1..0ba19f9 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -11,6 +11,7 @@ import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; +import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import java.net.InetAddress; @@ -309,30 +310,31 @@ public class Client { } /** - * funnels a message to the gui, where depending on the message different functions/controls/methods - * of the gui are targeted. The message contains information on what to do, which are extracted - * @param msg a message of the form {@code parameter$msg} - * + * funnels a message to the gui, where depending on the parameter different functions/controls/methods + * of the gui are targeted. The data contains more information the gui needs + * @param parameter a string according to {@link GuiParameters} and {@link ClientGameInfoHandler} can be empty + * @param data some information in a string, separators can be $ or : + *TODO(Seraina&Sebi): evtl. auslagern? */ - public void sendToGUI(String msg) { - int indexFirstDollar = msg.indexOf('$'); - String header = ""; - try { - header = msg.substring(0,indexFirstDollar); - } catch (IndexOutOfBoundsException e) { - LOGGER.info(e.getMessage()); - } - - switch (header) { - case ClientGameInfoHandler.itsNightTime: + public void sendToGUI(String parameter, String data) { + switch (parameter) { + case ClientGameInfoHandler.itsNightTime: //ClientGameInfoHandler gameStateModel.setDayClone(false); break; - case ClientGameInfoHandler.itsDayTime: + case ClientGameInfoHandler.itsDayTime: //ClientGameInfoHandler gameStateModel.setDayClone(true); break; - + case GuiParameters.updateGameState: + gameStateModel.setGSFromString(data); + break; + case GuiParameters.noiseHeardAtPosition: + break; + case GuiParameters.listOfLobbies: + break; + case GuiParameters.listOfPLayers: + break; default: - gameController.addMessageToNotificationText(msg); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController? + gameController.addMessageToNotificationText(data); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController? } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java index 6d5782a..a91a555 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java @@ -49,7 +49,6 @@ public class JClientProtocolParser { break; case Protocol.serverRequestsGhostVote: LOGGER.debug("Ghost received Vote request"); - //c.sendToGUI(ClientGameInfoHandler.ghostVoteRequest); c.positionSetter(msg.substring(6)); break; case Protocol.serverRequestsHumanVote: @@ -63,8 +62,8 @@ public class JClientProtocolParser { case Protocol.printToGUI: String substring = msg.substring(6); int index = msg.indexOf("$"); - String parameter; - String data; + String parameter = ""; + String data = substring; try { parameter = msg.substring(0,index); data = msg.substring(index+1); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java index b140d25..dfa3d03 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java @@ -1,10 +1,18 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; +import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ServerGameInfoHandler; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + /** * A Class that saves the current game State of the Game the client is in. Should get updated regularly * The gui gets its game information from here */ public class GameStateModel { + public static final Logger LOGGER = LogManager.getLogger(GameStateModel.class); + public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + private int nrOfPlayers; //sets the length of the train /** * true if it is the day @@ -79,4 +87,42 @@ public class GameStateModel { public boolean getDayClone() { return isDayClone; } + + public void setKickedOff(boolean[] kickedOff) { + this.kickedOff = kickedOff; + } + + public boolean[] getKickedOff() { + return kickedOff; + } + + /** + * Extracts information of a String and fills the information into the passengerTrainClone and + * kickedOff fields of this gameState + * @param data the data in the form: {@code name:role:kickedOff$name:role:kickedOff$}..usw. + */ + public void setGSFromString(String data) { + try { + String[] names = new String[6]; + String[] roles = new String[6]; + boolean[] kickedOff = new boolean[6]; + int i = 0; + while (!data.isEmpty()) { + int index = data.indexOf('$'); + String left = data.substring(0, index); + data = data.substring(index + 1); + int j = left.indexOf(':'); + names[i] = left.substring(0, j); + String right = left.substring(j + 1); + j = right.indexOf(':'); + roles[i] = right.substring(0, j); + kickedOff[i] = Boolean.parseBoolean(right.substring(j + 1)); + i++; + } + setPassengerTrainClone(names, roles); + setKickedOff(kickedOff); + } catch (Exception e) { + LOGGER.warn("data has wrong format"); + } + } } From d963c3596599e6143daf474b597122ab55712c88 Mon Sep 17 00:00:00 2001 From: Seraina Date: Fri, 29 Apr 2022 20:56:04 +0200 Subject: [PATCH 05/15] Added ImageViews for noise Bell --- .../client/gui/game/GameController.java | 69 ++++++++++++++++++- .../client/gui/game/GameDayAll.fxml | 10 +++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java index 73d5cfd..f1845b5 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameController.java @@ -23,6 +23,8 @@ import javafx.scene.control.Label; import javafx.scene.control.SplitPane; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Background; import javafx.scene.layout.HBox; @@ -38,6 +40,8 @@ public class GameController { private static GameStateModel gameStateModel; + + //TODO(Seraina, Sebi): Same issue as ChatController? do with setters? public GameController(ClientModel c, GameStateModel g) { client = c; @@ -76,6 +80,20 @@ public class GameController { @FXML private TextFlow lableRoom5; @FXML + private HBox notificationHBox; + @FXML + private ImageView noiseImage0; + @FXML + private ImageView noiseImage1; + @FXML + private ImageView noiseImage2; + @FXML + private ImageView noiseImage3; + @FXML + private ImageView noiseImage4; + @FXML + private ImageView noiseImage5; + @FXML private Button noiseButton; @FXML private TextFlow notificationText; @@ -132,7 +150,7 @@ public class GameController { * Sends a noise message, to the server, should be a gui message? */ public void noise() { - client.getClient().sendMsgToServer("noise"); //TODO: Add message + client.getClient().sendMsgToServer("noise"); //TODO: Add message that server understands } /** @@ -185,6 +203,55 @@ public class GameController { lableRoom5.getChildren().add(role5); } + /** + * Adds an image of a bell on top of button0 + */ + public void noiseDisplay0(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + /** + * Adds an image of a bell on top of button1 + */ + public void noiseDisplay1(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + /** + * Adds an image of a bell on top of button2 + */ + public void noiseDisplay2(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + /** + * Adds an image of a bell on top of button3 + */ + public void noiseDisplay3(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + /** + * Adds an image of a bell on top of button4 + */ + public void noiseDisplay4(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + /** + * Adds an image of a bell on top of button5 + */ + public void noiseDisplay5(){ + Image bell = new Image("ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.DayOpen.bell.png"); + noiseImage0.setImage(bell); + } + + public void setGameStateModel( GameStateModel gameStateModel) { diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml index f36cb4a..18eaabb 100644 --- a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/game/GameDayAll.fxml @@ -13,6 +13,16 @@ + + + + + + + + + +