diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.form b/Mage.Client/src/main/java/mage/client/MageFrame.form
index bbe38d41da5..ffeecb63fc1 100644
--- a/Mage.Client/src/main/java/mage/client/MageFrame.form
+++ b/Mage.Client/src/main/java/mage/client/MageFrame.form
@@ -52,7 +52,9 @@
-
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java
index 582c02e358d..83379b706a0 100644
--- a/Mage.Client/src/main/java/mage/client/MageFrame.java
+++ b/Mage.Client/src/main/java/mage/client/MageFrame.java
@@ -113,8 +113,8 @@ import mage.client.remote.CallbackClientImpl;
import mage.client.table.TablesPane;
import mage.client.tournament.TournamentPane;
import mage.client.util.EDTExceptionHandler;
-import mage.client.util.MusicPlayer;
import mage.client.util.SettingsManager;
+import mage.client.util.audio.MusicPlayer;
import mage.client.util.gui.ArrowBuilder;
import mage.components.ImagePanel;
import mage.interfaces.MageClient;
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 9b39f203edb..48b76232858 100644
--- a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java
+++ b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java
@@ -3,7 +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.audio.AudioManager;
import mage.client.util.SettingsManager;
import mage.client.util.gui.ArrowBuilder;
import mage.view.CardView;
diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java
index 5567d8b59c0..19ac164198b 100644
--- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java
+++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/ChoiceDialog.java
@@ -9,7 +9,7 @@ import mage.client.components.ext.dlg.DialogManager;
import mage.client.components.ext.dlg.DlgParams;
import mage.client.components.ext.dlg.IDialogPanel;
import mage.client.plugins.impl.Plugins;
-import mage.client.util.AudioManager;
+import mage.client.util.audio.AudioManager;
import mage.client.util.Command;
import mage.client.util.SettingsManager;
import mage.view.CardView;
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
index c4847696d39..257f63e42c3 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java
@@ -39,7 +39,7 @@ import mage.client.MageFrame;
import mage.client.cards.BigCard;
import mage.client.components.HoverButton;
import mage.client.plugins.impl.Plugins;
-import mage.client.util.AudioManager;
+import mage.client.util.audio.AudioManager;
import mage.client.util.Command;
import mage.client.util.Config;
import mage.client.util.ImageHelper;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java b/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java
index 3d912880b6e..3440a44b11b 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/GameEndDialog.java
@@ -49,7 +49,7 @@ import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import mage.client.MageFrame;
import mage.client.game.GamePanel;
-import mage.client.util.AudioManager;
+import mage.client.util.audio.AudioManager;
import mage.client.util.Format;
import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
index 04d4a579ef1..b05eb2f917c 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
@@ -66,13 +66,13 @@
-
+
-
-
+
+
-
+
@@ -82,10 +82,10 @@
-
+
-
-
+
+
@@ -171,7 +171,7 @@
-
+
@@ -184,6 +184,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -731,8 +747,8 @@
-
-
+
+
@@ -745,7 +761,7 @@
-
+
@@ -769,13 +785,13 @@
-
+
-
-
+
+
-
+
@@ -783,6 +799,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
index f561a43f837..19e55015950 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
@@ -74,10 +74,13 @@ import org.apache.log4j.Logger;
*/
public class PreferencesDialog extends javax.swing.JDialog {
+ private static final transient Logger log = Logger.getLogger(PreferencesDialog.class);
+
public static final String KEY_SHOW_TOOLTIPS_ANY_ZONE = "showTooltipsInAnyZone";
public static final String KEY_HAND_USE_BIG_CARDS = "handUseBigCards";
public static final String KEY_PERMANENTS_IN_ONE_PILE = "nonLandPermanentsInOnePile";
public static final String KEY_SHOW_PLAYER_NAMES_PERMANENTLY = "showPlayerNamesPermanently";
+ public static final String KEY_SHOW_ABILITY_PICKER = "showAbilityPicker";
public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave";
public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault";
@@ -91,7 +94,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_BATTLEFIELD_IMAGE_RANDOM = "battlefieldImagerandom";
public static final String KEY_BATTLEFIELD_IMAGE_DEFAULT = "battlefieldImageDefault";
- public static final String KEY_SOUNDS_ON = "soundsOn";
+ public static final String KEY_SOUNDS_GAME_ON = "soundsOn";
+ public static final String KEY_SOUNDS_OTHER_ON = "soundsOtherOn";
public static final String KEY_SOUNDS_MATCH_MUSIC_ON = "soundsMatchMusicOn";
public static final String KEY_SOUNDS_MATCH_MUSIC_PATH = "soundsMatchMusicPath";
@@ -173,17 +177,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_AVATAR = "selectedId";
- private static Map cache = new HashMap();
+ private static final Map cache = new HashMap();
+
private static final Boolean UPDATE_CACHE_POLICY = Boolean.TRUE;
public static final String OPEN_CONNECTION_TAB = "Open-Connection-Tab";
- private static final transient Logger log = Logger.getLogger(PreferencesDialog.class);
+
public static final int DEFAULT_AVATAR_ID = 51;
private static int selectedAvatarId = DEFAULT_AVATAR_ID;
private static final Set available_avatars = new HashSet();
- private static Map panels = new HashMap();
+ private static final Map panels = new HashMap();
private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3);
private static final Border BLACK_BORDER = BorderFactory.createLineBorder(Color.BLACK, 3);
@@ -267,6 +272,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
main_game = new javax.swing.JPanel();
nonLandPermanentsInOnePile = new javax.swing.JCheckBox();
showPlayerNamesPermanently = new javax.swing.JCheckBox();
+ showAbilityPickerForSimpleAbilities = new javax.swing.JCheckBox();
main_gamelog = new javax.swing.JPanel();
cbGameLogAutoSave = new javax.swing.JCheckBox();
tabPhases = new javax.swing.JPanel();
@@ -313,7 +319,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
jLabel15 = new javax.swing.JLabel();
tabSounds = new javax.swing.JPanel();
sounds_clips = new javax.swing.JPanel();
- cbEnableSounds = new javax.swing.JCheckBox();
+ cbEnableGameSounds = new javax.swing.JCheckBox();
+ cbEnableOtherSounds = new javax.swing.JCheckBox();
sounds_backgroundMusic = new javax.swing.JPanel();
cbEnableBattlefieldBGM = new javax.swing.JCheckBox();
jLabel16 = new javax.swing.JLabel();
@@ -390,7 +397,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
nonLandPermanentsInOnePileActionPerformed(evt);
}
});
- main_game.add(nonLandPermanentsInOnePile, java.awt.BorderLayout.CENTER);
+ main_game.add(nonLandPermanentsInOnePile, java.awt.BorderLayout.PAGE_START);
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
showPlayerNamesPermanently.setSelected(true);
@@ -401,7 +408,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
showPlayerNamesPermanentlyActionPerformed(evt);
}
});
- main_game.add(showPlayerNamesPermanently, java.awt.BorderLayout.PAGE_END);
+ main_game.add(showPlayerNamesPermanently, java.awt.BorderLayout.LINE_START);
+
+ showAbilityPickerForSimpleAbilities.setSelected(true);
+ showAbilityPickerForSimpleAbilities.setText("Show ability picker for abilities without costs");
+ showAbilityPickerForSimpleAbilities.setToolTipText("This prevents that you accidently activate abilities without costs that e.g. tap the permanent.");
+ showAbilityPickerForSimpleAbilities.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
+ showAbilityPickerForSimpleAbilities.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ showAbilityPickerForSimpleAbilitiesActionPerformed(evt);
+ }
+ });
+ main_game.add(showAbilityPickerForSimpleAbilities, java.awt.BorderLayout.PAGE_END);
main_gamelog.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Game log"));
main_gamelog.setLayout(new java.awt.BorderLayout());
@@ -423,8 +441,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(main_card, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE))
+ .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE)
+ .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
tabMainLayout.setVerticalGroup(
@@ -433,10 +451,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(188, Short.MAX_VALUE))
+ .addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(153, Short.MAX_VALUE))
);
main_card.getAccessibleContext().setAccessibleName("Game panel");
@@ -766,14 +784,23 @@ public class PreferencesDialog extends javax.swing.JDialog {
sounds_clips.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Clips"));
sounds_clips.setLayout(new java.awt.BorderLayout());
- cbEnableSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.)");
- cbEnableSounds.setLabel("Enable");
- cbEnableSounds.addActionListener(new java.awt.event.ActionListener() {
+ cbEnableGameSounds.setText("Enable game sounds");
+ cbEnableGameSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.) during the game.");
+ cbEnableGameSounds.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- cbEnableSoundsActionPerformed(evt);
+ cbEnableGameSoundsActionPerformed(evt);
}
});
- sounds_clips.add(cbEnableSounds, java.awt.BorderLayout.CENTER);
+ sounds_clips.add(cbEnableGameSounds, java.awt.BorderLayout.CENTER);
+
+ cbEnableOtherSounds.setText("Enable other sounds");
+ cbEnableOtherSounds.setToolTipText("Sounds that will be played for actions outside of games (e.g. whisper, player joins your game, player submits a deck ...).");
+ cbEnableOtherSounds.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbEnableOtherSoundsActionPerformed(evt);
+ }
+ });
+ sounds_clips.add(cbEnableOtherSounds, java.awt.BorderLayout.PAGE_END);
sounds_backgroundMusic.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Music"));
@@ -835,8 +862,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(tabSoundsLayout.createSequentialGroup()
.addContainerGap()
.addGroup(tabSoundsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(sounds_clips, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(sounds_clips, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE)
+ .addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
tabSoundsLayout.setVerticalGroup(
@@ -846,7 +873,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(sounds_clips, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(254, Short.MAX_VALUE))
+ .addContainerGap(229, Short.MAX_VALUE))
);
sounds_clips.getAccessibleContext().setAccessibleDescription("");
@@ -1288,6 +1315,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.displayBigCardsInHand, KEY_HAND_USE_BIG_CARDS, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.showPlayerNamesPermanently, KEY_SHOW_PLAYER_NAMES_PERMANENTLY, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.showAbilityPickerForSimpleAbilities, KEY_SHOW_ABILITY_PICKER, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
// Phases
@@ -1318,7 +1346,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbUseRandomBattleImage, KEY_BATTLEFIELD_IMAGE_RANDOM, "true", "false", UPDATE_CACHE_POLICY);
// sounds
- save(prefs, dialog.cbEnableSounds, KEY_SOUNDS_ON, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbEnableGameSounds, KEY_SOUNDS_GAME_ON, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbEnableOtherSounds, KEY_SOUNDS_OTHER_ON, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbEnableBattlefieldBGM, KEY_SOUNDS_MATCH_MUSIC_ON, "true", "false", UPDATE_CACHE_POLICY);
saveSoundPath(prefs);
@@ -1404,9 +1433,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
// TODO add your handling code here:
}//GEN-LAST:event_cbCheckForNewImagesActionPerformed
- private void cbEnableSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableSoundsActionPerformed
+ private void cbEnableGameSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableGameSoundsActionPerformed
// TODO add your handling code here:
- }//GEN-LAST:event_cbEnableSoundsActionPerformed
+ }//GEN-LAST:event_cbEnableGameSoundsActionPerformed
private void cbEnableBattlefieldBGMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableBattlefieldBGMActionPerformed
if(cbEnableBattlefieldBGM.isSelected()){
@@ -1545,6 +1574,14 @@ public class PreferencesDialog extends javax.swing.JDialog {
}//GEN-LAST:event_showToolTipsInAnyZoneActionPerformed
+ private void showAbilityPickerForSimpleAbilitiesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showAbilityPickerForSimpleAbilitiesActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_showAbilityPickerForSimpleAbilitiesActionPerformed
+
+ private void cbEnableOtherSoundsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbEnableOtherSoundsActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbEnableOtherSoundsActionPerformed
+
private void showProxySettings() {
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
this.pnlProxy.setVisible(true);
@@ -1575,6 +1612,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
}
final int openedTab = param;
java.awt.EventQueue.invokeLater(new Runnable() {
+ @Override
public void run() {
if (!dialog.isVisible()) {
Preferences prefs = MageFrame.getPreferences();
@@ -1628,6 +1666,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
load(prefs, dialog.showToolTipsInAnyZone, KEY_SHOW_TOOLTIPS_ANY_ZONE, "true");
load(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true");
load(prefs, dialog.showPlayerNamesPermanently, KEY_SHOW_PLAYER_NAMES_PERMANENTLY, "true");
+ load(prefs, dialog.showAbilityPickerForSimpleAbilities, KEY_SHOW_ABILITY_PICKER, "true");
load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true");
}
@@ -1682,11 +1721,17 @@ public class PreferencesDialog extends javax.swing.JDialog {
}
private static void loadSoundSettings(Preferences prefs) {
- String prop = prefs.get(KEY_SOUNDS_ON, "true");
+ String prop = prefs.get(KEY_SOUNDS_GAME_ON, "true");
if (prop.equals("true")) {
- dialog.cbEnableSounds.setSelected(true);
+ dialog.cbEnableGameSounds.setSelected(true);
} else {
- dialog.cbEnableSounds.setSelected(false);
+ dialog.cbEnableGameSounds.setSelected(false);
+ }
+ prop = prefs.get(KEY_SOUNDS_OTHER_ON, "true");
+ if (prop.equals("true")) {
+ dialog.cbEnableOtherSounds.setSelected(true);
+ } else {
+ dialog.cbEnableOtherSounds.setSelected(false);
}
// Match music
@@ -1830,7 +1875,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
} else {
Preferences prefs = MageFrame.getPreferences();
String value = prefs.get(key, def);
- if (value == null) return null;
+ if (value == null) {
+ return null;
+ }
cache.put(key, value);
return value;
}
@@ -1877,8 +1924,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
for (JPanel panel : panels.values()) {
panel.setBorder(BLACK_BORDER);
}
- this.selectedAvatarId = id;
- panels.get(this.selectedAvatarId).setBorder(GREEN_BORDER);
+ PreferencesDialog.selectedAvatarId = id;
+ panels.get(PreferencesDialog.selectedAvatarId).setBorder(GREEN_BORDER);
}
}
@@ -1923,7 +1970,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JButton btnBrowseImageLocation;
private javax.swing.JCheckBox cbCheckForNewImages;
private javax.swing.JCheckBox cbEnableBattlefieldBGM;
- private javax.swing.JCheckBox cbEnableSounds;
+ private javax.swing.JCheckBox cbEnableGameSounds;
+ private javax.swing.JCheckBox cbEnableOtherSounds;
private javax.swing.JCheckBox cbGameLogAutoSave;
private javax.swing.JComboBox cbProxyType;
private javax.swing.JCheckBox cbSaveToZipFiles;
@@ -1992,6 +2040,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JPanel pnlProxySettings;
private javax.swing.JCheckBox rememberPswd;
private javax.swing.JButton saveButton;
+ private javax.swing.JCheckBox showAbilityPickerForSimpleAbilities;
private javax.swing.JCheckBox showPlayerNamesPermanently;
private javax.swing.JCheckBox showToolTipsInAnyZone;
private javax.swing.JPanel sounds_backgroundMusic;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
index 210ad8438b0..6eae9b77879 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
@@ -44,7 +44,7 @@ import mage.client.MageFrame;
import mage.client.chat.ChatPanel;
import mage.client.components.MageComponents;
import mage.client.components.tray.MageTray;
-import mage.client.util.AudioManager;
+import mage.client.util.audio.AudioManager;
import mage.remote.Session;
import mage.view.SeatView;
import mage.view.TableView;
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 5779c881af3..ac3c671bc60 100644
--- a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java
@@ -56,7 +56,7 @@ 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.audio.AudioManager;
import mage.client.util.Config;
import mage.constants.CardType;
import mage.view.PermanentView;
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 bcaa9d642f0..84c47246b59 100644
--- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
@@ -46,7 +46,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.audio.AudioManager;
import mage.client.util.gui.ArrowBuilder;
import mage.remote.Session;
import org.apache.log4j.Logger;
diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
index a2479d6f98b..0d81fb21cce 100644
--- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
+++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
@@ -38,7 +38,7 @@ import mage.client.constants.Constants.DeckEditorMode;
import mage.client.draft.DraftPanel;
import mage.client.game.GamePanel;
import mage.client.plugins.impl.Plugins;
-import mage.client.util.AudioManager;
+import mage.client.util.audio.AudioManager;
import mage.client.util.DeckUtil;
import mage.client.util.GameManager;
import mage.client.util.object.SaveObjectUtil;
diff --git a/Mage.Client/src/main/java/mage/client/util/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/AudioManager.java
deleted file mode 100644
index ad1417e53d3..00000000000
--- a/Mage.Client/src/main/java/mage/client/util/AudioManager.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package mage.client.util;
-
-import java.io.File;
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.Clip;
-import javax.sound.sampled.DataLine;
-import mage.client.constants.Constants;
-import mage.client.dialog.PreferencesDialog;
-import org.apache.log4j.Logger;
-
-/**
- * Manager class for playing audio files.
- *
- * @author nantuko
- */
-public class AudioManager {
-
- private static final Logger log = Logger.getLogger(AudioManager.class);
-
- /**
- * AudioManager singleton.
- */
- private static AudioManager audioManager = null;
-
-
- public static AudioManager getManager() {
- if (audioManager == null) {
- audioManager = new AudioManager();
- audioManager.nextPageClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"); //sounds better than OnNextPage
- audioManager.prevPageClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav");
- audioManager.anotherTabClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPage.wav");
- audioManager.nextPhaseClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPhase.wav");
- 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");
- audioManager.attackClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAttack.wav");
- audioManager.blockClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnBlock.wav");
- audioManager.addPermanentClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddPermanent.wav");
- audioManager.addArtifactClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddArtifact.wav");
- audioManager.updateStackClip = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnStackNew.wav");
- audioManager.onHover = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnHover.wav");
-
- audioManager.playerJoinedTable = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerJoinedTable.wav");
- audioManager.playerSubmittedDeck = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerSubmittedDeck.wav");
- audioManager.playerWhispered = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWhispered.wav");
- audioManager.playerLeft = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLeft.wav");
- audioManager.playerWon = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWon.wav");
- audioManager.playerLost = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLost.wav");
- }
- return audioManager;
- }
-
- public static void playNextPage() {
- checkAndPlayClip(getManager().nextPageClip);
- }
-
- public static void playPrevPage() {
- checkAndPlayClip(getManager().prevPageClip);
- }
-
- public static void playAnotherTab() {
- checkAndPlayClip(getManager().anotherTabClip);
- }
-
- public static void playNextPhase() {
- checkAndPlayClip(getManager().nextPhaseClip);
- }
-
- public static void playEndTurn() {
- checkAndPlayClip(getManager().endTurnClip);
- }
-
- public static void playTapPermanent() {
- checkAndPlayClip(getManager().tapPermanentClip);
- }
-
- public static void playSummon() {
- checkAndPlayClip(getManager().summonClip);
- }
-
- public static void playDiedCreature() {
- checkAndPlayClip(getManager().diedCreatureClip);
- }
-
- public static void playDraw() {
- checkAndPlayClip(getManager().drawClip);
- }
-
- public static void playButtonOk() {
- checkAndPlayClip(getManager().buttonOkClip);
- }
-
- public static void playButtonCancel() {
- checkAndPlayClip(getManager().buttonCancelClip);
- }
-
- public static void playAttack() {
- checkAndPlayClip(getManager().attackClip);
- }
-
- public static void playBlock() {
- checkAndPlayClip(getManager().blockClip);
- }
-
- public static void playAddPermanent() {
- checkAndPlayClip(getManager().addPermanentClip);
- }
-
- public static void playAddArtifact() {
- checkAndPlayClip(getManager().addArtifactClip);
- }
-
- public static void playStackNew() {
- checkAndPlayClip(getManager().updateStackClip);
- }
-
- public static void playOnHover() {
- checkAndPlayClip(getManager().onHover);
- }
-
- public static void playPlayerJoinedTable() {
- checkAndPlayClip(getManager().playerJoinedTable);
- }
-
- public static void playPlayerWhispered() {
- checkAndPlayClip(getManager().playerWhispered);
- }
-
- public static void playPlayerSubmittedDeck() {
- checkAndPlayClip(getManager().playerSubmittedDeck);
- }
-
- public static void playPlayerLeft() {
- checkAndPlayClip(getManager().playerLeft);
- }
-
- public static void playPlayerLost() {
- checkAndPlayClip(getManager().playerLost);
- }
-
- public static void playPlayerWon() {
- checkAndPlayClip(getManager().playerWon);
- }
-
- private static void checkAndPlayClip(Clip clip) {
- try {
- if (clip != null) {
- String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_ON, "true");
- if (soundsOn.equals("true")) {
- audioManager.play(clip);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void play(final Clip clip) {
- new Thread(new Runnable() {
- public void run() {
- clip.setFramePosition(0);
- clip.start();
- }
- }).run();
- }
-
- private Clip loadClip(String filename) {
- try {
- File soundFile = new File(filename);
- AudioInputStream soundIn = AudioSystem
- .getAudioInputStream(soundFile);
- AudioFormat format = new AudioFormat(
- AudioFormat.Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED,
- 16, 2, 4, AudioSystem.NOT_SPECIFIED, true);
- DataLine.Info info = new DataLine.Info(Clip.class, format);
-
- Clip clip = (Clip) AudioSystem.getLine(info);
- clip.open(soundIn);
-
- return clip;
- } catch (Exception e) {
- //e.printStackTrace();
- log.error("Couldn't load sound: " + filename + ".");
- }
-
- return null;
- }
-
- private Clip nextPageClip = null;
- private Clip prevPageClip = null;
- private Clip anotherTabClip = null;
- private Clip nextPhaseClip = null;
- 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;
- private Clip attackClip = null;
- private Clip blockClip = null;
- private Clip addPermanentClip = null;
- private Clip addArtifactClip = null;
- private Clip updateStackClip = null;
- private Clip onHover = null;
-
- private Clip playerJoinedTable = null;
- private Clip playerSubmittedDeck = null;
- private Clip playerWhispered = null;
- private Clip playerLeft = null;
- private Clip playerWon = null;
- private Clip playerLost = null;
-}
diff --git a/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java
deleted file mode 100644
index 5079e56c3be..00000000000
--- a/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package mage.client.util;
-import java.io.File;
-import java.awt.List;
-import javax.sound.sampled.*;
-import mage.client.constants.Constants;
-import mage.client.dialog.PreferencesDialog;
-import org.apache.log4j.Logger;
-
-/**
- *
- * @author renli
- */
-
-public class MusicPlayer {
- private static final Logger log = Logger.getLogger(AudioManager.class);
- String filepath;
- String filename;
- List filelist = new List();
- static MusicPlayer player = null;
-
-
- //open file and add list
- private boolean open(){
- String path = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_PATH, "true");
- filepath = path + File.separator;
- if(path == null) filepath = Constants.BASE_MUSICS_PATH;
- filelist.removeAll();
- File filedir = new File(filepath);
- File[] fileread = filedir.listFiles();
- if(fileread == null) return false;
- if(fileread.length == 0)return false;
- String filename;
- for(File f:fileread){
- filename = f.getName().toLowerCase();
- if(filename.endsWith(".mp3") || filename.endsWith(".wav")){
- filelist.add(filename);
- }
- }
- if(filelist.getItemCount() == 0) return false;
- return true;
- }
-
- public static void playBGM(){
- stopBGM();
- if(player == null){
- player = new MusicPlayer();
- }
- if(player.open()){
- player.play();
- }
- }
-
- public void play(){
- String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_ON, "true");
- if(soundsOn.equals("true")){
- player.breaked = false;
- player.breaked_out = false;
- player.stopped = false;
- Thread player = new Thread(new playerThread());
- player.start();
- }
- }
-
- public static void stopBGM(){
- if(player != null){
- player.stopped = true;
- player.breaked_out = true;
- player.breaked = true;
- try {
- Thread.sleep(100);
- } catch (Exception e) {
- log.error("Thread error: " + e);
- }
- }
- }
-
- public volatile boolean breaked = false;
- public volatile boolean breaked_out = false;
- public volatile boolean stopped = false;
- public volatile FloatControl volume;
- AudioInputStream audioInputStream;
- AudioFormat audioFormat;
- SourceDataLine sourceDataLine;
-
-
- class playerThread extends Thread{
- private void load(File file){
- try{
- audioInputStream = AudioSystem.getAudioInputStream(file);
- audioFormat = audioInputStream.getFormat();
- // mp3 decode
- if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
- audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
- audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2,
- audioFormat.getSampleRate(), false);
- audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream);
- }
- //output
- DataLine.Info dataLineInfo = new DataLine.Info(
- SourceDataLine.class, audioFormat,
- AudioSystem.NOT_SPECIFIED);
- sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
- sourceDataLine.open(audioFormat);
- volume = (FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
- sourceDataLine.start();
- }catch(Exception e){
- log.error("Couldn't load file: " + file + " " + e);
- }
-
- }
-
- public void run(){
- try {
- Thread.sleep(100);
- } catch (Exception e) {
- }
- while(!stopped){
- int it = (int)Math.abs(Math.random()*(filelist.getItemCount()));
- File file = new File(filepath + filelist.getItem(it));
- load(file);
- Thread PlayThread = new Thread(new PlayThread());
- PlayThread.start();
- while (!(breaked || breaked_out)) {
- try {
- Thread.sleep(10);
- } catch (Exception e) {
- log.error("Thread error: " + e);
- }
- }
- breaked = false;
- }
- }
- };
-
- class PlayThread extends Thread{
- byte tempBuffer[] = new byte[320];
- public void run(){
- try{
- sourceDataLine.flush();
- int len;
- while ((len = audioInputStream.read(tempBuffer, 0,
- tempBuffer.length)) != -1){
- if(breaked_out) break;
- if(len > 0) sourceDataLine.write(tempBuffer, 0, len);
- }
- //breaked or stopped
- sourceDataLine.flush();
- sourceDataLine.close();
- breaked = true;
- }catch(Exception e){
- log.error("Thread error: " + e);
- }
- }
- };
-}
-
diff --git a/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java b/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java
new file mode 100644
index 00000000000..ae90e67515d
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/util/audio/AudioGroup.java
@@ -0,0 +1,10 @@
+package mage.client.util.audio;
+
+/**
+ *
+ * @author LevelX2
+ */
+public enum AudioGroup {
+ GameSounds,
+ OtherSounds;
+}
diff --git a/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java
new file mode 100644
index 00000000000..da33d4be6d7
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java
@@ -0,0 +1,256 @@
+package mage.client.util.audio;
+
+import java.io.File;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.DataLine;
+import mage.client.constants.Constants;
+import mage.client.dialog.PreferencesDialog;
+import org.apache.log4j.Logger;
+
+/**
+ * Manager class for playing audio files.
+ *
+ * @author nantuko
+ */
+public class AudioManager {
+
+ private static final Logger log = Logger.getLogger(AudioManager.class);
+
+ private MageClip nextPageClip = null;
+ private MageClip prevPageClip = null;
+ private MageClip anotherTabClip = null;
+ private MageClip nextPhaseClip = null;
+ private MageClip endTurnClip = null;
+ private MageClip tapPermanentClip = null;
+ private MageClip summonClip = null;
+ private MageClip diedCreatureClip = null;
+ private MageClip drawClip = null;
+ private MageClip buttonOkClip = null;
+ private MageClip buttonCancelClip = null;
+ private MageClip attackClip = null;
+ private MageClip blockClip = null;
+ private MageClip addPermanentClip = null;
+ private MageClip addArtifactClip = null;
+ private MageClip updateStackClip = null;
+ private MageClip onHover = null;
+
+ private MageClip playerJoinedTable = null;
+ private MageClip playerSubmittedDeck = null;
+ private MageClip playerWhispered = null;
+ private MageClip playerLeft = null;
+ private MageClip playerWon = null;
+ private MageClip playerLost = null;
+ /**
+ * AudioManager singleton.
+ */
+ private static AudioManager audioManager = null;
+
+
+ public static AudioManager getManager() {
+ if (audioManager == null) {
+ audioManager = new AudioManager();
+ audioManager.nextPageClip =
+ new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"),
+ AudioGroup.OtherSounds); //sounds better than OnNextPage
+ audioManager.prevPageClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPrevPage.wav"),
+ AudioGroup.OtherSounds);
+ audioManager.anotherTabClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPage.wav"),
+ AudioGroup.OtherSounds);
+
+ audioManager.playerSubmittedDeck = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerSubmittedDeck.wav"),
+ AudioGroup.OtherSounds);
+ audioManager.playerWhispered = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWhispered.wav"),
+ AudioGroup.OtherSounds);
+ audioManager.playerLeft = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLeft.wav"),
+ AudioGroup.OtherSounds);
+
+ // in games sounds
+ audioManager.nextPhaseClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnNextPhase.wav"),
+ AudioGroup.GameSounds);
+ audioManager.endTurnClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnEndTurn.wav"),
+ AudioGroup.GameSounds);
+ audioManager.tapPermanentClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnTapPermanent.wav"),
+ AudioGroup.GameSounds);
+ audioManager.summonClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon.wav"),
+ AudioGroup.GameSounds);
+ audioManager.diedCreatureClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnSummon-.wav"),
+ AudioGroup.GameSounds);
+ audioManager.drawClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnDraw.wav"),
+ AudioGroup.GameSounds);
+ audioManager.buttonOkClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonOk.wav"),
+ AudioGroup.GameSounds);
+ audioManager.buttonCancelClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnButtonCancel.wav"),
+ AudioGroup.GameSounds);
+ audioManager.attackClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAttack.wav"),
+ AudioGroup.GameSounds);
+ audioManager.blockClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnBlock.wav"),
+ AudioGroup.GameSounds);
+ audioManager.addPermanentClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddPermanent.wav"),
+ AudioGroup.GameSounds);
+ audioManager.addArtifactClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnAddArtifact.wav"),
+ AudioGroup.GameSounds);
+ audioManager.updateStackClip = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnStackNew.wav"),
+ AudioGroup.GameSounds);
+ audioManager.onHover = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnHover.wav"),
+ AudioGroup.GameSounds);
+ audioManager.playerWon = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWon.wav"),
+ AudioGroup.GameSounds);
+ audioManager.playerLost = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLost.wav"),
+ AudioGroup.GameSounds);
+ }
+ return audioManager;
+ }
+
+ public static void playNextPage() {
+ checkAndPlayClip(getManager().nextPageClip);
+ }
+
+ public static void playPrevPage() {
+ checkAndPlayClip(getManager().prevPageClip);
+ }
+
+ public static void playAnotherTab() {
+ checkAndPlayClip(getManager().anotherTabClip);
+ }
+
+ public static void playNextPhase() {
+ checkAndPlayClip(getManager().nextPhaseClip);
+ }
+
+ public static void playEndTurn() {
+ checkAndPlayClip(getManager().endTurnClip);
+ }
+
+ public static void playTapPermanent() {
+ checkAndPlayClip(getManager().tapPermanentClip);
+ }
+
+ public static void playSummon() {
+ checkAndPlayClip(getManager().summonClip);
+ }
+
+ public static void playDiedCreature() {
+ checkAndPlayClip(getManager().diedCreatureClip);
+ }
+
+ public static void playDraw() {
+ checkAndPlayClip(getManager().drawClip);
+ }
+
+ public static void playButtonOk() {
+ checkAndPlayClip(getManager().buttonOkClip);
+ }
+
+ public static void playButtonCancel() {
+ checkAndPlayClip(getManager().buttonCancelClip);
+ }
+
+ public static void playAttack() {
+ checkAndPlayClip(getManager().attackClip);
+ }
+
+ public static void playBlock() {
+ checkAndPlayClip(getManager().blockClip);
+ }
+
+ public static void playAddPermanent() {
+ checkAndPlayClip(getManager().addPermanentClip);
+ }
+
+ public static void playAddArtifact() {
+ checkAndPlayClip(getManager().addArtifactClip);
+ }
+
+ public static void playStackNew() {
+ checkAndPlayClip(getManager().updateStackClip);
+ }
+
+ public static void playOnHover() {
+ checkAndPlayClip(getManager().onHover);
+ }
+
+ public static void playPlayerJoinedTable() {
+ if (audioManager.playerJoinedTable == null) {
+ audioManager.playerJoinedTable = new MageClip(audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerJoinedTable.wav"),
+ AudioGroup.OtherSounds);
+ }
+ checkAndPlayClip(getManager().playerJoinedTable);
+ }
+
+ public static void playPlayerWhispered() {
+ checkAndPlayClip(getManager().playerWhispered);
+ }
+
+ public static void playPlayerSubmittedDeck() {
+ checkAndPlayClip(getManager().playerSubmittedDeck);
+ }
+
+ public static void playPlayerLeft() {
+ checkAndPlayClip(getManager().playerLeft);
+ }
+
+ public static void playPlayerLost() {
+ checkAndPlayClip(getManager().playerLost);
+ }
+
+ public static void playPlayerWon() {
+ checkAndPlayClip(getManager().playerWon);
+ }
+
+ private static void checkAndPlayClip(MageClip mageClip) {
+ try {
+ if (mageClip != null) {
+ boolean playSound = false;
+ switch (mageClip.getAudioGroup()) {
+ case GameSounds:
+ playSound = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_GAME_ON, "true").equals("true");
+ break;
+ case OtherSounds:
+ playSound = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_OTHER_ON, "true").equals("true");
+ }
+
+ if (playSound) {
+ audioManager.play(mageClip.getClip());
+ }
+ }
+ } catch (Exception e) {
+ Logger.getLogger(AudioManager.class).fatal("Error while playing sound clip.", e);
+ }
+ }
+
+ public void play(final Clip clip) {
+ new Thread(new Runnable() {
+ public void run() {
+ clip.setFramePosition(0);
+ clip.start();
+ }
+ }).run();
+ }
+
+ private Clip loadClip(String filename) {
+ try {
+ File soundFile = new File(filename);
+ AudioInputStream soundIn = AudioSystem
+ .getAudioInputStream(soundFile);
+ AudioFormat format = new AudioFormat(
+ AudioFormat.Encoding.PCM_SIGNED, AudioSystem.NOT_SPECIFIED,
+ 16, 2, 4, AudioSystem.NOT_SPECIFIED, true);
+ DataLine.Info info = new DataLine.Info(Clip.class, format);
+
+ Clip clip = (Clip) AudioSystem.getLine(info);
+ clip.open(soundIn);
+
+ return clip;
+ } catch (Exception e) {
+ //e.printStackTrace();
+ log.error("Couldn't load sound: " + filename + ".");
+ }
+
+ return null;
+ }
+
+
+}
diff --git a/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java b/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java
new file mode 100644
index 00000000000..efa0ed2492b
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/util/audio/MageClip.java
@@ -0,0 +1,55 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.client.util.audio;
+
+import javax.sound.sampled.Clip;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MageClip {
+
+ private final Clip clip;
+ private final AudioGroup audioGroup;
+
+ public MageClip(Clip clip, AudioGroup audioGroup) {
+ this.clip = clip;
+ this.audioGroup = audioGroup;
+ }
+
+ public Clip getClip() {
+ return clip;
+ }
+
+ public AudioGroup getAudioGroup() {
+ return audioGroup;
+ }
+
+}
diff --git a/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java
new file mode 100644
index 00000000000..ed03821d8df
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java
@@ -0,0 +1,169 @@
+package mage.client.util.audio;
+
+import java.io.File;
+import java.awt.List;
+import javax.sound.sampled.*;
+import mage.client.constants.Constants;
+import mage.client.dialog.PreferencesDialog;
+import org.apache.log4j.Logger;
+
+/**
+ *
+ * @author renli
+ */
+public class MusicPlayer {
+
+ private static final Logger log = Logger.getLogger(AudioManager.class);
+ String filepath;
+ String filename;
+ List filelist = new List();
+ static MusicPlayer player = null;
+
+ //open file and add list
+ private boolean open() {
+ String path = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_PATH, "true");
+ filepath = path + File.separator;
+ if (path == null) {
+ filepath = Constants.BASE_MUSICS_PATH;
+ }
+ filelist.removeAll();
+ File filedir = new File(filepath);
+ File[] fileread = filedir.listFiles();
+ if (fileread == null) {
+ return false;
+ }
+ if (fileread.length == 0) {
+ return false;
+ }
+ String filename;
+ for (File f : fileread) {
+ filename = f.getName().toLowerCase();
+ if (filename.endsWith(".mp3") || filename.endsWith(".wav")) {
+ filelist.add(filename);
+ }
+ }
+ if (filelist.getItemCount() == 0) {
+ return false;
+ }
+ return true;
+ }
+
+ public static void playBGM() {
+ stopBGM();
+ if (player == null) {
+ player = new MusicPlayer();
+ }
+ if (player.open()) {
+ player.play();
+ }
+ }
+
+ public void play() {
+ String soundsOn = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SOUNDS_MATCH_MUSIC_ON, "true");
+ if (soundsOn.equals("true")) {
+ player.breaked = false;
+ player.breaked_out = false;
+ player.stopped = false;
+ Thread player = new Thread(new playerThread());
+ player.start();
+ }
+ }
+
+ public static void stopBGM() {
+ if (player != null) {
+ player.stopped = true;
+ player.breaked_out = true;
+ player.breaked = true;
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ log.error("Thread error: " + e);
+ }
+ }
+ }
+
+ public volatile boolean breaked = false;
+ public volatile boolean breaked_out = false;
+ public volatile boolean stopped = false;
+ public volatile FloatControl volume;
+ AudioInputStream audioInputStream;
+ AudioFormat audioFormat;
+ SourceDataLine sourceDataLine;
+
+ class playerThread extends Thread {
+
+ private void load(File file) {
+ try {
+ audioInputStream = AudioSystem.getAudioInputStream(file);
+ audioFormat = audioInputStream.getFormat();
+ // mp3 decode
+ if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
+ audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
+ audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2,
+ audioFormat.getSampleRate(), false);
+ audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream);
+ }
+ //output
+ DataLine.Info dataLineInfo = new DataLine.Info(
+ SourceDataLine.class, audioFormat,
+ AudioSystem.NOT_SPECIFIED);
+ sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
+ sourceDataLine.open(audioFormat);
+ volume = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
+ sourceDataLine.start();
+ } catch (Exception e) {
+ log.error("Couldn't load file: " + file + " " + e);
+ }
+
+ }
+
+ public void run() {
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ }
+ while (!stopped) {
+ int it = (int) Math.abs(Math.random() * (filelist.getItemCount()));
+ File file = new File(filepath + filelist.getItem(it));
+ load(file);
+ Thread PlayThread = new Thread(new PlayThread());
+ PlayThread.start();
+ while (!(breaked || breaked_out)) {
+ try {
+ Thread.sleep(10);
+ } catch (Exception e) {
+ log.error("Thread error: " + e);
+ }
+ }
+ breaked = false;
+ }
+ }
+ };
+
+ class PlayThread extends Thread {
+
+ byte tempBuffer[] = new byte[320];
+
+ public void run() {
+ try {
+ sourceDataLine.flush();
+ int len;
+ while ((len = audioInputStream.read(tempBuffer, 0,
+ tempBuffer.length)) != -1) {
+ if (breaked_out) {
+ break;
+ }
+ if (len > 0) {
+ sourceDataLine.write(tempBuffer, 0, len);
+ }
+ }
+ //breaked or stopped
+ sourceDataLine.flush();
+ sourceDataLine.close();
+ breaked = true;
+ } catch (Exception e) {
+ log.error("Thread error: " + e);
+ }
+ }
+ };
+}
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 38f955a5f96..21cae8b95d8 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
@@ -30,7 +30,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.client.util.audio.AudioManager;
import mage.components.ImagePanel;
import mage.constants.CardType;
import mage.utils.CardUtil;
diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java
index 5f96d093920..974a74328b6 100644
--- a/Mage/src/mage/players/PlayerImpl.java
+++ b/Mage/src/mage/players/PlayerImpl.java
@@ -2140,5 +2140,5 @@ public abstract class PlayerImpl> implements Player, Ser
return game.isOpponent(this, playerToCheckId);
}
-
+
}