diff --git a/Meilenstein III/Diary.txt b/Meilenstein III/Diary.txt index 76e3d19..b82abd9 100644 --- a/Meilenstein III/Diary.txt +++ b/Meilenstein III/Diary.txt @@ -282,6 +282,10 @@ eine Stimme abgeben und sie wird gezählt, NPC können sehr stupide stimmen abge Server schickt dem Client bei einem Voterequest immer seine Position im Zug mit, und der client schickt sie dem Server wieder zurück. +11 & 12.04.2022 - Jonas +Implementation aller notwendigen Lobby - funktionen, list-commands, sowie whisper chat. + + 13.04.2022 - Seraina Spiellogik: Habe Alexs noiseHandling in die restliche Spiellogik integriert und debugged. Ebenso musste ich den Input der Clients beim Abstimmen geben umstrukturieren. Anstatt dass eine speziefische Methode @@ -318,5 +322,10 @@ Im GUI funktioniert der Whisper nun. Folgendes Colorcoding: Eigene Nachrichten s und im Momentan Whisper Nachrichten violet. 18.04.2022 - Seraina -Nach etlichem lesen von Websites zu custom tasks in gradle habe ich entlich die build-cs108 task zum Laufen -gebracht. Es war wie so oft die einfachste Lösung. \ No newline at end of file +Nach etlichem Lesen von Websites zu custom tasks in gradle habe ich endlich die build-cs108 task zum Laufen +gebracht. Es war wie so oft die einfachste Lösung. + +18.04.2022 - Alex +- Aktualisierung des Projektplans für Meilensteine 4 und 5 abgeschlossen (hochgeladen als pdf und xls) +- Änderung des NoiseHandlers: Nun werden human players, selbst wenn nachts mehrmals Geister an ihnen vorbeilaufen, nur einmal benachrichtigt. +- Abschliessende Arbeit am Manual. diff --git a/Meilenstein III/Manual_1.0.docx b/Meilenstein III/Manual.pdf similarity index 89% rename from Meilenstein III/Manual_1.0.docx rename to Meilenstein III/Manual.pdf index 436f1cc..dbf3c5b 100644 Binary files a/Meilenstein III/Manual_1.0.docx and b/Meilenstein III/Manual.pdf differ diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java b/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java index 0ee0b70..2da3348 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java @@ -19,7 +19,7 @@ public class BudaLogConfig { LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); - loggerConfig.setLevel(Level.INFO); // change level here + loggerConfig.setLevel(Level.ERROR); // change level here ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. } 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 9317836..ba803e8 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 @@ -16,7 +16,7 @@ public class ClientGameInfoHandler { //relevant: 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 = "You heard some noise"; + 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!"; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/Game.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/Game.java index 6ab28ee..2514ead 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/Game.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/Game.java @@ -109,7 +109,7 @@ public class Game implements Runnable { LOGGER.info(gameState.toString()); i = 0; - while (isOngoing == true) {//game cycle + while (isOngoing) {//game cycle if (!isDay) { LOGGER.info("NIGHT"); gameOverCheck = voteHandler.ghostVote(gameState.getPassengerTrain(), this); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/NoiseHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/NoiseHandler.java index cdda0ee..9579dea 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/NoiseHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/NoiseHandler.java @@ -8,30 +8,32 @@ import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Passenger; * and broadcasts noise message to them (via ServerGameInfoHandler) */ public class NoiseHandler { - /** - * Notifies passengers in the train about a ghost walking by them. Differentiates between two + /** Updates the amount of times passengers on the train heard ghosts walk by them. Differentiates between two * cases: if the active ghost (predator) is to the right of his victim, the Passenger array is * being walked through from right to left (from the predator's position back to the victim's * position), otherwise the other way around. One call of noiseNotifier only deals with one * predator infecting a victim, so if there are already multiple ghosts in the game, the method * should be called for each of them individually. - * + * @param passengers passengers of the train the game is played in * @param predator ghost that has infected a human player during this night (called upon as - * passenger for convenience reasons) + * passenger for convenience reasons) * @param victim human player who has been turned into a ghost this night + * @param noiseAmount array containing information about how many times each passenger heard a noise this night * @param game current game instance + * @return updated array with info on who heard how many noises */ - public void noiseNotifier(Passenger[] passengers, Passenger predator, Passenger victim, Game game) { + public int[] noiseNotifier(Passenger[] passengers, Passenger predator, Passenger victim, int[] noiseAmount, Game game) { if (predator.getPosition() - victim.getPosition() > 0) { // if predator is to the right of victim for (int i = predator.getPosition() - 1; i > victim.getPosition(); i--) { - passengers[i].send(ClientGameInfoHandler.noiseNotification, game); + noiseAmount[i]++; } } else { // if predator is to the left of victim for (int i = predator.getPosition() + 1; i < victim.getPosition(); i++) { - passengers[i].send(ClientGameInfoHandler.noiseNotification, game); + noiseAmount[i]++; } } + return noiseAmount; } } 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 457dee1..1c7472d 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 @@ -88,14 +88,25 @@ public class VoteHandler { } /* notify passengers the ghosts passed by - for each ghost that ghostified a player, an instance of NoiseHandler - is being created and the passengers this ghost passed by are being notified. The player who's just been ghostified - is ignored since he didn't participate in this night's ghostification. */ + is being created and the array containing the information about the amount of times each passenger heard a ghost + walk by is being updated. Finally, each passenger receives information about how often he heard something during + this night. The player who's just been ghostified is ignored since he didn't participate in this night's + ghostification. */ + + int[] noiseAmount = new int[6]; for (int i = 0; i < passengers.length; i++) { if (passengers[i].getIsGhost() && i != ghostPosition) { NoiseHandler n = new NoiseHandler(); - n.noiseNotifier(passengers, passengers[i], g, game); + noiseAmount = n.noiseNotifier(passengers, passengers[i], g, noiseAmount, game); } } + for (int i = 0; i < passengers.length; i++) { + if (!passengers[i].getIsGhost() && noiseAmount[i] != 0) { // passenger is human and someone walked by him + passengers[i].send(ClientGameInfoHandler.noiseNotification + noiseAmount[i] + " time(s)", game); + } + } + + // no humans left in the game --> everyone has been ghostified, ghosts win int humanCounter = 0; for(Passenger passenger : passengers) { if(!passenger.getIsGhost()) { //if it is a human @@ -108,7 +119,7 @@ public class VoteHandler { } LOGGER.info(game.getGameState().toString()); - // set hasVoted to false for all passengers for future votings + // set hasVoted to false for all passengers for future voting for (Passenger passenger : passengers) { passenger.setHasVoted(false); passenger.setVote(Integer.MAX_VALUE); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 5cf6e7d..071d248 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -217,9 +217,13 @@ public class ClientHandler implements Runnable { */ public void broadcastChatMessageToAll(String msg) { for (ClientHandler client : connectedClients) { + + // we can un-comment this if we want broadcast to only send to everyone else, excluding the person who sent it. + /* if (client.getClientUserName().equals(this.getClientUserName())) { continue; } + */ client.sendMsgToClient(Protocol.printToClientChat + "$" + clientUserName + ": " + msg); } } @@ -459,6 +463,8 @@ public class ClientHandler implements Runnable { Game game = l.getGame(); if (game != null) { l.getGame().getGameState().handleClientDisconnect(this); + l.removeGameFromRunningGames(game); + l.addGameToFinishedGames(game); } } } @@ -523,13 +529,19 @@ public class ClientHandler implements Runnable { } /** - * Lists all Games currenty running and already finished and displays it to the client handled by + * Lists all Games currently running and already finished and displays it to the client handled by * this */ public void listGames() { - if (Lobby.runningGames.isEmpty() && Lobby.finishedGames.isEmpty()) { + if (Lobby.runningGames.isEmpty() && Lobby.finishedGames.isEmpty() && Lobby.lobbies.isEmpty()) { sendAnnouncementToClient("No Games"); } else { + sendAnnouncementToClient("Open Games (i.e. open Lobbies):"); + for (Lobby l : Lobby.lobbies) { + if (l.getLobbyIsOpen()) { + sendAnnouncementToClient(" - Lobby Nr. " + l.getLobbyID()); + } + } sendAnnouncementToClient("Running Games:"); try { for (Game runningGame : Lobby.runningGames) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java index c15f7b8..84e129b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java @@ -26,7 +26,7 @@ public class JServerProtocolParser { try { header = msg.substring(0, 5); if (!header.equals(Protocol.pingBack) && !header.equals( - Protocol.pingFromClient)) { //for debuging without constant pings + Protocol.pingFromClient)) { //for debugging without constant pings LOGGER.debug("got message: " + msg + "."); } } catch (IndexOutOfBoundsException e) {