From 87d6799c108f4b50beb490cbf516058211067291 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Wed, 16 Aug 2017 20:48:37 +1200 Subject: [PATCH 1/6] Re-added wind speed & direction variations - Wind speed & direction are randomly updated - Removed two duplicate threads ;) Tags: #story[1124] --- .../java/seng302/gameServer/GameState.java | 37 ++++++++----- .../seng302/gameServer/MainServerThread.java | 52 +++++++++++++++++-- .../server/messages/RaceStatusMessage.java | 2 +- .../controllers/RaceViewController.java | 12 +++-- 4 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index c508df98..bfd05391 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -36,7 +36,6 @@ import seng302.utilities.XMLParser; * Created by wmu16 on 10/07/17. */ public class GameState implements Runnable { - @FunctionalInterface interface NewMessageListener { @@ -180,6 +179,14 @@ public class GameState implements Runnable { return windDirection; } + public static void setWindDirection(Double newWindDirection) { + windDirection = newWindDirection; + } + + public static void setWindSpeed(Double newWindSpeed) { + windSpeed = newWindSpeed; + } + public static Double getWindSpeedMMS() { return windSpeed; } @@ -250,7 +257,6 @@ public class GameState implements Runnable { } } - /** * Called periodically in this GameState thread to update the GameState values */ @@ -271,6 +277,8 @@ public class GameState implements Runnable { checkForLegProgression(yacht); raceFinished = false; } + + } if (raceFinished) { @@ -329,17 +337,20 @@ public class GameState implements Runnable { notifyMessageListeners( new YachtEventCodeMessage(serverYacht.getSourceId()) ); - } else if (checkBoundaryCollision(serverYacht)) { - serverYacht.setLocation( - calculateBounceBack(serverYacht, serverYacht.getLocation(), - BOUNCE_DISTANCE_YACHT) - ); - serverYacht.setCurrentVelocity( - serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY - ); - notifyMessageListeners( - new YachtEventCodeMessage(serverYacht.getSourceId()) - ); + } + else{ + if (checkBoundaryCollision(serverYacht)) { + serverYacht.setLocation( + calculateBounceBack(serverYacht, serverYacht.getLocation(), + BOUNCE_DISTANCE_YACHT) + ); + serverYacht.setCurrentVelocity( + serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY + ); + notifyMessageListeners( + new YachtEventCodeMessage(serverYacht.getSourceId()) + ); + } } } } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index e7e0bfc1..90d09413 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -4,10 +4,7 @@ import gherkin.lexer.Fi; import java.io.IOException; import java.net.ServerSocket; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import seng302.gameServer.server.messages.*; import seng302.model.GeoPoint; @@ -25,12 +22,17 @@ import seng302.visualiser.GameClient; public class MainServerThread implements Runnable, ClientConnectionDelegate { private static final int PORT = 4942; - private static final Integer CLIENT_UPDATES_PER_SECOND = 10; + private static final Integer CLIENT_UPDATES_PER_SECOND = 60; private static final int LOG_LEVEL = 1; private static final int WARNING_TIME = 10 * -1000; private static final int PREPATORY_TIME = 5 * -1000; public static final int TIME_TILL_START = 10 * 1000; + private static final int MAX_WIND_SPEED = 12000; + private static final int MIN_WIND_SPEED = 8000; + + public static int windSpeed = 1000; + private boolean terminated; private Thread thread; @@ -51,6 +53,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { GameState.addMarkPassListener(this::broadcastMessage); terminated = false; thread = new Thread(this, "MainServer"); + startUpdatingWind(); thread.start(); } @@ -104,6 +107,45 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { } } + private static void updateWind(){ + Integer direction = GameState.getWindDirection().intValue(); + Integer windSpeed = GameState.getWindSpeedMMS().intValue(); + + Random random = new Random(); + + if (Math.floorMod(random.nextInt(), 2) == 0){ + direction += random.nextInt(4); + windSpeed += random.nextInt(100) + 500; + } + else{ + direction -= random.nextInt(4); + windSpeed -= random.nextInt(100) + 500; + } + + direction = Math.floorMod(direction, 360); + + if (windSpeed > MAX_WIND_SPEED){ + windSpeed -= random.nextInt(1000); + } + + if (windSpeed <= MIN_WIND_SPEED){ + windSpeed += random.nextInt(1000); + } + + GameState.setWindSpeed(Double.valueOf(windSpeed)); + GameState.setWindDirection(direction.doubleValue()); + } + + private static void startUpdatingWind(){ + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + updateWind(); + } + }, 0, 500); + } + static void serverLog(String message, int logLevel) { if (logLevel <= LOG_LEVEL) { diff --git a/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java b/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java index 5cddf0bf..d0de1de7 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java +++ b/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java @@ -39,7 +39,7 @@ public class RaceStatusMessage extends Message{ this.raceId = raceId; this.raceStatus = raceStatus; this.expectedStartTime = expectedStartTime; - this.raceWindDirection = raceWindDirection * windDirFactor; + this.raceWindDirection = raceWindDirection * windDirFactor+100.0; this.windSpeed = windSpeed; this.numBoatsInRace = numBoatsInRace; this.raceType = raceType; diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index a4d2142b..f2afd3e3 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -73,6 +73,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private ComboBox yachtSelectionComboBox; @FXML private Text fpsDisplay; + @FXML + private Text windSpeedText; + //Race Data private Map participants; private Map markers; @@ -102,8 +105,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel public void loadRace ( Map participants, RaceXMLData raceData, RaceState raceState, - ClientYacht player - ) { + ClientYacht player) { this.participants = participants; this.courseData = raceData; this.markers = raceData.getCompoundMarks(); @@ -315,7 +317,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel @Override public void run() { updateRaceTime(); - updateWindDirection(); + updateWind(); updateOrder(); // updateSparkLine(); } @@ -355,9 +357,11 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** * Updates the wind direction arrow and text as from info from the StreamParser */ - private void updateWindDirection() { + private void updateWind() { windDirectionText.setText(String.format("%.1f°", raceState.getWindDirection())); windArrowText.setRotate(raceState.getWindDirection()); + + windSpeedText.setText("Speed: " + String.format("%.1f", raceState.getWindSpeed()) + " Knots"); } From db614fe8450e908b1cea89922c60248d5645b59d Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 21:16:27 +1200 Subject: [PATCH 2/6] Initial commit for Fixing order --- src/main/java/seng302/gameServer/GameState.java | 2 +- src/main/java/seng302/visualiser/GameClient.java | 4 ++++ .../controllers/FinishScreenViewController.java | 3 ++- src/main/resources/server_config/xml_templates/race.ftlh | 8 -------- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index bfd05391..83cbecd3 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -360,7 +360,7 @@ public class GameState implements Runnable { Double velocity = yacht.getCurrentVelocity(); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * 3; // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (velocity < maxBoatSpeed - 500) { diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 22559ce8..3f1af7c7 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -27,6 +27,7 @@ import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.stream.xml.parser.RegattaXMLData; import seng302.utilities.StreamParser; import seng302.utilities.XMLParser; +import seng302.visualiser.controllers.FinishScreenViewController; import seng302.visualiser.controllers.LobbyController; import seng302.visualiser.controllers.LobbyController.CloseStatus; import seng302.visualiser.controllers.RaceViewController; @@ -195,6 +196,9 @@ public class GameClient { } catch (IOException e) { e.printStackTrace(); } + + FinishScreenViewController controller = fxmlLoader.getController(); + controller.setFinishers(allBoatsMap.values()); } private void parsePackets() { diff --git a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java index a4dc831b..bf518d29 100644 --- a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java @@ -3,6 +3,7 @@ package seng302.visualiser.controllers; import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.ResourceBundle; @@ -61,7 +62,7 @@ public class FinishScreenViewController implements Initializable { finishOrderTable.refresh(); } - public void setFinishers(List participants) { + public void setFinishers(Collection participants) { List sorted = new ArrayList<>(participants); sorted.sort(Comparator.comparingInt(ClientYacht::getPositionInteger)); finishOrderTable.getItems().setAll(sorted); diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index e38bf0b7..08d148e2 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -35,14 +35,6 @@ - - - - - - - - From 9727e86249e37facb0b36862d1672433f9218dd9 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 22:40:32 +1200 Subject: [PATCH 3/6] Merge remote-tracking branch 'origin/story1118_map_arrows' into 1124_Fixing_Order_And_Finish_Screen # Conflicts: # src/main/java/seng302/gameServer/MainServerThread.java # src/main/java/seng302/visualiser/GameClient.java # src/main/java/seng302/visualiser/controllers/RaceViewController.java # src/main/resources/server_config/xml_templates/race.ftlh --- .../java/seng302/gameServer/GameState.java | 1 + .../seng302/gameServer/MainServerThread.java | 3 ++- src/main/java/seng302/model/RaceState.java | 20 +++++++++++++++++ src/main/java/seng302/model/ServerYacht.java | 9 ++++++++ .../java/seng302/utilities/StreamParser.java | 5 ----- .../java/seng302/visualiser/GameClient.java | 13 ++++------- .../controllers/RaceViewController.java | 22 +++++++++++-------- 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 83cbecd3..c1562e87 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -444,6 +444,7 @@ public class GameState implements Runnable { yacht.setHasPassedThroughGate(false); if (!markOrder.isLastMark(currentMarkSeqID)) { yacht.incrementMarkSeqID(); + yacht.incrementLegNumber(); } } } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 90d09413..fc4649fd 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -227,7 +227,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { for (Player player : GameState.getPlayers()) { ServerYacht y = player.getYacht(); - BoatSubMessage m = new BoatSubMessage(y.getSourceId(), y.getBoatStatus(), 0, + BoatSubMessage m = new BoatSubMessage(y.getSourceId(), y.getBoatStatus(), + y.getLegNumber(), 0, 0, 1234L, 1234L); boatSubMessages.add(m); diff --git a/src/main/java/seng302/model/RaceState.java b/src/main/java/seng302/model/RaceState.java index d4e71971..cd62428f 100644 --- a/src/main/java/seng302/model/RaceState.java +++ b/src/main/java/seng302/model/RaceState.java @@ -2,7 +2,13 @@ package seng302.model; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Observable; import java.util.TimeZone; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import seng302.model.stream.parser.RaceStartData; import seng302.model.stream.parser.RaceStatusData; @@ -21,8 +27,10 @@ public class RaceState { private long expectedStartTime; private boolean isRaceStarted = false; long timeTillStart; + private ObservableList playerPositions; public RaceState() { + playerPositions = FXCollections.observableArrayList(); } public void updateState (RaceStatusData data) { @@ -69,4 +77,16 @@ public class RaceState { public boolean isRaceStarted () { return isRaceStarted; } + + public void setBoats(Collection clientYachts) { + playerPositions.setAll(clientYachts); + } + + public void sortPlayers() { + playerPositions.sort(Comparator.comparingInt(ClientYacht::getLegNumber)); + } + + public ObservableList getPlayerPositions() { + return FXCollections.unmodifiableObservableList(playerPositions); + } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 40721137..296f731f 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -40,6 +40,7 @@ public class ServerYacht extends Observable { private Double currentVelocity; private Boolean isAuto; private Double autoHeading; + private Integer legNumber; //Mark Rounding private Integer currentMarkSeqID; @@ -65,6 +66,7 @@ public class ServerYacht extends Observable { this.heading = 120.0; //In degrees this.currentVelocity = 0d; //in mms-1 this.currentMarkSeqID = 0; + this.legNumber = 0; this.hasEnteredRoundingZone = false; this.hasPassedLine = false; @@ -381,5 +383,12 @@ public class ServerYacht extends Observable { return hasPassedLine; } + public void incrementLegNumber() { + legNumber++; + } + + public Integer getLegNumber() { + return legNumber; + } } diff --git a/src/main/java/seng302/utilities/StreamParser.java b/src/main/java/seng302/utilities/StreamParser.java index 304b105d..dccc3ccb 100644 --- a/src/main/java/seng302/utilities/StreamParser.java +++ b/src/main/java/seng302/utilities/StreamParser.java @@ -95,13 +95,8 @@ public class StreamParser { boatID = bytesToLong( Arrays.copyOfRange(payload, 24 + (i * 20), 28 + (i * 20))); boatStatus = (int) payload[28 + (i * 20)]; - -// setBoatLegPosition(boat, (int) payload[29 + (i * 20)]); -// boat.setPenaltiesAwarded((int) payload[30 + (i * 20)]); -// boat.setPenaltiesServed((int) payload[31 + (i * 20)]); estTimeAtNextMark = bytesToLong( Arrays.copyOfRange(payload, 32 + (i * 20), 38 + (i * 20))); -// boat.setEstimateTimeTillNextMark(estTimeAtNextMark); estTimeAtFinish = bytesToLong( Arrays.copyOfRange(payload, 38 + (i * 20), 44 + (i * 20))); leg = (int) payload[29 + (i * 20)]; diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 3f1af7c7..2c5c07c9 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -243,6 +243,7 @@ public class GameClient { allBoatsMap.forEach((id, boat) -> clientLobbyList.add(id + " " + boat.getBoatName()) ); + raceState.setBoats(allBoatsMap.values()); break; case RACE_START_STATUS: @@ -323,7 +324,7 @@ public class GameClient { raceFinished = false; } } - if (raceFinished == true) { + if (raceFinished) { close(); loadFinishScreenView(); } @@ -333,16 +334,10 @@ public class GameClient { clientYacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); clientYacht.setEstimateTimeAtFinish(boatData[2]); int legNumber = (int) boatData[3]; - clientYacht.setLegNumber(legNumber); clientYacht.setBoatStatus((int) boatData[4]); if (legNumber != clientYacht.getLegNumber()) { - int placing = 1; - for (ClientYacht otherClientYacht : allBoatsMap.values()) { - if (otherClientYacht.getSourceId() != boatData[0] && - clientYacht.getLegNumber() <= otherClientYacht.getLegNumber()) - placing++; - } - clientYacht.setPositionInteger(placing); + clientYacht.setLegNumber(legNumber); + raceState.sortPlayers(); } } } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index f2afd3e3..85051ca1 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -11,6 +11,8 @@ import java.util.concurrent.TimeUnit; import javafx.animation.Timeline; import javafx.application.Platform; import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Point2D; @@ -117,6 +119,15 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel initialiseBoatSelectionComboBox(); initialiseSparkLine(); + raceState.getPlayerPositions().addListener((ListChangeListener) c -> { + while (c.next()) { + if (c.wasPermutated()) { + updateOrder(raceState.getPlayerPositions()); + } + } + }); + + updateOrder(raceState.getPlayerPositions()); gameView = new GameView(); gameView.setFrameRateFXText(fpsDisplay); Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView)); @@ -318,7 +329,6 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel public void run() { updateRaceTime(); updateWind(); - updateOrder(); // updateSparkLine(); } }, 0, 1000); @@ -381,16 +391,10 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel * Updates the order of the yachts as from the StreamParser and sets them in the yacht order * section */ - private void updateOrder() { -// positionVbox.getChildren().removeAll(); -// positionVbox.getStylesheets().add(getClass().getResource("/css/master.css").toString()); - - // list of racing yacht id - List sorted = new ArrayList<>(participants.values()); - sorted.sort(Comparator.comparingInt(ClientYacht::getPositionInteger)); + private void updateOrder(ObservableList yachts) { List vboxEntries = new ArrayList<>(); - for (ClientYacht clientYacht : sorted) { + for (ClientYacht clientYacht : yachts) { // System.out.println("yacht == null " + String.valueOf(yacht == null)); if (clientYacht.getBoatStatus() == 3) { // 3 is finish status Text textToAdd = new Text(clientYacht.getPositionInteger() + ". " + From 65286f273b996f4cc052e004a23b2c2b7f3a733e Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 23:22:58 +1200 Subject: [PATCH 4/6] Working ordering for in game AND race finish screen. List in RaceState holds a sorted list of yachts. A Listener is added to this list, listening for a permutation change, on perm change, sorts the list by comparitor of leg number of each yacht (stable sort) --- src/main/java/seng302/gameServer/GameState.java | 2 +- src/main/java/seng302/model/RaceState.java | 5 +++-- src/main/java/seng302/visualiser/GameClient.java | 7 ++++++- .../visualiser/controllers/RaceViewController.java | 12 ++++++------ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index c1562e87..5201862e 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -437,6 +437,7 @@ public class GameState implements Runnable { } if (hasProgressed) { + yacht.incrementLegNumber(); sendMarkRoundingMessage(yacht); logMarkRounding(yacht); yacht.setHasPassedLine(false); @@ -444,7 +445,6 @@ public class GameState implements Runnable { yacht.setHasPassedThroughGate(false); if (!markOrder.isLastMark(currentMarkSeqID)) { yacht.incrementMarkSeqID(); - yacht.incrementLegNumber(); } } } diff --git a/src/main/java/seng302/model/RaceState.java b/src/main/java/seng302/model/RaceState.java index cd62428f..2bb60220 100644 --- a/src/main/java/seng302/model/RaceState.java +++ b/src/main/java/seng302/model/RaceState.java @@ -83,10 +83,11 @@ public class RaceState { } public void sortPlayers() { - playerPositions.sort(Comparator.comparingInt(ClientYacht::getLegNumber)); + playerPositions.sort((yacht1, yacht2) -> Integer.compare(yacht2.getLegNumber(), + yacht1.getLegNumber())); } public ObservableList getPlayerPositions() { - return FXCollections.unmodifiableObservableList(playerPositions); + return playerPositions; } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 2c5c07c9..e056edd7 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -198,7 +198,7 @@ public class GameClient { } FinishScreenViewController controller = fxmlLoader.getController(); - controller.setFinishers(allBoatsMap.values()); + controller.setFinishers(raceState.getPlayerPositions()); } private void parsePackets() { @@ -338,6 +338,11 @@ public class GameClient { if (legNumber != clientYacht.getLegNumber()) { clientYacht.setLegNumber(legNumber); raceState.sortPlayers(); +// System.out.println("ORDER:"); +// for (ClientYacht clientYacht1 : raceState.getPlayerPositions()) { +// System.out.println(clientYacht1.getShortName()); +// } +// System.out.println(); } } } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 85051ca1..f0bf2688 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -394,17 +394,17 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private void updateOrder(ObservableList yachts) { List vboxEntries = new ArrayList<>(); - for (ClientYacht clientYacht : yachts) { + for (int i = 0; i < yachts.size(); i++) { // System.out.println("yacht == null " + String.valueOf(yacht == null)); - if (clientYacht.getBoatStatus() == 3) { // 3 is finish status - Text textToAdd = new Text(clientYacht.getPositionInteger() + ". " + - clientYacht.getShortName() + " (Finished)"); + if (yachts.get(i).getBoatStatus() == 3) { // 3 is finish status + Text textToAdd = new Text(i + 1 + ". " + + yachts.get(i).getShortName() + " (Finished)"); textToAdd.setFill(Paint.valueOf("#d3d3d3")); vboxEntries.add(textToAdd); } else { - Text textToAdd = new Text(clientYacht.getPositionInteger() + ". " + - clientYacht.getShortName() + " "); + Text textToAdd = new Text(i + 1 + ". " + + yachts.get(i).getShortName() + " "); textToAdd.setFill(Paint.valueOf("#d3d3d3")); textToAdd.setStyle(""); vboxEntries.add(textToAdd); From a59d06fbbf41dd75ce34ddd743a3a997debb20f3 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 23:36:45 +1200 Subject: [PATCH 5/6] Finish screen --- src/main/java/seng302/model/ClientYacht.java | 11 ++++++-- .../java/seng302/visualiser/GameClient.java | 26 +++++++++++-------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index ff544482..3a609024 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -31,13 +31,13 @@ public class ClientYacht extends Observable { private Logger logger = LoggerFactory.getLogger(ClientYacht.class); - //BOTH AFAIK private String boatType; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; private String boatName; private String country; + private Integer position; private Long estimateTimeAtFinish; private Boolean sailIn = true; @@ -50,7 +50,6 @@ public class ClientYacht extends Observable { private Integer boatStatus; private Double currentVelocity; - //CLIENT SIDE private List locationListeners = new ArrayList<>(); private ReadOnlyDoubleWrapper velocityProperty = new ReadOnlyDoubleWrapper(); private ReadOnlyLongWrapper timeTillNextProperty = new ReadOnlyLongWrapper(); @@ -189,6 +188,14 @@ public class ClientYacht extends Observable { return location; } + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + public void toggleSail() { sailIn = !sailIn; } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index e056edd7..eb25e53a 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -15,6 +15,7 @@ import javafx.scene.layout.Pane; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; import seng302.gameServer.server.messages.BoatAction; +import seng302.gameServer.server.messages.BoatStatus; import seng302.model.ClientYacht; import seng302.model.RaceState; import seng302.model.stream.packets.StreamPacket; @@ -320,14 +321,10 @@ public class GameClient { } boolean raceFinished = true; for (ClientYacht yacht : allBoatsMap.values()) { - if (yacht.getBoatStatus() != 3) { + if (yacht.getBoatStatus() != BoatStatus.FINISHED.getCode()) { raceFinished = false; } } - if (raceFinished) { - close(); - loadFinishScreenView(); - } for (long[] boatData : data.getBoatData()) { ClientYacht clientYacht = allBoatsMap.get((int) boatData[0]); @@ -337,14 +334,21 @@ public class GameClient { clientYacht.setBoatStatus((int) boatData[4]); if (legNumber != clientYacht.getLegNumber()) { clientYacht.setLegNumber(legNumber); - raceState.sortPlayers(); -// System.out.println("ORDER:"); -// for (ClientYacht clientYacht1 : raceState.getPlayerPositions()) { -// System.out.println(clientYacht1.getShortName()); -// } -// System.out.println(); + updatePlayerPositions(); } } + + if (raceFinished) { + close(); + loadFinishScreenView(); + } + } + } + + private void updatePlayerPositions() { + raceState.sortPlayers(); + for (ClientYacht yacht : raceState.getPlayerPositions()) { + yacht.setPosition(raceState.getPlayerPositions().indexOf(yacht) + 1); } } From 4596f1e0f871ea6aba5e4ef264c72b3105743e12 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 23:42:07 +1200 Subject: [PATCH 6/6] Finish screen all done, updates during race tags: #story[1124] #pair[wmu16, cir27] --- src/main/java/seng302/gameServer/GameState.java | 2 +- src/main/resources/server_config/xml_templates/race.ftlh | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 5201862e..f7dcbe30 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -360,7 +360,7 @@ public class GameState implements Runnable { Double velocity = yacht.getCurrentVelocity(); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * 3; + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (velocity < maxBoatSpeed - 500) { diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index 08d148e2..e38bf0b7 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -35,6 +35,14 @@ + + + + + + + +