From 3b571cb7ec38ffa315ebcf50f38c19a072c4dfb6 Mon Sep 17 00:00:00 2001 From: moomarc Date: Thu, 20 Feb 2014 17:04:13 +0000 Subject: [PATCH] - Moved Commander to Constructed match setup. - Variants menu removed --- .../src/main/java/forge/game/GameAction.java | 3 +- .../java/forge/game/cost/CostAddMana.java | 2 +- .../main/java/forge/game/player/Player.java | 4 +- .../game/spellability/AbilityManaPart.java | 2 +- .../forge/gui/deckchooser/DeckgenUtil.java | 47 +++++++++- .../main/java/forge/gui/framework/EDocID.java | 2 - .../main/java/forge/gui/home/EMenuGroup.java | 1 - .../src/main/java/forge/gui/home/VHomeUI.java | 3 - .../home/sanctioned/CSubmenuConstructed.java | 83 ++++++++++++----- .../home/sanctioned/VSubmenuConstructed.java | 90 +++++++++++++++---- 10 files changed, 187 insertions(+), 50 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 54f83113467..e7dd00552c0 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -21,6 +21,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; + import forge.GameCommand; import forge.card.CardCharacteristicName; import forge.card.CardType; @@ -1481,7 +1482,7 @@ public class GameAction { p1.drawCards(p1.getMaxHandSize()); } - performMulligans(first, gameType == GameType.Commander); + performMulligans(first, game.getRules().hasAppliedVariant(GameType.Commander)); if (game.isGameOver()) { break; } // conceded during "mulligan" prompt game.setAge(GameStage.Play); diff --git a/forge-game/src/main/java/forge/game/cost/CostAddMana.java b/forge-game/src/main/java/forge/game/cost/CostAddMana.java index 3af7f616556..4e19bc1600d 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAddMana.java +++ b/forge-game/src/main/java/forge/game/cost/CostAddMana.java @@ -71,7 +71,7 @@ public class CostAddMana extends CostPart { Card source = sa.getHostCard(); ColorSet cid = null; - if (ai.getGame().getRules().getGameType() == GameType.Commander) { + if (ai.getGame().getRules().hasAppliedVariant(GameType.Commander)) { cid = ai.getCommander().getRules().getColorIdentity(); } ArrayList manaProduced = new ArrayList(); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index fe78b09cb24..d1becf4fd1a 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -21,6 +21,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; + import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.*; @@ -2112,8 +2113,7 @@ public class Player extends GameEntity implements Comparable { return this.loseConditionMet(GameLossReason.Poisoned, null); } - if(game.getRules().getGameType() == GameType.Commander) - { + if (game.getRules().hasAppliedVariant(GameType.Commander)) { Map cmdDmg = getCommanderDamage(); for(Card c : cmdDmg.keySet()) { diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index cc8e280d523..f82a0005328 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -130,7 +130,7 @@ public class AbilityManaPart implements java.io.Serializable { } ColorSet CID = null; - if (player.getGame().getRules().getGameType() == GameType.Commander) { + if (player.getGame().getRules().hasAppliedVariant(GameType.Commander)) { CID = player.getCommander().getRules().getColorIdentity(); } //clear lastProduced diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java b/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java index 146a9403e2c..7733b0e646b 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java @@ -1,11 +1,17 @@ package forge.gui.deckchooser; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.Iterables; + import forge.Singletons; import forge.card.CardDb; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; import forge.deck.CardPool; import forge.deck.Deck; +import forge.deck.DeckSection; import forge.deck.generation.*; import forge.gui.toolbox.FOptionPane; import forge.gui.toolbox.itemmanager.DeckManager; @@ -80,7 +86,6 @@ public class DeckgenUtil { return deck; } - public static QuestEvent getQuestEvent(final String name) { QuestController qCtrl = Singletons.getModel().getQuest(); for (QuestEventChallenge challenge : qCtrl.getChallenges()) { @@ -247,4 +252,44 @@ public class DeckgenUtil { return res; } + + /** Generate a 2-color Commander deck. */ + public static Deck generateCommanderDeck(boolean forAi) { + final Deck deck; + CardDb cardDb = Singletons.getMagicDb().getCommonCards(); + PaperCard commander; + ColorSet colorID; + + // Get random multicolor Legendary creature + Predicate canPlay = forAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY; + Iterable legends = cardDb.getAllCards(Predicates.compose(Predicates.and + (CardRulesPredicates.Presets.IS_CREATURE, CardRulesPredicates.Presets.IS_LEGENDARY), PaperCard.FN_GET_RULES)); + legends = Iterables.filter(legends, Predicates.compose(Predicates.and + (CardRulesPredicates.Presets.IS_MULTICOLOR, canPlay), PaperCard.FN_GET_RULES)); + + do { + commander = Aggregates.random(legends); + colorID = commander.getRules().getColorIdentity(); + } while (colorID.countColors() != 2); + + List comColors = new ArrayList(2); + if (colorID.hasWhite()) { comColors.add("White"); } + if (colorID.hasBlue()) { comColors.add("Blue"); } + if (colorID.hasBlack()) { comColors.add("Black"); } + if (colorID.hasRed()) { comColors.add("Red"); } + if (colorID.hasGreen()) { comColors.add("Green"); } + + DeckGeneratorBase gen = null; + gen = new DeckGenerator2Color(cardDb, comColors.get(0), comColors.get(1)); + gen.setSingleton(true); + gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); + CardPool cards = gen == null ? null : gen.getDeck(60, forAi); + + // After generating card lists, build deck. + deck = new Deck("Generated Commander deck (" + commander.getName() + ")"); + deck.getMain().addAll(cards); + deck.getOrCreate(DeckSection.Commander).add(commander); + + return deck; + } } diff --git a/forge-gui/src/main/java/forge/gui/framework/EDocID.java b/forge-gui/src/main/java/forge/gui/framework/EDocID.java index 0a6a6ce178d..5dbc1e9da8c 100644 --- a/forge-gui/src/main/java/forge/gui/framework/EDocID.java +++ b/forge-gui/src/main/java/forge/gui/framework/EDocID.java @@ -16,7 +16,6 @@ import forge.gui.home.settings.VSubmenuAvatars; import forge.gui.home.settings.VSubmenuDownloaders; import forge.gui.home.settings.VSubmenuPreferences; import forge.gui.home.settings.VSubmenuReleaseNotes; -import forge.gui.home.variant.VSubmenuCommander; import forge.gui.match.views.*; import forge.gui.workshop.views.VCardDesigner; import forge.gui.workshop.views.VCardScript; @@ -53,7 +52,6 @@ public enum EDocID { /** */ HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE), /** */ HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE), /** */ HOME_GAUNTLETCONTESTS (VSubmenuGauntletContests.SINGLETON_INSTANCE), /** */ - HOME_COMMANDER (VSubmenuCommander.SINGLETON_INSTANCE), /** */ HOME_PREFERENCES (VSubmenuPreferences.SINGLETON_INSTANCE), /** */ HOME_AVATARS (VSubmenuAvatars.SINGLETON_INSTANCE), /** */ HOME_UTILITIES (VSubmenuDownloaders.SINGLETON_INSTANCE), /** */ diff --git a/forge-gui/src/main/java/forge/gui/home/EMenuGroup.java b/forge-gui/src/main/java/forge/gui/home/EMenuGroup.java index b705cb6b935..cf3ce1f64d4 100644 --- a/forge-gui/src/main/java/forge/gui/home/EMenuGroup.java +++ b/forge-gui/src/main/java/forge/gui/home/EMenuGroup.java @@ -11,7 +11,6 @@ public enum EMenuGroup { /** */ SANCTIONED ("Sanctioned Formats"), /** */ QUEST ("Quest Mode"), /** */ GAUNTLET ("Gauntlets"), /** */ - VARIANT ("Variant"), /** */ SETTINGS ("Game Settings"); private final String strTitle; diff --git a/forge-gui/src/main/java/forge/gui/home/VHomeUI.java b/forge-gui/src/main/java/forge/gui/home/VHomeUI.java index 4031fdc1d92..5248bd11eb9 100644 --- a/forge-gui/src/main/java/forge/gui/home/VHomeUI.java +++ b/forge-gui/src/main/java/forge/gui/home/VHomeUI.java @@ -31,7 +31,6 @@ import forge.gui.home.settings.VSubmenuAvatars; import forge.gui.home.settings.VSubmenuDownloaders; import forge.gui.home.settings.VSubmenuPreferences; import forge.gui.home.settings.VSubmenuReleaseNotes; -import forge.gui.home.variant.VSubmenuCommander; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPanel; import forge.gui.toolbox.FSkin; @@ -130,8 +129,6 @@ public enum VHomeUI implements IVTopLevelUI { allSubmenus.add(VSubmenuDownloaders.SINGLETON_INSTANCE); allSubmenus.add(VSubmenuReleaseNotes.SINGLETON_INSTANCE); - allSubmenus.add(VSubmenuCommander.SINGLETON_INSTANCE); - // For each group: init its panel final SortedMap allGroupPanels = new TreeMap(); for (final EMenuGroup e : EMenuGroup.values()) { diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index 463a8bcc75d..9dc2fcc5763 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -1,7 +1,5 @@ package forge.gui.home.sanctioned; -import com.google.common.collect.Iterables; - import forge.UiCommand; import forge.Singletons; import forge.deck.CardPool; @@ -62,11 +60,32 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { @Override public void run() { final CardCollections cColl = Singletons.getModel().getDecks(); FList deckList; + Vector listData; + Object val; for (int i = 0; i < 8; i++) { + // Commander: reinit deck list and restore last selections (if any) + deckList = view.getCommanderDeckLists().get(i); + listData = new Vector(); + listData.add("Generate"); + if (cColl.getCommander().size() > 0) { + listData.add("Random"); + for (Deck comDeck : cColl.getCommander()) { + listData.add(comDeck); + } + } + val = deckList.getSelectedValue(); + deckList.setListData(listData); + if (null != val) { + deckList.setSelectedValue(val, true); + } + if (-1 == deckList.getSelectedIndex()) { + deckList.setSelectedIndex(0); + } // End Commander + // Archenemy: reinit deck list and restore last selections (if any) deckList = view.getSchemeDeckLists().get(i); - Vector listData = new Vector(); + listData = new Vector(); listData.add("Use deck's scheme section (random if unavailable)"); listData.add("Generate"); if (cColl.getScheme().size() > 0) { @@ -75,7 +94,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { listData.add(schemeDeck); } } - Object val = deckList.getSelectedValue(); + val = deckList.getSelectedValue(); deckList.setListData(listData); if (null != val) { deckList.setSelectedValue(val, true); @@ -166,12 +185,6 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { /** Starts a match with the applied variants. */ private void startGame(final List variantTypes) { - if (variantTypes.contains(GameType.Commander)) { - FOptionPane.showMessageDialog("Commander matches cannot currently be started via the " - + "Constructed match setup screen. Please this variant then restart the match"); - return; - } - if (!view.isEnoughTeams()) { FOptionPane.showMessageDialog("There are not enough teams! Please adjust team allocations."); return; @@ -185,7 +198,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { } // Is it even possible anymore? I think current implementation assigns decks automatically. boolean checkLegality = Singletons.getModel().getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY); - if (checkLegality) { + if (checkLegality && !variantTypes.contains(GameType.Commander)) { //Commander deck replaces regular deck and is checked later for (final int i : view.getParticipants()) { String name = view.getPlayerName(i); String errMsg = GameType.Constructed.getDecksFormat().getDeckConformanceProblem(view.getDeckChooser(i).getPlayer().getDeck()); @@ -201,20 +214,44 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { for (final int i : view.getParticipants()) { String name = view.getPlayerName(i); LobbyPlayer lobbyPlayer = view.isPlayerAI(i) ? lobby.getAiPlayer(name, - view.getPlayerAvatar(i)) : lobby.getGuiPlayer(); - RegisteredPlayer rp = view.getDeckChooser(i).getPlayer(); + view.getPlayerAvatar(i)) : lobby.getGuiPlayer(); + RegisteredPlayer rp = view.getDeckChooser(i).getPlayer(); - if (variantTypes.isEmpty()) { - rp.setTeamNumber(view.getTeam(i)); - players.add(rp.setPlayer(lobbyPlayer)); - } else { - // Initialise Variant variables - Deck deck = rp.getDeck(); + if (variantTypes.isEmpty()) { + rp.setTeamNumber(view.getTeam(i)); + players.add(rp.setPlayer(lobbyPlayer)); + } else { + Deck deck = null; + boolean isCommanderMatch = variantTypes.contains(GameType.Commander); + if (isCommanderMatch) { + Object selected = view.getCommanderDeckLists().get(i).getSelectedValue(); + if (selected instanceof String) { + String sel = (String) selected; + IStorage comDecks = Singletons.getModel().getDecks().getCommander(); + if (sel.equals("Random") && comDecks.size() > 0) { + deck = Aggregates.random(comDecks); + } + } else { + deck = (Deck) selected; + } + if (deck == null) { //Can be null if player deselects the list selection or chose Generate + deck = DeckgenUtil.generateCommanderDeck(view.isPlayerAI(i)); + } + if (checkLegality) { + String errMsg = GameType.Commander.getDecksFormat().getDeckConformanceProblem(deck); + if (null != errMsg) { + FOptionPane.showErrorDialog(name + "'s deck " + errMsg, "Invalid Commander Deck"); + return; + } + } + } + + // Initialise variables for other variants + deck = deck == null ? rp.getDeck() : deck; Iterable schemes = null; boolean playerIsArchenemy = view.isPlayerArchenemy(i); Iterable planes = null; PaperCard vanguardAvatar = null; - Random randomSeed = new Random(); //Archenemy if (variantTypes.contains(GameType.ArchenemyRumble) @@ -292,9 +329,9 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { vanguardAvatar = deck.get(DeckSection.Avatar).get(0); } else { //Only other string is "Random" if (!view.isPlayerAI(i)) { //Human - vanguardAvatar = Iterables.get(view.getAllAvatars(), randomSeed.nextInt(Iterables.size(view.getNonRandomHumanAvatars()))); + vanguardAvatar = Aggregates.random(view.getNonRandomHumanAvatars()); } else { //AI - vanguardAvatar = Iterables.get(view.getAllAiAvatars(), randomSeed.nextInt(Iterables.size(view.getNonRandomAiAvatars()))); + vanguardAvatar = Aggregates.random(view.getNonRandomAiAvatars()); } } } else { @@ -307,7 +344,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { } } - rp = RegisteredPlayer.forVariants(variantTypes, rp.getDeck(), schemes, playerIsArchenemy, planes, vanguardAvatar); + rp = RegisteredPlayer.forVariants(variantTypes, deck, schemes, playerIsArchenemy, planes, vanguardAvatar); rp.setTeamNumber(view.getTeam(i)); players.add(rp.setPlayer(lobbyPlayer)); } diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java index 2a2d2ff0117..474d2cec91a 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java @@ -15,6 +15,7 @@ import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckchooser.IDecksComboBoxListener; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.DeckProxy; +import forge.gui.deckeditor.controllers.CEditorCommander; import forge.gui.deckeditor.controllers.CEditorVariant; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; @@ -103,6 +104,9 @@ public enum VSubmenuConstructed implements IVSubmenu { private final List schemeDeckPanels = new ArrayList(MAX_PLAYERS); private int lastArchenemy = 0; + private final List> commanderDeckLists = new ArrayList>(); + private final List commanderDeckPanels = new ArrayList(MAX_PLAYERS); + private final List> planarDeckLists = new ArrayList>(); private final List planarDeckPanels = new ArrayList(MAX_PLAYERS); @@ -126,7 +130,6 @@ public enum VSubmenuConstructed implements IVSubmenu { // Populate and add variants panel vntVanguard.addItemListener(iListenerVariants); vntCommander.addItemListener(iListenerVariants); - vntCommander.setEnabled(false); vntPlanechase.addItemListener(iListenerVariants); vntArchenemy.addItemListener(iListenerVariants); comboArchenemy.setSelectedIndex(0); @@ -277,6 +280,20 @@ public enum VSubmenuConstructed implements IVSubmenu { schemeDeckLists.add(schemeDeckList); schemeDeckPanels.add(schemeDeckPanel); + // Commander deck list + FPanel commanderDeckPanel = new FPanel(); + commanderDeckPanel.setBorderToggle(false); + commanderDeckPanel.setLayout(new MigLayout(sectionConstraints)); + commanderDeckPanel.add(new FLabel.Builder().text("Select Commander deck:").build(), labelConstraints); + FList commanderDeckList = new FList(); + commanderDeckList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + + FScrollPane scrCommander = new FScrollPane(commanderDeckList, true, + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + commanderDeckPanel.add(scrCommander, "grow, push"); + commanderDeckLists.add(commanderDeckList); + commanderDeckPanels.add(commanderDeckPanel); + // Planar deck list FPanel planarDeckPanel = new FPanel(); planarDeckPanel.setBorderToggle(false); @@ -338,6 +355,9 @@ public enum VSubmenuConstructed implements IVSubmenu { populateDeckPanel(GameType.Constructed); } } + else if (GameType.Commander == forGameType) { + decksFrame.add(commanderDeckPanels.get(playerWithFocus), "grow, push"); + } else if (GameType.Planechase == forGameType) { decksFrame.add(planarDeckPanels.get(playerWithFocus), "grow, push"); } @@ -465,6 +485,7 @@ public enum VSubmenuConstructed implements IVSubmenu { private FComboBoxWrapper aeTeamComboBox = new FComboBoxWrapper(); private final FLabel deckBtn = new FLabel.ButtonBuilder().text("Select a deck").build(); + private final FLabel deckLabel = newLabel("Deck:"); private final String variantBtnConstraints = "height 30px, hidemode 3"; @@ -473,6 +494,10 @@ public enum VSubmenuConstructed implements IVSubmenu { private final FLabel scmDeckEditor = new FLabel.ButtonBuilder().text("Scheme Deck Editor").build(); private final FLabel scmLabel = newLabel("Scheme deck:"); + private final FLabel cmdDeckSelectorBtn = new FLabel.ButtonBuilder().text("Select a Commander deck").build(); + private final FLabel cmdDeckEditor = new FLabel.ButtonBuilder().text("Commander Deck Editor").build(); + private final FLabel cmdLabel = newLabel("Commander deck:"); + private final FLabel pchDeckSelectorBtn = new FLabel.ButtonBuilder().text("Select a planar deck").build(); private final FLabel pchDeckEditor = new FLabel.ButtonBuilder().text("Planar Deck Editor").build(); private final FLabel pchLabel = newLabel("Planar deck:"); @@ -511,24 +536,28 @@ public enum VSubmenuConstructed implements IVSubmenu { populateTeamsComboBoxes(); teamComboBox.addActionListener(teamListener); aeTeamComboBox.addActionListener(teamListener); - teamComboBox.addTo(this, "h 30px, pushx, growx, gaptop 5px, hidemode 3"); - aeTeamComboBox.addTo(this, "h 30px, pushx, growx, gaptop 5px, hidemode 3"); + teamComboBox.addTo(this, variantBtnConstraints + ", pushx, growx, gaptop 5px"); + aeTeamComboBox.addTo(this, variantBtnConstraints + ", pushx, growx, gaptop 5px"); - this.add(newLabel("Deck:"), variantBtnConstraints + ", cell 0 2, sx 2, ax right"); + this.add(deckLabel, variantBtnConstraints + ", cell 0 2, sx 2, ax right"); this.add(deckBtn, variantBtnConstraints + ", cell 2 2, pushx, growx, wmax 100%-153px, h 30px, spanx 4, wrap"); addHandlersDeckSelector(); - this.add(scmLabel, variantBtnConstraints + ", cell 0 3, sx 2, ax right"); - this.add(scmDeckSelectorBtn, variantBtnConstraints + ", cell 2 3, growx, pushx"); - this.add(scmDeckEditor, variantBtnConstraints + ", cell 3 3, sx 3, growx, wrap"); + this.add(cmdLabel, variantBtnConstraints + ", cell 0 3, sx 2, ax right"); + this.add(cmdDeckSelectorBtn, variantBtnConstraints + ", cell 2 3, growx, pushx"); + this.add(cmdDeckEditor, variantBtnConstraints + ", cell 3 3, sx 3, growx, wrap"); - this.add(pchLabel, variantBtnConstraints + ", cell 0 4, sx 2, ax right"); - this.add(pchDeckSelectorBtn, variantBtnConstraints + ", cell 2 4, growx, pushx"); - this.add(pchDeckEditor, variantBtnConstraints + ", cell 3 4, sx 3, growx, wrap"); + this.add(scmLabel, variantBtnConstraints + ", cell 0 4, sx 2, ax right"); + this.add(scmDeckSelectorBtn, variantBtnConstraints + ", cell 2 4, growx, pushx"); + this.add(scmDeckEditor, variantBtnConstraints + ", cell 3 4, sx 3, growx, wrap"); - this.add(vgdLabel, variantBtnConstraints + ", cell 0 5, sx 2, ax right"); - this.add(vgdSelectorBtn, variantBtnConstraints + ", cell 2 5, sx 4, growx, wrap"); + this.add(pchLabel, variantBtnConstraints + ", cell 0 5, sx 2, ax right"); + this.add(pchDeckSelectorBtn, variantBtnConstraints + ", cell 2 5, growx, pushx"); + this.add(pchDeckEditor, variantBtnConstraints + ", cell 3 5, sx 3, growx, wrap"); + + this.add(vgdLabel, variantBtnConstraints + ", cell 0 6, sx 2, ax right"); + this.add(vgdSelectorBtn, variantBtnConstraints + ", cell 2 6, sx 4, growx, wrap"); addHandlersToVariantsControls(); updateVariantControlsVisibility(); @@ -613,7 +642,14 @@ public enum VSubmenuConstructed implements IVSubmenu { }; public void updateVariantControlsVisibility() { - boolean archenemyVisiblity = appliedVariants.contains(GameType.ArchenemyRumble) + // Commander deck replaces basic deck, so hide that + deckLabel.setVisible(!appliedVariants.contains(GameType.Commander)); + deckBtn.setVisible(!appliedVariants.contains(GameType.Commander)); + cmdDeckSelectorBtn.setVisible(appliedVariants.contains(GameType.Commander)); + cmdDeckEditor.setVisible(appliedVariants.contains(GameType.Commander)); + cmdLabel.setVisible(appliedVariants.contains(GameType.Commander)); + + boolean archenemyVisiblity = appliedVariants.contains(GameType.ArchenemyRumble) || (appliedVariants.contains(GameType.Archenemy) && playerIsArchenemy); scmDeckSelectorBtn.setVisible(archenemyVisiblity); scmDeckEditor.setVisible(archenemyVisiblity); @@ -736,7 +772,26 @@ public enum VSubmenuConstructed implements IVSubmenu { Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_ARCHENEMY); CDeckEditorUI.SINGLETON_INSTANCE.setEditorController( - new CEditorVariant(Singletons.getModel().getDecks().getScheme(), predSchemes, DeckSection.Schemes, FScreen.DECK_EDITOR_PLANECHASE)); + new CEditorVariant(Singletons.getModel().getDecks().getScheme(), predSchemes, DeckSection.Schemes, FScreen.DECK_EDITOR_PLANECHASE)); + } + }); + + // Commander buttons + cmdDeckSelectorBtn.setCommand(new Runnable() { + @Override + public void run() { + currentGameMode = GameType.Commander; + cmdDeckSelectorBtn.requestFocusInWindow(); + changePlayerFocus(index, currentGameMode); + } + }); + + cmdDeckEditor.setCommand(new UiCommand() { + @Override + public void run() { + currentGameMode = GameType.Commander; + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander()); } }); @@ -1203,7 +1258,12 @@ public enum VSubmenuConstructed implements IVSubmenu { return planarDeckLists; } - /** Gets the list of planar deck lists. */ + /** Gets the list of commander deck lists. */ + public List> getCommanderDeckLists() { + return commanderDeckLists; + } + + /** Gets the list of scheme deck lists. */ public List> getSchemeDeckLists() { return schemeDeckLists; }