diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 2f8f4e4a..4ff9f82c 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -13,9 +13,6 @@ import org.slf4j.LoggerFactory; import seng302.discoveryServer.DiscoveryServer; import seng302.visualiser.controllers.ViewManager; -import java.util.Timer; -import java.util.TimerTask; - public class App extends Application { private static Logger logger = LoggerFactory.getLogger(App.class); @@ -95,15 +92,12 @@ public class App extends Application { } public static void main(String[] args) throws Exception { - /* - * Do not trust Java to do garbage collection - */ - new Timer().schedule(new TimerTask() { - @Override - public void run() { - System.gc(); - } - }, 0, 1_000); +// new Timer().schedule(new TimerTask() { +// @Override +// public void run() { +// System.gc(); +// } +// }, 0, 1_000); try { parseArgs(args); diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index c279c363..fadef0f8 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -11,6 +11,7 @@ import java.util.Random; import java.util.Set; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.CopyOnWriteArrayList; import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.scene.paint.Color; import org.slf4j.Logger; @@ -98,7 +99,7 @@ public class GameState implements Runnable { private static long startTime; private static Set marks = new HashSet<>(); private static List courseLimit = new ArrayList<>(); - private static Integer maxPlayers = 8; + private static Integer maxPlayers = 12; private static List tokensInPlay; private static RandomSpawn randomSpawn; @@ -113,7 +114,7 @@ public class GameState implements Runnable { windDirectionProperty.set(windDirection); windSpeed = 10000d; yachts = new HashMap<>(); - tokensInPlay = new ArrayList<>(); + tokensInPlay = new CopyOnWriteArrayList<>(); players = new ArrayList<>(); customizationFlag = false; playerHasLeftFlag = false; @@ -123,7 +124,7 @@ public class GameState implements Runnable { newMessageListeners = new ArrayList<>(); resetStartTime(); - //setCourseLimit("/server_config/race.xml"); + new Thread(this, "GameState").start(); //Run the auto updates on the game state } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 63acf89a..e87cf128 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -284,13 +284,13 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { private void initialiseBoatPositions() { final double DISTANCE_TO_START = 75d; - final double YACHT_SEPARATION = 20d; + final double YACHT_SEPARATION = 35d; //Length of start line double startLineLength = GeoUtility.getDistance( GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1), GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2) - ); + ) - YACHT_SEPARATION; //How many yachts can fit along the start line int spacesAlongLine = (int) Math.round(startLineLength / YACHT_SEPARATION); @@ -312,7 +312,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint() ); - GeoPoint startingPoint = GeoUtility.getGeoCoordinate( + GeoPoint midPoint = GeoUtility.getGeoCoordinate( GameState.getMarkOrder().getMarkOrder().get(0).getMidPoint(), angleToStart, DISTANCE_TO_START ); @@ -321,26 +321,24 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { Collections.shuffle(randomisedYachts); while (randomisedYachts.size() > 0) { - int numYachtsInLine = - spacesAlongLine > randomisedYachts.size() ? randomisedYachts.size() - : spacesAlongLine; - double yachtSpace = numYachtsInLine * YACHT_SEPARATION / 2; + int numYachts = spacesAlongLine > randomisedYachts.size() ? randomisedYachts.size() : spacesAlongLine; + double yachtSpace = (numYachts - 1) * YACHT_SEPARATION / 2; GeoPoint firstYachtPoint = GeoUtility.getGeoCoordinate( - startingPoint, startMarkToMarkAngle + 180, yachtSpace + midPoint, startMarkToMarkAngle + 180, yachtSpace ); - for (int i = 0; i < numYachtsInLine; i++) { + for (int i = 0; i < numYachts; i++) { randomisedYachts.get(0).setHeading(angleFromStart); randomisedYachts.get(0).setLocation(firstYachtPoint); firstYachtPoint = GeoUtility.getGeoCoordinate( - firstYachtPoint, startMarkToMarkAngle, yachtSpace + firstYachtPoint, startMarkToMarkAngle, YACHT_SEPARATION ); randomisedYachts.remove(0); } - startingPoint = GeoUtility.getGeoCoordinate( - startingPoint, angleToStart, DISTANCE_TO_START + midPoint = GeoUtility.getGeoCoordinate( + midPoint, angleToStart, YACHT_SEPARATION * 1.5 ); } } diff --git a/src/main/java/seng302/visualiser/MapPreview.java b/src/main/java/seng302/visualiser/MapPreview.java index 9725e526..56bda7c7 100644 --- a/src/main/java/seng302/visualiser/MapPreview.java +++ b/src/main/java/seng302/visualiser/MapPreview.java @@ -206,7 +206,7 @@ public class MapPreview extends GameView { } GeoPoint secondToLastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); for (Mark mark : course.get(course.size()-1).getMarks()) { - markerObjects.get(mark).addArrows( + markerObjects.get(mark).addFinishArrow( mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT, GeoUtility.getBearing(secondToLastMarkAv, mark), GeoUtility.getBearing(mark, mark) diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 9035085d..6ab3d9e4 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -5,14 +5,12 @@ import com.jfoenix.controls.JFXDialog; import java.io.IOException; import java.net.URL; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.collections.ListChangeListener; -import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -20,7 +18,6 @@ import javafx.geometry.Point3D; import javafx.scene.Group; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; -import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; @@ -43,7 +40,6 @@ import seng302.utilities.Sounds; import seng302.visualiser.MapPreview; import seng302.visualiser.controllers.cells.PlayerCell; import seng302.visualiser.controllers.dialogs.BoatCustomizeController; -import seng302.visualiser.controllers.dialogs.PopupDialogController; import seng302.visualiser.controllers.dialogs.TokenInfoDialogController; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; import seng302.visualiser.fxObjects.assets_3D.ModelType; @@ -357,8 +353,8 @@ public class LobbyController implements Initializable { } /** - * - * @param raceState + * Updates the state of the race and changes the value + * @param raceState the new race state */ public void updateRaceState(RaceState raceState){ this.raceState = raceState; diff --git a/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java index a5d8175b..48fad862 100644 --- a/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java @@ -86,16 +86,6 @@ public class MarkArrowFactory { */ public static Group constructEntryArrow (RoundingSide roundingSide, double angleOfEntry, double angleOfExit, Paint colour) { - // Check to see if the the angle around mark would take you inside of it. (less than 180) - // If so make interior angle. - if (roundingSide == RoundingSide.PORT && angleOfEntry < angleOfExit && - Math.abs(angleOfExit - angleOfEntry) < 180) { - return makeInteriorAngle(roundingSide, angleOfExit, angleOfEntry, colour); - - } else if (roundingSide == RoundingSide.STARBOARD && angleOfEntry > angleOfExit && - -Math.abs(angleOfEntry - angleOfExit) > -180) { - return makeInteriorAngle(roundingSide, angleOfExit, angleOfEntry, colour); - } //Create regular exit arrow. Group arrow = new Group(); Group exitSection = constructExitArrow(roundingSide, angleOfExit, colour); @@ -132,7 +122,9 @@ public class MarkArrowFactory { * @param colour colour of arrow * @return the arrow. */ - private static Group makeInteriorAngle (RoundingSide roundingSide, double angleOfExit, double angleOfEntry, Paint colour) { + public static Group constructInteriorArrow(RoundingSide roundingSide, double angleOfExit, + double angleOfEntry, Paint colour) { + Group arrow = new Group(); Polygon lineSegment; //Reverse angle of exit/entry to find position between them diff --git a/src/main/java/seng302/visualiser/fxObjects/Marker.java b/src/main/java/seng302/visualiser/fxObjects/Marker.java index 53dcda32..6c6a1280 100644 --- a/src/main/java/seng302/visualiser/fxObjects/Marker.java +++ b/src/main/java/seng302/visualiser/fxObjects/Marker.java @@ -16,6 +16,9 @@ public abstract class Marker extends Group{ protected int exitArrowIndex = 0; public abstract void addArrows(RoundingSide roundingSide, double entryAngle, double exitAngle); + + public abstract void addFinishArrow(RoundingSide roundingSide, double entryAngle, double exitAngle); + /** * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. */ diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java index e32023dc..f8ffa5d5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java @@ -7,6 +7,7 @@ import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.MarkArrowFactory.RoundingSide; import seng302.visualiser.fxObjects.Marker; /** @@ -57,6 +58,14 @@ public class Marker2D extends Marker { ); } + @Override + public void addFinishArrow(RoundingSide roundingSide, double entryAngle, double exitAngle){ + enterArrows.add( + MarkArrowFactory.constructInteriorArrow(roundingSide, entryAngle, exitAngle, Color.RED) + ); + exitArrows.add(new Group()); + } + /** * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows * become hidden. diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java index aa2420e1..8031cf41 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java @@ -55,6 +55,16 @@ public class Marker3D extends Marker { ); } + public void addFinishArrow(RoundingSide roundingSide, double entryAngle, + double exitAngle) { + enterArrows.add( + MarkArrowFactory.constructEntryArrow3D(roundingSide, entryAngle, ModelType.FINISH_ARROW).getAssets() + ); + exitArrows.add( + MarkArrowFactory.constructExitArrow3D(roundingSide, exitAngle, ModelType.FINISH_ARROW).getAssets() + ); + } + @Override protected void showArrow(List arrowList, int arrowListIndex) { if (arrowListIndex < arrowList.size()) { diff --git a/src/main/resources/maps/default.xml b/src/main/resources/maps/default.xml index 5d3da318..467bc0cf 100644 --- a/src/main/resources/maps/default.xml +++ b/src/main/resources/maps/default.xml @@ -6,7 +6,7 @@ 57.6679590 11.8503233 - 10 + 8 diff --git a/src/main/resources/maps/horseshoe.xml b/src/main/resources/maps/horseshoe.xml index e3124406..ec36ffa2 100644 --- a/src/main/resources/maps/horseshoe.xml +++ b/src/main/resources/maps/horseshoe.xml @@ -6,7 +6,7 @@ -14.6457 47.612855 - 5 + 8 diff --git a/src/main/resources/maps/loop.xml b/src/main/resources/maps/loop.xml index 008a58ce..fdc4368b 100644 --- a/src/main/resources/maps/loop.xml +++ b/src/main/resources/maps/loop.xml @@ -6,7 +6,7 @@ 57.6679590 11.8503233 - 5 + 8 diff --git a/src/main/resources/maps/madagascar.xml b/src/main/resources/maps/madagascar.xml index 37113567..e2cf893e 100644 --- a/src/main/resources/maps/madagascar.xml +++ b/src/main/resources/maps/madagascar.xml @@ -6,7 +6,7 @@ -15.67707 49.79338 - 10 + 5 diff --git a/src/main/resources/maps/waiheke.xml b/src/main/resources/maps/waiheke.xml index 41598416..5b009f55 100644 --- a/src/main/resources/maps/waiheke.xml +++ b/src/main/resources/maps/waiheke.xml @@ -6,7 +6,7 @@ -36.80008 175.012225 - 10 + 6 @@ -32,13 +32,13 @@ - + - - + + @@ -47,14 +47,14 @@ - - + + - - + + diff --git a/src/main/resources/views/LobbyView.fxml b/src/main/resources/views/LobbyView.fxml index 432fd4e7..fceb85bb 100644 --- a/src/main/resources/views/LobbyView.fxml +++ b/src/main/resources/views/LobbyView.fxml @@ -1,25 +1,12 @@ - - - + + - - - - - - - - - - - - diff --git a/src/main/resources/views/ServerListView.fxml b/src/main/resources/views/ServerListView.fxml index 966bd240..30713dab 100644 --- a/src/main/resources/views/ServerListView.fxml +++ b/src/main/resources/views/ServerListView.fxml @@ -6,18 +6,7 @@ - - - - - - - - - - - - +