Added processing of input from host via chat to manually trigger race finishing or to speed up boats.

#implement
This commit is contained in:
Calum
2017-09-03 19:18:30 +12:00
parent 45fa73595f
commit 88d1e91b6f
3 changed files with 66 additions and 22 deletions
@@ -59,6 +59,7 @@ public class GameState implements Runnable {
private static Long previousUpdateTime; private static Long previousUpdateTime;
public static Double windDirection; public static Double windDirection;
private static Double windSpeed; private static Double windSpeed;
private static Double speedMultiplier = 1d;
private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat. private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat.
@@ -356,7 +357,7 @@ public class GameState implements Runnable {
Double velocity = yacht.getCurrentVelocity(); Double velocity = yacht.getCurrentVelocity();
Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading());
Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle);
Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier;
// TODO: 15/08/17 remove magic numbers from these equations. // TODO: 15/08/17 remove magic numbers from these equations.
if (yacht.getSailIn()) { if (yacht.getSailIn()) {
if (velocity < maxBoatSpeed - 500) { if (velocity < maxBoatSpeed - 500) {
@@ -693,4 +694,13 @@ public class GameState implements Runnable {
public static void broadcastChatter(ChatterMessage chatterMessage) { public static void broadcastChatter(ChatterMessage chatterMessage) {
notifyMessageListeners(chatterMessage); notifyMessageListeners(chatterMessage);
} }
public static void endRace () {
yachts.forEach((id, yacht) -> yacht.setBoatStatus(BoatStatus.FINISHED));
// currentStage = GameStages.FINISHED;
}
public static void setSpeedMultiplier (double multiplier) {
speedMultiplier = multiplier;
}
} }
@@ -86,7 +86,13 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
//FINISHED //FINISHED
else if (GameState.getCurrentStage() == GameStages.FINISHED) { else if (GameState.getCurrentStage() == GameStages.FINISHED) {
broadcastMessage(makeRaceStatusMessage());
try {
Thread.sleep(1000); //Hackish fix to make sure all threads have broadcasted
terminate(); terminate();
} catch (InterruptedException ie) {
serverLog("Thread interrupted while waiting to terminate clients", 1);
}
} }
} }
@@ -169,6 +175,9 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
@Override @Override
public void clientConnected(ServerToClientThread serverToClientThread) { public void clientConnected(ServerToClientThread serverToClientThread) {
serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0); serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0);
if (serverToClientThreads.size() == 0) { //Sets first client as host.
serverToClientThread.setAsHost();
}
serverToClientThreads.add(serverToClientThread); serverToClientThreads.add(serverToClientThread);
serverToClientThread.addConnectionListener(() -> { serverToClientThread.addConnectionListener(() -> {
for (ServerToClientThread thread : serverToClientThreads) { for (ServerToClientThread thread : serverToClientThreads) {
@@ -257,6 +266,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
if (timeTillStart > PREPATORY_TIME) { if (timeTillStart > PREPATORY_TIME) {
raceStatus = RaceStatus.PREPARATORY; raceStatus = RaceStatus.PREPARATORY;
} }
} else if (GameState.getCurrentStage() == GameStages.FINISHED) {
raceStatus = RaceStatus.TERMINATED;
} else { } else {
raceStatus = RaceStatus.STARTED; raceStatus = RaceStatus.STARTED;
} }
@@ -31,23 +31,6 @@ import seng302.gameServer.messages.RegistrationResponseStatus;
import seng302.gameServer.messages.XMLMessage; import seng302.gameServer.messages.XMLMessage;
import seng302.gameServer.messages.XMLMessageSubType; import seng302.gameServer.messages.XMLMessageSubType;
import seng302.gameServer.messages.YachtEventCodeMessage; import seng302.gameServer.messages.YachtEventCodeMessage;
import seng302.gameServer.messages.YachtEventCodeMessage;
import seng302.model.Player;
import seng302.model.ServerYacht;
import seng302.model.stream.packets.PacketType;
import seng302.model.stream.packets.StreamPacket;
import seng302.model.stream.xml.generator.Race;
import seng302.model.stream.xml.generator.Regatta;
import seng302.utilities.XMLGenerator;
import seng302.gameServer.messages.BoatAction;
import seng302.gameServer.messages.BoatLocationMessage;
import seng302.gameServer.messages.ClientType;
import seng302.gameServer.messages.Message;
import seng302.gameServer.messages.RegistrationResponseMessage;
import seng302.gameServer.messages.RegistrationResponseStatus;
import seng302.gameServer.messages.XMLMessage;
import seng302.gameServer.messages.XMLMessageSubType;
import seng302.gameServer.messages.YachtEventCodeMessage;
import seng302.model.Player; import seng302.model.Player;
import seng302.model.ServerYacht; import seng302.model.ServerYacht;
import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.PacketType;
@@ -92,6 +75,7 @@ public class ServerToClientThread implements Runnable, Observer {
private ClientType clientType; private ClientType clientType;
private Boolean isRegistered = false; private Boolean isRegistered = false;
private Boolean isHost = false;
private XMLGenerator xml; private XMLGenerator xml;
@@ -227,9 +211,10 @@ public class ServerToClientThread implements Runnable, Observer {
completeRegistration(requestedType); completeRegistration(requestedType);
break; break;
case CHATTER_TEXT: case CHATTER_TEXT:
GameState.broadcastChatter( // GameState.broadcastChatter(
ServerPacketParser.extractChatterText(payload) // ServerPacketParser.extractChatterText(payload)
); // );
parseChatter(payload);
break; break;
case RACE_CUSTOMIZATION_REQUEST: case RACE_CUSTOMIZATION_REQUEST:
Long sourceID = Message Long sourceID = Message
@@ -391,4 +376,42 @@ public class ServerToClientThread implements Runnable, Observer {
public void addDisconnectListener(DisconnectListener disconnectListener) { public void addDisconnectListener(DisconnectListener disconnectListener) {
this.disconnectListener = disconnectListener; this.disconnectListener = disconnectListener;
} }
public void setAsHost() {
isHost = true;
}
private void parseChatter(byte[] chatterPayload) {
String chatterText = new String(
Arrays.copyOfRange(chatterPayload, 3, 3 + chatterPayload.length)
);
String[] words = chatterText.split("\\s+");
if (words.length < 3) {
return;
}
switch (words[2].trim()) {
case ">speed":
try {
GameState.setSpeedMultiplier(Double.valueOf(words[3]));
GameState.broadcastChatter(new ChatterMessage(
Byte.toUnsignedInt(chatterPayload[1]),
words[0] + "Host has set speed modifier to x" + words[3]
));
} catch (Exception e) {
logger.error("cannot parse >speed value");
}
break;
case ">finish":
GameState.endRace();
GameState.broadcastChatter(new ChatterMessage(
chatterPayload[1],
words[0] + "Host has ended the game"
));
break;
default:
GameState.broadcastChatter(
ServerPacketParser.extractChatterText(chatterPayload)
);
}
}
} }