diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 39e16160f03..a547ab5c2cf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -262,6 +262,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeAutoUpdaterComboBox(); initializeMulliganRuleComboBox(); initializeAiProfilesComboBox(); + initializeSoundProfilesComboBox(); initializeStackAdditionsComboBox(); initializeLandPlayedComboBox(); initializeColorIdentityCombobox(); @@ -466,6 +467,14 @@ public enum CSubmenuPreferences implements ICDoc { panel.setComboBox(comboBox, selectedItem); } + private void initializeSoundProfilesComboBox() { + final FPref userSetting = FPref.UI_CURRENT_SOUND_PROFILE; + final FComboBoxPanel panel = this.view.getSoundProfilesComboBoxPanel(); + final FComboBox comboBox = createComboBox(SoundSystem.getAvailableSoundProfiles(), userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + } + private void initializeCardArtPreference() { final String latestOpt = Localizer.getInstance().getMessage("latestArtOpt"); final String originalOpt = Localizer.getInstance().getMessage("originalArtOpt"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 31934975948..2a542284e1c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -128,6 +128,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpCardArtFormat = new FComboBoxPanel<>(localizer.getMessage("cbpCardArtFormat")+":"); private final FComboBoxPanel cbpCardArtPreference = new FComboBoxPanel<>(localizer.getMessage("lblPreferredArt")+":"); private final FComboBoxPanel cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":"); + private final FComboBoxPanel cbpSoundProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpSoundProfiles")+":"); private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); private final FComboBoxPanel cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); private final FComboBoxPanel cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); @@ -414,6 +415,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbEnableSounds, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableSounds")), descriptionConstraints); + pnlPrefs.add(cbpSoundProfiles, comboBoxConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpSoundProfiles")), descriptionConstraints); + pnlPrefs.add(cbEnableMusic, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableMusic")), descriptionConstraints); @@ -740,6 +744,10 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbpMulliganRule; } + public FComboBoxPanel getSoundProfilesComboBoxPanel() { + return cbpSoundProfiles; + } + public FComboBoxPanel getAiProfilesComboBoxPanel() { return cbpAiProfiles; } diff --git a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java index ac2e0be5db5..7fe6ed340c1 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java @@ -64,7 +64,7 @@ public class AudioClip implements IAudioClip { } public static boolean fileExists(String fileName) { - File fSound = new File(ForgeConstants.SOUND_DIR, fileName); + File fSound = new File(SoundSystem.getSoundDirectory(), fileName); return fSound.exists(); } @@ -195,7 +195,7 @@ public class AudioClip implements IAudioClip { } private Clip createClip(String filename) { - File fSound = new File(ForgeConstants.SOUND_DIR, filename); + File fSound = new File(SoundSystem.getSoundDirectory(), filename); if (!fSound.exists()) { throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); } diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index f04a3fcc76c..e7a4531c842 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -21,10 +21,7 @@ import forge.screens.LoadingOverlay; import forge.screens.match.MatchController; import forge.screens.quest.QuestMenu; import forge.screens.settings.GuiDownloader; -import forge.sound.AudioClip; -import forge.sound.AudioMusic; -import forge.sound.IAudioClip; -import forge.sound.IAudioMusic; +import forge.sound.*; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; import forge.util.*; @@ -272,7 +269,7 @@ public class GuiMobile implements IGuiBase { @Override public IAudioClip createAudioClip(final String filename) { - return AudioClip.createClip(ForgeConstants.SOUND_DIR + filename); + return AudioClip.createClip(SoundSystem.getSoundDirectory() + filename); } @Override diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 31cb928ee23..4fc681fb5cb 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -111,6 +111,7 @@ cbpGameLogEntryType=Spielberichtsumfang cbpCloseAction=Beenden cbpDefaultFontSize=Standard Schriftgröße cbpCardArtFormat=Kartenbildformat +cbpSoundProfiles=Sound Profile cbpAiProfiles=KI Persönlichkeit cbpStackAdditions=Nachricht bei Stapeländerung cbpDisplayCurrentCardColors=Zeige detaillierte Kartenfarben diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index c22b8e08639..9a5c351eb9e 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -113,6 +113,7 @@ cbpCloseAction=Close Action cbpDefaultFontSize=Default Font Size cbpCardArtFormat=Card Art Format cbpAiProfiles=AI Personality +cbpSoundProfiles=Sound Profile cbpStackAdditions=Stack effect notifications cbpDisplayCurrentCardColors=Show Detailed Card Color cbpAutoYieldMode=Auto-Yield @@ -142,6 +143,7 @@ nlCompactMainMenu=Enable for a space efficient sidebar that displays only one me nlUseSentry=When enabled, automatically submits bug reports to developers. GamePlay=Gameplay nlpMulliganRule=Choose the version of the Mulligan rule +nlpSoundProfiles=Choose the sound profile from the ones present in the "sound" folder in your Forge cache directory nlpAiProfiles=Choose your AI opponent nlpStackAdditions=Choose when you want to get visual notifications for an effect added to the stack: Never, always, or only for the effects cast/activated by a AI player or triggered by any player nlAnte=Determines whether or not the game is played for ante. diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 8ea46c95fe9..3a5fbf406ce 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -112,6 +112,7 @@ cbpGameLogEntryType=Registro del juego cbpCloseAction=Acción al cerrar cbpDefaultFontSize=Tamaño de fuente predeterminado cbpCardArtFormat=Card Art Format +cbpSoundProfiles=Sound Profile cbpAiProfiles=Personalidad de la IA cbpStackAdditions=Efecto de la pila de notificaciones cbpDisplayCurrentCardColors=Mostrar color de la carta diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index c089272c174..7b81edf4e5b 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -111,6 +111,7 @@ cbpGameLogEntryType=Verbosità del registro di gioco cbpCloseAction=Chiudi cbpDefaultFontSize=Dimensione carattere predefinita cbpCardArtFormat=Formato dell'Illustrazione delle carte +cbpSoundProfiles=Sound Profile cbpAiProfiles=Personalità dell''IA cbpStackAdditions=Notifiche degli effetti in pila cbpDisplayCurrentCardColors=Mostra colore scheda dettagliato diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index ec920c6c054..107ca2e0963 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -112,6 +112,7 @@ cbpGameLogEntryType=ゲームログの詳細レベル cbpCloseAction=閉じる時の動作 cbpDefaultFontSize=デフォルトのフォントサイズ cbpCardArtFormat=カードのアートフォーマット +cbpSoundProfiles=Sound Profile cbpAiProfiles=AI の性格 cbpStackAdditions=スタック効果通知 cbpDisplayCurrentCardColors=詳細なカードの色を表示 diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 77ea552a0be..da80b481fb3 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -112,6 +112,7 @@ cbpGameLogEntryType=游戏日志详细程度 cbpCloseAction=关闭动作 cbpDefaultFontSize=默认字体大小 cbpCardArtFormat=牌张插画格式 +cbpSoundProfiles=Sound Profile cbpAiProfiles=AI强度 cbpStackAdditions=堆叠效应通知 cbpDisplayCurrentCardColors=显示卡牌颜色详情 diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index 792074b7a8d..aeb1bd369f5 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -283,6 +283,7 @@ public final class ForgeConstants { public static final String DB_DIR = CACHE_DIR + "db" + PATH_SEPARATOR; public static final String FONTS_DIR = CACHE_DIR + "fonts" + PATH_SEPARATOR; public static final String CACHE_SKINS_DIR = CACHE_DIR + "skins" + PATH_SEPARATOR; + public static final String CACHE_SOUND_DIR = CACHE_DIR + "sound" + PATH_SEPARATOR; public static final String CACHE_TOKEN_PICS_DIR = PICS_DIR + "tokens" + PATH_SEPARATOR; public static final String CACHE_ICON_PICS_DIR = PICS_DIR + "icons" + PATH_SEPARATOR; public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols" + PATH_SEPARATOR; diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 24def10e2a2..348c1e795c4 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -121,6 +121,7 @@ public class ForgePreferences extends PreferencesStore { UI_VOL_SOUNDS ("100"), UI_VOL_MUSIC ("100"), UI_ALT_SOUND_SYSTEM ("false"), + UI_CURRENT_SOUND_PROFILE ("Default"), UI_CURRENT_AI_PROFILE ("Default"), UI_CLONE_MODE_SOURCE ("false"), UI_MATCH_IMAGE_VISIBLE ("true"), diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index 884a8871127..3165ce06e7f 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -331,7 +331,7 @@ public class EventVisualizer extends IGameEventVisitor.Base imp } // Only proceed if the file actually exists - return new File(ForgeConstants.SOUND_DIR, effect).exists(); + return new File(SoundSystem.getSoundDirectory(), effect).exists(); } diff --git a/forge-gui/src/main/java/forge/sound/SoundSystem.java b/forge-gui/src/main/java/forge/sound/SoundSystem.java index d1dcab487c0..ca2b9e7f6fd 100644 --- a/forge-gui/src/main/java/forge/sound/SoundSystem.java +++ b/forge-gui/src/main/java/forge/sound/SoundSystem.java @@ -1,8 +1,7 @@ package forge.sound; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; +import java.io.File; +import java.util.*; import com.google.common.eventbus.Subscribe; @@ -245,4 +244,31 @@ public class SoundSystem { currentTrack = null; } } + + public static String[] getAvailableSoundProfiles() + { + final List availableProfiles = new ArrayList<>(); + availableProfiles.add("Default"); + + final File dir = new File(ForgeConstants.CACHE_SOUND_DIR); + if (dir != null && dir.exists()) { + final String[] files = dir.list(); + for (String fileName : files) { + if (!fileName.equals("Default") && new File(fileName).isDirectory()) { + availableProfiles.add(fileName); + } + } + } + + return availableProfiles.toArray(new String[availableProfiles.size()]); + } + + public static String getSoundDirectory() { + String profileName = FModel.getPreferences().getPref(FPref.UI_CURRENT_SOUND_PROFILE); + if (profileName.equals("Default")) { + return ForgeConstants.SOUND_DIR; + } else { + return ForgeConstants.CACHE_SOUND_DIR + profileName + ForgeConstants.PATH_SEPARATOR; + } + } }