From bf016356a6c3b58f73c61d26eaaa503c9f971819 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 13:04:34 +1200 Subject: [PATCH] Finish screen now displays correctly on finishing. GameState update now checks for finishing the race Can now go back to main menu from finish screen Labeled all threads for better debugging Still need to implement race list ordering and finish screen ordering --- src/main/java/seng302/gameServer/GameState.java | 17 ++++++++++++----- .../seng302/gameServer/MainServerThread.java | 5 +++-- .../gameServer/ServerToClientThread.java | 2 +- src/main/java/seng302/model/ServerYacht.java | 14 ++------------ .../server_config/xml_templates/race.ftlh | 8 ++++++++ 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index e8d858a4..a6716807 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -89,7 +89,7 @@ public class GameState implements Runnable { markOrder = new MarkOrder(); //This could be instantiated at some point with a select map? markListeners = new ArrayList<>(); - new Thread(this).start(); //Run the auto updates on the game state + new Thread(this, "GameState").start(); //Run the auto updates on the game state marks = new MarkOrder().getAllMarks(); } @@ -184,7 +184,7 @@ public class GameState implements Runnable { @Override public void run() { - while (true) { + while (currentStage != GameStages.FINISHED) { try { Thread.sleep(1000 / STATE_UPDATES_PER_SECOND); } catch (InterruptedException e) { @@ -229,17 +229,24 @@ public class GameState implements Runnable { * Called periodically in this GameState thread to update the GameState values */ public void update() { + Boolean raceFinished = true; + Double timeInterval = (System.currentTimeMillis() - previousUpdateTime) / 1000000.0; previousUpdateTime = System.currentTimeMillis(); for (ServerYacht yacht : yachts.values()) { updateVelocity(yacht); yacht.runAutoPilot(); yacht.updateLocation(timeInterval); - if (!yacht.getFinishedRace()) { + if (yacht.getBoatStatus() != BoatStatus.FINISHED) { checkForCollision(yacht); checkForLegProgression(yacht); + raceFinished = false; } } + + if (raceFinished) { + currentStage = GameStages.FINISHED; + } } @@ -283,7 +290,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) { @@ -345,6 +352,7 @@ public class GameState implements Runnable { private void checkForLegProgression(ServerYacht yacht) { Integer currentMarkSeqID = yacht.getCurrentMarkSeqID(); CompoundMark currentMark = markOrder.getCurrentMark(currentMarkSeqID); +// System.out.println(yacht.getCurrentMarkSeqID()); Boolean hasProgressed; if (currentMarkSeqID == 0) { @@ -493,7 +501,6 @@ public class GameState implements Runnable { Boolean isClockwiseCross = GeoUtility.isClockwise(mark1, mark2, prevMark.getMidPoint()); if (crossedLine == 1 && isClockwiseCross || crossedLine == 2 && !isClockwiseCross) { yacht.setClosestCurrentMark(mark1); - yacht.setIsFinished(true); yacht.setBoatStatus(BoatStatus.FINISHED); return true; } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 8965839d..bd22063c 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,5 +1,6 @@ package seng302.gameServer; +import gherkin.lexer.Fi; import java.io.IOException; import java.net.ServerSocket; import java.time.LocalDateTime; @@ -48,7 +49,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv")); GameState.addMarkPassListener(this::broadcastMessage); terminated = false; - thread = new Thread(this); + thread = new Thread(this, "MainServer"); thread.start(); } @@ -82,7 +83,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { //FINISHED else if (GameState.getCurrentStage() == GameStages.FINISHED) { - + terminate(); } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index c8a1e3b5..bae4216c 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -88,7 +88,7 @@ public class ServerToClientThread implements Runnable, Observer { return; } - thread = new Thread(this); + thread = new Thread(this, "ServerToClient"); thread.start(); } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 2a8a8935..2f10929c 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -42,12 +42,11 @@ public class ServerYacht extends Observable { private Double autoHeading; //Mark Rounding - private Integer currentMarkSeqID = 0; + private Integer currentMarkSeqID; private Boolean hasEnteredRoundingZone; private Mark closestCurrentMark; private Boolean hasPassedLine; private Boolean hasPassedThroughGate; - private Boolean finishedRace; public ServerYacht(String boatType, Integer sourceId, String hullID, String shortName, @@ -65,11 +64,11 @@ public class ServerYacht extends Observable { this.lastLocation = location; this.heading = 120.0; //In degrees this.currentVelocity = 0d; //in mms-1 + this.currentMarkSeqID = 0; this.hasEnteredRoundingZone = false; this.hasPassedLine = false; this.hasPassedThroughGate = false; - this.finishedRace = false; } @@ -322,15 +321,6 @@ public class ServerYacht extends Observable { return boatName; } - - public void setIsFinished(Boolean isFinished) { - finishedRace = isFinished; - } - - public Boolean getFinishedRace() { - return finishedRace; - } - public Double getCurrentVelocity() { return currentVelocity; } 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 @@ + + + + + + + +