diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientVoteData.java b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientVoteData.java new file mode 100644 index 0000000..d9c405f --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/gamelogic/ClientVoteData.java @@ -0,0 +1,32 @@ +package ch.unibas.dmi.dbis.cs108.gamelogic; + +import java.util.Arrays; + +public class ClientVoteData { + + private int[] vote; //saves vote of clientHandler for later transmission to passenger, by default MAX_VALUE, index corresponds to Passenger position + private boolean[] hasVoted; //saves hasVoted status of clientHandler for later transmission to passenger, by default false, index corresponds to Passenger position + + public ClientVoteData() { + int[] h = new int[6]; + Arrays.fill(h,Integer.MAX_VALUE); + this.vote = h; + this.hasVoted = new boolean[6]; + } + + public int[] getVote() { + return vote; + } + + public boolean[] getHasVoted() { + return hasVoted; + } + + public void setVote(int position, int vote) { + this.vote[position] = vote; + } + + public void setHasVoted(int position, boolean hasVoted) { + this.hasVoted[position] = hasVoted; + } +} 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 1d45b50..ba640a2 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,6 +109,7 @@ public class Game implements Runnable { } else { LOGGER.info("DAY"); gameOverCheck = voteHandler.humanVote(gameState.getPassengerTrain(), this); + setDay(false); } if (gameOverCheck.equals("Game over: ghosts win!") || gameOverCheck.equals( "Game over: humans win!")) { 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 c6eb67e..712b246 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 @@ -4,6 +4,7 @@ import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Ghost; import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Human; import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Passenger; +import java.util.Arrays; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -24,6 +25,7 @@ public class GameState { private Passenger[] passengerTrain; + /** * Constructs a GameState instance where nrOfPlayers >= nrOfUsers. Fills passengerTrain with * only humans @@ -65,6 +67,8 @@ public class GameState { return train; } + + /** * Takes a given Passenger and puts it into the passengerTrain at a certain position * @param passenger the new passenger being put into the train 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 ab81971..78b3323 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 @@ -2,9 +2,7 @@ package ch.unibas.dmi.dbis.cs108.gamelogic; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Ghost; -import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.GhostPlayer; import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Passenger; -import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -23,6 +21,15 @@ public class VoteHandler { public static final Logger LOGGER = LogManager.getLogger(); public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + private ClientVoteData clientVoteData; + + public ClientVoteData getClientVoteData() { + return clientVoteData; + } + + public static void setClientVoteData(ClientVoteData clientVoteData) { + clientVoteData = clientVoteData; + } /** * Handles the ghost vote during nighttime: passengers who are ghosts are being asked on who to @@ -65,7 +72,7 @@ public class VoteHandler { // Note: Each voting collects votes for all players even though some might not be concerned // (i.e. ghosts during ghost vote). Those players will then get 0 votes so it doesn't matter. // TODO: Perhaps the vote results should be handled by ClientGameInfoHandler - passenger.getVoteFromClientHandler(); + passenger.getVoteFromGameState(clientVoteData); if (passenger.getHasVoted()) { for (int i = 0; i < votesForPlayers.length; i++) { if (passenger.getVote() == i) { @@ -142,7 +149,7 @@ public class VoteHandler { } for (Passenger passenger : passengers) { - passenger.getVoteFromClientHandler(); + passenger.getVoteFromGameState(clientVoteData); // collecting the votes - distribute them among the vote counters for all players // TODO: Perhaps the vote results should be handled by ClientGameInfoHandler if (passenger.getHasVoted()) { 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 c964b67..363bf0a 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 @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientVoteData; import ch.unibas.dmi.dbis.cs108.gamelogic.Game; import ch.unibas.dmi.dbis.cs108.gamelogic.ServerGameInfoHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; @@ -44,11 +45,11 @@ public class GhostPlayer extends Ghost { * Sets clientHandler fields to default: vote = Integer.MAX_VALUE , hasVoted = false */ @Override - public void getVoteFromClientHandler() { - vote = clientHandler.getVote()[position]; - hasVoted = clientHandler.getHasVoted()[position]; - clientHandler.setVote(position,Integer.MAX_VALUE); - clientHandler.setHasVoted(position,false); + public void getVoteFromGameState(ClientVoteData clientVoteData) { + vote = clientVoteData.getVote()[position]; + hasVoted = clientVoteData.getHasVoted()[position]; + clientVoteData.setVote(position,Integer.MAX_VALUE); + clientVoteData.setHasVoted(position,false); LOGGER.info("Ghost at Pos: " + position + " has voted for: " + vote); /* * if vote wasn't valid, make sure, the passenger field hasVoted == false, probably redundant but better be safe than sorry 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 bdb05c5..0084d8b 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 @@ -1,9 +1,11 @@ package ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientVoteData; import ch.unibas.dmi.dbis.cs108.gamelogic.Game; import ch.unibas.dmi.dbis.cs108.gamelogic.ServerGameInfoHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; +import java.util.Arrays; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,13 +43,14 @@ public class HumanPlayer extends Human { * Sets clientHandler fields to default: vote = Integer.MAX_VALUE , hasVoted = false */ @Override - public void getVoteFromClientHandler() { + public void getVoteFromGameState(ClientVoteData clientVoteData) { + LOGGER.debug(Arrays.toString(clientVoteData.getVote())); LOGGER.info("method was called by: " + position); - vote = clientHandler.getVote()[position]; + vote = clientVoteData.getVote()[position]; LOGGER.info("Human at Pos: " + position + " has voted for: " + vote); - hasVoted = clientHandler.getHasVoted()[position]; - clientHandler.setVote(position,Integer.MAX_VALUE); - clientHandler.setHasVoted(position,false); + hasVoted = clientVoteData.getHasVoted()[position]; + clientVoteData.setVote(position,Integer.MAX_VALUE); + clientVoteData.setHasVoted(position,false); /* * if vote wasn't valid, make sure, the passenger field hasVoted == false, probably redundant but better be safe than sorry */ 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 7151294..efe4446 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 @@ -1,9 +1,9 @@ package ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientVoteData; import ch.unibas.dmi.dbis.cs108.gamelogic.Game; import ch.unibas.dmi.dbis.cs108.gamelogic.ServerGameInfoHandler; -import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -112,7 +112,7 @@ public class Passenger { /** * When called by NPC nothing should happen, because clientHandler = null */ - public void getVoteFromClientHandler() { + public void getVoteFromGameState(ClientVoteData clientVoteData) { LOGGER.debug("a NPC called this method hopefully: " + position); } 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 2ed5c99..d9ed5fa 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 @@ -36,8 +36,6 @@ public class ClientHandler implements Runnable { public static HashSet disconnectedClients = new HashSet<>(); //todo: implement re-connection public static HashSet lobby = new HashSet<>(); public static HashSet ghostClients = new HashSet<>(); - private int[] vote; //saves vote of clientHandler for later transmission to passenger, by default MAX_VALUE, index corresponds to Passenger position - private boolean[] hasVoted; //saves hasVoted status of clientHandler for later transmission to passenger, by default false, index corresponds to Passenger position /** * Implements the login logic in client-server architecture. @@ -52,10 +50,6 @@ public class ClientHandler implements Runnable { this.in = new BufferedReader(new InputStreamReader((socket.getInputStream()))); this.loggedIn = false; this.clientUserName = nameDuplicateChecker.checkName("U.N. Owen"); - int[] h = new int[1000]; - Arrays.fill(h,Integer.MAX_VALUE); - this.vote = h; - this.hasVoted = new boolean[1000]; connectedClients.add(this); serverPinger = new ServerPinger(socket, this); Thread sP = new Thread(serverPinger); @@ -94,14 +88,6 @@ public class ClientHandler implements Runnable { return loggedIn; } - public int[] getVote() { - return vote; - } - - public boolean[] getHasVoted() { - return hasVoted; - } - public String getClientUserName() { return clientUserName; } @@ -111,13 +97,6 @@ public class ClientHandler implements Runnable { this.loggedIn = loggedIn; } - public void setVote(int position, int vote) { - this.vote[position] = vote; - } - - public void setHasVoted(int position, boolean hasVoted) { - this.hasVoted[position] = hasVoted; - } @Override public void run() { 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 a7a8c70..a213128 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 @@ -2,8 +2,11 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.server; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.gamelogic.ClientVoteData; import ch.unibas.dmi.dbis.cs108.gamelogic.Game; +import ch.unibas.dmi.dbis.cs108.gamelogic.GameState; import ch.unibas.dmi.dbis.cs108.gamelogic.TrainOverflow; +import ch.unibas.dmi.dbis.cs108.gamelogic.VoteHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; @@ -77,6 +80,7 @@ public class JServerProtocolParser { int msgIndex = msg.indexOf('$'); int vote = Integer.MAX_VALUE; int position = 0; + ClientVoteData clientVoteData = new ClientVoteData(); LOGGER.debug("Message is " + msg.substring(6)); try { position = Integer.parseInt(msg.substring(0,msgIndex)); @@ -85,10 +89,11 @@ public class JServerProtocolParser { LOGGER.warn("Invalid vote " + e.getMessage()); } if(vote != Integer.MAX_VALUE) { //gets MAX_VALUE when the vote wasn't valid - h.setVote(position,vote); + clientVoteData.setVote(position,vote); LOGGER.debug("Player vote: " + vote); - h.setHasVoted(position,true); + clientVoteData.setHasVoted(position,true); } + VoteHandler.setClientVoteData(clientVoteData); break; case Protocol.startANewGame: try {