diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 2f43b9cb..daab1162 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -94,6 +94,7 @@ public class Event { } if (gameType == 2){ + System.out.println("In gametype 2"); raceXMLFile = "mock/mockXML/raceTutorial.xml"; boatsXMLFile = "mock/mockXML/boatTutorial.xml"; regattaXMLFile = "mock/mockXML/regattaTutorial.xml"; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index e0f8654d..839abc57 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -159,4 +159,6 @@ public class HostController extends Controller { this.gameType = gameType; } + public int getGameType(){ return this.gameType; } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index ef749d90..b81bf918 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -98,6 +98,8 @@ public class MainController extends Controller { hostController.setGameType(gameType); } + public int getGameType(){ return hostController.getGameType(); } + /** * Main Controller for the applications will house the menu and the displayed pane. * diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index e864993d..0ae11f67 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -24,6 +24,7 @@ import shared.dataInput.RaceDataSource; import shared.model.Leg; import shared.model.Mark; import visualiser.app.App; +import visualiser.enums.TutorialState; import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; @@ -34,6 +35,8 @@ import visualiser.utils.GPSConverter; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Optional; import java.util.ResourceBundle; import java.util.logging.Level; @@ -58,6 +61,13 @@ public class RaceController extends Controller { private boolean isHost; + private TutorialState currentState; + + private ArrayList tutorialStates; + + private boolean isTutorial = false; + + /** * state of the info table */ @@ -110,13 +120,25 @@ public class RaceController extends Controller { if(controlKey != null) { try { controlKey.onAction(); // Change key state if applicable + + if (isTutorial){ + if (controlKey.getProtocolCode().equals(currentState.getAction())){ + updateTutorialState(); + } + } + + controllerClient.sendKey(controlKey); event.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); Logger.getGlobal().log(Level.WARNING, "RaceController was interrupted on thread: " + Thread.currentThread() + "while sending: " + controlKey, e); + } catch (Exception e) { + e.printStackTrace(); } } + + if(event.getCode() == KeyCode.ESCAPE) { try { @@ -246,6 +268,8 @@ public class RaceController extends Controller { } + + /** * Initialises the frame rate functionality. This allows for toggling the frame rate, and connect the fps label to the race's fps property. * @param visualiserRace The race to connect the fps label to. @@ -422,6 +446,18 @@ public class RaceController extends Controller { this.controllerClient = controllerClient; this.isHost = isHost; + + //Check if the game is a tutorial + if (parent.getGameType()==2){ + isTutorial = true; + tutorialStates = new ArrayList<>(Arrays.asList(TutorialState.values())); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + System.out.println(currentState); + System.out.println(tutorialStates); + + } + initialiseRace(); //Display this controller. @@ -519,4 +555,53 @@ public class RaceController extends Controller { infoTableShow = !infoTableShow; } + private void updateTutorialState() throws Exception { + switch (currentState){ + case UPWIND: + System.out.println("You turned upwind. Now go downwind."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case DOWNWIND: + System.out.println("You turned downwind. Now go tack/gybe."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case TACKGYBE: + System.out.println("You tack/gybe. Now go VMG."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case VMG: + System.out.println("You VMG. Now sails-in."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case SAILSIN: + System.out.println("You sails-in. Now sails-out."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case SAILSOUT: + System.out.println("You sails-out. Tutorial finished. Well done!"); + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Finished Tutorial"); + alert.setHeaderText("You have finished the tutorial."); + alert.setContentText("Now you know the controls you are ready to race!"); + Optional result = alert.showAndWait(); + if (result.get() == ButtonType.OK) { + parent.endEvent(); + racePane.setVisible(false); + App.app.showMainStage(App.getStage()); + } + break; + default: + System.out.println("Something went wrong."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + } + + } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java index b46bf79f..6d073ed8 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java @@ -86,9 +86,6 @@ public class StartController extends Controller { - - - /** * Ctor. */ diff --git a/racevisionGame/src/main/java/visualiser/enums/TutorialState.java b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java new file mode 100644 index 00000000..57c17e77 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java @@ -0,0 +1,66 @@ +package visualiser.enums; + +import javafx.scene.input.KeyCode; +import network.Messages.BoatAction; +import network.Messages.Enums.BoatActionEnum; +import visualiser.gameController.Keys.ControlKey; +import static visualiser.app.App.keyFactory; + +import java.util.ArrayList; + +/** + * Created by zwu18 on 10/09/17. + */ +public enum TutorialState { + + + +// keyState.put("Z", new ZoomInKey()); +// keyState.put("X", new ZoomOutKey()); +// keyState.put("SPACE", new VMGKey()); +// keyState.put("SHIFT", new SailsToggleKey()); +// keyState.put("ENTER", new TackGybeKey()); +// keyState.put("UP", new UpWindKey()); +// keyState.put("DOWN", new DownWindKey()); + + /** + * State for upwind in tutorial + */ + UPWIND(BoatActionEnum.UPWIND), + + /** + * State for downwind in tutorial + */ + DOWNWIND(BoatActionEnum.DOWNWIND), + + /** + * State for tacking/gybing in tutorial + */ + TACKGYBE(BoatActionEnum.TACK_GYBE), + + /** + * State for vmg in tutorial + */ + VMG(BoatActionEnum.AUTO_PILOT), + + /** + * State for sails-in in tutorial + */ + SAILSIN(BoatActionEnum.SAILS_IN), + + /** + * State for sails-out in tutorial + */ + SAILSOUT(BoatActionEnum.SAILS_OUT); + + private BoatActionEnum action; + + TutorialState(BoatActionEnum action){ + this.action = action; + } + + public BoatActionEnum getAction(){ + return action; + } + +} diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml b/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml index e9e9378a..c4efcd17 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml @@ -5,7 +5,6 @@ RACE_CREATION_TIME - diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml b/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml index e0b81837..c4efcd17 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml @@ -5,9 +5,6 @@ RACE_CREATION_TIME - - - diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml b/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml index 19d358cd..ecc59e40 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml @@ -5,7 +5,7 @@ RACE_CREATION_TIME - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/race.fxml b/racevisionGame/src/main/resources/visualiser/scenes/race.fxml index b6496743..5adc3efd 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/race.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/race.fxml @@ -1,5 +1,11 @@ + + + + + + @@ -22,7 +28,7 @@ - + @@ -46,16 +52,16 @@ - + -