From 9fcb8915c2e680de8bb51c9bffc035992648f962 Mon Sep 17 00:00:00 2001 From: William Muir Date: Mon, 11 Sep 2017 14:45:04 +1200 Subject: [PATCH] Added sounds to coin pick up Refactored check for token collision to move into the generic check for collision method Created a YachtEventType enum to differentiate between collision and pickup on client side. Client now plays a sound when they pick up a token #story[1250] --- .../java/seng302/gameServer/GameState.java | 110 +++++++++++------- .../messages/YachtEventCodeMessage.java | 4 +- .../gameServer/messages/YachtEventType.java | 19 +++ src/main/java/seng302/utilities/Sounds.java | 10 ++ .../java/seng302/visualiser/GameClient.java | 27 +++-- 5 files changed, 118 insertions(+), 52 deletions(-) create mode 100644 src/main/java/seng302/gameServer/messages/YachtEventType.java diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index f5e1abba..7a0e2005 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -24,6 +24,7 @@ import seng302.gameServer.messages.MarkType; import seng302.gameServer.messages.Message; import seng302.gameServer.messages.RoundingBoatStatus; import seng302.gameServer.messages.YachtEventCodeMessage; +import seng302.gameServer.messages.YachtEventType; import seng302.model.GeoPoint; import seng302.model.Limit; import seng302.model.Player; @@ -49,7 +50,7 @@ public class GameState implements Runnable { void notify(Message message); } - private Logger logger = LoggerFactory.getLogger(GameState.class); + private static Logger logger = LoggerFactory.getLogger(GameState.class); static final int WARNING_TIME = 10 * -1000; @@ -300,7 +301,13 @@ public class GameState implements Runnable { } /** - * Called periodically in this GameState thread to update the GameState values + * Called periodically in this GameState thread to update the GameState values. + * -Updates yachts velocity + * -Updates locations + * -Checks for collisions + * -Checks for progression + * + * -Also checks things like the end of the race and race start time etc */ public void update() { Boolean raceFinished = true; @@ -317,7 +324,6 @@ public class GameState implements Runnable { yacht.updateLocation(timeInterval); if (yacht.getBoatStatus() != BoatStatus.FINISHED) { checkCollision(yacht); - checkTokenPickUp(yacht); checkForLegProgression(yacht); raceFinished = false; } @@ -361,25 +367,34 @@ public class GameState implements Runnable { /** * Checks all tokensInPlay to see if a yacht has picked one up - * - * @param serverYacht The yacht to check for + * @return Token which was collided with + * @param serverYacht The yacht to check for collision with a token */ - private void checkTokenPickUp(ServerYacht serverYacht) { + private static Token checkTokenPickUp(ServerYacht serverYacht) { for (Token token : tokensInPlay) { Double distance = GeoUtility.getDistance(token, serverYacht.getLocation()); if (distance < YACHT_COLLISION_DISTANCE) { - tokensInPlay.remove(token); - serverYacht.powerUp(token.getTokenType()); - logger.debug("Yacht: " + serverYacht.getShortName() + " got powerup " + token - .getTokenType()); - notifyMessageListeners(MessageFactory.getRaceXML()); - break; + return token; } } + + return null; } + /** + * Checks for collision with other in game objects for the given serverYacht. To be called each + * update. If there is a collision, Notifies the server to send the appropriate messages out. + * Checks for these items in turn: + * - Other yachts + * - Marks + * - Boundary + * - Tokens + * + * @param serverYacht The server yacht to check collisions with + */ public static void checkCollision(ServerYacht serverYacht) { + //Yacht Collision ServerYacht collidedYacht = checkYachtCollision(serverYacht); if (collidedYacht != null) { GeoPoint originalLocation = serverYacht.getLocation(); @@ -396,36 +411,51 @@ public class GameState implements Runnable { collidedYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY ); notifyMessageListeners( - new YachtEventCodeMessage(serverYacht.getSourceId()) + new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION) ); - } else { - Mark collidedMark = checkMarkCollision(serverYacht); - if (collidedMark != null) { - serverYacht.setLocation( - calculateBounceBack(serverYacht, collidedMark, BOUNCE_DISTANCE_MARK) - ); - serverYacht.setCurrentVelocity( - serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY - ); - notifyMessageListeners( - new YachtEventCodeMessage(serverYacht.getSourceId()) - ); - } - else{ - if (checkBoundaryCollision(serverYacht)) { - serverYacht.setLocation( - calculateBounceBack(serverYacht, serverYacht.getLocation(), - BOUNCE_DISTANCE_YACHT) - ); - serverYacht.setCurrentVelocity( - serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY - ); - notifyMessageListeners( - new YachtEventCodeMessage(serverYacht.getSourceId()) - ); - } - } } + + //Mark Collision + Mark collidedMark = checkMarkCollision(serverYacht); + if (collidedMark != null) { + serverYacht.setLocation( + calculateBounceBack(serverYacht, collidedMark, BOUNCE_DISTANCE_MARK) + ); + serverYacht.setCurrentVelocity( + serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY + ); + notifyMessageListeners( + new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION) + ); + } + + //Boundary Collision + if (checkBoundaryCollision(serverYacht)) { + serverYacht.setLocation( + calculateBounceBack(serverYacht, serverYacht.getLocation(), + BOUNCE_DISTANCE_YACHT) + ); + serverYacht.setCurrentVelocity( + serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY + ); + notifyMessageListeners( + new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.COLLISION) + ); + } + + //Token Collision + Token collidedToken = checkTokenPickUp(serverYacht); + if (collidedToken != null) { + tokensInPlay.remove(collidedToken); + serverYacht.powerUp(collidedToken.getTokenType()); + logger.debug("Yacht: " + serverYacht.getShortName() + " got powerup " + collidedToken + .getTokenType()); + notifyMessageListeners(MessageFactory.getRaceXML()); + notifyMessageListeners( + new YachtEventCodeMessage(serverYacht.getSourceId(), YachtEventType.TOKEN)); + } + + } diff --git a/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java b/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java index eb9f557e..e26dad6b 100644 --- a/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java +++ b/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java @@ -18,13 +18,13 @@ public class YachtEventCodeMessage extends Message { private int eventId; - public YachtEventCodeMessage(Integer subjectId) { + public YachtEventCodeMessage(Integer subjectId, YachtEventType yachtEventType) { timeStamp = System.currentTimeMillis() / 1000L; ack = 0; raceId = 1; destSourceId = subjectId; // collision boat source id incidentId = 0; - eventId = 33; + eventId = yachtEventType.getCode(); setHeader(new Header(MESSAGE_TYPE, 0x01, (short) getSize())); allocateBuffer(); diff --git a/src/main/java/seng302/gameServer/messages/YachtEventType.java b/src/main/java/seng302/gameServer/messages/YachtEventType.java new file mode 100644 index 00000000..b31d45a1 --- /dev/null +++ b/src/main/java/seng302/gameServer/messages/YachtEventType.java @@ -0,0 +1,19 @@ +package seng302.gameServer.messages; + +/** + * Created by wmu16 on 11/09/17. + */ +public enum YachtEventType { + COLLISION(33), + TOKEN(34); + + private int code; + + YachtEventType(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/seng302/utilities/Sounds.java b/src/main/java/seng302/utilities/Sounds.java index 9fe962b0..d789e61e 100644 --- a/src/main/java/seng302/utilities/Sounds.java +++ b/src/main/java/seng302/utilities/Sounds.java @@ -151,6 +151,16 @@ public class Sounds { } } + public static void playTokenPickupSound() { + if (!soundEffectsMuted) { + Media pickupSound = new Media( + Sounds.class.getClassLoader().getResource("sounds/Coin-pick-up-sound-effect.mp3") + .toString()); + soundPlayer = new MediaPlayer(pickupSound); + soundPlayer.play(); + } + } + public static void playHoverSound() { if (!soundEffectsMuted) { Media hoverSound = new Media(Sounds.class.getClassLoader().getResource("sounds/sound-over.wav").toString()); diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 241b1ec3..c4d219fb 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -23,6 +23,7 @@ import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; import seng302.gameServer.messages.BoatAction; import seng302.gameServer.messages.BoatStatus; +import seng302.gameServer.messages.YachtEventType; import seng302.model.ClientYacht; import seng302.model.RaceState; import seng302.model.stream.packets.StreamPacket; @@ -296,7 +297,12 @@ public class GameClient { break; case YACHT_EVENT_CODE: - showCollisionAlert(StreamParser.extractYachtEventCode(packet)); + YachtEventData yachtEventData = StreamParser.extractYachtEventCode(packet); + if (yachtEventData.getEventId() == YachtEventType.COLLISION.getCode()) { + showCollisionAlert(StreamParser.extractYachtEventCode(packet)); + } else if (yachtEventData.getEventId() == YachtEventType.TOKEN.getCode()) { + showPickUp(); + } break; case CHATTER_TEXT: @@ -446,15 +452,16 @@ public class GameClient { * Tells race view to show a collision animation. */ private void showCollisionAlert(YachtEventData yachtEventData) { - // 33 is the agreed code to show collision - if (yachtEventData.getEventId() == 33) { - Sounds.playCrashSound(); - raceState.storeCollision( - allBoatsMap.get( - yachtEventData.getSubjectId().intValue() - ) - ); - } + Sounds.playCrashSound(); + raceState.storeCollision( + allBoatsMap.get( + yachtEventData.getSubjectId().intValue() + ) + ); + } + + private void showPickUp() { + Sounds.playTokenPickupSound(); } private void formatAndSendChatMessage(String rawChat) {