diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java index 96858fa542c..a18079a02d7 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.FThreads; import forge.Forge; +import forge.GuiBase; import forge.properties.ForgePreferences.FPref; import forge.screens.LaunchScreen; import forge.screens.LoadingOverlay; @@ -13,17 +14,25 @@ import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; import forge.assets.FSkinFont; +import forge.deck.Deck; +import forge.deck.DeckGroup; import forge.deck.DeckProxy; import forge.deck.FDeckChooser; import forge.deck.FDeckEditor; import forge.deck.FDeckEditor.EditorType; import forge.deck.io.DeckPreferences; import forge.game.GameType; +import forge.game.player.RegisteredPlayer; import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.filters.ItemFilter; +import forge.match.HostedMatch; import forge.model.FModel; +import forge.player.GamePlayerUtil; +import forge.toolbox.FComboBox; import forge.util.gui.SGuiChoose; +import java.util.ArrayList; +import java.util.List; public class LoadDraftScreen extends LaunchScreen { private final DeckManager lstDecks = add(new DeckManager(GameType.Draft)); @@ -32,9 +41,17 @@ public class LoadDraftScreen extends LaunchScreen { .textColor(FLabel.INLINE_LABEL_COLOR) .align(HAlignment.CENTER).font(FSkinFont.get(12)).build()); + private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); + private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); + private final FComboBox cbMode = add(new FComboBox()); + public LoadDraftScreen() { super(null, LoadGameMenu.getMenu()); + cbMode.setFont(GAME_MODE_FONT); + cbMode.addItem("Gauntlet"); + cbMode.addItem("Single Match"); + lstDecks.setup(ItemManagerConfig.DRAFT_DECKS); lstDecks.setItemActivateHandler(new FEventHandler() { @Override @@ -65,10 +82,15 @@ public class LoadDraftScreen extends LaunchScreen { float w = width - 2 * x; float labelHeight = lblTip.getAutoSizeBounds().height; float listHeight = height - labelHeight - y - FDeckChooser.PADDING; + float comboBoxHeight = cbMode.getHeight(); + lblMode.setBounds(x, y, lblMode.getAutoSizeBounds().width + FDeckChooser.PADDING / 2, comboBoxHeight); + cbMode.setBounds(x + lblMode.getWidth(), y, w - lblMode.getWidth(), comboBoxHeight); + y += comboBoxHeight + FDeckChooser.PADDING; lstDecks.setBounds(x, y, w, listHeight); y += listHeight + FDeckChooser.PADDING; lblTip.setBounds(x, y, w, labelHeight); + y += labelHeight + FDeckChooser.PADDING; } @Override @@ -90,24 +112,59 @@ public class LoadDraftScreen extends LaunchScreen { } } - final Integer rounds = SGuiChoose.getInteger("How many opponents are you willing to face?", - 1, FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size()); - if (rounds == null) { - return; - } + // TODO: if booster draft tournaments are supported in the future, add the possibility to choose them here + final boolean gauntlet = cbMode.getSelectedItem().equals("Gauntlet"); - FThreads.invokeInEdtLater(new Runnable() { - @Override - public void run() { - LoadingOverlay.show("Loading new game...", new Runnable() { - @Override - public void run() { - FModel.getGauntletMini().resetGauntletDraft(); - FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), GameType.Draft); - } - }); + if (gauntlet) { + final Integer rounds = SGuiChoose.getInteger("How many opponents are you willing to face?", + 1, FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size()); + if (rounds == null) { + return; } - }); + + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + LoadingOverlay.show("Loading new game...", new Runnable() { + @Override + public void run() { + FModel.getGauntletMini().resetGauntletDraft(); + FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), GameType.Draft); + } + }); + } + }); + } else { + final Integer aiIndex = SGuiChoose.getInteger("Which opponent would you like to face?", + 1, FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size()); + + final DeckGroup opponentDecks = FModel.getDecks().getDraft().get(humanDeck.getName()); + final Deck aiDeck = opponentDecks.getAiDecks().get(aiIndex - 1); + if (aiDeck == null) { + throw new IllegalStateException("Draft: Computer deck is null!"); + } + + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + LoadingOverlay.show("Loading new game...", new Runnable() { + @Override + public void run() { + final List starter = new ArrayList(); + final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); + starter.add(human); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); + for (final RegisteredPlayer pl : starter) { + pl.assignConspiracies(); + } + + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); + hostedMatch.startMatch(GameType.Draft, null, starter, human, GuiBase.getInterface().getNewGuiGame()); + } + }); + } + }); + } } }); } diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java index a5467470647..8987b91f8d5 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java @@ -1,27 +1,39 @@ package forge.screens.limited; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.FThreads; import forge.Forge; +import forge.GuiBase; import forge.assets.FSkinFont; +import forge.deck.Deck; +import forge.deck.DeckGroup; import forge.deck.DeckProxy; import forge.deck.FDeckChooser; import forge.deck.FDeckEditor; import forge.deck.FDeckEditor.EditorType; import forge.deck.io.DeckPreferences; import forge.game.GameType; +import forge.game.player.RegisteredPlayer; import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.filters.ItemFilter; +import forge.match.HostedMatch; import forge.model.FModel; +import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; import forge.screens.LaunchScreen; import forge.screens.LoadingOverlay; import forge.screens.home.LoadGameMenu; +import forge.toolbox.FComboBox; import forge.toolbox.FEvent; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; import forge.toolbox.FEvent.FEventHandler; +import forge.util.gui.SGuiChoose; +import forge.util.gui.SOptionPane; +import java.util.ArrayList; +import java.util.List; public class LoadSealedScreen extends LaunchScreen { private final DeckManager lstDecks = add(new DeckManager(GameType.Draft)); @@ -30,9 +42,17 @@ public class LoadSealedScreen extends LaunchScreen { .textColor(FLabel.INLINE_LABEL_COLOR) .align(HAlignment.CENTER).font(FSkinFont.get(12)).build()); + private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); + private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); + private final FComboBox cbMode = add(new FComboBox()); + public LoadSealedScreen() { super(null, LoadGameMenu.getMenu()); + cbMode.setFont(GAME_MODE_FONT); + cbMode.addItem("Gauntlet"); + cbMode.addItem("Single Match"); + lstDecks.setup(ItemManagerConfig.SEALED_DECKS); lstDecks.setItemActivateHandler(new FEventHandler() { @Override @@ -63,7 +83,11 @@ public class LoadSealedScreen extends LaunchScreen { float w = width - 2 * x; float labelHeight = lblTip.getAutoSizeBounds().height; float listHeight = height - labelHeight - y - FDeckChooser.PADDING; + float comboBoxHeight = cbMode.getHeight(); + lblMode.setBounds(x, y, lblMode.getAutoSizeBounds().width + FDeckChooser.PADDING / 2, comboBoxHeight); + cbMode.setBounds(x + lblMode.getWidth(), y, w - lblMode.getWidth(), comboBoxHeight); + y += comboBoxHeight + FDeckChooser.PADDING; lstDecks.setBounds(x, y, w, listHeight); y += listHeight + FDeckChooser.PADDING; lblTip.setBounds(x, y, w, labelHeight); @@ -71,25 +95,70 @@ public class LoadSealedScreen extends LaunchScreen { @Override protected void startMatch() { - final DeckProxy human = lstDecks.getSelectedItem(); - if (human == null) { - FOptionPane.showErrorDialog("You must select an existing deck or build a deck from a new sealed pool.", "No Deck"); - return; - } - - if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - String errorMessage = GameType.Sealed.getDeckFormat().getDeckConformanceProblem(human.getDeck()); - if (errorMessage != null) { - FOptionPane.showErrorDialog("Your deck " + errorMessage + "\nPlease edit or choose a different deck.", "Invalid Deck"); - return; - } - } - - LoadingOverlay.show("Loading new game...", new Runnable() { + FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { - final int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size(); - FModel.getGauntletMini().launch(matches, human.getDeck(), GameType.Sealed); + final DeckProxy humanDeck = lstDecks.getSelectedItem(); + if (humanDeck == null) { + FOptionPane.showErrorDialog("You must select an existing deck or build a deck from a new sealed pool.", "No Deck"); + return; + } + + if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + String errorMessage = GameType.Sealed.getDeckFormat().getDeckConformanceProblem(humanDeck.getDeck()); + if (errorMessage != null) { + FOptionPane.showErrorDialog("Your deck " + errorMessage + "\nPlease edit or choose a different deck.", "Invalid Deck"); + return; + } + } + + final boolean gauntlet = cbMode.getSelectedItem().equals("Gauntlet"); + + if (gauntlet) { + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + LoadingOverlay.show("Loading new game...", new Runnable() { + @Override + public void run() { + final int matches = FModel.getDecks().getSealed().get(humanDeck.getName()).getAiDecks().size(); + FModel.getGauntletMini().launch(matches, humanDeck.getDeck(), GameType.Sealed); + } + }); + } + }); + } else { + + final Integer aiIndex = SGuiChoose.getInteger("Which opponent would you like to face?", + 1, FModel.getDecks().getSealed().get(humanDeck.getName()).getAiDecks().size()); + + final DeckGroup opponentDecks = FModel.getDecks().getSealed().get(humanDeck.getName()); + final Deck aiDeck = opponentDecks.getAiDecks().get(aiIndex - 1); + if (aiDeck == null) { + throw new IllegalStateException("Draft: Computer deck is null!"); + } + + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + LoadingOverlay.show("Loading new game...", new Runnable() { + @Override + public void run() { + final List starter = new ArrayList(); + final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); + starter.add(human); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); + for (final RegisteredPlayer pl : starter) { + pl.assignConspiracies(); + } + + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); + hostedMatch.startMatch(GameType.Sealed, null, starter, human, GuiBase.getInterface().getNewGuiGame()); + } + }); + } + }); + } } }); } diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 0257df74a63..87aa397423b 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -191,7 +191,7 @@ public class SettingsPage extends TabPage { 4); lstSettings.addItem(new BooleanSetting(FPref.UI_LIBGDX_TEXTURE_FILTERING, "Battlefield Texture Filtering", - "Filter card art on battlefield to make it look less pixelated on large screens (restart required)."), + "Filter card art on battlefield to make it less pixelated on large screens (restart required, may reduce performance)."), 4); lstSettings.addItem(new CustomSelectSetting(FPref.UI_DISPLAY_CURRENT_COLORS, "Detailed Card Color",