From a56dac1e87777ea96e61076dd08cba2d4edf010b Mon Sep 17 00:00:00 2001 From: William Muir Date: Tue, 25 Jul 2017 22:19:03 +1200 Subject: [PATCH] Polar velocities should now work as intended. Snapping to VMG still needs to be implemented. Still an issue of not being able to pass the total upwind or downwind point tags: #story[986] --- .../seng302/fxObjects/BoatAnnotations.java | 2 +- .../java/seng302/gameServer/GameState.java | 21 ++++++---- .../gameServer/ServerToClientThread.java | 14 ++----- src/main/java/seng302/models/Yacht.java | 40 +++++++++++++------ .../server/messages/BoatLocationMessage.java | 1 - 5 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/main/java/seng302/fxObjects/BoatAnnotations.java b/src/main/java/seng302/fxObjects/BoatAnnotations.java index c8848418..26931ce9 100644 --- a/src/main/java/seng302/fxObjects/BoatAnnotations.java +++ b/src/main/java/seng302/fxObjects/BoatAnnotations.java @@ -83,7 +83,7 @@ public class BoatAnnotations extends Group{ } void update () { - velocityObject.setText(String.format(String.format("%.2f m/s", boat.getVelocity()))); + velocityObject.setText(String.format(String.format("%.2f m/s", boat.getVelocityMMS()))); if (boat.getTimeTillNext() != null) { DateFormat format = new SimpleDateFormat("mm:ss"); diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 90c649ca..326caf52 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -2,6 +2,7 @@ package seng302.gameServer; import java.util.*; +import seng302.client.ClientPacketParser; import seng302.models.Player; import seng302.models.Yacht; @@ -80,10 +81,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; } @@ -93,6 +98,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; @@ -118,12 +124,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 0fd3768f..5931aa40 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -12,10 +12,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; -import java.util.Random; import java.util.zip.CRC32; import java.util.zip.Checksum; -import org.apache.commons.io.IOUtils; + import seng302.models.Player; import seng302.models.Yacht; import seng302.models.stream.packets.PacketType; @@ -29,18 +28,11 @@ import seng302.server.messages.BoatStatus; import seng302.server.messages.BoatSubMessage; import seng302.server.messages.Message; -import java.io.*; -import java.net.Socket; -import java.util.zip.CRC32; -import java.util.zip.Checksum; import seng302.server.messages.RaceStatus; import seng302.server.messages.RaceStatusMessage; import seng302.server.messages.RaceType; import seng302.server.messages.XMLMessage; import seng302.server.messages.XMLMessageSubType; -import seng302.server.messages.XMLMessage; -import seng302.server.messages.XMLMessageSubType; -import seng302.utilities.GeoPoint; /** * A class describing a single connection to a Client for the purposes of sending and receiving on @@ -306,7 +298,7 @@ public class ServerToClientThread implements Runnable, Observer { yacht.getLocation().getLat(), yacht.getLocation().getLng(), yacht.getHeading(), - (long) yacht.getVelocity()); + (long) yacht.getVelocityMMS()); sendMessage(boatLocationMessage); } @@ -348,7 +340,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/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 443c9e55..5cb9b837 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -4,6 +4,7 @@ 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; @@ -110,8 +111,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,13 +121,14 @@ 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 / ClientPacketParser.MS_TO_KNOTS * 3000; - //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; } } @@ -136,13 +138,16 @@ public class Yacht { } 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() { @@ -150,7 +155,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); @@ -171,7 +177,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); @@ -191,6 +198,11 @@ 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; @@ -294,10 +306,14 @@ public class Yacht { this.markRoundTime = markRoundingTime; } - public double getVelocity() { + public double getVelocityMMS() { return velocity; } + public Double getVelocityKnots() { + return velocity / 1000 * ClientPacketParser.MS_TO_KNOTS; + } + public Long getTimeTillNext() { return timeTillNext; } 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;