- Initial implementation of sound profiles, part 1.

This commit is contained in:
Michael Kamensky
2021-11-03 08:49:52 +03:00
parent af2ae37451
commit 238a3ea17a
14 changed files with 60 additions and 11 deletions

View File

@@ -262,6 +262,7 @@ public enum CSubmenuPreferences implements ICDoc {
initializeAutoUpdaterComboBox(); initializeAutoUpdaterComboBox();
initializeMulliganRuleComboBox(); initializeMulliganRuleComboBox();
initializeAiProfilesComboBox(); initializeAiProfilesComboBox();
initializeSoundProfilesComboBox();
initializeStackAdditionsComboBox(); initializeStackAdditionsComboBox();
initializeLandPlayedComboBox(); initializeLandPlayedComboBox();
initializeColorIdentityCombobox(); initializeColorIdentityCombobox();
@@ -466,6 +467,14 @@ public enum CSubmenuPreferences implements ICDoc {
panel.setComboBox(comboBox, selectedItem); panel.setComboBox(comboBox, selectedItem);
} }
private void initializeSoundProfilesComboBox() {
final FPref userSetting = FPref.UI_CURRENT_SOUND_PROFILE;
final FComboBoxPanel<String> panel = this.view.getSoundProfilesComboBoxPanel();
final FComboBox<String> comboBox = createComboBox(SoundSystem.getAvailableSoundProfiles(), userSetting);
final String selectedItem = this.prefs.getPref(userSetting);
panel.setComboBox(comboBox, selectedItem);
}
private void initializeCardArtPreference() { private void initializeCardArtPreference() {
final String latestOpt = Localizer.getInstance().getMessage("latestArtOpt"); final String latestOpt = Localizer.getInstance().getMessage("latestArtOpt");
final String originalOpt = Localizer.getInstance().getMessage("originalArtOpt"); final String originalOpt = Localizer.getInstance().getMessage("originalArtOpt");

View File

@@ -128,6 +128,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final FComboBoxPanel<String> cbpCardArtFormat = new FComboBoxPanel<>(localizer.getMessage("cbpCardArtFormat")+":"); private final FComboBoxPanel<String> cbpCardArtFormat = new FComboBoxPanel<>(localizer.getMessage("cbpCardArtFormat")+":");
private final FComboBoxPanel<String> cbpCardArtPreference = new FComboBoxPanel<>(localizer.getMessage("lblPreferredArt")+":"); private final FComboBoxPanel<String> cbpCardArtPreference = new FComboBoxPanel<>(localizer.getMessage("lblPreferredArt")+":");
private final FComboBoxPanel<String> cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":"); private final FComboBoxPanel<String> cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":");
private final FComboBoxPanel<String> cbpSoundProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpSoundProfiles")+":");
private final FComboBoxPanel<String> cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); private final FComboBoxPanel<String> cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":");
private final FComboBoxPanel<String> cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); private final FComboBoxPanel<String> cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":");
private final FComboBoxPanel<String> cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); private final FComboBoxPanel<String> cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":");
@@ -414,6 +415,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
pnlPrefs.add(cbEnableSounds, titleConstraints); pnlPrefs.add(cbEnableSounds, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableSounds")), descriptionConstraints); 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(cbEnableMusic, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableMusic")), descriptionConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableMusic")), descriptionConstraints);
@@ -740,6 +744,10 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
return cbpMulliganRule; return cbpMulliganRule;
} }
public FComboBoxPanel<String> getSoundProfilesComboBoxPanel() {
return cbpSoundProfiles;
}
public FComboBoxPanel<String> getAiProfilesComboBoxPanel() { public FComboBoxPanel<String> getAiProfilesComboBoxPanel() {
return cbpAiProfiles; return cbpAiProfiles;
} }

View File

