diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 4a93f0d5..cb6d4958 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -449,11 +449,10 @@ public class GameState implements Runnable { private void updateVelocity(ServerYacht yacht) { Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier; + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier * yacht.getMaxSpeedMultiplier(); if (yacht.getPowerUp() != null) { if (yacht.getPowerUp().equals(TokenType.BOOST)) { // TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER - // TODO 22/09/17 kre39 change this magic number to a variable maxBoatSpeed *= 2; } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index f9e028d4..6c3ca3dd 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -23,7 +23,8 @@ public class ServerYacht { //Boat info private String boatType; - private Double turn_step; + private Double turnStep = 10.0; + private Double maxSpeedMultiplier = 1.0; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -172,7 +173,7 @@ public class ServerYacht { if (isAuto) { turnTowardsHeading(autoHeading); if (Math.abs(heading - autoHeading) - <= turn_step) { //Cancel when within 1 turn step of target. + <= turnStep) { //Cancel when within 1 turn step of target. isAuto = false; } } @@ -187,20 +188,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } else if (normalizedHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } @@ -209,20 +210,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } else if (normalizedHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } @@ -266,9 +267,9 @@ public class ServerYacht { private void turnTowardsHeading(Double newHeading) { Double newVal = heading - newHeading; if (Math.floorMod(newVal.longValue(), 360L) > 180) { - adjustHeading(turn_step / 5); + adjustHeading(turnStep / 5); } else { - adjustHeading(-turn_step / 5); + adjustHeading(-turnStep / 5); } } @@ -420,16 +421,21 @@ public class ServerYacht { } public void setBoatType(String boatType) { - if (boatType == BoatMeshType.DINGHY.toString()) { - turn_step = 5.0; - } else if (boatType == BoatMeshType.CAT_ATE_A_MERINGUE.toString()){ - turn_step = 10.0; - } else { - turn_step = 7.0; + BoatMeshType boatMeshType; + for (BoatMeshType boatMesh: BoatMeshType.values()) { + if (boatType == boatMesh.toString()) { + boatMeshType = boatMesh; + turnStep = boatMeshType.turnStep; + maxSpeedMultiplier = boatMeshType.maxSpeedMultiplier; + } } this.boatType = boatType; } + public Double getMaxSpeedMultiplier() { + return maxSpeedMultiplier; + } + public String getBoatType() { return boatType; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 55f0b7e6..83b1e520 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -12,6 +12,7 @@ import javafx.fxml.Initializable; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.PointLight; +import javafx.scene.control.ProgressBar; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; @@ -34,6 +35,12 @@ public class BoatCustomizeController implements Initializable{ @FXML private JFXColorPicker colorPicker; @FXML + private ProgressBar speedBar; + @FXML + private ProgressBar accelBar; + @FXML + private ProgressBar handleBar; + @FXML private JFXButton submitBtn; @FXML private JFXTextField boatName; @@ -49,12 +56,15 @@ public class BoatCustomizeController implements Initializable{ private ClientToServerThread socketThread; private LobbyController lobbyController; private BoatMeshType currentBoat; + private static Double maxSpeedMultiplier = 1.0; + private static Double maxTurnRate = 10.0; + private static Double maxAcceleration = 2.0; @Override public void initialize(URL location, ResourceBundle resources) { socketThread = ViewManager.getInstance().getGameClient().getServerThread(); - + generateMaxStats(); RequiredFieldValidator playerNameReqValidator = new RequiredFieldValidator(); playerNameReqValidator.setMessage("Player name required."); @@ -120,6 +130,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } public void nextBoat(ActionEvent actionEvent) { @@ -130,6 +142,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } public void prevBoat(ActionEvent actionEvent) { @@ -140,6 +154,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } private void RefreshBoat() { @@ -148,5 +164,26 @@ public class BoatCustomizeController implements Initializable{ boatPane.getChildren().add(group); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); + refreshStatBars(bo); + } + + private void generateMaxStats() { + for (BoatMeshType bmt: BoatMeshType.values()) { + if (bmt.turnStep > maxTurnRate) { + maxTurnRate = bmt.turnStep; + } + if (bmt.maxSpeedMultiplier > maxSpeedMultiplier) { + maxSpeedMultiplier = bmt.maxSpeedMultiplier; + } + if (bmt.accelerationMultiplier > maxAcceleration) { + maxAcceleration = bmt.accelerationMultiplier; + } + } + } + + private void refreshStatBars(BoatModel bo) { + speedBar.setProgress((bo.getMeshType().maxSpeedMultiplier) / maxSpeedMultiplier); + accelBar.setProgress(bo.getMeshType().accelerationMultiplier / maxAcceleration); + handleBar.setProgress(bo.getMeshType().turnStep / maxTurnRate); } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 947a63f5..e7c375e5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,19 +7,22 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false), + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.5, 1.0, 5.0), CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", - 0.997, null, false), + 0.997, null, false, 1.0, 1.0, 10.0), PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", - -0.5415, "pirateship_frontsail.stl", true); + -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.0, 7.0); final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; + public final double maxSpeedMultiplier; + public final double accelerationMultiplier; + public final double turnStep; final boolean fixedSail; final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CAT_ATE_A_MERINGUE, PIRATE_SHIP}; BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, - double sailOffset, String jibFile, boolean fixedSail) { + double sailOffset, String jibFile, boolean fixedSail, double maxSpeedMultiplier, double accelerationMultiplier, double turnStep) { this.hullFile = hullFile; this.mastFile = mastFile; this.mastOffset = mastOffset; @@ -27,6 +30,9 @@ public enum BoatMeshType { this.sailOffset = sailOffset; this.jibFile = jibFile; this.fixedSail = fixedSail; + this.maxSpeedMultiplier = maxSpeedMultiplier; + this.accelerationMultiplier = accelerationMultiplier; + this.turnStep = turnStep; } public static BoatMeshType getBoatMeshType(String boatType) { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java index 0562d4f7..960ceacf 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java @@ -18,6 +18,9 @@ public class BoatModel extends Model { private static final int SAIL_INDEX = 2; private BoatMeshType meshType; + private Double maxSpeedMultiplier; + private Double turnStep; + private Double accelerationMultiplier; /** * Stores a model and it's optional animation. @@ -71,4 +74,8 @@ public class BoatModel extends Model { private MeshView getMeshViewChild(int index) { return (MeshView) assets.getChildren().get(index); } + + public BoatMeshType getMeshType() { + return meshType; + } } \ No newline at end of file diff --git a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml index 1d355a33..809b96a2 100644 --- a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml +++ b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml @@ -1,5 +1,6 @@ + @@ -24,6 +25,7 @@ + @@ -31,12 +33,12 @@ + + + + + + + + + + + + + + + + + + +