- Ported the "Duel a Specific Opponent / Start a Gauntlet" functionality in Booster Draft and Sealed Deck game modes to mobile Forge.

This commit is contained in:
Agetian
2016-12-27 12:24:07 +00:00
parent 16353246cd
commit 1d55b0cf33
3 changed files with 160 additions and 34 deletions

View File

@@ -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<String> cbMode = add(new FComboBox<String>());
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,6 +112,10 @@ public class LoadDraftScreen extends LaunchScreen {
}
}
// TODO: if booster draft tournaments are supported in the future, add the possibility to choose them here
final boolean gauntlet = cbMode.getSelectedItem().equals("Gauntlet");
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) {
@@ -108,6 +134,37 @@ public class LoadDraftScreen extends LaunchScreen {
});
}
});
} 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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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());
}
});
}
});
}
}
});
}

View File

@@ -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<String> cbMode = add(new FComboBox<String>());
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) {
FThreads.invokeInBackgroundThread(new Runnable() {
@Override
public void run() {
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(human.getDeck());
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(human.getName()).getAiDecks().size();
FModel.getGauntletMini().launch(matches, human.getDeck(), GameType.Sealed);
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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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());
}
});
}
});
}
}
});
}

View File

@@ -191,7 +191,7 @@ public class SettingsPage extends TabPage<SettingsScreen> {
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",