Cherry-picked my own commit from master, because I messed up the branch creation, recommitting it on this one

This commit is contained in:
Seraina 2022-04-29 16:24:24 +02:00
parent ba03095647
commit f058eabb75
8 changed files with 164 additions and 35 deletions

View File

@ -13,18 +13,21 @@ public class ClientGameInfoHandler {
* All messages that are used in VoteHandler * All messages that are used in VoteHandler
* TODO(Seraina-Alex): Adjust strings to be more meaningful * TODO(Seraina-Alex): Adjust strings to be more meaningful
*/ */
//relevant: //relevant for game logic:
public static final String ghostVoteRequest = "Vote on who to ghostify!"; 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 humanVoteRequest = "Vote for a ghost to kick off!";
public static final String noiseNotification = "Someone passed by you "; public static final String noiseNotification = "Someone passed by you ";
public static final String gameOverHumansWin = "Game over: humans win!"; public static final String gameOverHumansWin = "Game over: humans win!";
public static final String gameOverGhostsWin = "Game over: ghosts win!"; public static final String gameOverGhostsWin = "Game over: ghosts win!";
//just messages //relevant for gui
public static final String itsNightTime = "Please wait, ghosts are active"; public static final String itsNightTime = "Please wait, ghosts are active";
public static final String itsDayTime = "Please wait, humans are active";
//just messages
public static final String youGotGhostyfied = "You are now a ghost!"; 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 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 humansVotedFor = "Humans voted for: ";
public static final String isAHuman = " but they're a human!"; 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 gotKickedOff = " is a Ghost and got kicked off";

View File

@ -162,27 +162,17 @@ public class GameState {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
String[] print = new String[6]; String[] print = new String[6];
for (int i = 0; i < array.length; i++) { for (int i = 0; i < array.length; i++) {
if (array[i].getKickedOff()) { if(array[i].getIsSpectator()) {
print[i] = "| " + array[i].getName() + ", kicked off: " + array[i].getPosition() + " |"; print[i] = array[i].getName() + ":s:" + array[i].getKickedOff();
} else if (array[i].getIsGhost()) {
print[i] = array[i].getName() + ":g:" + array[i].getKickedOff();
} else { } else {
if (array[i].getIsPlayer()) { print[i] = "| " + array[i].getName() + ":h:" + array[i].getKickedOff();
if (array[i].getIsGhost()) {
print[i] = "| " + array[i].getName() + "(ghostPlayer): " + array[i].getPosition() + " |";
} else {
print[i] = "| " + array[i].getName() + "(humanPlayer): " + array[i].getPosition() + " |";
}
} else {
if (array[i].getIsGhost()) {
print[i] = "| " + array[i].getName() + "(ghostNPC): " + array[i].getPosition() + " |";
} else {
print[i] = "| " + array[i].getName() + "(humanNPC): " + array[i].getPosition() + " |";
}
}
} }
}
}
for (int i = 0; i < array.length; i++) { for (int i = 0; i < array.length; i++) {
stringBuilder.append(print[i]); stringBuilder.append("$").append(print[i]);
} }
return stringBuilder.toString(); return stringBuilder.toString();
} }
@ -198,11 +188,11 @@ public class GameState {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
String[] print = new String[6]; String[] print = new String[6];
for (int i = 0; i < array.length; i++) { for (int i = 0; i < array.length; i++) {
print[i] = "| " + array[i].getName() + ": " + array[i].getPosition() + " |"; print[i] = array[i].getName() + "::" + array[i].getKickedOff();
} }
for (int i = 0; i < array.length; i++) { for (int i = 0; i < array.length; i++) {
stringBuilder.append(print[i]); stringBuilder.append("$").append(print[i]);
} }
return stringBuilder.toString(); return stringBuilder.toString();
} }

View File

@ -52,7 +52,7 @@ public class VoteHandler {
//Timer.ghostVoteTimer(game); //Timer.ghostVoteTimer(game);
try { try {
Thread.sleep(10*1000); Thread.sleep(20*1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted"); LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted");
} }
@ -155,7 +155,7 @@ public class VoteHandler {
} }
try { // waits 60 seconds before votes get collected try { // waits 60 seconds before votes get collected
Thread.sleep(10*1000); Thread.sleep(20*1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted"); LOGGER.warn("Thread " + Thread.currentThread() + " was interrupted");
} }

