diff --git a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java index 90e497009c..7fd226c9d7 100644 --- a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java +++ b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java @@ -3,6 +3,7 @@ package mage.client.combat; import mage.cards.MagePermanent; import mage.client.MageFrame; import mage.client.game.PlayAreaPanel; +import mage.client.util.AudioManager; import mage.client.util.SettingsManager; import mage.client.util.gui.ArrowBuilder; import mage.view.CardView; @@ -10,7 +11,9 @@ import mage.view.CombatGroupView; import javax.swing.*; import java.awt.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -20,6 +23,10 @@ public class CombatManager { private static CombatManager combatManager; + private Map combatAttackers = new HashMap(); + private Map combatBlockers = new HashMap(); + private int globalBlockersCount; // we need global counter as there are several combat groups + public static CombatManager getInstance() { if (combatManager == null) { combatManager = new CombatManager(); @@ -34,17 +41,35 @@ public class CombatManager { displayArrows(combatView, gameId); } - public void hideCombat() { + public void hideCombat(UUID gameId) { ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT); + combatAttackers.remove(gameId); + combatBlockers.remove(gameId); } private void displayArrows(List combatView, UUID gameId) { parentPoint = null; + int count = 0; + globalBlockersCount = 0; for (CombatGroupView group : combatView) { for (CardView attacker : group.getAttackers().values()) { drawAttacker(group, attacker, gameId); + count++; } } + playAddAttackersSound(gameId, count); + playAddBlockersSound(gameId, globalBlockersCount); + } + + private void playAddAttackersSound(UUID gameId, int count) { + int prevCount = 0; + if (combatAttackers.containsKey(gameId)) { + prevCount = combatAttackers.get(gameId); + } + if (prevCount < count) { + AudioManager.playAttack(); + } + combatAttackers.put(gameId, count); } private void drawAttacker(CombatGroupView group, CardView attacker, UUID gameId) { @@ -99,11 +124,23 @@ public class CombatManager { double xRateB = (blockerCard.getSize().width / SettingsManager.getInstance().getCardSize().width); ArrowBuilder.addArrow((int) blockerPoint.getX() + (int)(55*xRateB), (int) blockerPoint.getY() + (int)(25*xRateB), (int) attackerPoint.getX() + (int)(70*xRateA), (int) attackerPoint.getY() + (int)(25*yRateA), Color.blue, ArrowBuilder.Type.COMBAT); + globalBlockersCount++; } } } } + private void playAddBlockersSound(UUID gameId, int count) { + int prevCount = 0; + if (combatBlockers.containsKey(gameId)) { + prevCount = combatBlockers.get(gameId); + } + if (prevCount < count) { + AudioManager.playBlock(); + } + combatBlockers.put(gameId, count); + } + private Point getParentPoint(MagePermanent permanent) { if (parentPoint == null) { Component parentComponent = SwingUtilities.getRoot(permanent); diff --git a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java index fa09fec63f..990a6f65eb 100644 --- a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java @@ -34,10 +34,12 @@ package mage.client.game; +import mage.Constants; import mage.cards.MagePermanent; import mage.client.cards.BigCard; import mage.client.cards.Permanent; import mage.client.plugins.impl.Plugins; +import mage.client.util.AudioManager; import mage.client.util.Config; import mage.view.PermanentView; @@ -71,6 +73,12 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { private static int i = 0; + private boolean addedPermanent; + private boolean addedArtifact; + private boolean addedCreature; + + private boolean removedCreature; + /** Creates new form BattlefieldPanel */ public BattlefieldPanel() { ui.put("battlefieldPanel", this); @@ -114,11 +122,24 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { permanents.get(permanent.getId()).update(permanent); } } + + addedArtifact = addedCreature = addedPermanent = false; + int count = permanentsToAdd.size(); for (PermanentView permanent : permanentsToAdd) { addPermanent(permanent, count); } + if (addedArtifact) { + AudioManager.playAddArtifact(); + } else if (addedCreature) { + AudioManager.playSummon(); + } else if (addedPermanent) { + AudioManager.playAddPermanent(); + } + + removedCreature = false; + for (Iterator> i = permanents.entrySet().iterator(); i.hasNext();) { Entry entry = i.next(); if (!battlefield.containsKey(entry.getKey())) { @@ -128,6 +149,10 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { } } + if (removedCreature) { + AudioManager.playDiedCreature(); + } + if (changed) { this.battlefield = battlefield; sortLayout(); @@ -183,6 +208,14 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { threads.add(t); }*/ } + + if (permanent.getCardTypes().contains(Constants.CardType.ARTIFACT)) { + addedArtifact = true; + } else if (permanent.getCardTypes().contains(Constants.CardType.CREATURE)) { + addedCreature = true; + } else { + addedPermanent = true; + } } private void groupAttachments(PermanentView permanent) { @@ -241,6 +274,9 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { }); t.start(); } + if (((MagePermanent)comp).getOriginal().getCardTypes().contains(Constants.CardType.CREATURE)) { + removedCreature = true; + } } } } diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java index 1734c22fa0..f15a93fb23 100644 --- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java @@ -38,6 +38,7 @@ import mage.client.MageFrame; import mage.client.chat.ChatPanel; import mage.client.components.MageTextArea; import mage.client.dialog.MageDialog; +import mage.client.util.AudioManager; import mage.client.util.gui.ArrowBuilder; import mage.remote.Session; import org.apache.log4j.Logger; @@ -378,12 +379,14 @@ public class FeedbackPanel extends javax.swing.JPanel { } else { session.sendPlayerBoolean(gameId, false); } + //AudioManager.playButtonOk(); }//GEN-LAST:event_btnRightActionPerformed private void btnLeftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLeftActionPerformed this.selected = true; // clear0(); session.sendPlayerBoolean(gameId, true); + AudioManager.playButtonCancel(); }//GEN-LAST:event_btnLeftActionPerformed private void btnSpecialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSpecialActionPerformed diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 685d7195c1..eedfda34e9 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -46,6 +46,7 @@ import mage.client.dialog.*; import mage.client.game.FeedbackPanel.FeedbackMode; import mage.client.plugins.adapters.MageActionCallback; import mage.client.plugins.impl.Plugins; +import mage.client.util.AudioManager; import mage.client.util.Config; import mage.client.util.GameManager; import mage.client.util.PhaseManager; @@ -380,10 +381,16 @@ public class GamePanel extends javax.swing.JPanel { } } } - if (game.getPhase() != null) + + if (game.getPhase() != null) { this.txtPhase.setText(game.getPhase().toString()); - else + } else { this.txtPhase.setText(""); + } + if (game.getPhase() != null && game.getPhase().toString().equals("End") && game.getStep().toString().equals("End Turn")) { + AudioManager.playEndTurn(); + } + if (game.getStep() != null) this.txtStep.setText(game.getStep().toString()); else @@ -423,7 +430,7 @@ public class GamePanel extends javax.swing.JPanel { CombatManager.getInstance().showCombat(game.getCombat(), gameId); } else { //combat.hideDialog(); - CombatManager.getInstance().hideCombat(); + CombatManager.getInstance().hideCombat(gameId); } updatePhases(game.getStep()); this.revalidate(); diff --git a/Mage.Client/src/main/java/mage/client/util/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/AudioManager.java index af37c9c755..f466d7b30b 100644 --- a/Mage.Client/src/main/java/mage/client/util/AudioManager.java +++ b/Mage.Client/src/main/java/mage/client/util/AudioManager.java @@ -31,6 +31,7 @@ public class AudioManager { audioManager.endTurnClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnEndTurn.wav"); audioManager.tapPermanentClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnTapPermanent.wav"); audioManager.summonClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon.wav"); + audioManager.diedCreatureClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon-.wav"); audioManager.drawClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnDraw.wav"); audioManager.buttonOkClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonOk.wav"); audioManager.buttonCancelClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonCancel.wav"); @@ -72,6 +73,10 @@ public class AudioManager { checkAndPlayClip(getManager().summonClip); } + public static void playDiedCreature() { + checkAndPlayClip(getManager().diedCreatureClip); + } + public static void playDraw() { checkAndPlayClip(getManager().drawClip); } @@ -156,6 +161,7 @@ public class AudioManager { private Clip endTurnClip = null; private Clip tapPermanentClip = null; private Clip summonClip = null; + private Clip diedCreatureClip = null; private Clip drawClip = null; private Clip buttonOkClip = null; private Clip buttonCancelClip = null; diff --git a/Mage.Client/src/main/java/mage/client/util/PhaseManager.java b/Mage.Client/src/main/java/mage/client/util/PhaseManager.java index 502b173c81..b59524bfb9 100644 --- a/Mage.Client/src/main/java/mage/client/util/PhaseManager.java +++ b/Mage.Client/src/main/java/mage/client/util/PhaseManager.java @@ -74,6 +74,7 @@ public class PhaseManager { if (activePlayer == null) { throw new IllegalStateException("No active player found."); } + for (Map.Entry entry : map.entrySet()) { if (message.equals(entry.getKey())) { Preferences prefs = MageFrame.getPreferences(); @@ -81,6 +82,6 @@ public class PhaseManager { return !prop.equals(PHASE_ON); } } - return false; + return false; } } diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java index 25fce0fefb..dc972f054c 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java @@ -5,6 +5,7 @@ import mage.cards.MagePermanent; import mage.cards.TextPopup; import mage.cards.action.ActionCallback; import mage.cards.action.TransferData; +import mage.client.util.AudioManager; import mage.components.ImagePanel; import mage.utils.CardUtil; import mage.view.AbilityView; @@ -631,6 +632,9 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti if (needsTapping || needsFlipping) { Animation.tapCardToggle(this, this, needsTapping, needsFlipping); } + if (needsTapping && ((PermanentView) card).isTapped()) { + AudioManager.playTapPermanent(); + } boolean needsTranforming = isTransformed() != card.isTransformed(); if (needsTranforming) { Animation.transformCard(this, this, card.isTransformed());