Minor refactor moving Spawning and token creation to game state

#story[1250]
This commit is contained in:
William Muir
2017-09-09 13:11:44 +12:00
parent 1a755cec33
commit 8ba28ffda0
3 changed files with 40 additions and 45 deletions
+37 -18
View File
@@ -1,10 +1,12 @@
package seng302.gameServer; package seng302.gameServer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.Set; import java.util.Set;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
@@ -74,7 +76,6 @@ public class GameState implements Runnable {
private static String hostIpAddress; private static String hostIpAddress;
private static List<Player> players; private static List<Player> players;
private static Map<Integer, ServerYacht> yachts; private static Map<Integer, ServerYacht> yachts;
private static List<Token> tokens;
private static Boolean isRaceStarted; private static Boolean isRaceStarted;
private static GameStages currentStage; private static GameStages currentStage;
private static MarkOrder markOrder; private static MarkOrder markOrder;
@@ -82,6 +83,9 @@ public class GameState implements Runnable {
private static Set<Mark> marks; private static Set<Mark> marks;
private static List<Limit> courseLimit; private static List<Limit> courseLimit;
private static List<Token> allTokens;
private static List<Token> tokensInPlay;
private static List<NewMessageListener> markListeners; private static List<NewMessageListener> markListeners;
private static Map<Player, String> playerStringMap = new HashMap<>(); private static Map<Player, String> playerStringMap = new HashMap<>();
@@ -89,9 +93,8 @@ public class GameState implements Runnable {
public GameState(String hostIpAddress) { public GameState(String hostIpAddress) {
windDirection = 180d; windDirection = 180d;
windSpeed = 10000d; windSpeed = 10000d;
this.hostIpAddress = hostIpAddress;
yachts = new HashMap<>(); yachts = new HashMap<>();
tokens = new ArrayList<>(); tokensInPlay = new ArrayList<>();
players = new ArrayList<>(); players = new ArrayList<>();
GameState.hostIpAddress = hostIpAddress; GameState.hostIpAddress = hostIpAddress;
@@ -103,6 +106,7 @@ public class GameState implements Runnable {
previousUpdateTime = System.currentTimeMillis(); previousUpdateTime = System.currentTimeMillis();
markOrder = new MarkOrder(); //This could be instantiated at some point with a select map? markOrder = new MarkOrder(); //This could be instantiated at some point with a select map?
markListeners = new ArrayList<>(); markListeners = new ArrayList<>();
allTokens = makeTokens();
resetStartTime(); resetStartTime();
@@ -127,6 +131,21 @@ public class GameState implements Runnable {
courseLimit = XMLParser.parseRace(document).getCourseLimit(); courseLimit = XMLParser.parseRace(document).getCourseLimit();
} }
/**
* Make a pre defined set of tokensInPlay. //TODO wmu16 - Should read from some file for each
* race ideally
*
* @return A list of possible tokensInPlay for this race
*/
private ArrayList<Token> makeTokens() {
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);
return new ArrayList<>(Arrays.asList(token1, token2, token3, token4));
}
public static String getHostIpAddress() { public static String getHostIpAddress() {
return hostIpAddress; return hostIpAddress;
} }
@@ -139,16 +158,8 @@ public class GameState implements Runnable {
return players; return players;
} }
public static void addToken(Token token) { public static List<Token> getTokensInPlay() {
tokens.add(token); return tokensInPlay;
}
public static List<Token> getTokens() {
return tokens;
}
public static void clearTokens() {
tokens.clear();
} }
public static void addPlayer(Player player) { public static void addPlayer(Player player) {
@@ -277,6 +288,16 @@ public class GameState implements Runnable {
} }
} }
/**
* Randomly select a subset of tokensInPlay from a pre defined superset
* Broadasts a new race status message to show this update
*/
public static void spawnNewToken() {
Random random = new Random();
tokensInPlay.clear();
tokensInPlay.add(allTokens.get(random.nextInt(allTokens.size())));
}
/** /**
* Called periodically in this GameState thread to update the GameState values * Called periodically in this GameState thread to update the GameState values
*/ */
@@ -299,8 +320,6 @@ public class GameState implements Runnable {
checkForLegProgression(yacht); checkForLegProgression(yacht);
raceFinished = false; raceFinished = false;
} }
} }
if (raceFinished) { if (raceFinished) {
@@ -340,15 +359,15 @@ public class GameState implements Runnable {
} }
/** /**
* Checks all tokens to see if a yacht has picked one up * Checks all tokensInPlay to see if a yacht has picked one up
* *
* @param serverYacht The yacht to check for * @param serverYacht The yacht to check for
*/ */
private void checkTokenPickUp(ServerYacht serverYacht) { private void checkTokenPickUp(ServerYacht serverYacht) {
for (Token token : tokens) { for (Token token : tokensInPlay) {
Double distance = GeoUtility.getDistance(token, serverYacht.getLocation()); Double distance = GeoUtility.getDistance(token, serverYacht.getLocation());
if (distance < YACHT_COLLISION_DISTANCE) { if (distance < YACHT_COLLISION_DISTANCE) {
tokens.remove(token); tokensInPlay.remove(token);
serverYacht.powerUp(token.getTokenType()); serverYacht.powerUp(token.getTokenType());
logger.debug("Yacht: " + serverYacht.getShortName() + " got powerup " + token logger.debug("Yacht: " + serverYacht.getShortName() + " got powerup " + token
.getTokenType()); .getTokenType());
@@ -185,36 +185,12 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
timer.schedule(new TimerTask() { timer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
spawnNewCoins(); GameState.spawnNewToken();
broadcastMessage(MessageFactory.getRaceXML()); broadcastMessage(MessageFactory.getRaceXML());
} }
}, 0, 60000); }, 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()); i++) {
GameState.addToken(allTokens.get(i));
}
}
/** /**
* A client has tried to connect to the server * A client has tried to connect to the server
* *
@@ -96,7 +96,7 @@ public class MessageFactory {
public static XMLMessage getRaceXML() { public static XMLMessage getRaceXML() {
List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values()); List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values());
List<Token> tokens = GameState.getTokens(); List<Token> tokens = GameState.getTokensInPlay();
RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens); RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens);
xmlGenerator.setRaceTemplate(raceXMLTemplate); xmlGenerator.setRaceTemplate(raceXMLTemplate);
@@ -124,7 +124,7 @@ public class MessageFactory {
public static XMLMessage getBoatXML() { public static XMLMessage getBoatXML() {
List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values()); List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values());
List<Token> tokens = GameState.getTokens(); List<Token> tokens = GameState.getTokensInPlay();
RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens); RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens);
xmlGenerator.setRaceTemplate(raceXMLTemplate); xmlGenerator.setRaceTemplate(raceXMLTemplate);