diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java index 232e3361..33583a38 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java @@ -8,6 +8,7 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import mock.app.Event; import mock.exceptions.EventConstructionException; +import network.Messages.Enums.RequestToJoinEnum; import visualiser.app.App; import visualiser.app.MatchBrowserSingleton; import visualiser.network.HttpMatchBrowserHost; @@ -102,7 +103,7 @@ public class HostGameController extends Controller { public void connectSocket(String address, int port) throws IOException { Socket socket = new Socket(address, port); InGameLobbyController iglc = (InGameLobbyController)loadScene("gameLobby.fxml"); - iglc.enterGameLobby(socket, true); + iglc.enterGameLobby(socket, true, RequestToJoinEnum.PARTICIPANT);//TODO may want to let the host spectate if they wish. } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index 4c35e8e8..763680e2 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -274,10 +274,16 @@ public class InGameLobbyController extends Controller { }.start(); } - public void enterGameLobby(Socket socket, boolean isHost){ + /** + * Joins a game and enters the game lobby for it. + * @param socket Socket to connect to. + * @param isHost Whether this client is the host. + * @param joinType How the client wishes to join (e.g., participant). + */ + public void enterGameLobby(Socket socket, boolean isHost, RequestToJoinEnum joinType){ try { - this.visualiserRaceEvent = new VisualiserRaceEvent(socket, RequestToJoinEnum.PARTICIPANT); + this.visualiserRaceEvent = new VisualiserRaceEvent(socket, joinType); this.isHost = isHost; this.controllerClient = visualiserRaceEvent.getControllerClient(); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 8657152a..40857437 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -9,6 +9,7 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; +import network.Messages.Enums.RequestToJoinEnum; import javafx.scene.media.AudioClip; import network.Messages.HostGame; import org.json.JSONArray; @@ -35,6 +36,7 @@ public class LobbyController extends Controller { private @FXML TableColumn hostNameColumn; private @FXML TableColumn statusColumn; private @FXML Button joinGameBtn; + private @FXML Button spectateButton; private @FXML TextField addressFld; private @FXML TextField portFld; @@ -62,11 +64,14 @@ public class LobbyController extends Controller { lobbyTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { if (curr != null && curr.statusProperty().getValue().equals("Ready")) { joinGameBtn.setDisable(false); + spectateButton.setDisable(false); } else { joinGameBtn.setDisable(true); + spectateButton.setDisable(true); } }); joinGameBtn.setDisable(true); + spectateButton.setDisable(true); receiveMatchData(); } @@ -84,22 +89,41 @@ public class LobbyController extends Controller { try { if (lobbyTable.getSelectionModel().getSelectedItem().statusProperty().getValue().equals("Ready")) { joinGameBtn.setDisable(false); + spectateButton.setDisable(false); } else { joinGameBtn.setDisable(true); + spectateButton.setDisable(true); } } catch (Exception ignored){} } /** * Connect to a connection. + * @param joinType How the client wishes to join (e.g., participant). * @throws IOException socket error */ - public void connectSocket() throws IOException { + public void connectSocket(RequestToJoinEnum joinType) throws IOException { httpMatchBrowserClient.interrupt(); RaceConnection connection = lobbyTable.getSelectionModel().getSelectedItem(); Socket socket = new Socket(connection.getHostname(), connection.getPort()); InGameLobbyController iglc = (InGameLobbyController)loadScene("gameLobby.fxml"); - iglc.enterGameLobby(socket, false); + iglc.enterGameLobby(socket, false, joinType); + } + + /** + * Requests to join the game as a participant. + * @throws IOException socket error. + */ + public void connectParticipate() throws IOException { + connectSocket(RequestToJoinEnum.PARTICIPANT); + } + + /** + * Requests to join the game as a spectator. + * @throws IOException socket error. + */ + public void connectSpectate() throws IOException { + connectSocket(RequestToJoinEnum.SPECTATOR); } public void menuBtnPressed() throws IOException { diff --git a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java index 91396902..920dcbd9 100644 --- a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java @@ -14,15 +14,25 @@ public class ThisBoat { } public void setSailsOut(boolean sailsOut) { - this.boat.setSailsOut(sailsOut); + if (this.boat != null) { + this.boat.setSailsOut(sailsOut); + } } public boolean isSailsOut() { - return this.boat.isSailsOut(); + if (this.boat != null) { + return this.boat.isSailsOut(); + } else { + return true;//TODO junk value to allow the client to spectate. + } } public int getSourceID() { - return this.boat.getSourceID(); + if (this.boat != null) { + return this.boat.getSourceID(); + } else { + return 0;//TODO junk value to allow the client to spectate. + } } public void setBoat(VisualiserBoat boat) { diff --git a/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml index b9314691..6e02b4cf 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml @@ -10,6 +10,7 @@ + @@ -40,54 +41,58 @@ - + - - - - + + + + + + - + + - + + + + +