mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
- 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:
@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
|||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
|
import forge.GuiBase;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.LaunchScreen;
|
import forge.screens.LaunchScreen;
|
||||||
import forge.screens.LoadingOverlay;
|
import forge.screens.LoadingOverlay;
|
||||||
@@ -13,17 +14,25 @@ import forge.toolbox.FEvent.FEventHandler;
|
|||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckGroup;
|
||||||
import forge.deck.DeckProxy;
|
import forge.deck.DeckProxy;
|
||||||
import forge.deck.FDeckChooser;
|
import forge.deck.FDeckChooser;
|
||||||
import forge.deck.FDeckEditor;
|
import forge.deck.FDeckEditor;
|
||||||
import forge.deck.FDeckEditor.EditorType;
|
import forge.deck.FDeckEditor.EditorType;
|
||||||
import forge.deck.io.DeckPreferences;
|
import forge.deck.io.DeckPreferences;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.itemmanager.DeckManager;
|
import forge.itemmanager.DeckManager;
|
||||||
import forge.itemmanager.ItemManagerConfig;
|
import forge.itemmanager.ItemManagerConfig;
|
||||||
import forge.itemmanager.filters.ItemFilter;
|
import forge.itemmanager.filters.ItemFilter;
|
||||||
|
import forge.match.HostedMatch;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
|
import forge.player.GamePlayerUtil;
|
||||||
|
import forge.toolbox.FComboBox;
|
||||||
import forge.util.gui.SGuiChoose;
|
import forge.util.gui.SGuiChoose;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class LoadDraftScreen extends LaunchScreen {
|
public class LoadDraftScreen extends LaunchScreen {
|
||||||
private final DeckManager lstDecks = add(new DeckManager(GameType.Draft));
|
private final DeckManager lstDecks = add(new DeckManager(GameType.Draft));
|
||||||
@@ -32,9 +41,17 @@ public class LoadDraftScreen extends LaunchScreen {
|
|||||||
.textColor(FLabel.INLINE_LABEL_COLOR)
|
.textColor(FLabel.INLINE_LABEL_COLOR)
|
||||||
.align(HAlignment.CENTER).font(FSkinFont.get(12)).build());
|
.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() {
|
public LoadDraftScreen() {
|
||||||
super(null, LoadGameMenu.getMenu());
|
super(null, LoadGameMenu.getMenu());
|
||||||
|
|
||||||
|
cbMode.setFont(GAME_MODE_FONT);
|
||||||
|
cbMode.addItem("Gauntlet");
|
||||||
|
cbMode.addItem("Single Match");
|
||||||
|
|
||||||
lstDecks.setup(ItemManagerConfig.DRAFT_DECKS);
|
lstDecks.setup(ItemManagerConfig.DRAFT_DECKS);
|
||||||
lstDecks.setItemActivateHandler(new FEventHandler() {
|
lstDecks.setItemActivateHandler(new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
@@ -65,10 +82,15 @@ public class LoadDraftScreen extends LaunchScreen {
|
|||||||
float w = width - 2 * x;
|
float w = width - 2 * x;
|
||||||
float labelHeight = lblTip.getAutoSizeBounds().height;
|
float labelHeight = lblTip.getAutoSizeBounds().height;
|
||||||
float listHeight = height - labelHeight - y - FDeckChooser.PADDING;
|
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);
|
lstDecks.setBounds(x, y, w, listHeight);
|
||||||
y += listHeight + FDeckChooser.PADDING;
|
y += listHeight + FDeckChooser.PADDING;
|
||||||
lblTip.setBounds(x, y, w, labelHeight);
|
lblTip.setBounds(x, y, w, labelHeight);
|
||||||
|
y += labelHeight + FDeckChooser.PADDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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?",
|
final Integer rounds = SGuiChoose.getInteger("How many opponents are you willing to face?",
|
||||||
1, FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size());
|
1, FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size());
|
||||||
if (rounds == null) {
|
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());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,39 @@
|
|||||||
package forge.screens.limited;
|
package forge.screens.limited;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||||
|
import forge.FThreads;
|
||||||
|
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
|
import forge.GuiBase;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckGroup;
|
||||||
import forge.deck.DeckProxy;
|
import forge.deck.DeckProxy;
|
||||||
import forge.deck.FDeckChooser;
|
import forge.deck.FDeckChooser;
|
||||||
import forge.deck.FDeckEditor;
|
import forge.deck.FDeckEditor;
|
||||||
import forge.deck.FDeckEditor.EditorType;
|
import forge.deck.FDeckEditor.EditorType;
|
||||||
import forge.deck.io.DeckPreferences;
|
import forge.deck.io.DeckPreferences;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.itemmanager.DeckManager;
|
import forge.itemmanager.DeckManager;
|
||||||
import forge.itemmanager.ItemManagerConfig;
|
import forge.itemmanager.ItemManagerConfig;
|
||||||
import forge.itemmanager.filters.ItemFilter;
|
import forge.itemmanager.filters.ItemFilter;
|
||||||
|
import forge.match.HostedMatch;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.LaunchScreen;
|
import forge.screens.LaunchScreen;
|
||||||
import forge.screens.LoadingOverlay;
|
import forge.screens.LoadingOverlay;
|
||||||
import forge.screens.home.LoadGameMenu;
|
import forge.screens.home.LoadGameMenu;
|
||||||
|
import forge.toolbox.FComboBox;
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
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 {
|
public class LoadSealedScreen extends LaunchScreen {
|
||||||
private final DeckManager lstDecks = add(new DeckManager(GameType.Draft));
|
private final DeckManager lstDecks = add(new DeckManager(GameType.Draft));
|
||||||
@@ -30,9 +42,17 @@ public class LoadSealedScreen extends LaunchScreen {
|
|||||||
.textColor(FLabel.INLINE_LABEL_COLOR)
|
.textColor(FLabel.INLINE_LABEL_COLOR)
|
||||||
.align(HAlignment.CENTER).font(FSkinFont.get(12)).build());
|
.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() {
|
public LoadSealedScreen() {
|
||||||
super(null, LoadGameMenu.getMenu());
|
super(null, LoadGameMenu.getMenu());
|
||||||
|
|
||||||
|
cbMode.setFont(GAME_MODE_FONT);
|
||||||
|
cbMode.addItem("Gauntlet");
|
||||||
|
cbMode.addItem("Single Match");
|
||||||
|
|
||||||
lstDecks.setup(ItemManagerConfig.SEALED_DECKS);
|
lstDecks.setup(ItemManagerConfig.SEALED_DECKS);
|
||||||
lstDecks.setItemActivateHandler(new FEventHandler() {
|
lstDecks.setItemActivateHandler(new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
@@ -63,7 +83,11 @@ public class LoadSealedScreen extends LaunchScreen {
|
|||||||
float w = width - 2 * x;
|
float w = width - 2 * x;
|
||||||
float labelHeight = lblTip.getAutoSizeBounds().height;
|
float labelHeight = lblTip.getAutoSizeBounds().height;
|
||||||
float listHeight = height - labelHeight - y - FDeckChooser.PADDING;
|
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);
|
lstDecks.setBounds(x, y, w, listHeight);
|
||||||
y += listHeight + FDeckChooser.PADDING;
|
y += listHeight + FDeckChooser.PADDING;
|
||||||
lblTip.setBounds(x, y, w, labelHeight);
|
lblTip.setBounds(x, y, w, labelHeight);
|
||||||
@@ -71,25 +95,70 @@ public class LoadSealedScreen extends LaunchScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void startMatch() {
|
protected void startMatch() {
|
||||||
final DeckProxy human = lstDecks.getSelectedItem();
|
FThreads.invokeInBackgroundThread(new Runnable() {
|
||||||
if (human == null) {
|
@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");
|
FOptionPane.showErrorDialog("You must select an existing deck or build a deck from a new sealed pool.", "No Deck");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
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) {
|
if (errorMessage != null) {
|
||||||
FOptionPane.showErrorDialog("Your deck " + errorMessage + "\nPlease edit or choose a different deck.", "Invalid Deck");
|
FOptionPane.showErrorDialog("Your deck " + errorMessage + "\nPlease edit or choose a different deck.", "Invalid Deck");
|
||||||
return;
|
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() {
|
LoadingOverlay.show("Loading new game...", new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
final int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
final int matches = FModel.getDecks().getSealed().get(humanDeck.getName()).getAiDecks().size();
|
||||||
FModel.getGauntletMini().launch(matches, human.getDeck(), GameType.Sealed);
|
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());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ public class SettingsPage extends TabPage<SettingsScreen> {
|
|||||||
4);
|
4);
|
||||||
lstSettings.addItem(new BooleanSetting(FPref.UI_LIBGDX_TEXTURE_FILTERING,
|
lstSettings.addItem(new BooleanSetting(FPref.UI_LIBGDX_TEXTURE_FILTERING,
|
||||||
"Battlefield 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);
|
4);
|
||||||
lstSettings.addItem(new CustomSelectSetting(FPref.UI_DISPLAY_CURRENT_COLORS,
|
lstSettings.addItem(new CustomSelectSetting(FPref.UI_DISPLAY_CURRENT_COLORS,
|
||||||
"Detailed Card Color",
|
"Detailed Card Color",
|
||||||
|
|||||||
Reference in New Issue
Block a user