View File

@ -1,10 +1,13 @@
package ch.unibas.dmi.dbis.cs108.multiplayer.client; package ch.unibas.dmi.dbis.cs108.multiplayer.client;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; 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.ClientModel;
import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GUI; 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.chat.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatApp;
import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController;
import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger;
@ -32,6 +35,8 @@ public class Client {
private ChatApp chatApp; private ChatApp chatApp;
private GUI chatGui; private GUI chatGui;
private GameStateModel gameStateModel;
private GameController gameController;
/** /**
* Saves the position of the client, gets refreshed everytime the client gets a vote request. * Saves the position of the client, gets refreshed everytime the client gets a vote request.
@ -63,6 +68,8 @@ public class Client {
this.chatApp = new ChatApp(new ClientModel(systemName, this)); this.chatApp = new ChatApp(new ClientModel(systemName, this));
this.chatGui = new GUI(this.chatApp); this.chatGui = new GUI(this.chatApp);
clientPinger = new ClientPinger(this, this.socket); clientPinger = new ClientPinger(this, this.socket);
this.gameStateModel = new GameStateModel();
this.gameController = new GameController(ChatApp.getClientModel(),gameStateModel);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -124,6 +131,16 @@ public class Client {
//LOGGER.debug("just checked next line"); //LOGGER.debug("just checked next line");
} }
/**
* Extracts infromation about names and positions and roles from string and adds it to
* the GameStateModel
* @param msg
*/
public void gameStateModelSetter(String msg) {
}
/** /**
* Starts a thread which listens for incoming chat messages / other messages that the user has to * Starts a thread which listens for incoming chat messages / other messages that the user has to
@ -290,4 +307,38 @@ public class Client {
public void sendToChat(String substring) { public void sendToChat(String substring) {
chatApp.getChatController().addChatMsgToView(substring); chatApp.getChatController().addChatMsgToView(substring);
} }
/**
* funnels a message to the gui, where depending on the message different functions/controls/methods
* of the gui are targeted. The message contains information on what to do, which are extracted
* @param msg a message of the form {@code parameter$msg}
*
*/
public void sendToGUI(String msg) {
int indexFirstDollar = msg.indexOf('$');
String header = "";
try {
header = msg.substring(0,indexFirstDollar);
} catch (IndexOutOfBoundsException e) {
LOGGER.info(e.getMessage());
}
switch (header) {
case ClientGameInfoHandler.itsNightTime:
gameStateModel.setDayClone(false);
break;
case ClientGameInfoHandler.itsDayTime:
gameStateModel.setDayClone(true);
break;
default:
gameController.addMessageToNotificationText(msg); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController?
}
}
} }

View File

@ -1,6 +1,7 @@
package ch.unibas.dmi.dbis.cs108.multiplayer.client; package ch.unibas.dmi.dbis.cs108.multiplayer.client;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.gamelogic.ClientGameInfoHandler;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -48,7 +49,7 @@ public class JClientProtocolParser {
break; break;
case Protocol.serverRequestsGhostVote: case Protocol.serverRequestsGhostVote:
LOGGER.debug("Ghost received Vote request"); LOGGER.debug("Ghost received Vote request");
System.out.println("Ghost Vote:"); //c.sendToGUI(ClientGameInfoHandler.ghostVoteRequest);
c.positionSetter(msg.substring(6)); c.positionSetter(msg.substring(6));
break; break;
case Protocol.serverRequestsHumanVote: case Protocol.serverRequestsHumanVote:

View File

@ -11,6 +11,12 @@ public class GameStateModel {
*/ */
private boolean isDayClone; private boolean isDayClone;
/**
* 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;
/** /**
* A primitive clone of the passengerTrain in the GameState of the server. * 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 * in passengerTrainClone[0] the names of the passengers are stored, in passengerTrainClone[1] the roles
@ -18,13 +24,19 @@ public class GameStateModel {
*/ */
private String[][] passengerTrainClone; private String[][] passengerTrainClone;
private boolean[] kickedOff;
/** /**
* Constructs a GamesStateModel with the passengerTrainClone length at nrOfPlayers * Constructs a GamesStateModel with the passengerTrainClone
* @param nrOfPlayers the amount of different objects to be saved
*/ */
public void GameStateModel(int nrOfPlayers) { public GameStateModel() {
this.nrOfPlayers = nrOfPlayers; this.nrOfPlayers = 6;
passengerTrainClone = new String[2][nrOfPlayers]; passengerTrainClone = new String[2][nrOfPlayers];
for(String role : passengerTrainClone[1]) {
role = "";
}
kickedOff = new boolean[nrOfPlayers];
isDayClone = false;
} }
/** /**
@ -37,4 +49,34 @@ public class GameStateModel {
passengerTrainClone[1] = roles; passengerTrainClone[1] = roles;
} }
public String[][] getPassengerTrainClone() {
return passengerTrainClone;
}
/**
* Sets your current role to the specified role, must be h for human, g for ghost or s for spectator
* @param yourRole the role to set this role to
*/
public void setYourRole(String yourRole) {
if(yourRole.equals("h") || yourRole.equals("g") || yourRole.equals("s")) {
this.yourRole = yourRole;
}
}
public String getYourRole() {
return yourRole;
}
public int getNrOfPlayers() {
return nrOfPlayers;
}
public void setDayClone(boolean dayClone) {
isDayClone = dayClone;
}
public boolean getDayClone() {
return isDayClone;
}
} }

