diff --git a/src/client/display/GameFrame.java b/src/client/display/GameFrame.java index 05ad867..45fae75 100644 --- a/src/client/display/GameFrame.java +++ b/src/client/display/GameFrame.java @@ -3,6 +3,7 @@ import GUI.SBFrame; import client.Client; import client.logic.DrawingPath; +import client.sound.PlayerSound; import gameLogic.Pitch; import gameLogic.PitchField; import gameLogic.Player; @@ -292,6 +293,8 @@ public void blitzOrBlock(DrawingPath path, PitchField destination, Player actor) if(destination.getPlayer() != null) { SBProtocolParameterArray params; if (path.getPath().size() > 1) { // is blitz + PlayerSound.blitz(actor); + params = new SBProtocolParameterArray(SBProtocolMessage.ACTIO_MOVE, (actor.getId() - 1) + ""); for (PitchField field : path.getPath()) { params.addParameter(new SBProtocolParameter((int) field.getPos().x + "")); @@ -300,6 +303,8 @@ public void blitzOrBlock(DrawingPath path, PitchField destination, Player actor) params.addParameter(new SBProtocolParameter((int) destination.getPos().x + "")); params.addParameter(new SBProtocolParameter((int) destination.getPos().y + "")); } else { // is block + PlayerSound.block(actor); + params = new SBProtocolParameterArray(SBProtocolMessage.ACTIO_BLCK, (actor.getId() - 1) + ""); params.addParameter(new SBProtocolParameter((destination.getPlayer().getId() - 1) + "")); } @@ -315,6 +320,8 @@ public void blitzOrBlock(DrawingPath path, PitchField destination, Player actor) public void throwBall(PitchField throwDestination, Player thrower) { if(throwDestination != null && thrower != null) { try { + PlayerSound.pass(thrower); + SBProtocolParameterArray params = new SBProtocolParameterArray( "THRW", (thrower.getId() - 1) + "", diff --git a/src/client/logic/ClientMatch.java b/src/client/logic/ClientMatch.java index 5870ece..ee03695 100644 --- a/src/client/logic/ClientMatch.java +++ b/src/client/logic/ClientMatch.java @@ -608,26 +608,29 @@ private void adjustPlayer(SBProtocolMessage message){ if(playerIndex < 0 || playerIndex >= teams[actingUserIndex].getPlayers().size() || playerPosX < -1 || playerPosX > 25 || playerPosY < -1 || playerPosY > 14){ return; } - teams[actingUserIndex].getPlayers().get(playerIndex).setName(message.getParameterContent(3)); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetBe(Integer.parseInt(message.getParameterContent(4))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetSt(Integer.parseInt(message.getParameterContent(5))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetGe(Integer.parseInt(message.getParameterContent(6))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetRs(Integer.parseInt(message.getParameterContent(7))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetRemainingBe(Integer.parseInt(message.getParameterContent(8))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetPlayerCondition(PlayerCondition.valueOf(message.getParameterContent(9))); + Player player = teams[actingUserIndex].getPlayers().get(playerIndex); + player.setName(message.getParameterContent(3)); + player.invokeSetBe(Integer.parseInt(message.getParameterContent(4))); + player.invokeSetSt(Integer.parseInt(message.getParameterContent(5))); + player.invokeSetGe(Integer.parseInt(message.getParameterContent(6))); + player.invokeSetRs(Integer.parseInt(message.getParameterContent(7))); + player.invokeSetRemainingBe(Integer.parseInt(message.getParameterContent(8))); + PlayerCondition newCondition = PlayerCondition.valueOf(message.getParameterContent(9)); + if(player.invokeGetPlayerCondition() != newCondition) // only set new condition if it changed to avoid playing sounds multiple times + player.invokeSetPlayerCondition(newCondition); try{ if(playerPosX == -1 && playerPosY == -1){ - teams[actingUserIndex].getPlayers().get(playerIndex).invokeClearPosition(); + player.invokeClearPosition(); }else{ - teams[actingUserIndex].getPlayers().get(playerIndex).getPosition().adjustPlayer(null); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeAdjustPosition(getPitch().getFields()[playerPosX][playerPosY]); + player.getPosition().adjustPlayer(null); + player.invokeAdjustPosition(getPitch().getFields()[playerPosX][playerPosY]); } }catch(NullPointerException e){ getClient().logStackTrace(e); } - teams[actingUserIndex].getPlayers().get(playerIndex).getPosition().adjustPlayer(teams[actingUserIndex].getPlayers().get(playerIndex)); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetIsHoldingBall(Boolean.parseBoolean(message.getParameterContent(12))); - teams[actingUserIndex].getPlayers().get(playerIndex).invokeSetRedCard(Boolean.parseBoolean(message.getParameterContent(13))); + player.getPosition().adjustPlayer(player); + player.invokeSetIsHoldingBall(Boolean.parseBoolean(message.getParameterContent(12))); + player.invokeSetRedCard(Boolean.parseBoolean(message.getParameterContent(13))); }catch(NumberFormatException e){ returnFailureMessage(message, SBProtocolMessage.FAILD_RECEIVED_WRONG_GAME_DATA); } diff --git a/src/client/logic/PitchMouseLogic.java b/src/client/logic/PitchMouseLogic.java index cc281d0..7329750 100644 --- a/src/client/logic/PitchMouseLogic.java +++ b/src/client/logic/PitchMouseLogic.java @@ -1,6 +1,7 @@ package client.logic; import client.display.GameCanvas; +import client.sound.PlayerSound; import gameLogic.*; import gameLogic.rules.RuleThrow; import util.ResourceManager; @@ -785,8 +786,10 @@ && isHoveringOwnPlayer() && getGameCanvas().canSetUp() && !getGameCanvas().hasSetUpTeam()) { // is hovering own player and can set up team if((!getGameCanvas().getPlayersOnBench().contains(getHoveringPlayer()) || getGamePhase() == 1) - && getHoveringPlayer() != null && !getHoveringPlayer().getRedCard()) + && getHoveringPlayer() != null && !getHoveringPlayer().getRedCard()) { setMovingPlayer(getHoveringPlayer()); + PlayerSound.pickUp(getHoveringPlayer()); + } } } else if(getGamePhase() >= 3) { @@ -798,8 +801,10 @@ && getHoveringPlayer() != null && !getHoveringPlayer().getRedCard()) if (e.getButton() == MouseEvent.BUTTON1 && !getGameCanvas().isShiftPressed()) { // left mouse button, move if(!getGameCanvas().getPlayersOnBench().contains(getHoveringPlayer()) || getGamePhase() == 1) if(!getGameCanvas().isChoosingSpecialRule()) - if(getHoveringPlayer().invokeGetRemainingBe() > 0) + if(getHoveringPlayer().invokeGetRemainingBe() > 0) { setMovingPlayer(getHoveringPlayer()); + PlayerSound.pickUp(getHoveringPlayer()); + } addPathElement(); } else if (e.getButton() == MouseEvent.BUTTON3 || e.getButton() == MouseEvent.BUTTON2 || getGameCanvas().isShiftPressed()) { // right mouse button throw if (getHoveringPlayer().isHoldingBall() diff --git a/src/client/sound/PlayerSound.java b/src/client/sound/PlayerSound.java new file mode 100644 index 0000000..9587c17 --- /dev/null +++ b/src/client/sound/PlayerSound.java @@ -0,0 +1,46 @@ +package client.sound; + +import gameLogic.Player; + +/** + * Class handling the sounds players make + */ +public class PlayerSound { + + public static void pickUp(Player player) { + SoundManager.play(player.getSoundPickUp()); + } + + public static void proned(Player player) { + SoundManager.play(player.getSoundProned()); + } + + public static void stunned(Player player) { + SoundManager.play(player.getSoundStunned()); + } + + public static void injured(Player player) { + SoundManager.play(player.getSoundInjured()); + } + + public static void ko(Player player) { + SoundManager.play(player.getSoundKO()); + } + + public static void blitz(Player player) { + SoundManager.play(player.getSoundBlitz()); + } + + public static void block(Player player) { + SoundManager.play(player.getSoundBlock()); + } + + public static void pass(Player player) { + SoundManager.play(player.getSoundPass()); + } + + public static void died(Player player) { + SoundManager.play(player.getSoundDied()); + } + +} diff --git a/src/gameLogic/Player.java b/src/gameLogic/Player.java index 5cc9bf4..63968d1 100644 --- a/src/gameLogic/Player.java +++ b/src/gameLogic/Player.java @@ -5,8 +5,10 @@ import java.util.Vector; import java.util.logging.Level; +import javax.sound.sampled.Clip; import javax.vecmath.*; +import client.sound.PlayerSound; import server.logic.User; import gameLogic.rules.*; @@ -44,6 +46,20 @@ public class Player { * The images of the player looking left (spriteL) and looking right (spriteR). */ private BufferedImage spriteR, spriteL; + /** + * The sounds of this player: + * + */ + private Clip soundPickUp, soundProned, soundStunned, soundInjured, soundKO, soundBlitz, soundBlock, soundPass, soundDied; /** * A hash map for scripts to store data in. Is not used by standard players. */ @@ -71,8 +87,22 @@ public Player(String name, TeamManager manager) { private Player(Player p, Team team) { this.manager = p.manager; setName(p.getName()); + + // images setSpriteR(p.getSpriteR()); setSpriteL(p.getSpriteL()); + + // sounds + setSoundPickUp(p.getSoundPickUp()); + setSoundProned(p.getSoundProned()); + setSoundStunned(p.getSoundStunned()); + setSoundInjured(p.getSoundInjured()); + setSoundKO(p.getSoundKO()); + setSoundBlitz(p.getSoundBlitz()); + setSoundBlock(p.getSoundBlock()); + setSoundPass(p.getSoundPass()); + setSoundDied(p.getSoundDied()); + invokeAdjustTeam(team); invokeSetGe(DEFAULT_GE); invokeSetRs(DEFAULT_RS); @@ -223,6 +253,25 @@ public void invokeSetPlayerCondition(PlayerCondition playerCondition) { Object playerConditionFromScript = manager.invokeFunction("setPlayerCondition", this, playerCondition); if(playerConditionFromScript != null) this.playerCondition = (PlayerCondition) playerConditionFromScript; + switch(invokeGetPlayerCondition()) { + case PRONE: + if(playerCondition != PlayerCondition.STUNNED) // don't play sound if player was unstunned + PlayerSound.proned(this); + break; + case STUNNED: + PlayerSound.stunned(this); + break; + case INJURED: + PlayerSound.injured(this); + break; + case KO: + PlayerSound.ko(this); + break; + case DEAD: + PlayerSound.died(this); + break; + } + if(isHoldingBall()){ if(invokeGetPlayerCondition() != PlayerCondition.FINE){ invokeSetIsHoldingBall(false); @@ -479,7 +528,27 @@ public void setSpriteL(BufferedImage spriteL) { this.spriteL = spriteL; } - public void setId() { + // SOUNDS + public Clip getSoundPickUp() { return soundPickUp; } + public void setSoundPickUp(Clip soundPickUp) { this.soundPickUp = soundPickUp; } + public Clip getSoundProned() { return soundProned; } + public void setSoundProned(Clip soundProned) { this.soundProned = soundProned; } + public Clip getSoundStunned() { return soundStunned; } + public void setSoundStunned(Clip soundStunned) { this.soundStunned = soundStunned; } + public Clip getSoundInjured() { return soundInjured; } + public void setSoundInjured(Clip soundInjured) { this.soundInjured = soundInjured; } + public Clip getSoundKO() { return soundKO; } + public void setSoundKO(Clip soundKO) { this.soundKO = soundKO; } + public Clip getSoundBlitz() { return soundBlitz; } + public void setSoundBlitz(Clip soundBlitz) { this.soundBlitz = soundBlitz; } + public Clip getSoundBlock() { return soundBlock; } + public void setSoundBlock(Clip soundBlock) { this.soundBlock = soundBlock; } + public Clip getSoundPass() { return soundPass; } + public void setSoundPass(Clip soundPass) { this.soundPass = soundPass; } + public Clip getSoundDied() { return soundDied; } + public void setSoundDied(Clip soundDied) { this.soundDied = soundDied; } + + public void setId() { this.id = getTeam().countUpIdCounter(); } diff --git a/src/gameLogic/TeamManager.java b/src/gameLogic/TeamManager.java index 4973204..e403439 100644 --- a/src/gameLogic/TeamManager.java +++ b/src/gameLogic/TeamManager.java @@ -1,5 +1,6 @@ package gameLogic; +import client.sound.PlayerSound; import server.Server; import util.ResourceManager; import util.SBApplication; @@ -9,6 +10,10 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; @@ -99,6 +104,7 @@ private void setUp(File teamsDir) { try { HashMap teamImages = new HashMap(); + HashMap teamSounds = new HashMap(); // handle team files if(teamsDir != null) { @@ -125,11 +131,24 @@ private void setUp(File teamsDir) { } else if (filename.toLowerCase().endsWith(".png")) { // is image try { + String imageName = filename.substring(0, filename.length() - ".png".length()); teamImages.put(imageName, ImageIO.read(teamFile)); - } catch (IOException e) { - getParent().log(Level.WARNING, "IOException while reading team image " + teamFile.getName() + "."); - } + + } catch (IOException e) { getParent().log(Level.WARNING, "IOException while reading team image " + teamFile.getName() + "."); } + + } else if (filename.toLowerCase().endsWith(".wav")) { // is sound + + try { + + String soundName = filename.substring(0, filename.length() - ".wav".length()); + Clip clip = AudioSystem.getClip(); + clip.open(AudioSystem.getAudioInputStream(teamFile)); + teamSounds.put(soundName, clip); + + } catch(LineUnavailableException e) { getParent().logStackTrace(e); + } catch(UnsupportedAudioFileException e) { getParent().log(Level.WARNING, "Unsupported Audio File " + teamFile.getName() + "."); + } catch(IOException e) { getParent().log(Level.WARNING, "IOException while reading team sound " + teamFile.getName() + "."); } } } @@ -138,7 +157,7 @@ private void setUp(File teamsDir) { } } - // handle player images + // handle player images and sounds int w = ResourceManager.IMAGE_WIDTH, h = ResourceManager.IMAGE_HEIGHT; for (Team team : teamBlueprints) { for (Player player : team.availablePlayers) { @@ -157,6 +176,17 @@ private void setUp(File teamsDir) { player.setSpriteL(imageL); } else player.setSpriteL(ResourceManager.IMAGE_DEFAULT_PLAYER_L); + // get sounds + player.setSoundPickUp(teamSounds.get(player.getName() + " Pick Up")); + player.setSoundProned(teamSounds.get(player.getName() + " Proned")); + player.setSoundStunned(teamSounds.get(player.getName() + " Stunned")); + player.setSoundInjured(teamSounds.get(player.getName() + " Injured")); + player.setSoundKO(teamSounds.get(player.getName() + " KO")); + player.setSoundBlitz(teamSounds.get(player.getName() + " Blitz")); + player.setSoundBlock(teamSounds.get(player.getName() + " Block")); + player.setSoundPass(teamSounds.get(player.getName() + " Pass")); + player.setSoundDied(teamSounds.get(player.getName() + " Died")); + } } } else {