update SFX, handle missing JSON deck definition

- add button_press, coins_drop, take_shard sfx
- update music timing
- adjust secondary audio volume
- adjust flipprocess prior to its sfx
- handle crash for missing deck/json definition
This commit is contained in:
Anthony Calosa
2023-03-22 14:03:20 +08:00
parent a05e79fce8
commit 4fa752b24c
14 changed files with 94 additions and 21 deletions

View File

@@ -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) {

View File

@@ -201,7 +201,7 @@ public class DuelScene extends ForgeScene {
@Override
public void enter() {
GameHUD.getInstance().stopAudio();
GameHUD.getInstance().unloadAudio();
Set<GameType> appliedVariants = new HashSet<>();
appliedVariants.add(GameType.Constructed);
AdventurePlayer advPlayer = Current.player();

View File

@@ -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..."));

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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;

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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),