diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 98e47c52a3f..0ad4640b8c1 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -18,6 +18,8 @@ import forge.deck.DeckProxy; import forge.deck.DeckSection; import forge.item.InventoryItem; import forge.item.PaperCard; +import forge.sound.SoundEffectType; +import forge.sound.SoundSystem; import forge.util.ItemPool; import java.io.Serializable; @@ -516,6 +518,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public void takeGold(int price) { gold -= price; onGoldChangeList.emit(); + //play sfx + SoundSystem.instance.play(SoundEffectType.CoinsDrop, false); } public void addShards(int number) { takeShards(-number); @@ -523,6 +527,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public void takeShards(int number) { shards -= number; onShardsChangeList.emit(); + //play sfx + SoundSystem.instance.play(SoundEffectType.TakeShard, false); } public void setShards(int number) { diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 687b4d1a9fb..0d916192653 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -201,7 +201,7 @@ public class DuelScene extends ForgeScene { @Override public void enter() { - GameHUD.getInstance().stopAudio(); + GameHUD.getInstance().unloadAudio(); Set appliedVariants = new HashSet<>(); appliedVariants.add(GameType.Constructed); AdventurePlayer advPlayer = Current.player(); diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index ae0238cdf80..a386d174feb 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -24,6 +24,7 @@ import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.screens.TransitionScreen; +import forge.sound.SoundSystem; import forge.util.NameGenerator; import java.util.Random; @@ -190,7 +191,7 @@ public class NewGameScene extends UIScene { } Runnable runnable = () -> { started = false; - FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); + //FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_MUSIC, false); WorldSave.generateNewWorld(selectedName.getText(), gender.getCurrentIndex() == 0, race.getCurrentIndex(), @@ -200,6 +201,7 @@ public class NewGameScene extends UIScene { modes.get(mode.getCurrentIndex()), colorId.getCurrentIndex(), editionIds[starterEdition.getCurrentIndex()], 0);//maybe replace with enum GamePlayerUtil.getGuiPlayer().setName(selectedName.getText()); + SoundSystem.instance.changeBackgroundTrack(); Forge.switchScene(GameScene.instance()); }; Forge.setTransitionScreen(new TransitionScreen(runnable, null, false, true, "Generating World...")); diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index b7b5557c0d6..ede0fa74539 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -146,13 +146,15 @@ public class RewardScene extends UIScene { showLootOrDone(); return true; } - switch (type) { - case Shop: - doneButton.setText(Forge.getLocalizer().getMessage("lblLeave")); - break; - case Loot: - doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); - break; + if (type != null) { + switch (type) { + case Shop: + doneButton.setText(Forge.getLocalizer().getMessage("lblLeave")); + break; + case Loot: + doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); + break; + } } shown = false; clearGenerated(); diff --git a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java index cbb7ad68221..751058629f9 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java @@ -21,6 +21,7 @@ import forge.adventure.util.Current; import forge.adventure.world.WorldSave; import forge.adventure.world.WorldSaveHeader; import forge.screens.TransitionScreen; +import forge.sound.SoundSystem; import forge.util.TextUtil; import java.io.File; @@ -217,6 +218,7 @@ public class SaveLoadScene extends UIScene { try { Forge.setTransitionScreen(new TransitionScreen(() -> { if (WorldSave.load(currentSlot)) { + SoundSystem.instance.changeBackgroundTrack(); Forge.switchScene(GameScene.instance()); } else { Forge.clearTransitionScreen(); @@ -236,6 +238,7 @@ public class SaveLoadScene extends UIScene { Current.player().updateDifficulty(Config.instance().getConfigData().difficulties[difficulty.getSelectedIndex()]); Current.player().setWorldPosY((int) (WorldSave.getCurrentSave().getWorld().getData().playerStartPosY * WorldSave.getCurrentSave().getWorld().getData().height * WorldSave.getCurrentSave().getWorld().getTileSize())); Current.player().setWorldPosX((int) (WorldSave.getCurrentSave().getWorld().getData().playerStartPosX * WorldSave.getCurrentSave().getWorld().getData().width * WorldSave.getCurrentSave().getWorld().getTileSize())); + SoundSystem.instance.changeBackgroundTrack(); Forge.switchScene(GameScene.instance()); } else { Forge.clearTransitionScreen(); diff --git a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java index 543b812c223..a2fb1445ed4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java @@ -10,6 +10,7 @@ import forge.adventure.util.Config; import forge.adventure.util.Controls; import forge.adventure.world.WorldSave; import forge.screens.TransitionScreen; +import forge.sound.SoundSystem; /** * First scene after the splash screen @@ -81,6 +82,7 @@ public class StartScene extends UIScene { try { Forge.setTransitionScreen(new TransitionScreen(() -> { if (WorldSave.load(WorldSave.filenameToSlot(lastActiveSave))) { + SoundSystem.instance.changeBackgroundTrack(); Forge.switchScene(GameScene.instance()); } else { Forge.clearTransitionScreen(); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 10861a02376..022fc4ea62d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -35,6 +35,8 @@ import forge.adventure.world.WorldSave; import forge.deck.Deck; import forge.gui.FThreads; import forge.gui.GuiBase; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FModel; import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; import org.apache.commons.lang3.tuple.Pair; @@ -311,7 +313,7 @@ public class GameHUD extends Stage { SoundSystem.instance.pause(); playAudio(); } else { - stopAudio(); + unloadAudio(); SoundSystem.instance.resume(); // resume World BGM } } @@ -337,26 +339,63 @@ public class GameHUD extends Stage { if (audio != null) { audio.getRight().setLooping(true); audio.getRight().play(); + audio.getRight().setVolume(FModel.getPreferences().getPrefInt(ForgePreferences.FPref.UI_VOL_MUSIC)/100f); } } - public void fadeAudio(float v) { + public void fadeAudio(float value) { if (audio != null) { - audio.getRight().setVolume(v); + audio.getRight().setVolume((FModel.getPreferences().getPrefInt(ForgePreferences.FPref.UI_VOL_MUSIC)*value)/100f); } } - public void stopAudio() { - if (audio != null) { - audio.getRight().stop(); + float fade = 1f; + void fadeIn() { + if (fade >= 1f) + return; + for (int i = 10; i > 1; i--) { + float delay = i * 0.1f; + Timer.schedule(new Timer.Task() { + @Override + public void run() { + fade += 0.1f; + if (fade > 1f) + fade = 1f; + fadeAudio(fade); + } + }, delay); } } + void fadeOut() { + for (int i = 10; i > 1; i--) { + float delay = i * 0.1f; + Timer.schedule(new Timer.Task() { + @Override + public void run() { + fade -= 0.1f; + if (fade < 0.1f) + fade = 0.1f; + fadeAudio(fade); + } + }, delay); + } + } + + public void unloadAudio() { + if (audio != null) { + audio.getRight().setOnCompletionListener(null); + audio.getRight().stop(); + Forge.getAssets().manager().unload(audio.getLeft().path()); + } + audio = null; + currentAudioPlaylist = null; + } private MusicPlaylist currentAudioPlaylist = null; private void setAudio(MusicPlaylist playlist) { if (playlist.equals(currentAudioPlaylist)) return; - stopAudio(); + unloadAudio(); audio = getMusic(playlist); } @@ -399,6 +438,12 @@ public class GameHUD extends Stage { showDialog(); } + public void pauseMusic() { + if (audio != null) { + audio.getRight().pause(); + } + SoundSystem.instance.pause(); + } private void exitDungeonCallback() { hideDialog(true); } @@ -656,8 +701,6 @@ public class GameHUD extends Stage { } } - float fade = 1f; - void changeBGM(MusicPlaylist playlist) { if (!playlist.equals(SoundSystem.instance.getCurrentPlaylist())) { SoundSystem.instance.setBackgroundMusic(playlist); diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index 108fa1f2927..1aceb7abb97 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -648,7 +648,9 @@ public class CardUtil { FileHandle handle = Config.instance().getFile(path); if (handle.exists()) return generateDeck(json.fromJson(GeneratedDeckData.class, handle), starterEdition, discourageDuplicates); - return null; + Deck deck = DeckgenUtil.getRandomOrPreconOrThemeDeck(colors, true, false, true); + System.err.println("Error loading JSON: " + handle.path() + "\nGenerating random deck: "+deck.getName()); + return deck; } diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index be813e19a87..ebc99cd67b2 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -27,6 +27,8 @@ import com.github.tommyettinger.textra.TypingLabel; import forge.Forge; import forge.adventure.player.AdventurePlayer; import forge.card.ColorSet; +import forge.sound.SoundEffectType; +import forge.sound.SoundSystem; import java.util.function.Function; @@ -52,6 +54,13 @@ public class Controls { static class TextButtonFix extends TextraButton { public TextButtonFix(@Null String text) { super(text == null ? "NULL" : text, Controls.getSkin(), Controls.getTextraFont()); + addListener(new ClickListener(){ + @Override + public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); + SoundSystem.instance.play(SoundEffectType.ButtonPress, false); + } + }); } @Override @@ -74,6 +83,7 @@ public class Controls { getTextraLabel().setWidth(getTextraLabel().layout.getWidth() + (getTextraLabel().style != null && getTextraLabel().style.background != null ? getTextraLabel().style.background.getLeftWidth() + getTextraLabel().style.background.getRightWidth() : 0.0F)); layout(); } + } static public TextraButton newTextButton(String text) { diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 018f4afe026..71ae37acca7 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -611,7 +611,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb super.act(delta); if (clicked) { if (flipProcess < 1) - flipProcess += delta * 1.5; + flipProcess += delta * 2.4; else flipProcess = 1; diff --git a/forge-gui/res/sound/button_press.mp3 b/forge-gui/res/sound/button_press.mp3 new file mode 100644 index 00000000000..c85aaa0a801 Binary files /dev/null and b/forge-gui/res/sound/button_press.mp3 differ diff --git a/forge-gui/res/sound/coins_drop.mp3 b/forge-gui/res/sound/coins_drop.mp3 new file mode 100644 index 00000000000..44dbd60e00a Binary files /dev/null and b/forge-gui/res/sound/coins_drop.mp3 differ diff --git a/forge-gui/res/sound/take_shard.mp3 b/forge-gui/res/sound/take_shard.mp3 new file mode 100644 index 00000000000..14e6b85b385 Binary files /dev/null and b/forge-gui/res/sound/take_shard.mp3 differ diff --git a/forge-gui/src/main/java/forge/sound/SoundEffectType.java b/forge-gui/src/main/java/forge/sound/SoundEffectType.java index 5302fe62a30..c75d5431de9 100644 --- a/forge-gui/src/main/java/forge/sound/SoundEffectType.java +++ b/forge-gui/src/main/java/forge/sound/SoundEffectType.java @@ -48,6 +48,8 @@ public enum SoundEffectType { BlueBlackLand("blue_black_land.mp3", false), BlueBlackRedLand("blue_black_red_land.mp3", false), BlueLand("blue_land.mp3", false), + ButtonPress("button_press.mp3", false), + CoinsDrop("coins_drop.mp3", false), Creature("creature.mp3", false), Damage("damage.mp3", true), Daytime("daytime.mp3", true), @@ -58,8 +60,8 @@ public enum SoundEffectType { EndOfTurn("end_of_turn.mp3", false), Equip("equip.mp3", false), Exile("exile.mp3", false), - FlipCoin("flip_coin.mp3", false), FlipCard("flip_card.mp3", false), + FlipCoin("flip_coin.mp3", false), GreenBlackBlueLand("green_black_blue_land.mp3", false), GreenBlackLand("green_black_land.mp3", false), GreenBlueLand("green_blue_land.mp3", false), @@ -87,6 +89,7 @@ public enum SoundEffectType { ScriptedEffect("", false), // Plays the effect defined by SVar:SoundEffect Shuffle("shuffle.mp3", false), Sorcery("sorcery.mp3", false), + TakeShard("take_shard.mp3", false), StartDuel("start_duel.mp3",false), Tap("tap.mp3", false), Token("token.mp3", true),