add Commander Gauntlet

This commit is contained in:
Anthony Calosa
2023-03-17 08:18:52 +08:00
parent b03e99288a
commit 81efb2737f
25 changed files with 650 additions and 172 deletions

View File

@@ -12,37 +12,38 @@ 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 {
Sealed (DeckFormat.Limited, true, true, true, "lblSealed", ""), Sealed (DeckFormat.Limited, true, true, true, "lblSealed", ""),
Draft (DeckFormat.Limited, true, true, true, "lblDraft", ""), Draft (DeckFormat.Limited, true, true, true, "lblDraft", ""),
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", ""),
Quest (DeckFormat.QuestDeck, true, true, false, "lblQuest", ""), CommanderGauntlet (DeckFormat.Commander, false, false, false, "lblCommander", "lblCommanderDesc"),
QuestDraft (DeckFormat.Limited, true, true, true, "lblQuestDraft", ""), Quest (DeckFormat.QuestDeck, true, true, false, "lblQuest", ""),
PlanarConquest (DeckFormat.PlanarConquest, true, false, false, "lblPlanarConquest", ""), QuestDraft (DeckFormat.Limited, true, true, true, "lblQuestDraft", ""),
Puzzle (DeckFormat.Puzzle, false, false, false, "lblPuzzle", "lblPuzzleDesc"), PlanarConquest (DeckFormat.PlanarConquest, true, false, false, "lblPlanarConquest", ""),
Constructed (DeckFormat.Constructed, false, true, true, "lblConstructed", ""), Puzzle (DeckFormat.Puzzle, false, false, false, "lblPuzzle", "lblPuzzleDesc"),
DeckManager (DeckFormat.Constructed, false, true, true, "lblDeckManager", ""), Constructed (DeckFormat.Constructed, false, true, true, "lblConstructed", ""),
Vanguard (DeckFormat.Vanguard, true, true, true, "lblVanguard", "lblVanguardDesc"), DeckManager (DeckFormat.Constructed, false, true, true, "lblDeckManager", ""),
Commander (DeckFormat.Commander, false, false, false, "lblCommander", "lblCommanderDesc"), Vanguard (DeckFormat.Vanguard, true, true, true, "lblVanguard", "lblVanguardDesc"),
Oathbreaker (DeckFormat.Oathbreaker, false, false, false, "lblOathbreaker", "lblOathbreakerDesc"), Commander (DeckFormat.Commander, false, false, false, "lblCommander", "lblCommanderDesc"),
TinyLeaders (DeckFormat.TinyLeaders, false, false, false, "lblTinyLeaders", "lblTinyLeadersDesc"), Oathbreaker (DeckFormat.Oathbreaker, false, false, false, "lblOathbreaker", "lblOathbreakerDesc"),
Brawl (DeckFormat.Brawl, false, false, false, "lblBrawl", "lblBrawlDesc"), TinyLeaders (DeckFormat.TinyLeaders, false, false, false, "lblTinyLeaders", "lblTinyLeadersDesc"),
Planeswalker (DeckFormat.PlanarConquest, false, false, true, "lblPlaneswalker", "lblPlaneswalkerDesc"), Brawl (DeckFormat.Brawl, false, false, false, "lblBrawl", "lblBrawlDesc"),
Planechase (DeckFormat.Planechase, false, false, true, "lblPlanechase", "lblPlanechaseDesc"), Planeswalker (DeckFormat.PlanarConquest, false, false, true, "lblPlaneswalker", "lblPlaneswalkerDesc"),
Archenemy (DeckFormat.Archenemy, false, false, true, "lblArchenemy", "lblArchenemyDesc"), Planechase (DeckFormat.Planechase, false, false, true, "lblPlanechase", "lblPlanechaseDesc"),
ArchenemyRumble (DeckFormat.Archenemy, false, false, true, "lblArchenemyRumble", "lblArchenemyRumbleDesc"), Archenemy (DeckFormat.Archenemy, false, false, true, "lblArchenemy", "lblArchenemyDesc"),
MomirBasic (DeckFormat.Constructed, false, false, false, "lblMomirBasic", "lblMomirBasicDesc", new Function<RegisteredPlayer, Deck>() { ArchenemyRumble (DeckFormat.Archenemy, false, false, true, "lblArchenemyRumble", "lblArchenemyRumbleDesc"),
MomirBasic (DeckFormat.Constructed, false, false, false, "lblMomirBasic", "lblMomirBasicDesc", new Function<RegisteredPlayer, Deck>() {
@Override @Override
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);

View File

@@ -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),

View File

@@ -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();
} }
/** /**

View File

@@ -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);

View File

@@ -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();
}
});
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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";
@@ -77,25 +79,26 @@ public class ViewWinLose implements IWinLoseView<FButton> {
// modes. // modes.
ControlWinLose control = null; ControlWinLose control = null;
switch (game0.getGameType()) { switch (game0.getGameType()) {
case Quest: case Quest:
control = new QuestWinLose(this, game0, matchUI); control = new QuestWinLose(this, game0, matchUI);
break; break;
case QuestDraft: case QuestDraft:
control = new QuestDraftWinLose(this, game0, matchUI); control = new QuestDraftWinLose(this, game0, matchUI);
break; break;
case Draft: case Draft:
if (!FModel.getGauntletMini().isGauntletDraft()) { if (!FModel.getGauntletMini().isGauntletDraft()) {
break;
}
//$FALL-THROUGH$
case Sealed:
control = new LimitedWinLose(this, game0, matchUI);
break;
case CommanderGauntlet:
case Gauntlet:
control = new GauntletWinLose(this, game0, matchUI);
break;
default: // will catch it after switch
break; break;
}
//$FALL-THROUGH$
case Sealed:
control = new LimitedWinLose(this, game0, matchUI);
break;
case Gauntlet:
control = new GauntletWinLose(this, game0, matchUI);
break;
default: // will catch it after switch
break;
} }
if (null == control) { if (null == control) {
control = new ControlWinLose(this, game0, matchUI); control = new ControlWinLose(this, game0, matchUI);
@@ -179,7 +182,7 @@ public class ViewWinLose implements IWinLoseView<FButton> {
pnlLog.add( pnlLog.add(
new FLabel.Builder().text(localizer.getMessage("lblGameLog")).fontAlign(SwingConstants.CENTER).fontSize(18) new FLabel.Builder().text(localizer.getMessage("lblGameLog")).fontAlign(SwingConstants.CENTER).fontSize(18)
.fontStyle(Font.BOLD).build(), "w 300px!, h 28px!, gaptop 20px"); .fontStyle(Font.BOLD).build(), "w 300px!, h 28px!, gaptop 20px");
pnlLog.add(scrLog, "w 300px!, h 100px!, gap 0 0 10 10"); pnlLog.add(scrLog, "w 300px!, h 100px!, gap 0 0 10 10");
pnlLog.add(btnCopyLog, "center, w pref+16, h pref+8"); pnlLog.add(btnCopyLog, "center, w pref+16, h pref+8");
@@ -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);
} }
} }

View File

@@ -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);
}); });
} }

View File

@@ -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<>();
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(humanPlayer); players.add(humanPlayer);
players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
gauntlet.startRound(players, humanPlayer); gauntlet.startRound(players, humanPlayer);
} }
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1448,6 +1448,8 @@ lblGauntletText2=対戦したい対戦相手の数と、対戦相手のデッキ
lblGauntletText3=次に、試合に負けずにすべての AI 対戦相手を倒すようにしてください。 lblGauntletText3=次に、試合に負けずにすべての AI 対戦相手を倒すようにしてください。
lblSelectGauntletType=ガントレットタイプを選択 lblSelectGauntletType=ガントレットタイプを選択
lblCustomGauntlet=カスタムガントレット lblCustomGauntlet=カスタムガントレット
lblCommanderGauntlet=司令官ガントレット
lblCommanderGauntletBuilder=司令官ガントレットビルダー
lblGauntletContest=ガントレットコンテスト lblGauntletContest=ガントレットコンテスト
lblSelectYourDeck=デッキを選択 lblSelectYourDeck=デッキを選択
lblSelectDeckForOpponent=相手のデッキを選択 lblSelectDeckForOpponent=相手のデッキを選択

View File

@@ -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

View File

@@ -1449,6 +1449,8 @@ lblGauntletText2=设置你想面对的对手数量以及他们所使用的套牌
lblGauntletText3=然后尝试击败所有AI对手而不输掉一场比赛。 lblGauntletText3=然后尝试击败所有AI对手而不输掉一场比赛。
lblSelectGauntletType=选择一个决斗类型 lblSelectGauntletType=选择一个决斗类型
lblCustomGauntlet=自定义决斗 lblCustomGauntlet=自定义决斗
lblCommanderGauntlet=决斗指挥官
lblCommanderGauntletBuilder=决斗指挥官建筑商
lblGauntletContest=决斗竞赛 lblGauntletContest=决斗竞赛
lblSelectYourDeck=选择你的套牌 lblSelectYourDeck=选择你的套牌
lblSelectDeckForOpponent=选择对手的套牌 lblSelectDeckForOpponent=选择对手的套牌

View File

@@ -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();

View File

@@ -65,75 +65,76 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
@Override @Override
public Deck getDeck() { public Deck getDeck() {
switch (type) { switch (type) {
case Generated: case Generated:
return getGeneratedDeck(); return getGeneratedDeck();
case User: case User:
return getUserDeck(); return getUserDeck();
default: default:
return getFavoriteDeck(); return getFavoriteDeck();
} }
} }
private Deck getGeneratedDeck() { private Deck getGeneratedDeck() {
switch (lstDecks.getGameType()) { switch (lstDecks.getGameType()) {
case Commander: case CommanderGauntlet:
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Commander); case Commander:
case Oathbreaker: return DeckgenUtil.generateCommanderDeck(isAi, GameType.Commander);
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Oathbreaker); case Oathbreaker:
case TinyLeaders: return DeckgenUtil.generateCommanderDeck(isAi, GameType.Oathbreaker);
return DeckgenUtil.generateCommanderDeck(isAi, GameType.TinyLeaders); case TinyLeaders:
case Brawl: return DeckgenUtil.generateCommanderDeck(isAi, GameType.TinyLeaders);
return DeckgenUtil.generateCommanderDeck(isAi, GameType.Brawl); case Brawl:
case Archenemy: return DeckgenUtil.generateCommanderDeck(isAi, GameType.Brawl);
return DeckgenUtil.generateSchemeDeck(); case Archenemy:
case Planechase: return DeckgenUtil.generateSchemeDeck();
return DeckgenUtil.generatePlanarDeck(); case Planechase:
default: return DeckgenUtil.generatePlanarDeck();
while (true) { default:
switch (Aggregates.random(DeckType.ConstructedOptions)) { while (true) {
case PRECONSTRUCTED_DECK: switch (Aggregates.random(DeckType.ConstructedOptions)) {
return Aggregates.random(DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons())).getDeck(); case PRECONSTRUCTED_DECK:
case QUEST_OPPONENT_DECK: return Aggregates.random(DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons())).getDeck();
return Aggregates.random(DeckProxy.getAllQuestEventAndChallenges()).getDeck(); case QUEST_OPPONENT_DECK:
case COLOR_DECK: return Aggregates.random(DeckProxy.getAllQuestEventAndChallenges()).getDeck();
List<String> colors = new ArrayList<>(); case COLOR_DECK:
int count = Aggregates.randomInt(1, 3); List<String> colors = new ArrayList<>();
for (int i = 1; i <= count; i++) { int count = Aggregates.randomInt(1, 3);
colors.add("Random " + i); for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, null, isAi);
case STANDARD_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getStandard(), isAi);
case PIONEER_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getPioneer(), isAi);
case HISTORIC_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getHistoric(), isAi);
case MODERN_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getModern(), isAi);
case LEGACY_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().get("Legacy"), isAi);
case VINTAGE_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().get("Vintage"), isAi);
case STANDARD_COLOR_DECK:
colors = new ArrayList<>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getStandard().getFilterPrinted(), isAi);
case MODERN_COLOR_DECK:
colors = new ArrayList<>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getModern().getFilterPrinted(), isAi);
case THEME_DECK:
return Aggregates.random(DeckProxy.getAllThemeDecks()).getDeck();
default:
continue;
} }
return DeckgenUtil.buildColorDeck(colors, null, isAi);
case STANDARD_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getStandard(),isAi);
case PIONEER_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getPioneer(),isAi);
case HISTORIC_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getHistoric(),isAi);
case MODERN_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getModern(),isAi);
case LEGACY_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().get("Legacy"),isAi);
case VINTAGE_CARDGEN_DECK:
return DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().get("Vintage"),isAi);
case STANDARD_COLOR_DECK:
colors = new ArrayList<>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getStandard().getFilterPrinted(), isAi);
case MODERN_COLOR_DECK:
colors = new ArrayList<>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getModern().getFilterPrinted(), isAi);
case THEME_DECK:
return Aggregates.random(DeckProxy.getAllThemeDecks()).getDeck();
default:
continue;
} }
}
} }
} }
@@ -141,27 +142,28 @@ 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 Commander: case CommanderGauntlet:
decks = DeckProxy.getAllCommanderDecks(DeckFormat.Commander.isLegalDeckPredicate()); case Commander:
break; decks = DeckProxy.getAllCommanderDecks(DeckFormat.Commander.isLegalDeckPredicate());
case Oathbreaker: break;
decks = DeckProxy.getAllOathbreakerDecks(DeckFormat.Oathbreaker.isLegalDeckPredicate()); case Oathbreaker:
break; decks = DeckProxy.getAllOathbreakerDecks(DeckFormat.Oathbreaker.isLegalDeckPredicate());
case TinyLeaders: break;
decks = DeckProxy.getAllTinyLeadersDecks(DeckFormat.TinyLeaders.isLegalDeckPredicate()); case TinyLeaders:
break; decks = DeckProxy.getAllTinyLeadersDecks(DeckFormat.TinyLeaders.isLegalDeckPredicate());
case Brawl: break;
decks = DeckProxy.getAllBrawlDecks(DeckFormat.Brawl.isLegalDeckPredicate()); case Brawl:
break; decks = DeckProxy.getAllBrawlDecks(DeckFormat.Brawl.isLegalDeckPredicate());
case Archenemy: break;
decks = DeckProxy.getAllSchemeDecks(DeckFormat.Archenemy.isLegalDeckPredicate()); case Archenemy:
break; decks = DeckProxy.getAllSchemeDecks(DeckFormat.Archenemy.isLegalDeckPredicate());
case Planechase: break;
decks = DeckProxy.getAllPlanarDecks(DeckFormat.Planechase.isLegalDeckPredicate()); case Planechase:
break; decks = DeckProxy.getAllPlanarDecks(DeckFormat.Planechase.isLegalDeckPredicate());
default: break;
decks = DeckProxy.getAllConstructedDecks(gameType.getDeckFormat().isLegalDeckPredicate()); default:
break; decks = DeckProxy.getAllConstructedDecks(gameType.getDeckFormat().isLegalDeckPredicate());
break;
} }
if (Iterables.isEmpty(decks)) { if (Iterables.isEmpty(decks)) {
return getGeneratedDeck(); //fall back to generated deck if no decks in filtered list return getGeneratedDeck(); //fall back to generated deck if no decks in filtered list
@@ -175,27 +177,29 @@ 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 Commander: case CommanderGauntlet:
decks = DeckProxy.getAllCommanderDecks(); case Commander:
break; decks = DeckProxy.getAllCommanderDecks();
case Oathbreaker: break;
decks = DeckProxy.getAllOathbreakerDecks(); case Oathbreaker:
break; decks = DeckProxy.getAllOathbreakerDecks();
case TinyLeaders: break;
decks = DeckProxy.getAllTinyLeadersDecks(); case TinyLeaders:
break; decks = DeckProxy.getAllTinyLeadersDecks();
case Archenemy: break;
decks = DeckProxy.getAllSchemeDecks(); case Archenemy:
break; decks = DeckProxy.getAllSchemeDecks();
case Planechase: break;
decks = DeckProxy.getAllPlanarDecks(); case Planechase:
break; decks = DeckProxy.getAllPlanarDecks();
default: break;
decks = DeckProxy.getAllConstructedDecks(); default:
break; decks = DeckProxy.getAllConstructedDecks();
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();
} }
}); });

View File

@@ -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) {

View File

@@ -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_";

View File

@@ -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);

View File

@@ -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();