From 201405d0700843b13bfd204b951332834f1214e3 Mon Sep 17 00:00:00 2001 From: William Muir Date: Tue, 29 Aug 2017 19:13:48 +1200 Subject: [PATCH] WIP: Marks randomly appear in course now. Mark arrows broken. Something about sending raceXML during the course of the race breaks the mark rounding arrows functionallity, crashing the game. #story[1250] --- .../java/seng302/gameServer/GameState.java | 14 +-- .../seng302/gameServer/MainServerThread.java | 90 +++++++++++++++---- .../controllers/RaceViewController.java | 2 +- .../server_config/xml_templates/race.ftlh | 3 - 4 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 89e4492c..6cc37e91 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -98,16 +98,6 @@ public class GameState implements Runnable { yachts = new HashMap<>(); tokens = new ArrayList<>(); - //TEMP TEST STUFF - // TODO: 29/08/17 wmu16 - Take this out! - tokens.add(new Token(TokenType.BOOST, 57.66946, 11.83154)); - tokens.add(new Token(TokenType.BOOST, 57.66877, 11.83382)); - tokens.add(new Token(TokenType.BOOST, 57.66914, 11.83965)); - tokens.add(new Token(TokenType.BOOST, 57.66684, 11.83214)); - ; - - //TEMP TEST STUFF - players = new ArrayList<>(); GameState.hostIpAddress = hostIpAddress; customizationFlag = false; @@ -162,6 +152,10 @@ public class GameState implements Runnable { return tokens; } + public static void clearTokens() { + tokens.clear(); + } + public static void addPlayer(Player player) { players.add(player); String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName() diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 1e37e11d..2303b0c7 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -6,12 +6,16 @@ import seng302.model.Player; import seng302.model.PolarTable; import seng302.model.ServerYacht; import seng302.model.mark.CompoundMark; +import seng302.model.stream.xml.generator.RaceXMLTemplate; +import seng302.model.token.Token; +import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; import java.io.IOException; import java.net.ServerSocket; import java.time.LocalDateTime; import java.util.*; +import seng302.utilities.XMLGenerator; /** * A class describing the overall server, which creates and collects server threads for each client @@ -48,6 +52,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { terminated = false; thread = new Thread(this, "MainServer"); startUpdatingWind(); + startSpawningTokens(); thread.start(); } @@ -141,6 +146,25 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { GameState.setWindDirection(direction.doubleValue()); } + // TODO: 29/08/17 wmu16 - This should not be in one function (init and a scheduling update) + public void startGame() { + initialiseBoatPositions(); + Timer t = new Timer(); + + t.schedule(new TimerTask() { + @Override + public void run() { + broadcastMessage(makeRaceStatusMessage()); + if (GameState.getCurrentStage() == GameStages.PRE_RACE + || GameState.getCurrentStage() == GameStages.LOBBYING) { + broadcastMessage(makeRaceStartMessage()); + } + } + }, 0, 500); + } + + + // TODO: 29/08/17 wmu16 - This sort of update should be in game state private static void startUpdatingWind(){ Timer timer = new Timer(); timer.schedule(new TimerTask() { @@ -151,6 +175,57 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { }, 0, 500); } + /** + * Start spawning coins every 60s after the first minute + */ + private void startSpawningTokens() { + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + spawnNewCoins(); + } + }, 0, 60000); + } + + /** + * Randomly select a subset of tokens from a pre defined superset + * Broadasts a new race status message to show this update + */ + private void spawnNewCoins() { + + List allTokens = new ArrayList<>(); + Token token1 = new Token(TokenType.BOOST, 57.66946, 11.83154); + Token token2 = new Token(TokenType.BOOST, 57.66877, 11.83382); + Token token3 = new Token(TokenType.BOOST, 57.66914, 11.83965); + Token token4 = new Token(TokenType.BOOST, 57.66684, 11.83214); + allTokens.add(token1); + allTokens.add(token2); + allTokens.add(token3); + allTokens.add(token4); + + GameState.clearTokens(); + Random random = new Random(); + Collections.shuffle(allTokens); + for (int i = 0; i < random.nextInt(allTokens.size() - 1); i++) { + GameState.addToken(allTokens.get(i)); + } + + XMLGenerator xmlGenerator = new XMLGenerator(); + List yachts = new ArrayList<>(GameState.getYachts().values()); + List tokens = GameState.getTokens(); + RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens); + xmlGenerator.setRaceTemplate(raceXMLTemplate); + + XMLMessage raceXMLMessage = new XMLMessage( + xmlGenerator.getRaceAsXml(), + XMLMessageSubType.RACE, + xmlGenerator.getRaceAsXml().length()); + + broadcastMessage(raceXMLMessage); + } + + static void serverLog(String message, int logLevel) { if (logLevel <= LOG_LEVEL) { @@ -203,21 +278,6 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { closedConnection.terminate(); } - public void startGame() { - initialiseBoatPositions(); - Timer t = new Timer(); - - t.schedule(new TimerTask() { - @Override - public void run() { - broadcastMessage(makeRaceStatusMessage()); - if (GameState.getCurrentStage() == GameStages.PRE_RACE || GameState.getCurrentStage() == GameStages.LOBBYING) { - broadcastMessage(makeRaceStartMessage()); - } - } - }, 0, 500); - } - private RaceStartStatusMessage makeRaceStartMessage() { Long raceStartTime = GameState.getStartTime(); diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index b5119086..e5673ca5 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -138,10 +138,10 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView)); gameView.setBoats(new ArrayList<>(participants.values())); gameView.updateBorder(raceData.getCourseLimit()); + gameView.updateTokens(raceData.getTokens()); gameView.updateCourse( new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence() ); - gameView.updateTokens(raceData.getTokens()); gameView.enableZoom(); gameView.setBoatAsPlayer(player); gameView.startRace(); diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index 081fc085..88d2e22a 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -4,19 +4,16 @@ 15082901 Fleet - <#list boats as boat> - <#list tokens as token> -