diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 15766815..39641a9e 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -103,10 +103,14 @@ public class GameState { return windDirection; } - public static Double getWindSpeed() { + public static Double getWindSpeedMMS() { return windSpeed; } + public static Double getWindSpeedKnots() { + return windSpeed / 1000 * ClientPacketParser.MS_TO_KNOTS; + } + public static Map getYachts() { return yachts; } @@ -116,6 +120,7 @@ public class GameState { // System.out.println("-----------------------"); switch (actionType) { case VMG: + playerYacht.turnToVMG(); // System.out.println("Snapping to VMG"); // TODO: 22/07/17 wmu16 - Add in the vmg calculation code here break; @@ -141,12 +146,13 @@ public class GameState { break; } -// System.out.println("-----------------------"); -// System.out.println("Heading: " + playerYacht.getHeading()); -// System.out.println("Sails are in: " + playerYacht.getSailIn()); -// System.out.println("Lat: " + playerYacht.getLocation().getLat()); -// System.out.println("Lng: " + playerYacht.getLocation().getLng()); -// System.out.println("-----------------------\n"); + System.out.println("-----------------------"); + System.out.println("Sails are in: " + playerYacht.getSailIn()); + System.out.println("Heading: " + playerYacht.getHeading()); + System.out.println("Velocity: " + playerYacht.getVelocityMMS() / 1000); + System.out.println("Lat: " + playerYacht.getLocation().getLat()); + System.out.println("Lng: " + playerYacht.getLocation().getLng()); + System.out.println("-----------------------\n"); } public static void update() { diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 2c94b54c..8a51997f 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -339,7 +339,7 @@ public class ServerToClientThread implements Runnable, Observer { } sendMessage(new RaceStatusMessage(1, raceStatus, startTime, GameState.getWindDirection(), - GameState.getWindSpeed().longValue(), GameState.getPlayers().size(), + GameState.getWindSpeedMMS().longValue(), GameState.getPlayers().size(), RaceType.MATCH_RACE, 1, boatSubMessages)); } diff --git a/src/main/java/seng302/model/Yacht.java b/src/main/java/seng302/model/Yacht.java index 5bafcb82..a4857733 100644 --- a/src/main/java/seng302/model/Yacht.java +++ b/src/main/java/seng302/model/Yacht.java @@ -11,6 +11,11 @@ import static seng302.utilities.GeoUtility.getGeoCoordinate; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; + +import javafx.scene.paint.Color; +import seng302.client.ClientPacketParser; +import seng302.controllers.RaceViewController; import seng302.gameServer.GameState; import seng302.utilities.GeoPoint; @@ -110,8 +115,8 @@ public class Yacht { this.position = "-"; this.sailIn = false; this.location = new GeoPoint(57.670341, 11.826856); - this.heading = 120.0; - this.velocity = 50000.0; + this.heading = 120.0; //In degrees + this.velocity = 0d; //in mms-1 } /** @@ -120,24 +125,28 @@ public class Yacht { public void update(Long timeInterval) { if (sailIn) { Double secondsElapsed = timeInterval / 1000000.0; - Double thisHeading = ((double) Math.floorMod(heading.longValue(), 360L)); - Double windSpeedKnots = 0d; - Double boatSpeedInKnots = PolarTable.getBoatSpeed(windSpeedKnots, thisHeading); - velocity = boatSpeedInKnots / 1.94384449 * 3000; // TODO: 25/07/17 cir27 - remove magic numbers - //System.out.println("velocity = " + velocity); + Double windSpeedKnots = GameState.getWindSpeedKnots(); + Double trueWindAngle = Math.abs(GameState.getWindDirection() - heading); + Double boatSpeedInKnots = PolarTable.getBoatSpeed(windSpeedKnots, trueWindAngle); + velocity = boatSpeedInKnots / ClientPacketParser.MS_TO_KNOTS * 1000; Double metersCovered = velocity * secondsElapsed; location = getGeoCoordinate(location, heading, metersCovered); + } else { + velocity = 0d; } } public void adjustHeading(Double amount) { + Double newVal = heading + amount; lastHeading = heading; // TODO: 24/07/17 wmu16 - '%' in java does remainder, we need modulo. All this must be changed here, this is why we have neg values! - heading = (heading + amount) % 360.0; + heading = (double) Math.floorMod(newVal.longValue(), 360L); } public void tackGybe(Double windDirection) { - adjustHeading(-2 * ((heading - windDirection) % 360)); + Double normalizedHeading = heading - GameState.windDirection; + normalizedHeading = (double) Math.floorMod(normalizedHeading.longValue(), 360); + adjustHeading(-2 * normalizedHeading); } public void toggleSailIn() { @@ -145,7 +154,8 @@ public class Yacht { } public void turnUpwind() { - Double normalizedHeading = (heading - GameState.windDirection) % 360; + Double normalizedHeading = heading - GameState.windDirection; + normalizedHeading = (double) Math.floorMod(normalizedHeading.longValue(), 360); if (normalizedHeading == 0) { if (lastHeading < 180) { adjustHeading(-TURN_STEP); @@ -166,7 +176,8 @@ public class Yacht { } public void turnDownwind() { - Double normalizedHeading = (heading - GameState.windDirection) % 360; + Double normalizedHeading = heading - GameState.windDirection; + normalizedHeading = (double) Math.floorMod(normalizedHeading.longValue(), 360); if (normalizedHeading == 0) { if (lastHeading < 180) { adjustHeading(TURN_STEP); @@ -186,6 +197,9 @@ public class Yacht { } } + public void turnToVMG() { + // TODO: 25/07/17 wmu16 - Fix this so it grabs the optimal value from the optimal Polar + } public String getBoatType() { return boatType; @@ -267,8 +281,19 @@ public class Yacht { return velocityProperty.getReadOnlyProperty(); } + public double getVelocityMMS() { + return velocity; + } + public ReadOnlyLongProperty timeTillNextProperty() { return timeTillNextProperty.getReadOnlyProperty(); + + public Double getVelocityKnots() { + return velocity / 1000 * ClientPacketParser.MS_TO_KNOTS; + } + + public Long getTimeTillNext() { + return timeTillNext; } public Long getMarkRoundTime() { diff --git a/src/main/java/seng302/server/messages/BoatLocationMessage.java b/src/main/java/seng302/server/messages/BoatLocationMessage.java index b4b273a4..ec0a4c0e 100644 --- a/src/main/java/seng302/server/messages/BoatLocationMessage.java +++ b/src/main/java/seng302/server/messages/BoatLocationMessage.java @@ -39,7 +39,6 @@ public class BoatLocationMessage extends Message { * @param boatSpeed The boats speed */ public BoatLocationMessage(int sourceId, int sequenceNum, double latitude, double longitude, double heading, long boatSpeed){ - boatSpeed /= 10; messageVersionNumber = 1; time = System.currentTimeMillis(); this.sourceId = sourceId; diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index f5741594..dc8e580b 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -152,7 +152,7 @@ public class ClientToServerThread implements Runnable { try { socket.close(); } catch (IOException e) { - System.out.println("IO error in server thread upon trying to close socket"); + clientLog("Failed to close the socket", 0); } } diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 70edcde5..d282e417 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -16,8 +16,6 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; -import javafx.scene.media.Media; -import javafx.scene.media.MediaPlayer; import javafx.scene.text.Text; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; @@ -90,6 +88,11 @@ public class LobbyController implements Initializable { private static ObservableList seventhCompetitor = FXCollections.observableArrayList(); private static ObservableList eighthCompetitor = FXCollections.observableArrayList(); // private ClientStateQueryingRunnable clientStateQueryingRunnable; + private ClientStateQueryingRunnable clientStateQueryingRunnable; + private static List imageViews; + private static List listViews; + + private int MAX_NUM_PLAYERS = 8; private Boolean switchedPane = false; @@ -123,6 +126,27 @@ public class LobbyController implements Initializable { // } // initialiseListView(); // initialiseLobbyControllerThread(); +// initialiseImageView(); // parrot gif init +// if (ClientState.isHost()) { +// lobbyIpText.setText("Lobby Host IP: " + ClientState.getHostIp()); +// readyButton.setDisable(false); +// } +// else { +// lobbyIpText.setText("Connected to IP: "); +// readyButton.setDisable(true); +// } +// +// imageViews = new ArrayList<>(); +// Collections.addAll(imageViews, firstImageView, secondImageView, thirdImageView, fourthImageView, +// fifthImageView, sixthImageView, seventhImageView, eighthImageView); +// listViews = new ArrayList<>(); +// Collections.addAll(listViews, firstListView, secondListView, thirdListView, fourthListView, fifthListView, +// sixthListView, seventhListView, eighthListView); +// competitors = new ArrayList<>(); +// Collections.addAll(competitors, firstCompetitor, secondCompetitor, thirdCompetitor, +// fourthCompetitor, fifthCompetitor, sixthCompetitor, seventhCompetitor, eighthCompetitor); +// +// initialiseListView(); // initialiseImageView(); // parrot gif init // set up client state query thread, so that when it receives the race-started packet @@ -161,13 +185,16 @@ public class LobbyController implements Initializable { // seventhListView.getItems().clear(); // eighthListView.getItems().clear(); - competitors = new ArrayList<>(); - Collections.addAll(competitors, firstCompetitor, secondCompetitor, thirdCompetitor, - fourthCompetitor, fifthCompetitor, sixthCompetitor, seventhCompetitor, eighthCompetitor); - - for (ObservableList ol : competitors) { - ol.removeAll(); - } +// listViews.forEach(listView -> listView.getItems().clear()); +// imageViews.forEach(gif -> gif.setVisible(false)); +// competitors.forEach(ol -> ol.removeAll()); +// +// List ids = new ArrayList<>(ClientState.getBoats().keySet()); +// for (int i = 0; i < ids.size(); i++) { +// competitors.get(i).add(String.format("Player ID: %d", ids.get(i))); +// listViews.get(i).setItems(competitors.get(i)); +// imageViews.get(i).setVisible(true); +// } // firstCompetitor.add(ClientState.getClientSourceId()); @@ -183,15 +210,15 @@ public class LobbyController implements Initializable { // } // } - firstListView.setItems(firstCompetitor); - secondListView.setItems(secondCompetitor); - thirdListView.setItems(thirdCompetitor); - fourthListView.setItems(fourthCompetitor); - fifthListView.setItems(fifthCompetitor); - sixthListView.setItems(sixthCompetitor); - seventhListView.setItems(seventhCompetitor); - eighthListView.setItems(eighthCompetitor); - } +// firstListView.setItems(firstCompetitor); +// secondListView.setItems(secondCompetitor); +// thirdListView.setItems(thirdCompetitor); +// fourthListView.setItems(fourthCompetitor); +// fifthListView.setItems(fifthCompetitor); +// sixthListView.setItems(sixthCompetitor); +// seventhListView.setItems(seventhCompetitor); +// eighthListView.setItems(eighthCompetitor); +// } // private void initialiseLobbyControllerThread() { // Thread thread = new Thread(new Runnable() { @@ -209,22 +236,25 @@ public class LobbyController implements Initializable { // } private void initialiseImageView() { - Image image1 = new Image(getClass().getResourceAsStream("/ParrotGif/alistair.gif")); - firstImageView.setImage(image1); - Image image2 = new Image(getClass().getResourceAsStream("/ParrotGif/calum.gif")); - secondImageView.setImage(image2); - Image image3 = new Image(getClass().getResourceAsStream("/ParrotGif/haoming.gif")); - thirdImageView.setImage(image3); - Image image4 = new Image(getClass().getResourceAsStream("/ParrotGif/kusal.gif")); - fourthImageView.setImage(image4); - Image image5 = new Image(getClass().getResourceAsStream("/ParrotGif/michael.gif")); - fifthImageView.setImage(image5); - Image image6 = new Image(getClass().getResourceAsStream("/ParrotGif/peter.gif")); - sixthImageView.setImage(image6); - Image image7 = new Image(getClass().getResourceAsStream("/ParrotGif/ryan.gif")); - seventhImageView.setImage(image7); - Image image8 = new Image(getClass().getResourceAsStream("/ParrotGif/will.gif")); - eighthImageView.setImage(image8); + for (int i = 0; i < MAX_NUM_PLAYERS; i++) { + imageViews.get(i).setImage(new Image(getClass().getResourceAsStream("/pics/sail.png"))); + } +// Image image1 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// firstImageView.setImage(image1); +// Image image2 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// secondImageView.setImage(image2); +// Image image3 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// thirdImageView.setImage(image3); +// Image image4 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// fourthImageView.setImage(image4); +// Image image5 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// fifthImageView.setImage(image5); +// Image image6 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// sixthImageView.setImage(image6); +// Image image7 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// seventhImageView.setImage(image7); +// Image image8 = new Image(getClass().getResourceAsStream("/pics/sail.png")); +// eighthImageView.setImage(image8); } @FXML @@ -239,30 +269,30 @@ public class LobbyController implements Initializable { @FXML public void readyButtonPressed() { // setContentPane("/views/RaceView.fxml"); - playTheme(); +// playTheme(); GameState.setCurrentStage(GameStages.RACING); for (LobbyCloseListener readyListener : lobbyListeners) readyListener.notify(CloseStatus.READY); } - private static MediaPlayer mediaPlayer; - - private void playTheme() { - Random random = new Random(System.currentTimeMillis()); - Integer rand = random.nextInt(); - if(rand == 10) { - URL file = getClass().getResource("/music/Disturbed - down with the sickness.mp3"); - Media hit = new Media(file.toString()); - mediaPlayer = new MediaPlayer(hit); - mediaPlayer.play(); - } else if(rand == 9) { - URL file = getClass().getResource("/music/Owl City - Fireflies.mp3"); - Media hit = new Media(file.toString()); - mediaPlayer = new MediaPlayer(hit); - mediaPlayer.play(); - } - } +// private static MediaPlayer mediaPlayer; +// +// private void playTheme() { +// Random random = new Random(System.currentTimeMillis()); +// Integer rand = random.nextInt(); +// if(rand == 10) { +// URL file = getClass().getResource("/music/Disturbed - down with the sickness.mp3"); +// Media hit = new Media(file.toString()); +// mediaPlayer = new MediaPlayer(hit); +// mediaPlayer.play(); +// } else if(rand == 9) { +// URL file = getClass().getResource("/music/Owl City - Fireflies.mp3"); +// Media hit = new Media(file.toString()); +// mediaPlayer = new MediaPlayer(hit); +// mediaPlayer.play(); +// } +// } // private void switchToRaceView() { // if (!switchedPane) { diff --git a/src/main/resources/ParrotGif/alistair.gif b/src/main/resources/pics/alistair.gif similarity index 100% rename from src/main/resources/ParrotGif/alistair.gif rename to src/main/resources/pics/alistair.gif diff --git a/src/main/resources/ParrotGif/calum.gif b/src/main/resources/pics/calum.gif similarity index 100% rename from src/main/resources/ParrotGif/calum.gif rename to src/main/resources/pics/calum.gif diff --git a/src/main/resources/ParrotGif/haoming.gif b/src/main/resources/pics/haoming.gif similarity index 100% rename from src/main/resources/ParrotGif/haoming.gif rename to src/main/resources/pics/haoming.gif diff --git a/src/main/resources/ParrotGif/kusal.gif b/src/main/resources/pics/kusal.gif similarity index 100% rename from src/main/resources/ParrotGif/kusal.gif rename to src/main/resources/pics/kusal.gif diff --git a/src/main/resources/ParrotGif/michael.gif b/src/main/resources/pics/michael.gif similarity index 100% rename from src/main/resources/ParrotGif/michael.gif rename to src/main/resources/pics/michael.gif diff --git a/src/main/resources/ParrotGif/parrot.gif b/src/main/resources/pics/parrot.gif similarity index 100% rename from src/main/resources/ParrotGif/parrot.gif rename to src/main/resources/pics/parrot.gif diff --git a/src/main/resources/ParrotGif/peter.gif b/src/main/resources/pics/peter.gif similarity index 100% rename from src/main/resources/ParrotGif/peter.gif rename to src/main/resources/pics/peter.gif diff --git a/src/main/resources/ParrotGif/ryan.gif b/src/main/resources/pics/ryan.gif similarity index 100% rename from src/main/resources/ParrotGif/ryan.gif rename to src/main/resources/pics/ryan.gif diff --git a/src/main/resources/pics/sail.png b/src/main/resources/pics/sail.png new file mode 100644 index 00000000..7335918c Binary files /dev/null and b/src/main/resources/pics/sail.png differ diff --git a/src/main/resources/ParrotGif/will.gif b/src/main/resources/pics/will.gif similarity index 100% rename from src/main/resources/ParrotGif/will.gif rename to src/main/resources/pics/will.gif