diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 4e2c3dd5933..48a8defa61d 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -58,6 +58,11 @@ public class GuiDesktop implements IGuiBase { return true; } + @Override + public boolean isLibgdxPort() { + return false; + } + @Override public String getCurrentVersion() { return BuildInfo.getVersionString(); diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 0975278792b..73a1ed5aea9 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -55,6 +55,11 @@ public class GuiMobile implements IGuiBase { return Gdx.app.getType() == ApplicationType.Desktop; } + @Override + public boolean isLibgdxPort() { + return true; + } + @Override public String getCurrentVersion() { return Forge.CURRENT_VERSION; diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index c877263cbd7..21f9112ba39 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -1,5 +1,6 @@ package forge.achievement; +import forge.GuiBase; import java.io.File; import java.io.FileNotFoundException; import java.util.Iterator; @@ -38,23 +39,32 @@ public abstract class AchievementCollection implements Iterable { //don't update achievements if player cheated during game if (controller.hasCheated()) { return; - } + } final Game game = controller.getGame(); final Player player = controller.getPlayer(); //update all achievements for GUI player after game finished - ThreadUtil.invokeInGameThread(new Runnable() { - @Override - public void run() { - FModel.getAchievements(game.getRules().getGameType()).updateAll(player); - AltWinAchievements.instance.updateAll(player); - PlaneswalkerAchievements.instance.updateAll(player); - ChallengeAchievements.instance.updateAll(player); - } - }); + //(we are doing it in different threads in different game ports to prevent freezing when processing multiple achievements) + if (GuiBase.getInterface().isLibgdxPort()) { + ThreadUtil.invokeInGameThread(new Runnable() { + @Override + public void run() { + doUpdateAllAchievements(game, player); + } + }); + } else { + doUpdateAllAchievements(game, player); + } } + private static void doUpdateAllAchievements(final Game game, final Player player) { + FModel.getAchievements(game.getRules().getGameType()).updateAll(player); + AltWinAchievements.instance.updateAll(player); + PlaneswalkerAchievements.instance.updateAll(player); + ChallengeAchievements.instance.updateAll(player); + } + public static void buildComboBox(IComboBox cb) { cb.addItem(FModel.getAchievements(GameType.Constructed)); cb.addItem(FModel.getAchievements(GameType.Draft)); diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 7c3018c56df..f9fb99fd404 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -19,6 +19,7 @@ import forge.util.Callback; public interface IGuiBase { boolean isRunningOnDesktop(); + boolean isLibgdxPort(); String getCurrentVersion(); String getAssetsDir(); void invokeInEdtNow(Runnable runnable);