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 27d09fb..e4cc00c 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 @@ -24,10 +24,12 @@ public class ClientGameInfoHandler { //just messages public static final String itsNightTime = "Please wait, ghosts are active"; 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"; + public static final String gotGhostyfied = " is now also a ghost!"; } 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 84f1062..3f77278 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 @@ -105,7 +105,7 @@ public class Game implements Runnable { while (true) { if (!isDay) { LOGGER.info("NIGHT"); - voteHandler.ghostVote(gameState.getPassengerTrain(), this); + gameOverCheck = voteHandler.ghostVote(gameState.getPassengerTrain(), this); setDay(true); } else { LOGGER.info("DAY"); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ServerGameInfoHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ServerGameInfoHandler.java index bbdd8ca..5d3eaf8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ServerGameInfoHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ServerGameInfoHandler.java @@ -53,9 +53,11 @@ public class ServerGameInfoHandler { public static String spectatorFormat(String msg, Passenger passenger, Game game) { switch (msg) { case ClientGameInfoHandler.ghostVoteRequest: + case ClientGameInfoHandler.itsNightTime: msg = Protocol.printToClientConsole + "$Ghosts are voting: " + game.gameState.toString(); break; case ClientGameInfoHandler.humanVoteRequest: + case ClientGameInfoHandler.itsDayTime: msg = Protocol.printToClientConsole + "$Humans are voting:" + game.gameState.toString(); break; default: @@ -120,11 +122,8 @@ public class ServerGameInfoHandler { game.getLobby().getAdmin().broadcastNpcChatMessageToLobby(outMsg); break; case ClientGameInfoHandler.humanVoteRequest: - npc.vote(); + npc.vote(game); } - - } - } 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 25a9e7c..118459b 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 @@ -41,7 +41,6 @@ public class VoteHandler { // Walk through entire train, ask ghosts to ghostify and humans to wait for (Passenger passenger : passengers) { if (passenger.getIsGhost()) { - passenger.send(ClientGameInfoHandler.ghostVoteRequest, game); } else { passenger.send( @@ -67,15 +66,21 @@ public class VoteHandler { if (votesForPlayers[i] == currentMax) { // if player at position i has most votes ghostPosition = i; LOGGER.debug("Most votes for Passenger " + i); - } } LOGGER.info("Most votes for: " + ghostPosition); + for(Passenger passenger : passengers) { + if(passenger.getIsGhost() || passenger.getIsSpectator()) { + passenger.send(passengers[ghostPosition].getName() + ClientGameInfoHandler.gotGhostyfied, game); + } + } Passenger g = GhostifyHandler.ghost(passengers[ghostPosition], game); passengers[ghostPosition] = g; - passengers[ghostPosition].send( - ClientGameInfoHandler.youGotGhostyfied, game); + if (!passengers[ghostPosition].getIsSpectator()) { + passengers[ghostPosition].send( + ClientGameInfoHandler.youGotGhostyfied, game); + } try { // waits 20 seconds before votes get collected Thread.sleep(10); } catch (InterruptedException e) { @@ -180,8 +185,9 @@ public class VoteHandler { // Usual case: there is more than one human left and a normal ghost has been voted for --> // kick this ghost off passengers[voteIndex] = GhostifyHandler.kickOff(passengers[voteIndex], game); + passengers[voteIndex].send(ClientGameInfoHandler.youGotKickedOff, game); for (Passenger passenger : passengers) { - passenger.send("Player " + voteIndex + ClientGameInfoHandler.gotKickedOff, game); + passenger.send(passengers[voteIndex].getName() + ClientGameInfoHandler.gotKickedOff, game); } } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/GhostPlayer.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/GhostPlayer.java index 807572e..996cb0d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/GhostPlayer.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/GhostPlayer.java @@ -58,7 +58,8 @@ public class GhostPlayer extends Ghost { /* * if vote wasn't valid, make sure, the passenger field hasVoted == false, probably redundant but better be safe than sorry */ - if(vote == Integer.MAX_VALUE) { + if(vote == Integer.MAX_VALUE|| game.getGameState().getPassengerTrain()[vote].getKickedOff()) { + send("Your vote was invalid", game); hasVoted = false; } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanNPC.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanNPC.java index bf2c4e4..9235d61 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanNPC.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanNPC.java @@ -44,13 +44,29 @@ public class HumanNPC extends Human { } /** - * Currently returns a random integer for voting + * Currently returns a random integer for voting, but only for passengers that haven't been + * kicked off yet * * @return integer between 0 and 5 */ - public void vote() { - int randomNr = (int) (Math.random() * 6); - vote = randomNr; + public void vote(Game game) { + Passenger[] passengers = game.getGameState().getPassengerTrain(); + int kickedOffCounter = 0; + for(Passenger passenger : passengers) { + if(passenger.getKickedOff()) { + kickedOffCounter++; + } + } + int[] inGamePositions = new int[passengers.length - kickedOffCounter]; + int i = 0; + for(Passenger passenger : passengers) { + if(!passenger.getKickedOff()) { + inGamePositions[i] = passenger.getPosition(); + i++; + } + } + int randomNr = (int) (Math.random() * inGamePositions.length); + vote = inGamePositions[randomNr]; hasVoted = true; LOGGER.info("HumanNPC at Position: " + this.getPosition() + " has voted for: " + vote); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanPlayer.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanPlayer.java index c166ed2..4b5c0ea 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanPlayer.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/HumanPlayer.java @@ -62,7 +62,8 @@ public class HumanPlayer extends Human { /* * if vote wasn't valid, make sure, the passenger field hasVoted == false, probably redundant but better be safe than sorry */ - if (vote == Integer.MAX_VALUE) { + if (vote == Integer.MAX_VALUE || game.getGameState().getPassengerTrain()[vote].getKickedOff()) { + send("Your vote was invalid", game); hasVoted = false; } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/Passenger.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/Passenger.java index 1b436f6..ab27f15 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/Passenger.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/klassenstruktur/Passenger.java @@ -122,6 +122,13 @@ public class Passenger { */ public boolean getIsOG() { return isOG; } + /** + * true if passenger is a spectator + */ + public boolean getIsSpectator() { + return isSpectator; + } + /** * true if passenger has been voted off, false if passenger is still in the game * @return the boolean