The game is now playable wia the game gui, there are still some quirks to work out, especially timing wise and with the POSOF network message

This commit is contained in:
Seraina 2022-05-01 03:05:32 +02:00
parent f4ccb6894a
commit 27c31967e5
13 changed files with 184 additions and 52 deletions

View File

@ -1,2 +1,3 @@
B
serai
serai

View File

@ -17,8 +17,8 @@ public class ClientGameInfoHandler {
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!";
public static final String gameOverHumansWin = "Game over, humans win!";
public static final String gameOverGhostsWin = "Game over, ghosts win!";
//relevant for gui
public static final String itsNightTime = "Please wait, ghosts are active";

View File

@ -95,7 +95,7 @@ public class Game implements Runnable {
passenger.send(GuiParameters.updateGameState, getGame());
}
try {
Thread.sleep(4000); //TODO: Is this a good intervall?
Thread.sleep(2000); //TODO: Is this a good intervall?
} catch (InterruptedException e) {
e.printStackTrace();
}
@ -148,19 +148,22 @@ public class Game implements Runnable {
}
LOGGER.info(gameState.toString());
gameStateModelUpdater(); //TODO: does that work?
for(Passenger passenger : gameState.getPassengerTrain()) {
passenger.send(Protocol.positionOfClient + "$" + passenger.getPosition(), this);
}
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.night + "$");
i = 0;
while (isOngoing) {//game cycle TODO: maybe check that more often inside game loop?!
if (!isDay) {
LOGGER.info("NIGHT");
gameOverCheck = voteHandler.ghostVote(gameState.getPassengerTrain(), this);
setDay(true);
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + ClientGameInfoHandler.itsDayTime + "$");
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.day + "$");
} else {
LOGGER.info("DAY");
gameOverCheck = voteHandler.humanVote(gameState.getPassengerTrain(), this);
setDay(false);
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + ClientGameInfoHandler.itsNightTime + "$");
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.night + "$");
}
if (gameOverCheck.equals(ClientGameInfoHandler.gameOverGhostsWin) || gameOverCheck.equals(
ClientGameInfoHandler.gameOverHumansWin)) {
@ -169,6 +172,9 @@ public class Game implements Runnable {
}
lobby.getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.viewChangeToLobby + "$");
lobby.getAdmin().broadcastAnnouncementToLobby(gameOverCheck);
isOngoing = false;
Timer.ghostAfterVoteTimer();
isOngoing = true;
lobby.removeGameFromRunningGames(this);
lobby.addGameToFinishedGames(this);
return;

View File

@ -174,6 +174,7 @@ public class GameState {
for (int i = 0; i < array.length; i++) {
stringBuilder.append("$").append(print[i]);
}
stringBuilder.append("$");
return stringBuilder.toString();
}
@ -194,6 +195,7 @@ public class GameState {
for (int i = 0; i < array.length; i++) {
stringBuilder.append("$").append(print[i]);
}
stringBuilder.append("$");
return stringBuilder.toString();
}

View File