@@ -64,7 +64,7 @@ public class AudioClip implements IAudioClip {
} }
public static boolean fileExists(String fileName) { public static boolean fileExists(String fileName) {
File fSound = new File(ForgeConstants.SOUND_DIR, fileName); File fSound = new File(SoundSystem.getSoundDirectory(), fileName);
return fSound.exists(); return fSound.exists();
} }
@@ -195,7 +195,7 @@ public class AudioClip implements IAudioClip {
} }
private Clip createClip(String filename) { private Clip createClip(String filename) {
File fSound = new File(ForgeConstants.SOUND_DIR, filename); File fSound = new File(SoundSystem.getSoundDirectory(), filename);
if (!fSound.exists()) { if (!fSound.exists()) {
throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it");
} }

View File

@@ -21,10 +21,7 @@ import forge.screens.LoadingOverlay;
import forge.screens.match.MatchController; import forge.screens.match.MatchController;
import forge.screens.quest.QuestMenu; import forge.screens.quest.QuestMenu;
import forge.screens.settings.GuiDownloader; import forge.screens.settings.GuiDownloader;
import forge.sound.AudioClip; import forge.sound.*;
import forge.sound.AudioMusic;
import forge.sound.IAudioClip;
import forge.sound.IAudioMusic;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.GuiChoose; import forge.toolbox.GuiChoose;
import forge.util.*; import forge.util.*;
@@ -272,7 +269,7 @@ public class GuiMobile implements IGuiBase {
@Override @Override
public IAudioClip createAudioClip(final String filename) { public IAudioClip createAudioClip(final String filename) {
return AudioClip.createClip(ForgeConstants.SOUND_DIR + filename); return AudioClip.createClip(SoundSystem.getSoundDirectory() + filename);
} }
@Override @Override

View File

@@ -111,6 +111,7 @@ cbpGameLogEntryType=Spielberichtsumfang
cbpCloseAction=Beenden cbpCloseAction=Beenden
cbpDefaultFontSize=Standard Schriftgröße cbpDefaultFontSize=Standard Schriftgröße
cbpCardArtFormat=Kartenbildformat cbpCardArtFormat=Kartenbildformat
cbpSoundProfiles=Sound Profile
cbpAiProfiles=KI Persönlichkeit cbpAiProfiles=KI Persönlichkeit
cbpStackAdditions=Nachricht bei Stapeländerung cbpStackAdditions=Nachricht bei Stapeländerung
cbpDisplayCurrentCardColors=Zeige detaillierte Kartenfarben cbpDisplayCurrentCardColors=Zeige detaillierte Kartenfarben

View File

@@ -113,6 +113,7 @@ cbpCloseAction=Close Action
cbpDefaultFontSize=Default Font Size cbpDefaultFontSize=Default Font Size
cbpCardArtFormat=Card Art Format cbpCardArtFormat=Card Art Format
cbpAiProfiles=AI Personality cbpAiProfiles=AI Personality
cbpSoundProfiles=Sound Profile
cbpStackAdditions=Stack effect notifications cbpStackAdditions=Stack effect notifications
cbpDisplayCurrentCardColors=Show Detailed Card Color cbpDisplayCurrentCardColors=Show Detailed Card Color
cbpAutoYieldMode=Auto-Yield 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. nlUseSentry=When enabled, automatically submits bug reports to developers.
GamePlay=Gameplay GamePlay=Gameplay
nlpMulliganRule=Choose the version of the Mulligan rule 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 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 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. nlAnte=Determines whether or not the game is played for ante.

View File

@@ -112,6 +112,7 @@ cbpGameLogEntryType=Registro del juego
cbpCloseAction=Acción al cerrar cbpCloseAction=Acción al cerrar
cbpDefaultFontSize=Tamaño de fuente predeterminado cbpDefaultFontSize=Tamaño de fuente predeterminado
cbpCardArtFormat=Card Art Format cbpCardArtFormat=Card Art Format
cbpSoundProfiles=Sound Profile
cbpAiProfiles=Personalidad de la IA cbpAiProfiles=Personalidad de la IA
cbpStackAdditions=Efecto de la pila de notificaciones cbpStackAdditions=Efecto de la pila de notificaciones
cbpDisplayCurrentCardColors=Mostrar color de la carta cbpDisplayCurrentCardColors=Mostrar color de la carta

View File

@@ -111,6 +111,7 @@ cbpGameLogEntryType=Verbosità del registro di gioco
cbpCloseAction=Chiudi cbpCloseAction=Chiudi
cbpDefaultFontSize=Dimensione carattere predefinita cbpDefaultFontSize=Dimensione carattere predefinita
cbpCardArtFormat=Formato dell'Illustrazione delle carte cbpCardArtFormat=Formato dell'Illustrazione delle carte
cbpSoundProfiles=Sound Profile
cbpAiProfiles=Personalità dell''IA cbpAiProfiles=Personalità dell''IA
cbpStackAdditions=Notifiche degli effetti in pila cbpStackAdditions=Notifiche degli effetti in pila
cbpDisplayCurrentCardColors=Mostra colore scheda dettagliato cbpDisplayCurrentCardColors=Mostra colore scheda dettagliato

View File

@@ -112,6 +112,7 @@ cbpGameLogEntryType=ゲームログの詳細レベル
cbpCloseAction=閉じる時の動作 cbpCloseAction=閉じる時の動作
cbpDefaultFontSize=デフォルトのフォントサイズ cbpDefaultFontSize=デフォルトのフォントサイズ
cbpCardArtFormat=カードのアートフォーマット cbpCardArtFormat=カードのアートフォーマット
cbpSoundProfiles=Sound Profile
cbpAiProfiles=AI の性格 cbpAiProfiles=AI の性格
cbpStackAdditions=スタック効果通知 cbpStackAdditions=スタック効果通知
cbpDisplayCurrentCardColors=詳細なカードの色を表示 cbpDisplayCurrentCardColors=詳細なカードの色を表示

View File

@@ -112,6 +112,7 @@ cbpGameLogEntryType=游戏日志详细程度
cbpCloseAction=关闭动作 cbpCloseAction=关闭动作
cbpDefaultFontSize=默认字体大小 cbpDefaultFontSize=默认字体大小
cbpCardArtFormat=牌张插画格式 cbpCardArtFormat=牌张插画格式
cbpSoundProfiles=Sound Profile
cbpAiProfiles=AI强度 cbpAiProfiles=AI强度
cbpStackAdditions=堆叠效应通知 cbpStackAdditions=堆叠效应通知
cbpDisplayCurrentCardColors=显示卡牌颜色详情 cbpDisplayCurrentCardColors=显示卡牌颜色详情

View File

@@ -283,6 +283,7 @@ public final class ForgeConstants {
public static final String DB_DIR = CACHE_DIR + "db" + PATH_SEPARATOR; 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 FONTS_DIR = CACHE_DIR + "fonts" + PATH_SEPARATOR;
public static final String CACHE_SKINS_DIR = CACHE_DIR + "skins" + 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_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_ICON_PICS_DIR = PICS_DIR + "icons" + PATH_SEPARATOR;
public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols" + PATH_SEPARATOR; public static final String CACHE_SYMBOLS_DIR = PICS_DIR + "symbols" + PATH_SEPARATOR;

View File

@@ -121,6 +121,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
UI_VOL_SOUNDS ("100"), UI_VOL_SOUNDS ("100"),
UI_VOL_MUSIC ("100"), UI_VOL_MUSIC ("100"),
UI_ALT_SOUND_SYSTEM ("false"), UI_ALT_SOUND_SYSTEM ("false"),
UI_CURRENT_SOUND_PROFILE ("Default"),
UI_CURRENT_AI_PROFILE ("Default"), UI_CURRENT_AI_PROFILE ("Default"),
UI_CLONE_MODE_SOURCE ("false"), UI_CLONE_MODE_SOURCE ("false"),
UI_MATCH_IMAGE_VISIBLE ("true"), UI_MATCH_IMAGE_VISIBLE ("true"),

View File

@@ -331,7 +331,7 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> imp
} }
// Only proceed if the file actually exists // Only proceed if the file actually exists
return new File(ForgeConstants.SOUND_DIR, effect).exists(); return new File(SoundSystem.getSoundDirectory(), effect).exists();
} }

View File

@@ -1,8 +1,7 @@
package forge.sound; package forge.sound;
import java.util.EnumMap; import java.io.File;
import java.util.HashMap; import java.util.*;
import java.util.Map;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
@@ -245,4 +244,31 @@ public class SoundSystem {
currentTrack = null; currentTrack = null;
} }
} }
public static String[] getAvailableSoundProfiles()
{
final List<String> 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;
}
}
} }