diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index afd3a4e7..dfb8dae4 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -78,10 +78,11 @@ public class GameState implements Runnable { private static final Double COLLISION_VELOCITY_PENALTY = 0.3; //Powerup Constants - public static final Integer VELOCITY_BOOST_MULTIPLIER = 2; + public static final Double VELOCITY_BOOST_MULTIPLIER = 2d; public static final Integer HANDLING_BOOST_MULTIPLIER = 2; + private static final Double BAD_RANDOM_SPEED_PENALTY = 0.3; public static final Long BUMPER_DISABLE_TIME = 5_000L; - private static final Long TOKEN_SPAWN_TIME = 15_000L; + private static final Long TOKEN_SPAWN_TIME = 30_000L; private static Long previousUpdateTime; public static Double windDirection; @@ -383,7 +384,7 @@ public class GameState implements Runnable { //Get a random token location with random type Token token = allTokens.get(random.nextInt(allTokens.size())); token.assignRandomType(); -// token.assignType(TokenType.WIND_WALKER); +// token.assignType(TokenType.RANDOM); logger.debug("Spawned token of type " + token.getTokenType()); @@ -430,7 +431,12 @@ public class GameState implements Runnable { * @param yacht The yacht to perform token checks on */ private void preformTokenUpdates(ServerYacht yacht) { - checkTokenPickUp(yacht); + Token collidedToken = checkTokenPickUp(yacht); + if (collidedToken != null) { + tokensInPlay.remove(collidedToken); + powerUpYacht(yacht, collidedToken); + } + checkPowerUpTimeout(yacht); TokenType powerUp = yacht.getPowerUp(); @@ -442,7 +448,6 @@ public class GameState implements Runnable { case BUMPER: ServerYacht collidedYacht = checkYachtCollision(yacht, true); if (collidedYacht != null) { - System.out.println("WE OUT HERE"); yacht.powerDown(); boatTempShutDown(collidedYacht); notifyMessageListeners(MessageFactory.makePowerDownMessage(yacht)); @@ -450,10 +455,36 @@ public class GameState implements Runnable { MessageFactory.makeStatusEffectMessage(collidedYacht, powerUp)); } break; + case RANDOM: + yacht.setPowerUpSpeedMultiplier(BAD_RANDOM_SPEED_PENALTY); } } } + + /** + * Powers up a yacht with the given token type. + * + * @param yacht The yacht to be powered up + * @param collidedToken The token which this yacht collided with + */ + private void powerUpYacht(ServerYacht yacht, Token collidedToken) { + //The random token has a 50% chance of becoming another token else becoming a speed detriment! + if (collidedToken.getTokenType() == TokenType.RANDOM && new Random().nextBoolean()) { + collidedToken.realiseRandom(); + } + + yacht.powerUp(collidedToken.getTokenType()); + String logMessage = + yacht.getBoatName() + " has picked up a " + collidedToken.getTokenType().getName() + + " token"; + notifyMessageListeners(MessageFactory.makeChatterMessage(yacht.getSourceId(), logMessage)); + notifyMessageListeners(MessageFactory.getRaceXML()); + notifyMessageListeners(MessageFactory.makePickupMessage(yacht, collidedToken)); + logger.debug( + "Yacht: " + yacht.getShortName() + " got powerup " + collidedToken.getTokenType()); + } + // TODO: 23/09/17 wmu16 - This is a hacky way to have the boat power down. Need some sort of separation between token and status effect :/ /** @@ -462,7 +493,7 @@ public class GameState implements Runnable { * @param yacht The yacht to disable */ private void boatTempShutDown(ServerYacht yacht) { - yacht.setPowerUpSpeedMultiplier(0); + yacht.setPowerUpSpeedMultiplier(0d); Timer shutDownTimer = new Timer("Shutdown Timer"); shutDownTimer.schedule(new TimerTask() { @Override @@ -533,36 +564,18 @@ public class GameState implements Runnable { * Checks all tokensInPlay to see if a yacht has picked one up. If so, the yacht is powered up * in the appropriate way * @param yacht The yacht to check for collision with a token + * + * @return The token collided with */ - private void checkTokenPickUp(ServerYacht yacht) { - Token collidedToken = null; + private Token checkTokenPickUp(ServerYacht yacht) { for (Token token : tokensInPlay) { Double distance = GeoUtility.getDistance(token, yacht.getLocation()); if (distance < YACHT_COLLISION_DISTANCE) { - collidedToken = token; + return token; } } - if (collidedToken != null) { - tokensInPlay.remove(collidedToken); - if (collidedToken.getTokenType() == TokenType.RANDOM) { - collidedToken.realiseRandom(); - } - - TokenType tokenType = collidedToken.getTokenType(); - yacht.powerUp(tokenType); - - String logMessage = - yacht.getBoatName() + " has picked up a " + collidedToken.getTokenType().getName() - + " token"; - notifyMessageListeners( - MessageFactory.makeChatterMessage(yacht.getSourceId(), logMessage)); - notifyMessageListeners(MessageFactory.getRaceXML()); - notifyMessageListeners(MessageFactory.makePickupMessage(yacht, collidedToken)); - - logger.debug("Yacht: " + yacht.getShortName() + " got powerup " + collidedToken - .getTokenType()); - } + return null; } diff --git a/src/main/java/seng302/gameServer/messages/YachtEventType.java b/src/main/java/seng302/gameServer/messages/YachtEventType.java index facda84e..9fd5170b 100644 --- a/src/main/java/seng302/gameServer/messages/YachtEventType.java +++ b/src/main/java/seng302/gameServer/messages/YachtEventType.java @@ -1,7 +1,7 @@ package seng302.gameServer.messages; /** - * Created by wmu16 on 11/09/17. + * Enum for different event types for the yacht */ public enum YachtEventType { COLLISION(33), diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 0b15cb08..c092447d 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -55,7 +55,7 @@ public class ServerYacht { //PowerUp private TokenType powerUp; private Long powerUpStartTime; - private Integer powerUpSpeedMultiplier; + private Double powerUpSpeedMultiplier; private Integer powerUpHandlingMultiplier; //turning mode @@ -80,7 +80,7 @@ public class ServerYacht { this.legNumber = 0; this.boatColor = Colors.getColor(sourceId - 1); this.powerUp = null; - this.powerUpSpeedMultiplier = 1; + this.powerUpSpeedMultiplier = 1d; this.powerUpHandlingMultiplier = 1; this.hasEnteredRoundingZone = false; this.hasPassedLine = false; @@ -137,7 +137,7 @@ public class ServerYacht { */ public void powerDown() { this.powerUp = null; - this.powerUpSpeedMultiplier = 1; + this.powerUpSpeedMultiplier = 1d; this.powerUpHandlingMultiplier = 1; } @@ -480,11 +480,11 @@ public class ServerYacht { this.continuouslyTurning = continuouslyTurning; } - public Integer getPowerUpSpeedMultiplier() { + public Double getPowerUpSpeedMultiplier() { return powerUpSpeedMultiplier; } - public void setPowerUpSpeedMultiplier(Integer powerUpSpeedMultiplier) { + public void setPowerUpSpeedMultiplier(Double powerUpSpeedMultiplier) { this.powerUpSpeedMultiplier = powerUpSpeedMultiplier; } diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 027e92ad..5978675c 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -417,28 +417,30 @@ public class GameView3D { public void cameraMovement(KeyEvent event) { GameKeyBind keyBinds = GameKeyBind.getInstance(); KeyAction keyPressed = keyBinds.getKeyAction(event.getCode()); - switch (keyPressed) { - case ZOOM_IN: - ((RaceCamera) view.getCamera()).zoomIn(); - break; - case ZOOM_OUT: - ((RaceCamera) view.getCamera()).zoomOut(); - break; - case FORWARD: - ((RaceCamera) view.getCamera()).panUp(); - break; - case BACKWARD: - ((RaceCamera) view.getCamera()).panDown(); - break; - case LEFT: - ((RaceCamera) view.getCamera()).panLeft(); - break; - case RIGHT: - ((RaceCamera) view.getCamera()).panRight(); - break; - case VIEW: - toggleCamera(); - break; + if (keyPressed != null) { + switch (keyPressed) { + case ZOOM_IN: + ((RaceCamera) view.getCamera()).zoomIn(); + break; + case ZOOM_OUT: + ((RaceCamera) view.getCamera()).zoomOut(); + break; + case FORWARD: + ((RaceCamera) view.getCamera()).panUp(); + break; + case BACKWARD: + ((RaceCamera) view.getCamera()).panDown(); + break; + case LEFT: + ((RaceCamera) view.getCamera()).panLeft(); + break; + case RIGHT: + ((RaceCamera) view.getCamera()).panRight(); + break; + case VIEW: + toggleCamera(); + break; + } } } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 716bc9fd..7395d5df 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -121,7 +121,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel @FXML private Label positionLabel, boatSpeedLabel, boatHeadingLabel; @FXML - private ImageView velocityIcon, handlingIcon, windWalkerIcon, bumperIcon; + private ImageView velocityIcon, handlingIcon, windWalkerIcon, bumperIcon, badRandomIcon; //Race Data private Map participants; @@ -325,6 +325,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel case BUMPER: iconToDisplay = bumperIcon; break; + case RANDOM: + iconToDisplay = badRandomIcon; + break; default: iconToDisplay = velocityIcon; } diff --git a/src/main/resources/views/RaceView.fxml b/src/main/resources/views/RaceView.fxml index 9a02f517..7e53d81b 100644 --- a/src/main/resources/views/RaceView.fxml +++ b/src/main/resources/views/RaceView.fxml @@ -25,9 +25,8 @@ @@ -48,17 +47,15 @@ valignment="BOTTOM" vgrow="SOMETIMES"/> - + - + - + @@ -90,25 +87,20 @@ - - + + - + - + - + - + @@ -131,18 +123,16 @@ minWidth="90.0" prefWidth="90.0"/> - + - + - + - + - + - \ No newline at end of file +