View File

@ -1,5 +1,6 @@
package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game; package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game;
import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel;
import javafx.event.EventHandler; import javafx.event.EventHandler;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel;
@ -35,6 +36,14 @@ public class GameController {
private static ClientModel client; private static ClientModel client;
private static GameStateModel gameStateModel;
//TODO(Seraina, Sebi): Same issue as ChatController? do with setters?
public GameController(ClientModel c, GameStateModel g) {
client = c;
gameStateModel = g;
}
@FXML @FXML
private AnchorPane gameBG; private AnchorPane gameBG;
@FXML @FXML
@ -138,14 +147,47 @@ public class GameController {
} }
/** /**
* Adds a msg to the room Lable at the specified position * Updates the labels of the rooms accordingly to the datastructures in GameStateModel
* @param names a String array containing all the names
*/ */
public void addRoomLabels(String[] names) { public void updateRoomLabels() {
String[] names = gameStateModel.getPassengerTrainClone()[0];
String[] roles = gameStateModel.getPassengerTrainClone()[1];
Text name0 = new Text(names[0]);
Text name1 = new Text(names[1]);
Text name2 = new Text(names[2]);
Text name3 = new Text(names[3]);
Text name4 = new Text(names[4]);
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]);
lableRoom0.getChildren().clear();
lableRoom0.getChildren().add(name0);
lableRoom0.getChildren().add(role0);
lableRoom1.getChildren().clear();
lableRoom1.getChildren().add(name1);
lableRoom1.getChildren().add(role1);
lableRoom2.getChildren().clear();
lableRoom2.getChildren().add(name2);
lableRoom2.getChildren().add(role2);
lableRoom3.getChildren().clear();
lableRoom3.getChildren().add(name3);
lableRoom3.getChildren().add(role3);
lableRoom4.getChildren().clear();
lableRoom4.getChildren().add(name4);
lableRoom4.getChildren().add(role4);
lableRoom5.getChildren().clear();
lableRoom5.getChildren().add(name5);
lableRoom5.getChildren().add(role5);
} }
public void setGameStateModel(
GameStateModel gameStateModel) {
GameController.gameStateModel = gameStateModel;
}
} }

View File

@ -97,7 +97,7 @@
</HBox> </HBox>
</children> </children>
</Group> </Group>
<Button fx:id="noiseButton" alignment="CENTER" layoutX="267.0" layoutY="636.0" mnemonicParsing="false" prefHeight="114.0" prefWidth="217.0" text="I heard some noise"> <Button fx:id="noiseButton" alignment="CENTER" layoutX="267.0" layoutY="636.0" mnemonicParsing="false" onAction="#noise" prefHeight="114.0" prefWidth="217.0" text="I heard some noise">
<font> <font>
<Font name="System Bold" size="21.0" /> <Font name="System Bold" size="21.0" />
</font></Button> </font></Button>