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]
This commit is contained in:
William Muir
2017-08-29 19:13:48 +12:00
parent dc19310849
commit 201405d070
4 changed files with 80 additions and 29 deletions
@@ -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()
@@ -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<Token> 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<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values());
List<Token> 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();
@@ -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();
@@ -4,19 +4,16 @@
<RaceStartTime Start="${raceStartTime}" Postpone="False" />
<RaceID>15082901</RaceID>
<RaceType>Fleet</RaceType>
<Participants>
<#list boats as boat>
<Yacht SourceID="${boat.sourceId}"/>
</#list>
</Participants>
<Tokens>
<#list tokens as token>
<Token TokenType="${token.tokenType}" TargetLat="${token.lat?c}" TargetLng="${token.lng?c}"/>
</#list>
</Tokens>
<Course>
<CompoundMark CompoundMarkID="1" Name="Mark0">
<Mark SeqID="1" Name="Start Line 1" TargetLat="57.670603" TargetLng="11.828262" SourceID="122" />