@ -30,12 +30,10 @@ public class ServerGameInfoHandler {
public static String format(String msg, Passenger passenger, Game game) {
switch (msg) {
case ClientGameInfoHandler.ghostVoteRequest:
msg = Protocol.serverRequestsGhostVote + "$" + passenger.getPosition() + "$"
+ game.gameState.toString();
msg = Protocol.serverRequestsGhostVote + "$" + passenger.getPosition() + "$";
break;
case ClientGameInfoHandler.humanVoteRequest:
msg = Protocol.serverRequestsHumanVote + "$" + passenger.getPosition() + "$"
+ game.gameState.humanToString();
msg = Protocol.serverRequestsHumanVote + "$" + passenger.getPosition() + "$";
break;
default:
msg = Protocol.printToClientConsole + "$" + msg;
@ -56,11 +54,11 @@ public class ServerGameInfoHandler {
switch (msg) {
case ClientGameInfoHandler.ghostVoteRequest:
case ClientGameInfoHandler.itsNightTime:
msg = Protocol.printToClientConsole + "$Ghosts are voting: " + game.gameState.toString();
msg = Protocol.printToClientConsole + "$Ghosts are voting";
break;
case ClientGameInfoHandler.humanVoteRequest:
case ClientGameInfoHandler.itsDayTime:
msg = Protocol.printToClientConsole + "$Humans are voting:" + game.gameState.toString();
msg = Protocol.printToClientConsole + "$Humans are voting";
break;
case GuiParameters.updateGameState:
msg = Protocol.printToGUI + "$" + GuiParameters.updateGameState + game.getGameState().toString();
@ -114,9 +112,10 @@ public class ServerGameInfoHandler {
case ClientGameInfoHandler.noiseNotification + 5 + " time(s)":
String outMsg = npc.getName() + ": " + noiseRandomizer();
//TODO: add likelyhood
Timer.ghostAfterVoteTimer();
game.getLobby().getAdmin().broadcastNpcChatMessageToLobby(outMsg);
game.getLobby().getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + GuiParameters.noiseHeardAtPosition
+ "$" + npc.getPosition() + "$");
game.getLobby().getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.noiseHeardAtPosition
+ "$" + npc.getPosition());
break;
case ClientGameInfoHandler.ghostVoteRequest:
npc.vote(game);
@ -138,9 +137,10 @@ public class ServerGameInfoHandler {
case ClientGameInfoHandler.noiseNotification + 4 + " time(s)":
case ClientGameInfoHandler.noiseNotification + 5 + " time(s)":
String outMsg = npc.getName() + ": " + noiseRandomizer();
Timer.ghostAfterVoteTimer();
game.getLobby().getAdmin().broadcastNpcChatMessageToLobby(outMsg);
game.getLobby().getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + GuiParameters.noiseHeardAtPosition
+ "$" + npc.getPosition() + "$");
game.getLobby().getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.noiseHeardAtPosition
+ "$" + npc.getPosition());
break;
case ClientGameInfoHandler.humanVoteRequest:
npc.vote(game);

View File

@ -22,7 +22,7 @@ public class Timer {
* The length of time in seconds after the ghost vote during which the ghosts visually walk to /
* from their victim and the timespan within which humans will hear a noise. After this, the day starts.
*/
public static final int ghostAfterVoteTime = 7;
public static final int ghostAfterVoteTime = 4;
/**
* The maximum length of the human vote in the day, in seconds
*/

View File

@ -2,6 +2,8 @@ package ch.unibas.dmi.dbis.cs108.gamelogic;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.gamelogic.klassenstruktur.Passenger;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -66,7 +68,7 @@ public class VoteHandler {
}
}
LOGGER.info("Most votes for: " + newGhostPosition);
Timer.ghostAfterVoteTimer();
for(Passenger passenger : passengers) {
if(passenger.getIsGhost() || passenger.getIsSpectator()) {
passenger.send(passengers[newGhostPosition].getName() + ClientGameInfoHandler.gotGhostyfied, game);
@ -85,7 +87,7 @@ public class VoteHandler {
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. */
Timer.ghostAfterVoteTimer();
int[] noiseAmount = new int[6];
for (int i = 0; i < passengers.length; i++) {
if (passengers[i].getIsGhost() && i != newGhostPosition) {
@ -152,6 +154,7 @@ public class VoteHandler {
}
Timer.humanVoteTimer(game);
game.getLobby().getAdmin().sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.VoteIsOver + "$");
int currentMax = humanVoteEvaluation(passengers, votesForPlayers, game.getGameState().getClientVoteData(), game);
@ -170,6 +173,7 @@ public class VoteHandler {
ClientGameInfoHandler.humansVotedFor + voteIndex + ClientGameInfoHandler.isAHuman, game);
}
}
Timer.ghostAfterVoteTimer();
if (passengers[voteIndex].getIsGhost()) { // if player is a ghost
if (passengers[voteIndex].getIsOG()) { // if ghost is OG --> end game, humans win
System.out.println(ClientGameInfoHandler.gameOverHumansWin);

View File

@ -14,6 +14,7 @@ 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 com.google.inject.Guice;
import java.net.InetAddress;
import java.net.Socket;
import java.io.*;
@ -329,13 +330,17 @@ public class Client {
*/
public void sendToGUI(String parameter, String data) {
try {
if(!parameter.equals(GuiParameters.updateGameState)) {
LOGGER.debug("GUI: PARAMETER:" + parameter + ", DATA: " + data);
}
switch (parameter) {
case ClientGameInfoHandler.itsNightTime: //ClientGameInfoHandler
case GuiParameters.night: //ClientGameInfoHandler
gameStateModel.setDayClone(false);
chatApp.getGameController().setNoiseButtonInvisible();
break;
case ClientGameInfoHandler.itsDayTime: //ClientGameInfoHandler
case GuiParameters.day: //ClientGameInfoHandler
gameStateModel.setDayClone(true);
chatApp.getGameController().setNoiseButtonVisible();
break;
case GuiParameters.updateGameState:
gameStateModel.setGSFromString(data);
@ -353,6 +358,9 @@ public class Client {
//updateListOfLobbies(data); (commented out due to compiling error)
//TODO
break;
case GuiParameters.VoteIsOver:
chatApp.getGameController().clearAllNoiseDisplay();
break;
case GuiParameters.listOfPLayers:
updateListOfClients(data);
//TODO
@ -407,7 +415,7 @@ public class Client {
new Thread(() -> {
try {
chatApp.getGameController().addMessageToNotificationText(data);
Thread.sleep(3000);
Thread.sleep(5000);
chatApp.getGameController().clearNotificationText();
} catch (InterruptedException e) {
LOGGER.warn(e.getMessage());
@ -417,19 +425,26 @@ public class Client {
}
public void determineNoiseDisplay(int position) {
LOGGER.debug(position);
switch (position) {
case 0:
chatApp.getGameController().noiseDisplay0();
break;
case 1:
chatApp.getGameController().noiseDisplay1();
break;
case 2:
chatApp.getGameController().noiseDisplay2();
break;
case 3:
chatApp.getGameController().noiseDisplay3();
break;
case 4:
chatApp.getGameController().noiseDisplay4();
break;
case 5:
chatApp.getGameController().noiseDisplay5();
break;
}
}

View File

@ -40,6 +40,9 @@ public class JClientProtocolParser {
break;
case Protocol.printToClientConsole:
System.out.println(msg.substring(6));
if (!msg.substring(6).equals("Your vote was invalid")) {
c.notificationTextDisplay(msg.substring(6));
}
break;
case Protocol.printToClientChat:
//todo: handle chat separately from console.
@ -74,8 +77,12 @@ public class JClientProtocolParser {
c.sendToGUI(parameter,data);
break;
case Protocol.positionOfClient:
try {
int position = Integer.parseInt(msg.substring(6));
GameController.getClient().getClient().setPosition(position);
} catch (Exception e) {
LOGGER.warn(msg.substring(6));
}
default:
System.out.println("Received unknown command");
}

View File

@ -117,6 +117,7 @@ public class GameStateModel {
j = right.indexOf(':');
roles[i] = right.substring(0, j);
kickedOff[i] = Boolean.parseBoolean(right.substring(j + 1));
LOGGER.info(kickedOff[i]);
i++;
}
setPassengerTrainClone(names, roles);

View File

@ -181,6 +181,14 @@ public class GameController implements Initializable{
+ client.getClient().getPosition()); //TODO: Test!!
}
public void setNoiseButtonInvisible() {
noiseButton.setVisible(false);
}
public void setNoiseButtonVisible() {
noiseButton.setVisible(true);
}
/**
* Takes a given message and displays it in the notificationText Flow in the game Scene
* @param msg the message to be displayed
@ -197,7 +205,6 @@ public class GameController implements Initializable{
notificationText.getChildren().add(notification);
} catch (Exception e) {
LOGGER.debug(e.getMessage());
e.printStackTrace();
}
}
});
@ -214,7 +221,7 @@ public class GameController implements Initializable{
@Override
public void run() {
try {
notificationText.getChildren().clear();
notificationText.getChildren().remove(0);
} catch (Exception e) {
LOGGER.debug("Not yet initialized");
}
@ -230,18 +237,73 @@ public class GameController implements Initializable{
LOGGER.debug("roomlables update");
String[] names = gameStateModel.getPassengerTrainClone()[0];
String[] roles = gameStateModel.getPassengerTrainClone()[1];
boolean[] kickedOff = gameStateModel.getKickedOff();
Text name0 = new Text(names[0]);
name0.setStyle("-fx-font: 25 arial;");
name0.setFill(Color.WHITE);
Text name1 = new Text(names[1]);
name1.setStyle("-fx-font: 25 arial;");
name1.setFill(Color.WHITE);
Text name2 = new Text(names[2]);
name2.setStyle("-fx-font: 25 arial;");
name2.setFill(Color.WHITE);
Text name3 = new Text(names[3]);
name3.setStyle("-fx-font: 25 arial;");
name3.setFill(Color.WHITE);
Text name4 = new Text(names[4]);
name4.setStyle("-fx-font: 25 arial;");
name4.setFill(Color.WHITE);
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]);
name5.setStyle("-fx-font: 25 arial;");
name5.setFill(Color.WHITE);
Text role0;
if(kickedOff[0]) {
role0 = new Text("\nkicked off");
} else {
role0 = new Text("\n" + roles[0]);
}
role0.setStyle("-fx-font: 25 arial;");
role0.setFill(Color.WHITE);
Text role1;
if(kickedOff[1]) {
role1 = new Text("\nkicked off");
} else {
role1 = new Text("\n" + roles[0]);
}
role1.setStyle("-fx-font: 25 arial;");
role1.setFill(Color.WHITE);
Text role2;
if(kickedOff[2]) {
role2 = new Text("\nkicked off");
} else {
role2 = new Text("\n" + roles[0]);
}
role2.setStyle("-fx-font: 25 arial;");
role2.setFill(Color.WHITE);
Text role3;
if(kickedOff[3]) {
role3 = new Text("\nkicked off");
} else {
role3 = new Text("\n" + roles[0]);
}
role3.setStyle("-fx-font: 25 arial;");
role3.setFill(Color.WHITE);
Text role4;
if(kickedOff[4]) {
role4 = new Text("\nkicked off");
} else {
role4 = new Text("\n" + roles[0]);
}
role4.setStyle("-fx-font: 25 arial;");
role4.setFill(Color.WHITE);
Text role5;
if(kickedOff[5]) {
role5 = new Text("\nkicked off");
} else {
role5 = new Text("\n" + roles[0]);
}
role5.setStyle("-fx-font: 25 arial;");
role5.setFill(Color.WHITE);
Platform.runLater(new Runnable(){
@Override
@ -368,7 +430,7 @@ public class GameController implements Initializable{
/**
* Adds an image of a bell on top of button5
*/
public void noiseDisplay5(){
public void noiseDisplay5() {
LOGGER.debug("noise5 called");
Platform.runLater(new Runnable(){
@Override
@ -382,6 +444,27 @@ public class GameController implements Initializable{
});
}
/**
* Clears all bells from the view
*/
public void clearAllNoiseDisplay() {
Platform.runLater(new Runnable(){
@Override
public void run() {
try {
noiseImage0.setImage(null);
noiseImage1.setImage(null);
noiseImage2.setImage(null);
noiseImage3.setImage(null);
noiseImage4.setImage(null);
noiseImage5.setImage(null);
} catch (Exception e) {
LOGGER.debug(e.getMessage());
}
}
});
}
public void setGameStateModel(
GameStateModel gameStateModel) {
GameController.gameStateModel = gameStateModel;

View File

@ -40,11 +40,24 @@ public class GuiParameters {
*/
public static final String viewChangeToGame = "VCGAME";
/**
* Tells, Gui, who the members of a specified Lobby are.
* Form: {@code LMEMBS$<lobbyID>$<member names>$..}
*/
public static String changeToLobby = "LMEMBS";
public static final String changeToLobby = "LMEMBS";
/**
* Informs the GUI, that a vote is over
*/
public static final String VoteIsOver = "VOTEOVER";
/**
* Informes Gui, that its the night
*/
public static final String night = "NIGHT";
/**
* Informes Gui, that its the day
*/
public static final String day = "DAY";
}

View File

@ -13,14 +13,14 @@
<children>
<Group fx:id="roomButtonGroupDay" layoutX="230.5" layoutY="220.0">
<children>
<HBox fx:id="notificationHBox" layoutX="50.0" layoutY="-74.0" rotate="12.4">
<HBox fx:id="notificationHBox" layoutX="20.0" layoutY="-55.0" rotate="12.4">
<children>
<ImageView fx:id="noiseImage0" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage1" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage2" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage3" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage4" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage5" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" />
<ImageView fx:id="noiseImage0" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
<ImageView fx:id="noiseImage1" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
<ImageView fx:id="noiseImage2" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
<ImageView fx:id="noiseImage3" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
<ImageView fx:id="noiseImage4" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
<ImageView fx:id="noiseImage5" fitHeight="150.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true" rotate="-12.4" />
</children>
</HBox>
<Button id="room1" fx:id="buttonRoom0" accessibleRole="RADIO_BUTTON" alignment="TOP_CENTER" contentDisplay="GRAPHIC_ONLY" layoutX="21.5" minWidth="-Infinity" mnemonicParsing="false" onAction="#sendVote0" prefHeight="110.0" prefWidth="90.0" text="room0">
@ -95,14 +95,14 @@
</ImageView>
</graphic>
</Button>
<HBox fx:id="roomLables" alignment="CENTER" layoutY="80.0" prefHeight="62.0" prefWidth="747.0" rotate="12.4">
<HBox fx:id="roomLables" alignment="CENTER" layoutY="82.0" prefHeight="62.0" prefWidth="747.0" rotate="12.2">
<children>
<TextFlow fx:id="lableRoom0" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom1" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom2" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom3" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom4" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom5" prefHeight="200.0" prefWidth="200.0" />
<TextFlow fx:id="lableRoom0" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
<TextFlow fx:id="lableRoom1" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
<TextFlow fx:id="lableRoom2" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
<TextFlow fx:id="lableRoom3" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
<TextFlow fx:id="lableRoom4" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
<TextFlow fx:id="lableRoom5" prefHeight="200.0" prefWidth="200.0" textAlignment="CENTER" />
</children>
</HBox>
</children>