You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
5.2 KiB

package visualiser.Controllers;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
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;
import visualiser.network.MatchBrowserInterface;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Controller for Hosting a game.
*/
public class HostGameController extends Controller {
private @FXML ImageView mapImage;
private ArrayList<Image> listOfMaps;
private int currentMapIndex = 0;
private DatagramSocket udpSocket;
private MatchBrowserInterface matchBrowserInterface;
public void initialize() {
loadMaps();
this.udpSocket = MatchBrowserSingleton.getInstance().getUdpSocket();
this.matchBrowserInterface = MatchBrowserSingleton.getInstance().getMatchBrowserInterface();
}
/**
* Loads in the list of playable maps to be selected from.
*/
private void loadMaps(){
// image preview of maps
Image ac35Map = new Image(getClass().getClassLoader().getResourceAsStream("images/AC35_Racecourse_MAP.png"));
Image oMap = new Image(getClass().getClassLoader().getResourceAsStream("images/oMapLayout.png"));
Image iMap = new Image(getClass().getClassLoader().getResourceAsStream("images/iMapLayout.png"));
Image mMap = new Image(getClass().getClassLoader().getResourceAsStream("images/mMapLayout.png"));
listOfMaps = new ArrayList(Arrays.asList(ac35Map, oMap, iMap, mMap));
mapImage.setImage(listOfMaps.get(currentMapIndex));
Platform.runLater(() -> {
mapImage.fitWidthProperty()
.bind(mapImage.getScene().getWindow().widthProperty().multiply(0.6));
});
}
/**
* Hosts a game
*/
public void hostGamePressed() {
try {
App.game = new Event(false, currentMapIndex);
App.gameType = currentMapIndex;
HttpMatchBrowserHost matchBrowserHost = new HttpMatchBrowserHost();
new Thread(matchBrowserHost).start();
connectSocket("localhost", 4942);
//alertMatchBrowser();
} catch (EventConstructionException e) {
Logger.getGlobal().log(Level.SEVERE, "Could not create Event.", e);
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Sends info to the match browser so clients can see it
*/
public void alertMatchBrowser(){
try{
if (matchBrowserInterface == null){
return;//private game
}
matchBrowserInterface.startSendingHostData(App.game.getHostedGameData(), udpSocket);
}catch (IOException e){
System.err.println("failed to send out hosted game info");
}
}
/**
* Connect to a socket
* @param address address of the server
* @param port port that the server is run off
* @throws IOException socket error
*/
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, RequestToJoinEnum.PARTICIPANT);//TODO may want to let the host spectate if they wish.
}
/**
* Menu button pressed. Prompt alert then return to menu
* @throws IOException socket error
*/
public void menuBtnPressed() throws Exception {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Quitting race");
alert.setContentText("Do you wish to quit the race?");
alert.setHeaderText("You are about to quit the race");
Optional<ButtonType> result = alert.showAndWait();
if(result.get() == ButtonType.OK){
loadTitleScreen();
}
}
/**
* Method called when the 'next' arrow button is pressed. It is used to
* change the currently displayed map preview to the next in the list.
*/
public void nextImage(){
// increase index
currentMapIndex = (currentMapIndex + 1) % listOfMaps.size();
// update map preview
mapImage.setImage(listOfMaps.get(currentMapIndex));
}
/**
* Method called when the 'previous' arrow button is pressed. It is used to
* change the currently displayed map preview to the previous in the list.
*/
public void previousImage(){
// decrease index
currentMapIndex = ((((currentMapIndex - 1) % listOfMaps.size()) +
listOfMaps.size()) % listOfMaps.size());
// update map preview
mapImage.setImage(listOfMaps.get(currentMapIndex));
}
public void setCurrentMapIndex(Integer index){
this.currentMapIndex = index;
}
}