diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 604694e1..43668bdf 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import javafx.scene.paint.Color; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.slf4j.Logger; @@ -14,6 +15,7 @@ import org.w3c.dom.Document; import org.xml.sax.InputSource; import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.BoatStatus; +import seng302.gameServer.messages.CustomizeRequestType; import seng302.gameServer.messages.MarkRoundingMessage; import seng302.gameServer.messages.MarkType; import seng302.gameServer.messages.Message; @@ -36,6 +38,7 @@ import seng302.utilities.XMLParser; * Created by wmu16 on 10/07/17. */ public class GameState implements Runnable { + @FunctionalInterface interface NewMessageListener { @@ -57,6 +60,8 @@ public class GameState implements Runnable { public static Double windDirection; private static Double windSpeed; + private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat. + private static String hostIpAddress; private static List players; private static Map yachts; @@ -88,6 +93,7 @@ public class GameState implements Runnable { yachts = new HashMap<>(); players = new ArrayList<>(); GameState.hostIpAddress = hostIpAddress; + customizationFlag = false; currentStage = GameStages.LOBBYING; isRaceStarted = false; @@ -414,7 +420,7 @@ public class GameState implements Runnable { } - /** + /** lobbyController.setPlayerListSource(clientLobbyList); * 4 Different cases of progression in the race 1 - Passing the start line 2 - Passing any * in-race Gate 3 - Passing any in-race Mark 4 - Passing the finish line * @@ -581,6 +587,28 @@ public class GameState implements Runnable { return false; } + /** + * Handles player customization. + * + * @param playerID The ID of the player being modified. + * @param requestType the type of player customization the player wants + * @param customizeData the data related to the customization (color, name, shape) + */ + public static void customizePlayer(long playerID, CustomizeRequestType requestType, + byte[] customizeData) { + ServerYacht playerYacht = yachts.get((int) playerID); + + if (requestType.equals(CustomizeRequestType.NAME)) { + String name = new String(customizeData); + playerYacht.setBoatName(name); + } else if (requestType.equals(CustomizeRequestType.COLOR)) { + int red = customizeData[0] & 0xFF; + int green = customizeData[1] & 0xFF; + int blue = customizeData[2] & 0xFF; + Color yachtColor = Color.rgb(red, green, blue); + playerYacht.setBoatColor(yachtColor); + } + } private static Mark checkMarkCollision(ServerYacht yacht) { Set marksInRace = GameState.getMarks(); @@ -660,4 +688,16 @@ public class GameState implements Runnable { public static void addMarkPassListener(NewMessageListener listener) { markListeners.add(listener); } + + public static void setCustomizationFlag() { + customizationFlag = true; + } + + public static Boolean getCustomizationFlag() { + return customizationFlag; + } + + public static void resetCustomizationFlag() { + customizationFlag = false; + } } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index f4dc387d..ca271472 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -75,6 +75,14 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { } catch (InterruptedException e) { serverLog("Interrupted exception in Main Server Thread thread sleep", 1); } + if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState + .getCustomizationFlag()) { + // TODO: 16/08/17 ajm412: This can probably be done in a nicer way via those fancy functional interfaces. + for (ServerToClientThread thread : serverToClientThreads) { + thread.sendSetupMessages(); + } + GameState.resetCustomizationFlag(); + } if (GameState.getCurrentStage() == GameStages.PRE_RACE) { updateClients(); diff --git a/src/main/java/seng302/gameServer/ServerPacketParser.java b/src/main/java/seng302/gameServer/ServerPacketParser.java index 21d1497f..62d971ea 100644 --- a/src/main/java/seng302/gameServer/ServerPacketParser.java +++ b/src/main/java/seng302/gameServer/ServerPacketParser.java @@ -1,11 +1,11 @@ package seng302.gameServer; import java.util.Arrays; - +import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.CustomizeRequestType; import seng302.gameServer.messages.Message; import seng302.model.stream.packets.StreamPacket; -import seng302.gameServer.messages.BoatAction; public class ServerPacketParser { @@ -22,5 +22,11 @@ public class ServerPacketParser { long value = Message.bytesToLong(Arrays.copyOfRange(payload, 0, 1)); return ClientType.getClientType((int) value); } + + public static CustomizeRequestType extractCustomizationType(StreamPacket packet) { + byte[] payload = packet.getPayload(); + long type = Message.bytesToLong(Arrays.copyOfRange(payload, 4, 5)); + return CustomizeRequestType.getRequestType((int) type); + } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 479333bd..d532cbed 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -10,6 +10,7 @@ import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Observable; import java.util.Observer; @@ -19,8 +20,19 @@ import java.util.zip.CRC32; import java.util.zip.Checksum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import seng302.gameServer.messages.BoatAction; +import seng302.gameServer.messages.BoatLocationMessage; +import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.CustomizeRequestType; +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.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; @@ -203,6 +215,18 @@ public class ServerToClientThread implements Runnable, Observer { completeRegistration(requestedType); break; + + case RACE_CUSTOMIZATION_REQUEST: + Long sourceID = Message + .bytesToLong(Arrays.copyOfRange(payload, 0, 3)); + CustomizeRequestType requestType = ServerPacketParser + .extractCustomizationType( + new StreamPacket(type, payloadLength, timeStamp, payload)); + GameState.customizePlayer(sourceID, requestType, + Arrays.copyOfRange(payload, 6, payload.length)); + GameState.setCustomizationFlag(); + // TODO: 17/08/2017 ajm412: Send a response packet here, not really necessary until we do shapes. + break; } } else { logger.warn("Packet has been dropped", 1); diff --git a/src/main/java/seng302/gameServer/messages/CustomizeRequestMessage.java b/src/main/java/seng302/gameServer/messages/CustomizeRequestMessage.java new file mode 100644 index 00000000..324196f6 --- /dev/null +++ b/src/main/java/seng302/gameServer/messages/CustomizeRequestMessage.java @@ -0,0 +1,35 @@ +package seng302.gameServer.messages; + +// TODO: 14/08/17 ajm412: this may eventually need adjusting due to conforming to the agreed spec. +public class CustomizeRequestMessage extends Message { + + + private static int MESSAGE_LENGTH = 6; + + //Message fields + private CustomizeRequestType customizeType; + private Integer payloadLength; + + public CustomizeRequestMessage(CustomizeRequestType customizeType, double sourceID, + byte[] payload) { + payloadLength = payload.length; + setHeader(new Header(MessageType.CUSTOMIZATION_REQUEST, 1, (short) getSize())); + allocateBuffer(); + writeHeaderToBuffer(); + + + putInt((int) sourceID, 4); + putInt((int) customizeType.getType(), 2); + putBytes(payload); + + writeCRC(); + rewind(); + } + + @Override + public int getSize() { + return MESSAGE_LENGTH + payloadLength; // placeholder + } + + +} diff --git a/src/main/java/seng302/gameServer/messages/CustomizeRequestType.java b/src/main/java/seng302/gameServer/messages/CustomizeRequestType.java new file mode 100644 index 00000000..8077c657 --- /dev/null +++ b/src/main/java/seng302/gameServer/messages/CustomizeRequestType.java @@ -0,0 +1,31 @@ +package seng302.gameServer.messages; + +// TODO: 14/08/17 ajm412: this may eventually need adjusting due to conforming to the agreed spec. +public enum CustomizeRequestType { + NAME(0x00), + COLOR(0x01), + SHAPE(0x02); + + private int type; + + CustomizeRequestType(int type) { + this.type = type; + } + + int getType() { + return this.type; + } + + public static CustomizeRequestType getRequestType(int typeCode) { + switch (typeCode) { + case 0x00: + return NAME; + case 0x01: + return COLOR; + case 0x02: + return SHAPE; + default: + return null; + } + } +} diff --git a/src/main/java/seng302/gameServer/messages/CustomizeResponseMessage.java b/src/main/java/seng302/gameServer/messages/CustomizeResponseMessage.java new file mode 100644 index 00000000..e1723623 --- /dev/null +++ b/src/main/java/seng302/gameServer/messages/CustomizeResponseMessage.java @@ -0,0 +1,28 @@ +package seng302.gameServer.messages; + +/** + * Created by ajm412 on 14/08/17. + */ +public class CustomizeResponseMessage extends Message { + + private static int MESSAGE_LENGTH = 2; + + public CustomizeResponseMessage(CustomizeResponseType responseType) { + setHeader(new Header(MessageType.CUSTOMIZATION_RESPONSE, 1, (short) getSize())); + + allocateBuffer(); + writeHeaderToBuffer(); + + putInt(responseType.getType(), 2); + + writeCRC(); + rewind(); + } + + @Override + public int getSize() { + return MESSAGE_LENGTH; // placeholder + } + + +} diff --git a/src/main/java/seng302/gameServer/messages/CustomizeResponseType.java b/src/main/java/seng302/gameServer/messages/CustomizeResponseType.java new file mode 100644 index 00000000..a935dc80 --- /dev/null +++ b/src/main/java/seng302/gameServer/messages/CustomizeResponseType.java @@ -0,0 +1,34 @@ +package seng302.gameServer.messages; + +// TODO: 14/08/17 ajm412: this may eventually need adjusting due to conforming to the agreed spec. +public enum CustomizeResponseType { + SUCCESS(0x00), + FAILURE(0x01), + FAILURE_MALFORMED_DATA(0x02), + FAILURE_INCOMPATIBLE(0x03); + + private int type; + + CustomizeResponseType(int type) { + this.type = type; + } + + int getType() { + return this.type; + } + + public static CustomizeResponseType getResponseType(int typeCode) { + switch (typeCode) { + case 0x00: + return SUCCESS; + case 0x01: + return FAILURE; + case 0x02: + return FAILURE_MALFORMED_DATA; + case 0x03: + return FAILURE_INCOMPATIBLE; + default: + return null; + } + } +} diff --git a/src/main/java/seng302/gameServer/messages/MessageType.java b/src/main/java/seng302/gameServer/messages/MessageType.java index ea8d8171..9f0ddd4c 100644 --- a/src/main/java/seng302/gameServer/messages/MessageType.java +++ b/src/main/java/seng302/gameServer/messages/MessageType.java @@ -19,7 +19,10 @@ public enum MessageType { AVERAGE_WIND(47), BOAT_ACTION(100), REGISTRATION_REQUEST(101), - REGISTRATION_RESPONSE(102); + REGISTRATION_RESPONSE(102), + CUSTOMIZATION_REQUEST(103), + CUSTOMIZATION_RESPONSE(104); + private int code; diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 61447b3f..949a175b 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -78,6 +78,7 @@ public class ClientYacht extends Observable { this.heading = 120.0; //In degrees this.currentVelocity = 0d; this.boatStatus = 1; + this.colour = Color.rgb(0, 0, 0, 1.0); } /** diff --git a/src/main/java/seng302/model/Colors.java b/src/main/java/seng302/model/Colors.java index 81829262..c3afef90 100644 --- a/src/main/java/seng302/model/Colors.java +++ b/src/main/java/seng302/model/Colors.java @@ -8,12 +8,7 @@ import javafx.scene.paint.Color; public enum Colors { RED, PERU, GOLD, GREEN, BLUE, PURPLE, DEEPPINK, GRAY; - static Integer index = 0; - - public static Color getColor() { - if (index == 8) { - index = 0; - } - return Color.valueOf(values()[index++].toString()); + public static Color getColor(Integer index) { + return Color.valueOf(values()[index].toString()); } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 34f45f20..64143023 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -3,6 +3,7 @@ package seng302.model; import java.util.HashMap; import java.util.Observable; import java.util.Observer; +import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.gameServer.GameState; @@ -30,6 +31,8 @@ public class ServerYacht extends Observable { private String country; private BoatStatus boatStatus; + private Color boatColor; + //Location private Double lastHeading; @@ -67,6 +70,7 @@ public class ServerYacht extends Observable { this.currentVelocity = 0d; //in mms-1 this.currentMarkSeqID = 0; this.legNumber = 0; + this.boatColor = Colors.getColor(sourceId - 1); this.hasEnteredRoundingZone = false; this.hasPassedLine = false; @@ -300,6 +304,10 @@ public class ServerYacht extends Observable { return country; } + public void setBoatName(String name) { + boatName = name; + shortName = name.split(" ")[0]; + } public GeoPoint getLocation() { return location; @@ -391,4 +399,12 @@ public class ServerYacht extends Observable { return legNumber; } + public void setBoatColor(Color color) { + this.boatColor = color; + } + + public Color getBoatColor() { + return boatColor; + } + } diff --git a/src/main/java/seng302/model/stream/packets/PacketType.java b/src/main/java/seng302/model/stream/packets/PacketType.java index 1a38ae14..baf2ff42 100644 --- a/src/main/java/seng302/model/stream/packets/PacketType.java +++ b/src/main/java/seng302/model/stream/packets/PacketType.java @@ -1,8 +1,5 @@ package seng302.model.stream.packets; -/** - * Created by Kusal on 4/24/2017. - */ public enum PacketType { HEARTBEAT, RACE_STATUS, @@ -21,7 +18,9 @@ public enum PacketType { BOAT_ACTION, OTHER, RACE_REGISTRATION_REQUEST, - RACE_REGISTRATION_RESPONSE; + RACE_REGISTRATION_RESPONSE, + RACE_CUSTOMIZATION_REQUEST, + RACE_CUSTOMIZATION_RESPONSE; public static PacketType assignPacketType(int packetType, byte[] payload){ switch(packetType){ @@ -62,6 +61,10 @@ public enum PacketType { return RACE_REGISTRATION_REQUEST; case 102: return RACE_REGISTRATION_RESPONSE; + case 103: + return RACE_CUSTOMIZATION_REQUEST; + case 104: + return RACE_CUSTOMIZATION_RESPONSE; default: } return OTHER; diff --git a/src/main/java/seng302/utilities/XMLParser.java b/src/main/java/seng302/utilities/XMLParser.java index a08a0769..d7556234 100644 --- a/src/main/java/seng302/utilities/XMLParser.java +++ b/src/main/java/seng302/utilities/XMLParser.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import javafx.scene.paint.Color; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -142,6 +143,7 @@ public class XMLParser { XMLParser.getNodeAttributeString(currentBoat, "ShortName"), XMLParser.getNodeAttributeString(currentBoat, "BoatName"), XMLParser.getNodeAttributeString(currentBoat, "Country")); + yacht.setColour(Color.web(getNodeAttributeString(currentBoat, "Color"))); if (yacht.getBoatType().equals("Yacht")) { competingBoats.put(yacht.getSourceId(), yacht); } diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index dbf93693..dad3d740 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -24,6 +24,8 @@ import org.slf4j.LoggerFactory; import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.BoatActionMessage; import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.CustomizeRequestMessage; +import seng302.gameServer.messages.CustomizeRequestType; import seng302.gameServer.messages.Message; import seng302.gameServer.messages.RegistrationRequestMessage; import seng302.gameServer.messages.RegistrationResponseStatus; @@ -173,6 +175,15 @@ public class ClientToServerThread implements Runnable { clientLog("Closed connection to Server", 0); } + public void sendCustomizationRequest(CustomizeRequestType reqType, byte[] payload) { + CustomizeRequestMessage requestMessage = new CustomizeRequestMessage(reqType, this.clientId, payload); + try { + os.write(requestMessage.getBuffer()); + } catch (IOException e) { + logger.error("Could not send customization request"); + } + + } /** * Sends a request to the server asking for a source ID diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 70f77ef0..6dd0d98b 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -16,6 +16,7 @@ import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.BoatStatus; +import seng302.gameServer.messages.BoatAction; import seng302.model.ClientYacht; import seng302.model.RaceState; import seng302.model.stream.packets.StreamPacket; @@ -77,7 +78,6 @@ public class GameClient { socketThread.addStreamObserver(this::parsePackets); LobbyController lobbyController = loadLobby(); - lobbyController.setPlayerListSource(clientLobbyList); lobbyController.disableReadyButton(); if (regattaData != null){ @@ -130,6 +130,7 @@ public class GameClient { }); this.lobbyController = lobbyController; + //server.setGameClient(this); } private void loadStartScreen() { @@ -162,7 +163,12 @@ public class GameClient { } catch (IOException e) { e.printStackTrace(); } - return fxmlLoader.getController(); + LobbyController lobbyController = fxmlLoader.getController(); + lobbyController.setSocketThread(socketThread); + lobbyController.setPlayerListSource(clientLobbyList); + lobbyController.setPlayerID(socketThread.getClientId()); + + return lobbyController; } private void loadRaceView() { @@ -236,7 +242,7 @@ public class GameClient { ); clientLobbyList.clear(); allBoatsMap.forEach((id, boat) -> - clientLobbyList.add(id + " " + boat.getBoatName()) + clientLobbyList.add(boat.getBoatName()) ); raceState.setBoats(allBoatsMap.values()); break; diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 9268f3c1..10ef749e 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -26,6 +26,7 @@ import javafx.scene.shape.Circle; import javafx.scene.shape.Polygon; import javafx.scene.text.Text; import javafx.util.Duration; +import seng302.model.ClientYacht; import seng302.gameServer.messages.RoundingSide; import seng302.model.ClientYacht; import seng302.model.Colors; @@ -473,19 +474,19 @@ public class GameView extends Pane { public void setBoats(List yachts) { BoatObject newBoat; final List wakes = new ArrayList<>(); - for (ClientYacht yacht : yachts) { - Paint colour = Colors.getColor(); + for (ClientYacht clientYacht : yachts) { + Paint colour = clientYacht.getColour(); newBoat = new BoatObject(); newBoat.addSelectedBoatListener(this::setSelectedBoat); newBoat.setFill(colour); - boatObjects.put(yacht, newBoat); - createAndBindAnnotationBox(yacht, colour); + boatObjects.put(clientYacht, newBoat); + createAndBindAnnotationBox(clientYacht, colour); // wakesGroup.getChildren().add(newBoat.getWake()); wakes.add(newBoat.getWake()); boatObjectGroup.getChildren().add(newBoat); trails.getChildren().add(newBoat.getTrail()); // TODO: 1/08/17 Make this less vile to look at. - yacht.addLocationListener((boat, lat, lon, heading, sailIn, velocity) -> { + clientYacht.addLocationListener((boat, lat, lon, heading, sailIn, velocity) -> { BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); @@ -506,11 +507,11 @@ public class GameView extends Pane { }); } - private void createAndBindAnnotationBox(ClientYacht yacht, Paint colour) { + private void createAndBindAnnotationBox(ClientYacht clientYacht, Paint colour) { AnnotationBox newAnnotation = new AnnotationBox(); newAnnotation.setFill(colour); newAnnotation.addAnnotation( - "name", "Player: " + yacht.getShortName() + "name", "Player: " + clientYacht.getShortName() ); // newAnnotation.addAnnotation( // "velocity", @@ -533,7 +534,7 @@ public class GameView extends Pane { // return format.format(time); // } // ); - annotations.put(yacht, newAnnotation); + annotations.put(clientYacht, newAnnotation); } private void drawFps(Double fps) { diff --git a/src/main/java/seng302/visualiser/controllers/CustomizationController.java b/src/main/java/seng302/visualiser/controllers/CustomizationController.java new file mode 100644 index 00000000..1a5b5e4d --- /dev/null +++ b/src/main/java/seng302/visualiser/controllers/CustomizationController.java @@ -0,0 +1,74 @@ +package seng302.visualiser.controllers; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ColorPicker; +import javafx.scene.control.TextField; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import seng302.gameServer.messages.CustomizeRequestType; +import seng302.visualiser.ClientToServerThread; + +public class CustomizationController { + + @FXML + private TextField nameField; + + @FXML + private ColorPicker boatColorPicker; + + @FXML + private Button customizeSubmit; + + private LobbyController lc; + private ClientToServerThread socketThread; + private Stage windowStage; + + public void initialize() { + + } + + public void setServerThread(ClientToServerThread ctsThread) { + this.socketThread = ctsThread; + } + + @FXML + public void submitCustomization() { + System.out.println("Attempting to send"); + socketThread.sendCustomizationRequest(CustomizeRequestType.NAME, nameField.getText().getBytes()); + // TODO: 16/08/17 ajm412: Turn colors into byte array. + Color color = boatColorPicker.getValue(); + + short red = (short) (color.getRed() * 255); + short green = (short) (color.getGreen() * 255); + short blue = (short) (color.getBlue() * 255); + + byte[] colorArray = new byte[3]; + + colorArray[0] = (byte) red; + colorArray[1] = (byte) green; + colorArray[2] = (byte) blue; + + socketThread.sendCustomizationRequest(CustomizeRequestType.COLOR, colorArray); + lc.setPlayersColor(color); + windowStage.close(); + } + + public void setLobbyController(LobbyController lc) { + this.lc = lc; + } + + public void setStage(Stage stage) { + this.windowStage = stage; + } + + public void setPlayerName(String name) { + this.nameField.setText(name); + } + + public void setPlayerColor(Color playerColor) { + this.boatColorPicker.setValue(playerColor); + } + + +} diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index fa160e53..4dc5293f 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -1,20 +1,29 @@ package seng302.visualiser.controllers; -import java.util.*; - +import com.sun.media.jfxmedia.logging.Logger; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import javafx.application.Platform; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.paint.Color; import javafx.scene.text.Text; +import javafx.stage.Stage; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; +import seng302.model.Colors; import seng302.model.RaceState; -import seng302.visualiser.GameClient; +import seng302.visualiser.ClientToServerThread; /** * A class describing the actions of the lobby screen @@ -37,6 +46,8 @@ public class LobbyController { @FXML private Button readyButton; @FXML + private Button customizeButton; + @FXML private TextArea playerOneTxt; @FXML private TextArea playerTwoTxt; @@ -77,7 +88,14 @@ public class LobbyController { private List