From 442a859ec175d0c80671b8ecfac6a2e2a74bb3e9 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 24 Apr 2023 00:38:57 +0800 Subject: [PATCH 1/2] Add AdventureWinLose Overlay - show Match results after Duels on Adventure Mode - update SettingsScene options to disable AdventureWinLose Overlay - update console toggle --- .../src/forge/adventure/data/SettingData.java | 1 + .../src/forge/adventure/scene/DuelScene.java | 20 ++++---- .../forge/adventure/scene/SettingsScene.java | 10 +++- .../src/forge/adventure/stage/GameHUD.java | 20 ++++++-- .../forge/screens/match/MatchController.java | 14 +++--- .../match/winlose/AdventureWinLose.java | 46 +++++++++++++++++++ .../screens/match/winlose/ViewWinLose.java | 27 ++++++++--- forge-gui/res/languages/de-DE.properties | 2 + forge-gui/res/languages/en-US.properties | 2 + forge-gui/res/languages/es-ES.properties | 2 + forge-gui/res/languages/fr-FR.properties | 2 + forge-gui/res/languages/it-IT.properties | 2 + forge-gui/res/languages/ja-JP.properties | 2 + forge-gui/res/languages/pt-BR.properties | 2 + forge-gui/res/languages/zh-CN.properties | 2 + 15 files changed, 122 insertions(+), 32 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java diff --git a/forge-gui-mobile/src/forge/adventure/data/SettingData.java b/forge-gui-mobile/src/forge/adventure/data/SettingData.java index 048e608b8a6..fddfb1b705a 100644 --- a/forge-gui-mobile/src/forge/adventure/data/SettingData.java +++ b/forge-gui-mobile/src/forge/adventure/data/SettingData.java @@ -19,4 +19,5 @@ public class SettingData { public Float rewardCardAdjLandscape; public Float cardTooltipAdjLandscape; public boolean dayNightBG; + public boolean disableWinLose; } diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 0b8b3d49a38..93372af902c 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -34,6 +34,7 @@ import forge.player.GamePlayerUtil; import forge.player.PlayerControllerHuman; import forge.screens.FScreen; import forge.screens.LoadingOverlay; +import forge.screens.TransitionScreen; import forge.screens.match.MatchController; import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; @@ -131,6 +132,8 @@ public class DuelScene extends ForgeScene { public void run(Integer result) { if (result == 0) { afterGameEnd(enemyName, finalWinner, true, true); + if (Config.instance().getSettingData().disableWinLose) + exitDuelScene(); } fb.dispose(); } @@ -139,9 +142,9 @@ public class DuelScene extends ForgeScene { afterGameEnd(enemyName, winner, false, false); } } - - void afterGameEnd(String enemyName, boolean winner, boolean showOverlay, boolean alternate) { - Runnable runnable = () -> Gdx.app.postRunnable(()-> { + Runnable endRunnable = null; + void afterGameEnd(String enemyName, boolean winner, boolean overlay, boolean alt) { + endRunnable = () -> Gdx.app.postRunnable(()-> { if (GameScene.instance().isNotInWorldMap()) { SoundSystem.instance.pause(); GameHUD.getInstance().playAudio(); @@ -160,14 +163,9 @@ public class DuelScene extends ForgeScene { ((IAfterMatch) last).setWinner(winner); } }); - if (showOverlay) { - FThreads.invokeInEdtNowOrLater(() -> { - matchOverlay = new LoadingOverlay(runnable, true, alternate); - matchOverlay.show(); - }); - } else { - runnable.run(); - } + } + public void exitDuelScene() { + Forge.setTransitionScreen(new TransitionScreen(endRunnable, Forge.takeScreenshot(), false, false)); } void addEffects(RegisteredPlayer player, Array effects) { diff --git a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java index 02c404b73c4..555992547a7 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java @@ -17,7 +17,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.time.LocalTime; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; @@ -203,7 +202,6 @@ public class SettingsScene extends UIScene { boolean value = ((CheckBox) actor).isChecked(); Config.instance().getSettingData().fullScreen = value; Config.instance().saveSettings(); - setTargetTime(LocalTime.now().getHour()); //update if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) { FModel.getPreferences().setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, value); @@ -223,6 +221,14 @@ public class SettingsScene extends UIScene { } } }); + addSettingField(Forge.getLocalizer().getMessage("lblDisableWinLose"), Config.instance().getSettingData().disableWinLose, new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + boolean value = ((CheckBox) actor).isChecked(); + Config.instance().getSettingData().disableWinLose = value; + Config.instance().saveSettings(); + } + }); addCheckBox(Forge.getLocalizer().getMessage("lblCardName"), ForgePreferences.FPref.UI_OVERLAY_CARD_NAME); addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC, 0, 100); addSettingSlider(Forge.getLocalizer().getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0, 100); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 730e18d2bc3..2fc837eac90 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -338,12 +338,14 @@ public class GameHUD extends Stage { //unequip and reequip abilities updateAbility(); } - - void updateAbility() { + void clearAbility() { for (TextraButton button : abilityButtonMap) { button.remove(); } abilityButtonMap.clear(); + } + void updateAbility() { + clearAbility(); setAbilityButton(AdventurePlayer.current().getEquippedAbility1()); setAbilityButton(AdventurePlayer.current().getEquippedAbility2()); float x = Forge.isLandscapeMode() ? 426f : 216f; @@ -570,6 +572,14 @@ public class GameHUD extends Stage { } opacity = visible ? 1f : 0.4f; } + void toggleConsole() { + console.toggle(); + if (console.isVisible()) { + clearAbility(); + } else { + updateAbility(); + } + } @Override public boolean keyUp(int keycode) { @@ -584,12 +594,12 @@ public class GameHUD extends Stage { } ui.pressDown(keycode); if (keycode == Input.Keys.F9 || keycode == Input.Keys.F10) { - console.toggle(); + toggleConsole(); return true; } if (keycode == Input.Keys.BACK) { if (console.isVisible()) { - console.toggle(); + toggleConsole(); } } if (console.isVisible()) @@ -701,7 +711,7 @@ public class GameHUD extends Stage { @Override public boolean longPress(Actor actor, float x, float y) { - console.toggle(); + toggleConsole(); return super.longPress(actor, x, y); } } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 1352dd98dfe..acb8c490e6b 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -6,11 +6,11 @@ import java.util.List; import java.util.Map; import forge.adventure.scene.DuelScene; +import forge.adventure.util.Config; import forge.ai.GameState; import forge.deck.Deck; import forge.game.player.Player; import forge.item.IPaperCard; -import forge.screens.TransitionScreen; import forge.util.collect.FCollection; import org.apache.commons.lang3.StringUtils; @@ -312,14 +312,12 @@ public class MatchController extends AbstractGuiGame { @Override public void finishGame() { if (Forge.isMobileAdventureMode) { - Forge.setCursor(null, "0"); - if (DuelScene.instance().hasCallbackExit()) + if (Config.instance().getSettingData().disableWinLose) { + Forge.setCursor(null, "0"); + if (!DuelScene.instance().hasCallbackExit()) + DuelScene.instance().exitDuelScene(); return; - Forge.setTransitionScreen(new TransitionScreen(() -> { - Forge.clearTransitionScreen(); - Forge.clearCurrentScreen(); - }, Forge.takeScreenshot(), false, false)); - return; + } } if (hasLocalPlayers() || getGameView().isMatchOver()) { view.setViewWinLose(new ViewWinLose(getGameView())); diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java new file mode 100644 index 00000000000..2a3bcaee978 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/match/winlose/AdventureWinLose.java @@ -0,0 +1,46 @@ +package forge.screens.match.winlose; + +import forge.Forge; +import forge.adventure.scene.DuelScene; +import forge.game.GameView; + +public class AdventureWinLose extends ControlWinLose { + /** + * @param v   ViewWinLose + * @param game + */ + public AdventureWinLose(ViewWinLose v, GameView game) { + super(v, game); + v.getBtnContinue().setVisible(false); + v.getBtnRestart().setVisible(false); + v.getLabelShowBattlefield().setVisible(false); + v.getBtnQuit().setText(Forge.getLocalizer().getMessage("lblBackToAdventure")); + Forge.setCursor(null, "0"); + } + + @Override + public void actionOnContinue() { + //Do Nothing + } + + @Override + public void actionOnRestart() { + //Do Nothing + } + + @Override + public void actionOnQuit() { + getView().hide(); + DuelScene.instance().exitDuelScene(); + } + + @Override + public void saveOptions() { + //Do Nothing + } + + @Override + public void showRewards() { + //Do Nothing + } +} diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java index 5d7cc6b1fa8..afd79206f4c 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java @@ -123,6 +123,9 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { }).build()); lblTitle.setText(composeTitle(game0)); + if (Forge.isMobileAdventureMode) + control = new AdventureWinLose(this, game0); + showGameOutcomeSummary(); showPlayerScores(); control.showRewards(); @@ -152,6 +155,10 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { return this.btnQuit; } + public FLabel getLabelShowBattlefield() { + return this.btnShowBattlefield; + } + private void showGameOutcomeSummary() { for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) { pnlOutcomes.add(new FLabel.Builder().text(o.message).font(FSkinFont.get(14)).build()); @@ -191,12 +198,20 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { y += h + dy; h = height / 12; - btnContinue.setBounds(x, y, w, h); - y += h + dy; - btnRestart.setBounds(x, y, w, h); - y += h + dy; - btnQuit.setBounds(x, y, w, h); - y += h + dy; + if (Forge.isMobileAdventureMode) { + btnQuit.setBounds(x, y, w, h); + y += h + dy; + btnContinue.setVisible(false); + btnRestart.setVisible(false); + } else { + btnContinue.setBounds(x, y, w, h); + y += h + dy; + btnRestart.setBounds(x, y, w, h); + y += h + dy; + btnQuit.setBounds(x, y, w, h); + y += h + dy; + } + h = lblLog.getAutoSizeBounds().height + dy; lblLog.setBounds(x, y, w, h); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index a1a87f77eda..4e6f9f4f787 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -2962,6 +2962,8 @@ lblZoom=Zoomen lblEffect=Wirkung lblEmblem=Emblem lblBoon=Vorteil +lblBackToAdventure=Zurück zum Abenteuer +lblDisableWinLose=Deaktivieren Sie Winslose Overlay lblExitToWoldMap=Zurück zur Weltkarte? lblStartArena=Willst du in die Arena gehen? lblWouldYouLikeDestroy=Möchten Sie {0} zerstören? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 7981bf21a17..593c59ccfcf 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2972,6 +2972,8 @@ lblZoom=Zoom lblEffect=Effect lblEmblem=Emblem lblBoon=Boon +lblBackToAdventure=Back to Adventure +lblDisableWinLose=Disable WinLose Overlay lblExitToWoldMap=Exit to the World Map? lblStartArena=Do you want to go into the Arena? lblWouldYouLikeDestroy=Would you like to destroy {0}? diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index df8348733f2..d9fb30e91a5 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2965,6 +2965,8 @@ lblZoom=Zoom lblEffect=Efecto lblEmblem=Emblem lblBoon=Boon +lblBackToAdventure=Volver a la aventura +lblDisableWinLose=Desactivar WinLose Overlay lblExitToWoldMap=Salir al mapa del mundo? lblStartArena=¿Quieres ir a la arena? lblWouldYouLikeDestroy=¿Le gustaría destruir {0}? diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index c5de9a17174..8f6ce2b14f0 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -2968,6 +2968,8 @@ lblZoom=Zoom lblEffect=Effet lblEmblem=Emblème lblBoon=Aubaine +lblBackToAdventure=Retour à l'aventure +lblDisableWinLose=Désactiver la superposition Winlose lblExitToWoldMap=Sortir sur la carte du monde? lblStartArena=Voulez-vous entrer dans l'arène? lblWouldYouLikeDestroy=Souhaitez-vous détruire {0}? diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index aa848adf02f..23087813441 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -2968,6 +2968,8 @@ lblZoom=Ingrandisci lblEffect=Effetto lblEmblem=Emblema lblBoon=Boon +lblBackToAdventure=Torna all'avventura +lblDisableWinLose=Disabilita overlay winlose lblExitToWoldMap=Esci alla mappa del mondo? lblStartArena=Vuoi andare nell'arena? lblWouldYouLikeDestroy=Vorresti distruggere {0}? diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 661db100946..627cd6f4726 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -2964,6 +2964,8 @@ lblZoom=ズーム lblEffect=効果 lblEmblem=エンブレム lblBoon=ブーン +lblBackToAdventure=冒険に戻ります +lblDisableWinLose=Winloseオーバーレイを無効にします lblExitToWoldMap=世界地図に終了しますか? lblStartArena=アリーナに行きたいですか? lblWouldYouLikeDestroy={0}を破壊しますか? diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index c6d36de1dca..82a68753269 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -3054,6 +3054,8 @@ lblZoom=Ampliação lblEffect=Efeito lblEmblem=Emblem lblBoon=Boon +lblBackToAdventure=De volta à aventura +lblDisableWinLose=Desative a sobreposição de Winlose lblExitToWoldMap=Sair para o mapa do mundo? lblStartArena=Você quer entrar na arena? lblWouldYouLikeDestroy=Você gostaria de destruir {0}? diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index ea3a0dd2b05..c6933ad26df 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -2947,6 +2947,8 @@ lblZoom=飞涨 lblEffect=影响 lblEmblem=象征 lblBoon=恩赐 +lblBackToAdventure=回到冒险 +lblDisableWinLose=禁用Winlose覆盖 lblExitToWoldMap=退出世界地图? lblStartArena=您想进入竞技场吗? lblWouldYouLikeDestroy=您想销毁{0}吗? From b3e80cfe42b064f1601c5d40493a58a61f68238d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 24 Apr 2023 00:42:41 +0800 Subject: [PATCH 2/2] cleanup --- forge-gui-mobile/src/forge/adventure/scene/DuelScene.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 93372af902c..2d31b59a7ac 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -131,7 +131,7 @@ public class DuelScene extends ForgeScene { @Override public void run(Integer result) { if (result == 0) { - afterGameEnd(enemyName, finalWinner, true, true); + afterGameEnd(enemyName, finalWinner); if (Config.instance().getSettingData().disableWinLose) exitDuelScene(); } @@ -139,11 +139,11 @@ public class DuelScene extends ForgeScene { } })); } else { - afterGameEnd(enemyName, winner, false, false); + afterGameEnd(enemyName, winner); } } Runnable endRunnable = null; - void afterGameEnd(String enemyName, boolean winner, boolean overlay, boolean alt) { + void afterGameEnd(String enemyName, boolean winner) { endRunnable = () -> Gdx.app.postRunnable(()-> { if (GameScene.instance().isNotInWorldMap()) { SoundSystem.instance.pause();