diff --git a/OgGhostWinners.txt b/OgGhostWinners.txt index cf77d1f..53225b1 100644 --- a/OgGhostWinners.txt +++ b/OgGhostWinners.txt @@ -5,3 +5,4 @@ Jonas of Istanbul serai serai serai +serai 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 5056abc..9bd8eb0 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 @@ -3,6 +3,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.client.gui.ClientModel; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.DayNightChangeListener; 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.ChatApp; @@ -350,24 +351,12 @@ public class Client { switch (parameter) { case GuiParameters.night: //ClientGameInfoHandler; gameStateModel.setDayClone(false); - LOGGER.debug("----------------Night, Your role is:" + gameStateModel.getYourRole() + gameStateModel); - Sprites.setNightSprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); - chatApp.getGameController().updateGameSprites(); - chatApp.getGameController().setNoiseButtonInvisible(); - chatApp.getGameController().setVoteButtonVisibilityNight(gameStateModel); break; case GuiParameters.day: //ClientGameInfoHandler gameStateModel.setDayClone(true); - LOGGER.debug("----------------Day, Your role is:" + gameStateModel.getYourRole()+ gameStateModel); - Sprites.setDaySprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); - chatApp.getGameController().updateGameSprites(); - chatApp.getGameController().setNoiseButtonVisible(); - chatApp.getGameController().setVoteButtonVisibilityDay(gameStateModel); break; case GuiParameters.updateGameState: gameStateModel.setGSFromString(data); - chatApp.getGameController().updateRoomLabels(); - gameStateModel.setRoleFromPosition(position); break; case GuiParameters.noiseHeardAtPosition: try { @@ -382,6 +371,7 @@ public class Client { //TODO break; case GuiParameters.VoteIsOver: + chatApp.getGameController().setNoiseButtonInvisible(); chatApp.getGameController().clearAllNoiseDisplay(); break; case GuiParameters.getMembersInLobby: @@ -389,13 +379,12 @@ public class Client { break; case GuiParameters.viewChangeToGame: chatApp.getLoungeSceneViewController().addGameView(); - //TODO + gameStateModel.setGameOver(false); + new Thread(new DayNightChangeListener(gameStateModel, chatApp, position)).start(); break; - /*case GuiParameters.viewChangeToStart: - //TODO - break;*/ case GuiParameters.viewChangeToLobby: chatApp.getLoungeSceneViewController().removeGameView(); + gameStateModel.setGameOver(true); //TODO break; case GuiParameters.addNewMemberToLobby: 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 050caa0..c9f3287 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 @@ -50,6 +50,7 @@ public class JClientProtocolParser { break; case Protocol.serverConfirmQuit: c.disconnectFromServer(); + c.getGameStateModel().setGameOver(true); break; case Protocol.serverRequestsGhostVote: LOGGER.debug("Ghost received Vote request"); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java index dd2d860..915b5f7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java @@ -157,6 +157,7 @@ public class ChatApp extends Application { this.setGameC(gameController); gameC.setClient(cModel); gameC.setGameStateModel(GameController.getGameStateModel()); + Sprites.setNightSprites(GameController.getGameStateModel().getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); Sprites.setDaySprites(GameController.getGameStateModel().getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); SpritesDay.setBells(); SpritesDay.setWheels(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java new file mode 100644 index 0000000..1d6d298 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java @@ -0,0 +1,63 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; + + +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeSceneViewController; + +/** + * This class adds methods to listen if there is a change in the day&night state and calls methods accordingly + */ +public class DayNightChangeListener implements Runnable { + + private GameStateModel gameStateModel; + private ChatApp chatApp; + private int position; + + public DayNightChangeListener(GameStateModel gameStateModel, ChatApp chatApp, int position) { + this.gameStateModel = gameStateModel; + this.chatApp = chatApp; + this.position = position; + } + + + @Override + public void run() { + try{ + while(!gameStateModel.isGameOver()) { + if(gameStateModel.getDayClone()) { //its Day + LoungeSceneViewController.getTrainAnimationDayController().dontShowFullWagon(); + Sprites.setDaySprites(gameStateModel.getPassengerTrainClone()[1], + GameController.getGameStateModel().getKickedOff()); + chatApp.getGameController() + .updateGameSprites(LoungeSceneViewController.getTrainAnimationDayController()); + chatApp.getGameController().setNoiseButtonVisible(); + chatApp.getGameController().setVoteButtonVisibilityDay(gameStateModel); + } else { //its night + try { + if (gameStateModel.getYourRoleFromPosition(position).equals("")) { + LoungeSceneViewController.getTrainAnimationDayController().showFullWagon(); + } + } catch (Exception e) { + e.getMessage(); + } + Sprites.setNightSprites(gameStateModel.getPassengerTrainClone()[1], + GameController.getGameStateModel().getKickedOff()); + chatApp.getGameController() + .updateGameSprites(LoungeSceneViewController.getTrainAnimationDayController()); + chatApp.getGameController().setNoiseButtonInvisible(); + chatApp.getGameController().setVoteButtonVisibilityNight(gameStateModel); + } + chatApp.getGameController().updateGameSprites(LoungeSceneViewController.getTrainAnimationDayController()); + chatApp.getGameController().updateRoomLabels(); + gameStateModel.setRoleFromPosition(position); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} 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 fb92397..3996abf 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 @@ -19,12 +19,19 @@ public class GameStateModel { */ private boolean isDayClone; + /** + * true if the game is over + */ + private boolean gameOver = false; + /** * 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; //TODO: Maybe add a GUI field to show this in + private int yourPosition; + /** * 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 @@ -48,6 +55,15 @@ public class GameStateModel { isDayClone = false; } + public void setGameOver(boolean gameOver) { + this.gameOver = gameOver; + } + + public boolean isGameOver() { + return gameOver; + } + + /** * Updates the passengerTrainClone * @param names an array of the names of the players @@ -84,6 +100,10 @@ public class GameStateModel { return yourRole; } + public String getYourRoleFromPosition(int position) { + return passengerTrainClone[1][position]; + } + public int getNrOfPlayers() { return nrOfPlayers; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/Sprites.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/Sprites.java index 3597bcb..74559a9 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/Sprites.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/Sprites.java @@ -78,9 +78,7 @@ public class Sprites { shadow = SpritesDay.shadow; secondWagon = SpritesDay.secondWagon; emptyWagon = SpritesDay.emptyWagon; - for (int i = 0; i < roles.length; i++) { - rooms[i] = getRoomDay(i, roles[i], kickedOff); - } + updateDayRoomSprites(roles,kickedOff); emptyWagonWall = SpritesDay.emptyWagonWall; fullWagon = SpritesDay.fullWagon; loki = SpritesDay.loki; @@ -92,6 +90,11 @@ public class Sprites { e.printStackTrace(); } } + public static void updateDayRoomSprites(String[] roles, boolean[] kickedOff) { + for (int i = 0; i < roles.length; i++) { + rooms[i] = getRoomDay(i, roles[i], kickedOff); + } + } /** * Sets all Images of this class to the Night version, takes into account which room is a ghost @@ -104,9 +107,7 @@ public class Sprites { shadow = SpritesNight.shadow; secondWagon = SpritesNight.secondWagon; emptyWagon = SpritesNight.emptyWagon; - for (int i = 0; i < roles.length; i++) { - rooms[i] = getRoomNight(i, roles[i], kickedOff); - } + updateNightRoomSprites(roles,kickedOff); emptyWagonWall = SpritesNight.emptyWagonWall; fullWagon = SpritesNight.fullWagon; loki = SpritesNight.loki; @@ -115,6 +116,12 @@ public class Sprites { fg = SpritesNight.fg; } + public static void updateNightRoomSprites(String[] roles, boolean[] kickedOff) { + for (int i = 0; i < roles.length; i++) { + rooms[i] = getRoomNight(i, roles[i], kickedOff); + } + } + /** * Returns a room Image from SpritesDay, corresponding to the position and the role of the passenger in that room * @param position the position of the room integer 0-5 diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java index 33eecae..7a9fbaf 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java @@ -49,6 +49,14 @@ public class TrainAnimationDayController implements Initializable { LOGGER.debug("Empty TrainAnimationDayController() constructor was called"); } + public void updateSprites(){ + shadowTrain.setImage(Sprites.getShadow()); + wagonBGImageView.setImage(Sprites.getSecondWagon()); + wagonFloorImageView.setImage(Sprites.getEmptyWagon()); + wagonFullImageView.setImage(Sprites.getFullWagon()); + lokiImageView.setImage(Sprites.getLoki()); + } + public ChatApp getChatApp() { return chatApp; } @@ -86,6 +94,24 @@ public class TrainAnimationDayController implements Initializable { } }); } + + public void showFullWagon() { + Platform.runLater(new Runnable() { + @Override + public void run() { + wagonFullImageView.setVisible(true); + } + }); + } + + public void dontShowFullWagon() { + Platform.runLater(new Runnable() { + @Override + public void run() { + wagonFullImageView.setVisible(false); + } + }); + } /** * Adds the gameView to the existing LobbyView 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 aca4fd5..31d1c4b 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 @@ -5,6 +5,8 @@ import static javafx.scene.AccessibleRole.PARENT; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.Sprites; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.SpritesDay; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.TrainAnimationDayController; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; @@ -126,17 +128,23 @@ public class GameController implements Initializable { @FXML private AnchorPane chatAreaGame; - public void updateGameSprites(){ + public void updateGameSprites(TrainAnimationDayController trainAnimation){ Platform.runLater(new Runnable() { @Override public void run() { try{ + if(gameStateModel.getDayClone()) { + Sprites.updateDayRoomSprites(gameStateModel.getPassengerTrainClone()[1], gameStateModel.getKickedOff()); + } else { + Sprites.updateNightRoomSprites(gameStateModel.getPassengerTrainClone()[1], gameStateModel.getKickedOff()); + } room0ImageView.setImage(Sprites.getARoom(0)); room1ImageView.setImage(Sprites.getARoom(1)); room2ImageView.setImage(Sprites.getARoom(2)); room3ImageView.setImage(Sprites.getARoom(3)); room4ImageView.setImage(Sprites.getARoom(4)); room5ImageView.setImage(Sprites.getARoom(5)); + trainAnimation.updateSprites(); } catch (Exception e) { LOGGER.info(e.getMessage()); } @@ -157,7 +165,7 @@ public class GameController implements Initializable { @Override public void run() { LOGGER.debug(buttonRoom0); - if (g.getYourRole().equals("h")) { + if (g.getYourRoleFromPosition(client.getClient().getPosition()).equals("")) { //human try { buttonRoom0.setVisible(true); buttonRoom1.setVisible(true); @@ -169,7 +177,7 @@ public class GameController implements Initializable { e.printStackTrace(); } - } else { + } else { //ghost try { buttonRoom0.setVisible(false); buttonRoom1.setVisible(false); @@ -190,7 +198,7 @@ public class GameController implements Initializable { @Override public void run() { LOGGER.debug(buttonRoom0); - if (g.getYourRole().equals("g")) { + if (g.getYourRoleFromPosition(client.getClient().getPosition()).equals("g")) {//ghost try { buttonRoom0.setVisible(true); buttonRoom1.setVisible(true);