mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
add Commander Gauntlet
This commit is contained in:
@@ -12,8 +12,8 @@ import forge.deck.Deck;
|
|||||||
import forge.deck.DeckFormat;
|
import forge.deck.DeckFormat;
|
||||||
import forge.deck.DeckSection;
|
import forge.deck.DeckSection;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
|
import forge.util.Aggregates;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
import forge.util.MyRandom;
|
|
||||||
|
|
||||||
public enum GameType {
|
public enum GameType {
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ public enum GameType {
|
|||||||
Winston (DeckFormat.Limited, true, true, true, "lblWinston", ""),
|
Winston (DeckFormat.Limited, true, true, true, "lblWinston", ""),
|
||||||
Gauntlet (DeckFormat.Constructed, false, true, true, "lblGauntlet", ""),
|
Gauntlet (DeckFormat.Constructed, false, true, true, "lblGauntlet", ""),
|
||||||
Tournament (DeckFormat.Constructed, false, true, true, "lblTournament", ""),
|
Tournament (DeckFormat.Constructed, false, true, true, "lblTournament", ""),
|
||||||
|
CommanderGauntlet (DeckFormat.Commander, false, false, false, "lblCommander", "lblCommanderDesc"),
|
||||||
Quest (DeckFormat.QuestDeck, true, true, false, "lblQuest", ""),
|
Quest (DeckFormat.QuestDeck, true, true, false, "lblQuest", ""),
|
||||||
QuestDraft (DeckFormat.Limited, true, true, true, "lblQuestDraft", ""),
|
QuestDraft (DeckFormat.Limited, true, true, true, "lblQuestDraft", ""),
|
||||||
PlanarConquest (DeckFormat.PlanarConquest, true, false, false, "lblPlanarConquest", ""),
|
PlanarConquest (DeckFormat.PlanarConquest, true, false, false, "lblPlanarConquest", ""),
|
||||||
@@ -42,7 +43,7 @@ public enum GameType {
|
|||||||
public Deck apply(RegisteredPlayer player) {
|
public Deck apply(RegisteredPlayer player) {
|
||||||
Deck deck = new Deck();
|
Deck deck = new Deck();
|
||||||
CardPool mainDeck = deck.getMain();
|
CardPool mainDeck = deck.getMain();
|
||||||
String setcode = StaticData.instance().getBlockLands().get(MyRandom.getRandom().nextInt(StaticData.instance().getBlockLands().size()));
|
String setcode = Aggregates.random(StaticData.instance().getBlockLands());
|
||||||
mainDeck.add("Plains", setcode, 12, true);
|
mainDeck.add("Plains", setcode, 12, true);
|
||||||
mainDeck.add("Island", setcode, 12, true);
|
mainDeck.add("Island", setcode, 12, true);
|
||||||
mainDeck.add("Swamp", setcode, 12, true);
|
mainDeck.add("Swamp", setcode, 12, true);
|
||||||
@@ -58,7 +59,7 @@ public enum GameType {
|
|||||||
public Deck apply(RegisteredPlayer player) {
|
public Deck apply(RegisteredPlayer player) {
|
||||||
Deck deck = new Deck();
|
Deck deck = new Deck();
|
||||||
CardPool mainDeck = deck.getMain();
|
CardPool mainDeck = deck.getMain();
|
||||||
String setcode = StaticData.instance().getBlockLands().get(MyRandom.getRandom().nextInt(StaticData.instance().getBlockLands().size()));
|
String setcode = Aggregates.random(StaticData.instance().getBlockLands());
|
||||||
mainDeck.add("Plains", setcode, 12, true);
|
mainDeck.add("Plains", setcode, 12, true);
|
||||||
mainDeck.add("Island", setcode, 12, true);
|
mainDeck.add("Island", setcode, 12, true);
|
||||||
mainDeck.add("Swamp", setcode, 12, true);
|
mainDeck.add("Swamp", setcode, 12, true);
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ import forge.screens.deckeditor.views.VOathbreakerDecks;
|
|||||||
import forge.screens.deckeditor.views.VProbabilities;
|
import forge.screens.deckeditor.views.VProbabilities;
|
||||||
import forge.screens.deckeditor.views.VStatistics;
|
import forge.screens.deckeditor.views.VStatistics;
|
||||||
import forge.screens.deckeditor.views.VTinyLeadersDecks;
|
import forge.screens.deckeditor.views.VTinyLeadersDecks;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
|
import forge.screens.home.gauntlet.*;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
|
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletLoad;
|
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletQuick;
|
|
||||||
import forge.screens.home.online.VSubmenuOnlineLobby;
|
import forge.screens.home.online.VSubmenuOnlineLobby;
|
||||||
import forge.screens.home.puzzle.VSubmenuPuzzleCreate;
|
import forge.screens.home.puzzle.VSubmenuPuzzleCreate;
|
||||||
import forge.screens.home.puzzle.VSubmenuPuzzleSolve;
|
import forge.screens.home.puzzle.VSubmenuPuzzleSolve;
|
||||||
@@ -79,6 +76,7 @@ public enum EDocID {
|
|||||||
HOME_GAUNTLETBUILD (VSubmenuGauntletBuild.SINGLETON_INSTANCE),
|
HOME_GAUNTLETBUILD (VSubmenuGauntletBuild.SINGLETON_INSTANCE),
|
||||||
HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE),
|
HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE),
|
||||||
HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE),
|
HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE),
|
||||||
|
HOME_GAUNTLETCOMMANDER (VSubmenuGauntletCommander.SINGLETON_INSTANCE),
|
||||||
HOME_GAUNTLETCONTESTS (VSubmenuGauntletContests.SINGLETON_INSTANCE),
|
HOME_GAUNTLETCONTESTS (VSubmenuGauntletContests.SINGLETON_INSTANCE),
|
||||||
HOME_PREFERENCES (VSubmenuPreferences.SINGLETON_INSTANCE),
|
HOME_PREFERENCES (VSubmenuPreferences.SINGLETON_INSTANCE),
|
||||||
HOME_ACHIEVEMENTS (VSubmenuAchievements.SINGLETON_INSTANCE),
|
HOME_ACHIEVEMENTS (VSubmenuAchievements.SINGLETON_INSTANCE),
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import forge.item.PaperCard;
|
|||||||
import forge.screens.deckeditor.menus.DeckFileMenu;
|
import forge.screens.deckeditor.menus.DeckFileMenu;
|
||||||
import forge.screens.deckeditor.views.VCurrentDeck;
|
import forge.screens.deckeditor.views.VCurrentDeck;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
|
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
|
||||||
|
import forge.screens.home.gauntlet.VSubmenuGauntletCommander;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
|
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletQuick;
|
import forge.screens.home.gauntlet.VSubmenuGauntletQuick;
|
||||||
import forge.screens.home.sanctioned.VSubmenuConstructed;
|
import forge.screens.home.sanctioned.VSubmenuConstructed;
|
||||||
@@ -90,6 +91,8 @@ public class DeckController<T extends DeckBase> {
|
|||||||
this.loadDeck(deck, true);
|
this.loadDeck(deck, true);
|
||||||
}
|
}
|
||||||
public void loadDeck(Deck deck, boolean substituteCurrentDeck) {
|
public void loadDeck(Deck deck, boolean substituteCurrentDeck) {
|
||||||
|
if (deck == null)
|
||||||
|
return;
|
||||||
boolean isStored;
|
boolean isStored;
|
||||||
boolean isInfinite = view.getCatalogManager().isInfinite();
|
boolean isInfinite = view.getCatalogManager().isInfinite();
|
||||||
|
|
||||||
@@ -355,6 +358,7 @@ public class DeckController<T extends DeckBase> {
|
|||||||
VSubmenuGauntletBuild.SINGLETON_INSTANCE.updateDeckPanel();
|
VSubmenuGauntletBuild.SINGLETON_INSTANCE.updateDeckPanel();
|
||||||
VSubmenuGauntletQuick.SINGLETON_INSTANCE.updateDeckPanel();
|
VSubmenuGauntletQuick.SINGLETON_INSTANCE.updateDeckPanel();
|
||||||
VSubmenuGauntletContests.SINGLETON_INSTANCE.updateDeckPanel();
|
VSubmenuGauntletContests.SINGLETON_INSTANCE.updateDeckPanel();
|
||||||
|
VSubmenuGauntletCommander.SINGLETON_INSTANCE.updateDeckPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -41,10 +41,7 @@ import forge.gui.framework.IVTopLevelUI;
|
|||||||
import forge.localinstance.properties.ForgePreferences.FPref;
|
import forge.localinstance.properties.ForgePreferences.FPref;
|
||||||
import forge.localinstance.skin.FSkinProp;
|
import forge.localinstance.skin.FSkinProp;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
|
import forge.screens.home.gauntlet.*;
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
|
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletLoad;
|
|
||||||
import forge.screens.home.gauntlet.VSubmenuGauntletQuick;
|
|
||||||
import forge.screens.home.online.VSubmenuOnlineLobby;
|
import forge.screens.home.online.VSubmenuOnlineLobby;
|
||||||
import forge.screens.home.puzzle.VSubmenuPuzzleCreate;
|
import forge.screens.home.puzzle.VSubmenuPuzzleCreate;
|
||||||
import forge.screens.home.puzzle.VSubmenuPuzzleSolve;
|
import forge.screens.home.puzzle.VSubmenuPuzzleSolve;
|
||||||
@@ -136,6 +133,7 @@ public enum VHomeUI implements IVTopLevelUI {
|
|||||||
allSubmenus.add(VSubmenuGauntletBuild.SINGLETON_INSTANCE);
|
allSubmenus.add(VSubmenuGauntletBuild.SINGLETON_INSTANCE);
|
||||||
allSubmenus.add(VSubmenuGauntletLoad.SINGLETON_INSTANCE);
|
allSubmenus.add(VSubmenuGauntletLoad.SINGLETON_INSTANCE);
|
||||||
allSubmenus.add(VSubmenuGauntletContests.SINGLETON_INSTANCE);
|
allSubmenus.add(VSubmenuGauntletContests.SINGLETON_INSTANCE);
|
||||||
|
allSubmenus.add(VSubmenuGauntletCommander.SINGLETON_INSTANCE);
|
||||||
|
|
||||||
allSubmenus.add(VSubmenuPuzzleSolve.SINGLETON_INSTANCE);
|
allSubmenus.add(VSubmenuPuzzleSolve.SINGLETON_INSTANCE);
|
||||||
allSubmenus.add(VSubmenuPuzzleCreate.SINGLETON_INSTANCE);
|
allSubmenus.add(VSubmenuPuzzleCreate.SINGLETON_INSTANCE);
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package forge.screens.home.gauntlet;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
|
import forge.deck.DeckType;
|
||||||
|
import forge.game.player.RegisteredPlayer;
|
||||||
|
import forge.gamemodes.gauntlet.GauntletData;
|
||||||
|
import forge.gamemodes.gauntlet.GauntletUtil;
|
||||||
|
import forge.gui.SOverlayUtils;
|
||||||
|
import forge.gui.framework.ICDoc;
|
||||||
|
import forge.player.GamePlayerUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls the "commander gauntlet" submenu in the home UI.
|
||||||
|
*
|
||||||
|
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public enum CSubmenuGauntletCommander implements ICDoc {
|
||||||
|
/** */
|
||||||
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
|
private final ActionListener actStartGame = new ActionListener() {
|
||||||
|
@Override public void actionPerformed(final ActionEvent arg0) {
|
||||||
|
startGame();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final VSubmenuGauntletCommander view = VSubmenuGauntletCommander.SINGLETON_INSTANCE;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.ICSubmenu#initialize()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override public void run() { view.getBtnStart().requestFocusInWindow(); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.ICSubmenu#initialize()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
view.getBtnStart().addActionListener(actStartGame);
|
||||||
|
view.getLstDecks().initialize(DeckType.COMMANDER_DECK);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startGame() {
|
||||||
|
final RegisteredPlayer player = view.getLstDecks().getPlayer();
|
||||||
|
if (player == null) { // no deck selected
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start game overlay
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SOverlayUtils.startGameOverlay();
|
||||||
|
SOverlayUtils.showOverlay();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Find appropriate filename for new save, create and set new save file.
|
||||||
|
final List<DeckType> allowedDeckTypes = new ArrayList<>();
|
||||||
|
if (view.getBoxRandomCommanderDecks().isSelected()) { allowedDeckTypes.add(DeckType.RANDOM_COMMANDER_DECK); }
|
||||||
|
if (view.getBoxPreconCommanderDecks().isSelected()) { allowedDeckTypes.add(DeckType.PRECON_COMMANDER_DECK); }
|
||||||
|
if (view.getBoxCommanderDecks().isSelected()) { allowedDeckTypes.add(DeckType.COMMANDER_DECK); }
|
||||||
|
|
||||||
|
final GauntletData gd = GauntletUtil.createCommanderGauntlet(player.getDeck(), view.getSliOpponents().getValue(), allowedDeckTypes, null);
|
||||||
|
|
||||||
|
final List<RegisteredPlayer> starter = new ArrayList<>();
|
||||||
|
final RegisteredPlayer human = RegisteredPlayer.forCommander(player.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
|
starter.add(human);
|
||||||
|
starter.add(RegisteredPlayer.forCommander(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
|
gd.startRound(starter, human);
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SOverlayUtils.hideOverlay();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -122,7 +122,8 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
|||||||
Deck userDeck = gd.getUserDeck();
|
Deck userDeck = gd.getUserDeck();
|
||||||
if (userDeck == null) {
|
if (userDeck == null) {
|
||||||
//give user a chance to select a deck if none saved with gauntlet
|
//give user a chance to select a deck if none saved with gauntlet
|
||||||
userDeck = FDeckChooser.promptForDeck(null, "Select a deck to play for this gauntlet", DeckType.CUSTOM_DECK, false);
|
userDeck = FDeckChooser.promptForDeck(null, "Select a deck to play for this gauntlet", gd.isCommanderGauntlet()
|
||||||
|
? DeckType.COMMANDER_DECK : DeckType.CUSTOM_DECK, false);
|
||||||
if (userDeck == null) { return; } //prevent crash if user doesn't select a deck
|
if (userDeck == null) { return; } //prevent crash if user doesn't select a deck
|
||||||
gd.setUserDeck(userDeck);
|
gd.setUserDeck(userDeck);
|
||||||
GauntletIO.saveGauntlet(gd);
|
GauntletIO.saveGauntlet(gd);
|
||||||
@@ -139,9 +140,13 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
|||||||
});
|
});
|
||||||
|
|
||||||
final List<RegisteredPlayer> starter = new ArrayList<>();
|
final List<RegisteredPlayer> starter = new ArrayList<>();
|
||||||
final RegisteredPlayer human = new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer());
|
final RegisteredPlayer human = gd.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer())
|
||||||
|
: new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
starter.add(human);
|
starter.add(human);
|
||||||
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(gd.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())
|
||||||
|
: new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
gd.startRound(starter, human);
|
gd.startRound(starter, human);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,221 @@
|
|||||||
|
package forge.screens.home.gauntlet;
|
||||||
|
|
||||||
|
import java.awt.Font;
|
||||||
|
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JCheckBox;
|
||||||
|
import javax.swing.JSlider;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
|
import forge.deck.DeckType;
|
||||||
|
import forge.deckchooser.FDeckChooser;
|
||||||
|
import forge.game.GameType;
|
||||||
|
import forge.gui.framework.DragCell;
|
||||||
|
import forge.gui.framework.DragTab;
|
||||||
|
import forge.gui.framework.EDocID;
|
||||||
|
import forge.screens.home.EMenuGroup;
|
||||||
|
import forge.screens.home.IVSubmenu;
|
||||||
|
import forge.screens.home.StartButton;
|
||||||
|
import forge.screens.home.VHomeUI;
|
||||||
|
import forge.toolbox.FCheckBox;
|
||||||
|
import forge.toolbox.FLabel;
|
||||||
|
import forge.toolbox.FPanel;
|
||||||
|
import forge.toolbox.FSkin;
|
||||||
|
import forge.toolbox.FSkin.SkinnedSlider;
|
||||||
|
import forge.util.Localizer;
|
||||||
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assembles Swing components of "commander gauntlet" submenu singleton.
|
||||||
|
*
|
||||||
|
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public enum VSubmenuGauntletCommander implements IVSubmenu<CSubmenuGauntletCommander> {
|
||||||
|
/** */
|
||||||
|
SINGLETON_INSTANCE;
|
||||||
|
final Localizer localizer = Localizer.getInstance();
|
||||||
|
// Fields used with interface IVDoc
|
||||||
|
private DragCell parentCell;
|
||||||
|
private final DragTab tab = new DragTab(localizer.getMessage("lblCommanderGauntlet"));
|
||||||
|
|
||||||
|
// Other fields
|
||||||
|
private final FPanel pnlOptions = new FPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||||
|
private final FLabel lblTitle = new FLabel.Builder()
|
||||||
|
.text(localizer.getMessage("lblCommanderGauntletBuilder")).fontAlign(SwingConstants.CENTER)
|
||||||
|
.opaque(true).fontSize(16).build();
|
||||||
|
|
||||||
|
private final FLabel lblDecklist = new FLabel.Builder()
|
||||||
|
.text(localizer.getMessage("lblDecklist"))
|
||||||
|
.fontSize(12).build();
|
||||||
|
|
||||||
|
private final SkinnedSlider sliOpponents = new SkinnedSlider(SwingConstants.HORIZONTAL, 5, 50, 20);
|
||||||
|
//private SkinnedSlider sliGamesPerMatch = new SkinnedSlider(JSlider.HORIZONTAL, 1, 7, 3);
|
||||||
|
|
||||||
|
private final JCheckBox boxRandomCommanderDecks = new FCheckBox(DeckType.RANDOM_COMMANDER_DECK.toString());
|
||||||
|
private final JCheckBox boxPreconCommanderDecks = new FCheckBox(DeckType.PRECON_COMMANDER_DECK.toString());
|
||||||
|
private final JCheckBox boxCommanderDecks = new FCheckBox(DeckType.COMMANDER_DECK.toString());
|
||||||
|
|
||||||
|
private final FDeckChooser lstDecks = new FDeckChooser(null, false, GameType.CommanderGauntlet, true);
|
||||||
|
|
||||||
|
private final FLabel lblOptions = new FLabel.Builder().fontSize(16)
|
||||||
|
.fontStyle(Font.BOLD).text(localizer.getMessage("lblOptions")).fontAlign(SwingConstants.CENTER).build();
|
||||||
|
|
||||||
|
private final FLabel lblDesc1 = new FLabel.Builder()
|
||||||
|
.text(localizer.getMessage("lblMatchesperGauntlet")).fontStyle(Font.ITALIC).build();
|
||||||
|
|
||||||
|
private final FLabel lblDesc3 = new FLabel.Builder()
|
||||||
|
.text(localizer.getMessage("lblAllowedDeckTypes")).fontStyle(Font.ITALIC).build();
|
||||||
|
|
||||||
|
private final FLabel lblDesc = new FLabel.Builder().text(localizer.getMessage("lblAutosaveInf")).fontSize(12).build();
|
||||||
|
|
||||||
|
private final StartButton btnStart = new StartButton();
|
||||||
|
|
||||||
|
VSubmenuGauntletCommander() {
|
||||||
|
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||||
|
|
||||||
|
boxRandomCommanderDecks.setSelected(true);
|
||||||
|
boxPreconCommanderDecks.setSelected(true);
|
||||||
|
boxCommanderDecks.setSelected(true);
|
||||||
|
|
||||||
|
sliOpponents.setMajorTickSpacing(5);
|
||||||
|
sliOpponents.setMinorTickSpacing(0);
|
||||||
|
sliOpponents.setPaintTicks(false);
|
||||||
|
sliOpponents.setPaintLabels(true);
|
||||||
|
sliOpponents.setSnapToTicks(true);
|
||||||
|
sliOpponents.setOpaque(false);
|
||||||
|
sliOpponents.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||||
|
sliOpponents.setFont(FSkin.getFont());
|
||||||
|
|
||||||
|
pnlOptions.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||||
|
pnlOptions.add(lblOptions, "h 30px!, w 96%!, gap 2% 0 0 5px");
|
||||||
|
pnlOptions.add(sliOpponents, "h 40px!, w 96%!, gap 2% 0 0 5px, ax center");
|
||||||
|
pnlOptions.add(lblDesc1, "w 96%!, gap 2% 0 0 20px");
|
||||||
|
pnlOptions.add(lblDesc3, "w 96%!, gap 2% 0 0 0");
|
||||||
|
pnlOptions.setCornerDiameter(0);
|
||||||
|
pnlOptions.add(boxRandomCommanderDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||||
|
pnlOptions.add(boxPreconCommanderDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||||
|
pnlOptions.add(boxCommanderDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateDeckPanel() {
|
||||||
|
lstDecks.restoreSavedState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.IVSubmenu#getGroupEnum()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public EMenuGroup getGroupEnum() {
|
||||||
|
return EMenuGroup.GAUNTLET;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getMenuTitle() {
|
||||||
|
return localizer.getMessage("lblCommanderGauntlet");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.IVSubmenu#getItemEnum()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public EDocID getItemEnum() {
|
||||||
|
return EDocID.HOME_GAUNTLETCOMMANDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.home.IVSubmenu#populate()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void populate() {
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||||
|
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 98%!, h 30px!, gap 1% 0 15px 15px, span 2");
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblDesc, "ax center, gap 0 0 0 5px, span 2");
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblDecklist, "ax center, gap 0 0 0 15px, span 2");
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlOptions, "w 40%!, gap 1% 1% 0 0, pushy, growy");
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lstDecks, "w 57%!, pushy, growy");
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStart, "w 98%!, ax center, gap 1% 0 20px 20px, span 2");
|
||||||
|
|
||||||
|
getLstDecks().populate();
|
||||||
|
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
|
||||||
|
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JList} */
|
||||||
|
public FDeckChooser getLstDecks() {
|
||||||
|
return this.lstDecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JCheckBox} */
|
||||||
|
public JCheckBox getBoxRandomCommanderDecks() {
|
||||||
|
return boxRandomCommanderDecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JCheckBox} */
|
||||||
|
public JCheckBox getBoxPreconCommanderDecks() {
|
||||||
|
return boxPreconCommanderDecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JCheckBox} */
|
||||||
|
public JCheckBox getBoxCommanderDecks() {
|
||||||
|
return boxCommanderDecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JSlider} */
|
||||||
|
public JSlider getSliOpponents() {
|
||||||
|
return this.sliOpponents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return {@link javax.swing.JButton} */
|
||||||
|
public JButton getBtnStart() {
|
||||||
|
return this.btnStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========== Overridden from IVDoc
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.framework.IVDoc#getDocumentID()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public EDocID getDocumentID() {
|
||||||
|
return EDocID.HOME_GAUNTLETCOMMANDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.framework.IVDoc#getTabLabel()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DragTab getTabLabel() {
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.framework.IVDoc#getLayoutControl()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public CSubmenuGauntletCommander getLayoutControl() {
|
||||||
|
return CSubmenuGauntletCommander.SINGLETON_INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setParentCell(DragCell cell0) {
|
||||||
|
this.parentCell = cell0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.gui.framework.IVDoc#getParentCell()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DragCell getParentCell() {
|
||||||
|
return parentCell;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,7 +49,9 @@ public class ViewWinLose implements IWinLoseView<FButton> {
|
|||||||
private final SkinnedLabel lblStats = new SkinnedLabel("WinLoseFrame > lblStats needs updating.");
|
private final SkinnedLabel lblStats = new SkinnedLabel("WinLoseFrame > lblStats needs updating.");
|
||||||
private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, ax center, ay center"));
|
private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, ax center, ay center"));
|
||||||
|
|
||||||
/** String constraint parameters for title blocks and cardviewer blocks. */
|
/**
|
||||||
|
* String constraint parameters for title blocks and cardviewer blocks.
|
||||||
|
*/
|
||||||
private static final SkinColor FORE_COLOR = FSkin.getColor(Colors.CLR_TEXT);
|
private static final SkinColor FORE_COLOR = FSkin.getColor(Colors.CLR_TEXT);
|
||||||
private static final String CONSTRAINTS_TITLE = "w 95%!, gap 0 0 20px 10px";
|
private static final String CONSTRAINTS_TITLE = "w 95%!, gap 0 0 20px 10px";
|
||||||
private static final String CONSTRAINTS_TEXT = "w 95%!, h 220px!, gap 0 0 0 20px";
|
private static final String CONSTRAINTS_TEXT = "w 95%!, h 220px!, gap 0 0 0 20px";
|
||||||
@@ -91,6 +93,7 @@ public class ViewWinLose implements IWinLoseView<FButton> {
|
|||||||
case Sealed:
|
case Sealed:
|
||||||
control = new LimitedWinLose(this, game0, matchUI);
|
control = new LimitedWinLose(this, game0, matchUI);
|
||||||
break;
|
break;
|
||||||
|
case CommanderGauntlet:
|
||||||
case Gauntlet:
|
case Gauntlet:
|
||||||
control = new GauntletWinLose(this, game0, matchUI);
|
control = new GauntletWinLose(this, game0, matchUI);
|
||||||
break;
|
break;
|
||||||
@@ -224,25 +227,33 @@ public class ViewWinLose implements IWinLoseView<FButton> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link forge.toolbox.FButton} */
|
/**
|
||||||
|
* @return {@link forge.toolbox.FButton}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public FButton getBtnContinue() {
|
public FButton getBtnContinue() {
|
||||||
return this.btnContinue;
|
return this.btnContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link forge.toolbox.FButton} */
|
/**
|
||||||
|
* @return {@link forge.toolbox.FButton}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public FButton getBtnRestart() {
|
public FButton getBtnRestart() {
|
||||||
return this.btnRestart;
|
return this.btnRestart;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link forge.toolbox.FButton} */
|
/**
|
||||||
|
* @return {@link forge.toolbox.FButton}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public FButton getBtnQuit() {
|
public FButton getBtnQuit() {
|
||||||
return this.btnQuit;
|
return this.btnQuit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JPanel} */
|
/**
|
||||||
|
* @return {@link javax.swing.JPanel}
|
||||||
|
*/
|
||||||
public SkinnedPanel getPnlCustom() {
|
public SkinnedPanel getPnlCustom() {
|
||||||
return this.pnlCustom;
|
return this.pnlCustom;
|
||||||
}
|
}
|
||||||
@@ -279,8 +290,7 @@ public class ViewWinLose implements IWinLoseView<FButton> {
|
|||||||
getPnlCustom().add(new TitleLabel(title), CONSTRAINTS_TITLE);
|
getPnlCustom().add(new TitleLabel(title), CONSTRAINTS_TITLE);
|
||||||
if (FModel.getPreferences().getPrefBoolean(FPref.UI_LARGE_CARD_VIEWERS)) {
|
if (FModel.getPreferences().getPrefBoolean(FPref.UI_LARGE_CARD_VIEWERS)) {
|
||||||
getPnlCustom().add(cv, CONSTRAINTS_CARDS_LARGE);
|
getPnlCustom().add(cv, CONSTRAINTS_CARDS_LARGE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
getPnlCustom().add(cv, CONSTRAINTS_CARDS);
|
getPnlCustom().add(cv, CONSTRAINTS_CARDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ public class LoadGauntletScreen extends LaunchScreen {
|
|||||||
Deck userDeck = gauntlet.getUserDeck();
|
Deck userDeck = gauntlet.getUserDeck();
|
||||||
if (userDeck == null) {
|
if (userDeck == null) {
|
||||||
//give user a chance to select a deck if none saved with gauntlet
|
//give user a chance to select a deck if none saved with gauntlet
|
||||||
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectGauntletDeck"), GameType.Gauntlet, false, new Callback<Deck>() {
|
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectGauntletDeck"), gauntlet.isCommanderGauntlet()
|
||||||
|
? GameType.CommanderGauntlet : GameType.Gauntlet, false, new Callback<Deck>() {
|
||||||
@Override
|
@Override
|
||||||
public void run(Deck result) {
|
public void run(Deck result) {
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
@@ -121,9 +122,13 @@ public class LoadGauntletScreen extends LaunchScreen {
|
|||||||
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingNewGame"), true, () -> {
|
LoadingOverlay.show(Forge.getLocalizer().getMessage("lblLoadingNewGame"), true, () -> {
|
||||||
final GauntletData gauntlet1 = FModel.getGauntletData();
|
final GauntletData gauntlet1 = FModel.getGauntletData();
|
||||||
List<RegisteredPlayer> players = new ArrayList<>();
|
List<RegisteredPlayer> players = new ArrayList<>();
|
||||||
RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet1.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
RegisteredPlayer humanPlayer = gauntlet1.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(gauntlet1.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer())
|
||||||
|
: new RegisteredPlayer(gauntlet1.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
players.add(humanPlayer);
|
players.add(humanPlayer);
|
||||||
players.add(new RegisteredPlayer(gauntlet1.getDecks().get(gauntlet1.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
players.add(gauntlet1.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(gauntlet1.getDecks().get(gauntlet1.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())
|
||||||
|
: new RegisteredPlayer(gauntlet1.getDecks().get(gauntlet1.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
gauntlet1.startRound(players, humanPlayer);
|
gauntlet1.startRound(players, humanPlayer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ public class NewGauntletScreen extends LaunchScreen {
|
|||||||
Forge.getLocalizer().getMessage("lblQuickGauntlet"),
|
Forge.getLocalizer().getMessage("lblQuickGauntlet"),
|
||||||
Forge.getLocalizer().getMessage("lblCustomGauntlet"),
|
Forge.getLocalizer().getMessage("lblCustomGauntlet"),
|
||||||
Forge.getLocalizer().getMessage("lblGauntletContest"),
|
Forge.getLocalizer().getMessage("lblGauntletContest"),
|
||||||
|
Forge.getLocalizer().getMessage("lblCommanderGauntlet"),
|
||||||
}, new Callback<String>() {
|
}, new Callback<String>() {
|
||||||
@Override
|
@Override
|
||||||
public void run(String result) {
|
public void run(String result) {
|
||||||
@@ -65,6 +66,8 @@ public class NewGauntletScreen extends LaunchScreen {
|
|||||||
createQuickGauntlet();
|
createQuickGauntlet();
|
||||||
} else if(Forge.getLocalizer().getMessage("lblCustomGauntlet").equals(result)) {
|
} else if(Forge.getLocalizer().getMessage("lblCustomGauntlet").equals(result)) {
|
||||||
createCustomGauntlet();
|
createCustomGauntlet();
|
||||||
|
} else if(Forge.getLocalizer().getMessage("lblCommanderGauntlet").equals(result)) {
|
||||||
|
createCommandGauntlet();
|
||||||
} else {
|
} else {
|
||||||
createGauntletContest();
|
createGauntletContest();
|
||||||
}
|
}
|
||||||
@@ -72,6 +75,40 @@ public class NewGauntletScreen extends LaunchScreen {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createCommandGauntlet() {
|
||||||
|
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
|
||||||
|
@Override
|
||||||
|
public void run(final Integer numOpponents) {
|
||||||
|
if (numOpponents == null) { return; }
|
||||||
|
|
||||||
|
ListChooser<DeckType> chooser = new ListChooser<>(
|
||||||
|
Forge.getLocalizer().getMessage("lblChooseAllowedDeckTypeOpponents"), 0, 11, Arrays.asList(DeckType.COMMANDER_DECK,
|
||||||
|
DeckType.PRECON_COMMANDER_DECK,
|
||||||
|
DeckType.RANDOM_COMMANDER_DECK), null, new Callback<List<DeckType>>() {
|
||||||
|
@Override
|
||||||
|
public void run(final List<DeckType> allowedDeckTypes) {
|
||||||
|
if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FDeckChooser.promptForDeck(Forge.getLocalizer().getMessage("lblSelectYourDeck"), GameType.Commander, false, new Callback<Deck>() {
|
||||||
|
@Override
|
||||||
|
public void run(Deck userDeck) {
|
||||||
|
if (userDeck == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GauntletData gauntlet = GauntletUtil.createCommanderGauntlet(userDeck, numOpponents, allowedDeckTypes, null);
|
||||||
|
launchGauntlet(gauntlet);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
chooser.show(null, false); /*setting selectMax to true will select all available option*/
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void createQuickGauntlet() {
|
private void createQuickGauntlet() {
|
||||||
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
|
GuiChoose.getInteger(Forge.getLocalizer().getMessage("lblHowManyOpponents"), 3, 50, new Callback<Integer>() {
|
||||||
@Override
|
@Override
|
||||||
@@ -196,11 +233,16 @@ public class NewGauntletScreen extends LaunchScreen {
|
|||||||
if (gauntlet == null) { return; }
|
if (gauntlet == null) { return; }
|
||||||
FModel.setGauntletData(gauntlet);
|
FModel.setGauntletData(gauntlet);
|
||||||
gauntlet.reset();
|
gauntlet.reset();
|
||||||
|
|
||||||
RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
|
||||||
List<RegisteredPlayer> players = new ArrayList<>();
|
List<RegisteredPlayer> players = new ArrayList<>();
|
||||||
players.add(humanPlayer);
|
RegisteredPlayer humanPlayer;
|
||||||
|
if (gauntlet.isCommanderGauntlet()) {
|
||||||
|
humanPlayer = RegisteredPlayer.forCommander(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
|
players.add(RegisteredPlayer.forCommander(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
} else {
|
||||||
|
humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
}
|
||||||
|
players.add(humanPlayer);
|
||||||
gauntlet.startRound(players, humanPlayer);
|
gauntlet.startRound(players, humanPlayer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
|
|||||||
control = new LimitedWinLose(this, game0);
|
control = new LimitedWinLose(this, game0);
|
||||||
break;
|
break;
|
||||||
case Gauntlet:
|
case Gauntlet:
|
||||||
|
case CommanderGauntlet:
|
||||||
case DeckManager:
|
case DeckManager:
|
||||||
control = new GauntletWinLose(this, game0);
|
control = new GauntletWinLose(this, game0);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1446,6 +1446,8 @@ lblGauntletText2=Wähle die Anzahl der Gegner und welche Art Deck sie spielen so
|
|||||||
lblGauntletText3=Dann versuche alle Gegner zu besiegen ohne auch nur ein Spiel zu verlieren.
|
lblGauntletText3=Dann versuche alle Gegner zu besiegen ohne auch nur ein Spiel zu verlieren.
|
||||||
lblSelectGauntletType=Wähle die Art des Spießrutenlaufs
|
lblSelectGauntletType=Wähle die Art des Spießrutenlaufs
|
||||||
lblCustomGauntlet=angepaßter Spießrutenlauf
|
lblCustomGauntlet=angepaßter Spießrutenlauf
|
||||||
|
lblCommanderGauntlet=Generäle Spießrutenlauf
|
||||||
|
lblCommanderGauntletBuilder=Generäle Spießrutenlauf Erbauer
|
||||||
lblGauntletContest=Wettbewerb
|
lblGauntletContest=Wettbewerb
|
||||||
lblSelectYourDeck=Wähle dein Deck
|
lblSelectYourDeck=Wähle dein Deck
|
||||||
lblSelectDeckForOpponent=Wähle Deck für Gegner
|
lblSelectDeckForOpponent=Wähle Deck für Gegner
|
||||||
|
|||||||
@@ -1451,6 +1451,8 @@ lblGauntletText2=Configure how many opponents you wish to face and what decks or
|
|||||||
lblGauntletText3=Then, try to beat all AI opponents without losing a match.
|
lblGauntletText3=Then, try to beat all AI opponents without losing a match.
|
||||||
lblSelectGauntletType=Select a Gauntlet Type
|
lblSelectGauntletType=Select a Gauntlet Type
|
||||||
lblCustomGauntlet=Custom Gauntlet
|
lblCustomGauntlet=Custom Gauntlet
|
||||||
|
lblCommanderGauntlet=Commander Gauntlet
|
||||||
|
lblCommanderGauntletBuilder=Commander Gauntlet Builder
|
||||||
lblGauntletContest=Gauntlet Contest
|
lblGauntletContest=Gauntlet Contest
|
||||||
lblSelectYourDeck=Select Your Deck
|
lblSelectYourDeck=Select Your Deck
|
||||||
lblSelectDeckForOpponent=Select Deck for Opponent
|
lblSelectDeckForOpponent=Select Deck for Opponent
|
||||||
|
|||||||
@@ -1447,6 +1447,8 @@ lblGauntletText2=Configura a cuántos oponentes quieres enfrentarte y qué mazos
|
|||||||
lblGauntletText3=Luego, intenta derrotar a todos los oponentes de la IA sin perder una partida.
|
lblGauntletText3=Luego, intenta derrotar a todos los oponentes de la IA sin perder una partida.
|
||||||
lblSelectGauntletType=Selecciona el tipo de desafío
|
lblSelectGauntletType=Selecciona el tipo de desafío
|
||||||
lblCustomGauntlet=Desafío personalizado
|
lblCustomGauntlet=Desafío personalizado
|
||||||
|
lblCommanderGauntlet=Comandante de desafío
|
||||||
|
lblCommanderGauntletBuilder=Constructor de desafío comandante
|
||||||
lblGauntletContest=Concurso de desafío
|
lblGauntletContest=Concurso de desafío
|
||||||
lblSelectYourDeck=Seleccciona tu mazo
|
lblSelectYourDeck=Seleccciona tu mazo
|
||||||
lblSelectDeckForOpponent=Seleccionar mazo para el oponente
|
lblSelectDeckForOpponent=Seleccionar mazo para el oponente
|
||||||
|
|||||||
@@ -1448,6 +1448,8 @@ lblGauntletText2=Configurez le nombre d''adversaires que vous souhaitez affronte
|
|||||||
lblGauntletText3=Ensuite, essayez de battre tous les adversaires IA sans perdre de match.
|
lblGauntletText3=Ensuite, essayez de battre tous les adversaires IA sans perdre de match.
|
||||||
lblSelectGauntletType=Sélectionner un type de gantelet
|
lblSelectGauntletType=Sélectionner un type de gantelet
|
||||||
lblCustomGauntlet=Gantelet personnalisé
|
lblCustomGauntlet=Gantelet personnalisé
|
||||||
|
lblCommanderGauntlet=Commandant Gantelet
|
||||||
|
lblCommanderGauntletBuilder=Commandant Gantelet Constructeur
|
||||||
lblGauntletContest=Concours de gant
|
lblGauntletContest=Concours de gant
|
||||||
lblSelectYourDeck=Sélectionnez votre deck
|
lblSelectYourDeck=Sélectionnez votre deck
|
||||||
lblSelectDeckForOpponent=Sélectionner le deck pour l''adversaire
|
lblSelectDeckForOpponent=Sélectionner le deck pour l''adversaire
|
||||||
|
|||||||
@@ -1447,6 +1447,8 @@ lblGauntletText2=Configura quanti avversari vuoi affrontare e quali mazzi o tipi
|
|||||||
lblGauntletText3=Quindi, prova a battere tutti gli avversari IA senza perdere una partita.
|
lblGauntletText3=Quindi, prova a battere tutti gli avversari IA senza perdere una partita.
|
||||||
lblSelectGauntletType=Seleziona un tipo di sfida
|
lblSelectGauntletType=Seleziona un tipo di sfida
|
||||||
lblCustomGauntlet=Sfida personalizzata
|
lblCustomGauntlet=Sfida personalizzata
|
||||||
|
lblCommanderGauntlet=Commander Sfida
|
||||||
|
lblCommanderGauntletBuilder=Commander Sfida Costruttore
|
||||||
lblGauntletContest=Competizione delle sfide
|
lblGauntletContest=Competizione delle sfide
|
||||||
lblSelectYourDeck=Seleziona il tuo mazzo
|
lblSelectYourDeck=Seleziona il tuo mazzo
|
||||||
lblSelectDeckForOpponent=Seleziona il mazzo per l''avversario
|
lblSelectDeckForOpponent=Seleziona il mazzo per l''avversario
|
||||||
|
|||||||
@@ -1448,6 +1448,8 @@ lblGauntletText2=対戦したい対戦相手の数と、対戦相手のデッキ
|
|||||||
lblGauntletText3=次に、試合に負けずにすべての AI 対戦相手を倒すようにしてください。
|
lblGauntletText3=次に、試合に負けずにすべての AI 対戦相手を倒すようにしてください。
|
||||||
lblSelectGauntletType=ガントレットタイプを選択
|
lblSelectGauntletType=ガントレットタイプを選択
|
||||||
lblCustomGauntlet=カスタムガントレット
|
lblCustomGauntlet=カスタムガントレット
|
||||||
|
lblCommanderGauntlet=司令官ガントレット
|
||||||
|
lblCommanderGauntletBuilder=司令官ガントレットビルダー
|
||||||
lblGauntletContest=ガントレットコンテスト
|
lblGauntletContest=ガントレットコンテスト
|
||||||
lblSelectYourDeck=デッキを選択
|
lblSelectYourDeck=デッキを選択
|
||||||
lblSelectDeckForOpponent=相手のデッキを選択
|
lblSelectDeckForOpponent=相手のデッキを選択
|
||||||
|
|||||||
@@ -1483,6 +1483,8 @@ lblGauntletText2=Configure quantos adversários você deseja encarar e quais dec
|
|||||||
lblGauntletText3=Então, tente vencer todos os adversários IA sem perder uma partida.
|
lblGauntletText3=Então, tente vencer todos os adversários IA sem perder uma partida.
|
||||||
lblSelectGauntletType=Escolha o Tipo de Desafio
|
lblSelectGauntletType=Escolha o Tipo de Desafio
|
||||||
lblCustomGauntlet=Desafio Personalizado
|
lblCustomGauntlet=Desafio Personalizado
|
||||||
|
lblCommanderGauntlet=Comandante Desafio
|
||||||
|
lblCommanderGauntletBuilder=Comandante Desafio Construtor
|
||||||
lblGauntletContest=Campeonato Desafio
|
lblGauntletContest=Campeonato Desafio
|
||||||
lblSelectYourDeck=Escolha seu Deck
|
lblSelectYourDeck=Escolha seu Deck
|
||||||
lblSelectDeckForOpponent=Escolha o Deck do Adversário
|
lblSelectDeckForOpponent=Escolha o Deck do Adversário
|
||||||
|
|||||||
@@ -1449,6 +1449,8 @@ lblGauntletText2=设置你想面对的对手数量以及他们所使用的套牌
|
|||||||
lblGauntletText3=然后,尝试击败所有AI对手而不输掉一场比赛。
|
lblGauntletText3=然后,尝试击败所有AI对手而不输掉一场比赛。
|
||||||
lblSelectGauntletType=选择一个决斗类型
|
lblSelectGauntletType=选择一个决斗类型
|
||||||
lblCustomGauntlet=自定义决斗
|
lblCustomGauntlet=自定义决斗
|
||||||
|
lblCommanderGauntlet=决斗指挥官
|
||||||
|
lblCommanderGauntletBuilder=决斗指挥官建筑商
|
||||||
lblGauntletContest=决斗竞赛
|
lblGauntletContest=决斗竞赛
|
||||||
lblSelectYourDeck=选择你的套牌
|
lblSelectYourDeck=选择你的套牌
|
||||||
lblSelectDeckForOpponent=选择对手的套牌
|
lblSelectDeckForOpponent=选择对手的套牌
|
||||||
|
|||||||
@@ -432,6 +432,16 @@ public class DeckgenUtil {
|
|||||||
return allDecks.get(name);
|
return allDecks.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return {@link forge.deck.Deck} */
|
||||||
|
public static Deck getCommanderDeck() {
|
||||||
|
final IStorage<Deck> allDecks = FModel.getDecks().getCommander();
|
||||||
|
// in case user has not created any yet
|
||||||
|
if (allDecks.size() == 0) { return null; }
|
||||||
|
final int rand = (int) (Math.floor(MyRandom.getRandom().nextDouble() * allDecks.size()));
|
||||||
|
final String name = allDecks.getItemNames().toArray(new String[0])[rand];
|
||||||
|
return allDecks.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
/** @return {@link forge.deck.Deck} */
|
/** @return {@link forge.deck.Deck} */
|
||||||
public static Deck getRandomOrPreconOrThemeDeck(String colors, boolean forAi, boolean isTheme, boolean useGeneticAI) {
|
public static Deck getRandomOrPreconOrThemeDeck(String colors, boolean forAi, boolean isTheme, boolean useGeneticAI) {
|
||||||
final List<String> selection = new ArrayList<>();
|
final List<String> selection = new ArrayList<>();
|
||||||
@@ -494,6 +504,12 @@ public class DeckgenUtil {
|
|||||||
return allDecks.get(rand).getDeck();
|
return allDecks.get(rand).getDeck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return {@link forge.deck.Deck} */
|
||||||
|
public static Deck getRandomCommanderPreconDeck() {
|
||||||
|
final Iterable<DeckProxy> allDecks = DeckProxy.getAllCommanderPreconDecks();
|
||||||
|
return Aggregates.random(allDecks).getDeck();
|
||||||
|
}
|
||||||
|
|
||||||
/** @return {@link forge.deck.Deck} */
|
/** @return {@link forge.deck.Deck} */
|
||||||
public static Deck getRandomThemeDeck() {
|
public static Deck getRandomThemeDeck() {
|
||||||
final List<DeckProxy> allDecks = DeckProxy.getAllThemeDecks();
|
final List<DeckProxy> allDecks = DeckProxy.getAllThemeDecks();
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
|
|||||||
|
|
||||||
private Deck getGeneratedDeck() {
|
private Deck getGeneratedDeck() {
|
||||||
switch (lstDecks.getGameType()) {
|
switch (lstDecks.getGameType()) {
|
||||||
|
case CommanderGauntlet:
|
||||||
case Commander:
|
case Commander:
|
||||||
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Commander);
|
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Commander);
|
||||||
case Oathbreaker:
|
case Oathbreaker:
|
||||||
@@ -141,6 +142,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
|
|||||||
Iterable<DeckProxy> decks;
|
Iterable<DeckProxy> decks;
|
||||||
final GameType gameType = lstDecks.getGameType();
|
final GameType gameType = lstDecks.getGameType();
|
||||||
switch (gameType) {
|
switch (gameType) {
|
||||||
|
case CommanderGauntlet:
|
||||||
case Commander:
|
case Commander:
|
||||||
decks = DeckProxy.getAllCommanderDecks(DeckFormat.Commander.isLegalDeckPredicate());
|
decks = DeckProxy.getAllCommanderDecks(DeckFormat.Commander.isLegalDeckPredicate());
|
||||||
break;
|
break;
|
||||||
@@ -175,6 +177,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
|
|||||||
private Deck getFavoriteDeck() {
|
private Deck getFavoriteDeck() {
|
||||||
Iterable<DeckProxy> decks;
|
Iterable<DeckProxy> decks;
|
||||||
switch (lstDecks.getGameType()) {
|
switch (lstDecks.getGameType()) {
|
||||||
|
case CommanderGauntlet:
|
||||||
case Commander:
|
case Commander:
|
||||||
decks = DeckProxy.getAllCommanderDecks();
|
decks = DeckProxy.getAllCommanderDecks();
|
||||||
break;
|
break;
|
||||||
@@ -195,7 +198,8 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
decks = Iterables.filter(decks, new Predicate<DeckProxy>() {
|
decks = Iterables.filter(decks, new Predicate<DeckProxy>() {
|
||||||
@Override public boolean apply(final DeckProxy deck) {
|
@Override
|
||||||
|
public boolean apply(final DeckProxy deck) {
|
||||||
return deck.isFavoriteDeck();
|
return deck.isFavoriteDeck();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.io.File;
|
|||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -34,8 +35,18 @@ public final class GauntletData {
|
|||||||
private List<String> eventNames = new ArrayList<>();
|
private List<String> eventNames = new ArrayList<>();
|
||||||
private Deck userDeck;
|
private Deck userDeck;
|
||||||
private List<Deck> decks;
|
private List<Deck> decks;
|
||||||
|
private boolean isCommanderGauntlet = false;
|
||||||
|
|
||||||
|
public GauntletData(boolean isCommander) {
|
||||||
|
isCommanderGauntlet = isCommander;
|
||||||
|
}
|
||||||
|
|
||||||
public GauntletData() {
|
public GauntletData() {
|
||||||
|
this(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCommanderGauntlet() {
|
||||||
|
return isCommanderGauntlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name0) {
|
public void setName(String name0) {
|
||||||
@@ -132,7 +143,7 @@ public final class GauntletData {
|
|||||||
|
|
||||||
public void startRound(final List<RegisteredPlayer> players, final RegisteredPlayer human) {
|
public void startRound(final List<RegisteredPlayer> players, final RegisteredPlayer human) {
|
||||||
hostedMatch = GuiBase.getInterface().hostMatch();
|
hostedMatch = GuiBase.getInterface().hostMatch();
|
||||||
hostedMatch.startMatch(GameType.Gauntlet, null, players, human, GuiBase.getInterface().getNewGuiGame());
|
hostedMatch.startMatch(isCommanderGauntlet ? GameType.CommanderGauntlet : GameType.Gauntlet, isCommanderGauntlet ? Collections.singleton(GameType.Commander) : null , players, human, GuiBase.getInterface().getNewGuiGame());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void nextRound(final List<RegisteredPlayer> players, final RegisteredPlayer human) {
|
public void nextRound(final List<RegisteredPlayer> players, final RegisteredPlayer human) {
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ public class GauntletIO {
|
|||||||
public static final String PREFIX_QUICK = "Quick_";
|
public static final String PREFIX_QUICK = "Quick_";
|
||||||
/** Prefix for custom gauntlet save files. */
|
/** Prefix for custom gauntlet save files. */
|
||||||
public static final String PREFIX_CUSTOM = "Custom_";
|
public static final String PREFIX_CUSTOM = "Custom_";
|
||||||
|
/** Prefix for commander gauntlet save files. */
|
||||||
|
public static final String PREFIX_COMMANDER = "Commander_";
|
||||||
/** Regex for locked gauntlet save files. */
|
/** Regex for locked gauntlet save files. */
|
||||||
public static final String PREFIX_LOCKED = "LOCKED_";
|
public static final String PREFIX_LOCKED = "LOCKED_";
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import forge.deck.Deck;
|
|||||||
import forge.deck.DeckType;
|
import forge.deck.DeckType;
|
||||||
import forge.deck.DeckgenUtil;
|
import forge.deck.DeckgenUtil;
|
||||||
import forge.deck.NetDeckCategory;
|
import forge.deck.NetDeckCategory;
|
||||||
|
import forge.game.GameType;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.util.MyRandom;
|
import forge.util.MyRandom;
|
||||||
|
|
||||||
@@ -94,6 +95,47 @@ public class GauntletUtil {
|
|||||||
gauntlet.reset();
|
gauntlet.reset();
|
||||||
return gauntlet;
|
return gauntlet;
|
||||||
}
|
}
|
||||||
|
public static GauntletData createCommanderGauntlet(final Deck userDeck, final int numOpponents, final List<DeckType> allowedDeckTypes, NetDeckCategory netDecks) {
|
||||||
|
GauntletData gauntlet = new GauntletData(true);
|
||||||
|
setDefaultGauntletName(gauntlet, GauntletIO.PREFIX_COMMANDER);
|
||||||
|
FModel.setGauntletData(gauntlet);
|
||||||
|
|
||||||
|
// Generate gauntlet decks
|
||||||
|
Deck deck;
|
||||||
|
final List<String> eventNames = new ArrayList<>();
|
||||||
|
final List<Deck> decks = new ArrayList<>();
|
||||||
|
|
||||||
|
final Object[] netDeckNames = netDecks != null ? netDecks.getItemNames().toArray() : null;
|
||||||
|
|
||||||
|
for (int i = 0; i < numOpponents; i++) {
|
||||||
|
int randType = (int)Math.floor(MyRandom.getRandom().nextDouble() * allowedDeckTypes.size());
|
||||||
|
switch (allowedDeckTypes.get(randType)) {
|
||||||
|
case RANDOM_COMMANDER_DECK:
|
||||||
|
deck = DeckgenUtil.generateCommanderDeck(true, GameType.Commander);
|
||||||
|
eventNames.add(deck.getName());
|
||||||
|
break;
|
||||||
|
case PRECON_COMMANDER_DECK:
|
||||||
|
deck = DeckgenUtil.getRandomCommanderPreconDeck();
|
||||||
|
eventNames.add(deck.getName());
|
||||||
|
break;
|
||||||
|
case COMMANDER_DECK:
|
||||||
|
deck = DeckgenUtil.getCommanderDeck();
|
||||||
|
eventNames.add(deck.getName());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
decks.add(deck);
|
||||||
|
}
|
||||||
|
|
||||||
|
gauntlet.setDecks(decks);
|
||||||
|
gauntlet.setEventNames(eventNames);
|
||||||
|
gauntlet.setUserDeck(userDeck);
|
||||||
|
|
||||||
|
// Reset all variable fields to 0, stamps and saves automatically.
|
||||||
|
gauntlet.reset();
|
||||||
|
return gauntlet;
|
||||||
|
}
|
||||||
|
|
||||||
public static void setDefaultGauntletName(GauntletData gauntlet, String prefix) {
|
public static void setDefaultGauntletName(GauntletData gauntlet, String prefix) {
|
||||||
final File[] arrFiles = GauntletIO.getGauntletFilesUnlocked(prefix);
|
final File[] arrFiles = GauntletIO.getGauntletFilesUnlocked(prefix);
|
||||||
|
|||||||
@@ -117,11 +117,15 @@ public abstract class GauntletWinLoseController {
|
|||||||
if (lastGame.isMatchOver()) {
|
if (lastGame.isMatchOver()) {
|
||||||
// To change the AI deck, we have to create a new match.
|
// To change the AI deck, we have to create a new match.
|
||||||
final GauntletData gd = FModel.getGauntletData();
|
final GauntletData gd = FModel.getGauntletData();
|
||||||
final RegisteredPlayer human = new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
final RegisteredPlayer human = gd.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer())
|
||||||
|
: new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||||
final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
|
final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
|
||||||
final List<RegisteredPlayer> players = Lists.newArrayList();
|
final List<RegisteredPlayer> players = Lists.newArrayList();
|
||||||
players.add(human);
|
players.add(human);
|
||||||
players.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
players.add(gd.isCommanderGauntlet()
|
||||||
|
? RegisteredPlayer.forCommander(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())
|
||||||
|
: new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
view.hide();
|
view.hide();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
|
|||||||
Reference in New Issue
Block a user