From 0801bbc50b1cdf5c74ef6670c70d7aa82dd13cea Mon Sep 17 00:00:00 2001 From: friarsol Date: Fri, 6 Nov 2020 18:48:56 -0500 Subject: [PATCH] Allow desktop to play 2-6 multiplayer (not network) draft games --- .../home/sanctioned/CSubmenuDraft.java | 41 +++++++++++++++---- .../home/sanctioned/VSubmenuDraft.java | 6 +++ forge-gui/res/languages/en-US.properties | 3 +- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index b6af273140e..fc6762d4dcf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -31,6 +31,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import java.util.Collections; +import com.google.common.collect.Lists; /** * Controls the draft submenu in the home UI. @@ -86,6 +88,7 @@ public enum CSubmenuDraft implements ICDoc { view.getRadSingle().addActionListener(radioAction); view.getRadAll().addActionListener(radioAction); + view.getRadMultiple().addActionListener(radioAction); } /* (non-Javadoc) @@ -117,7 +120,7 @@ public enum CSubmenuDraft implements ICDoc { private void startGame(final GameType gameType) { final Localizer localizer = Localizer.getInstance(); - final boolean gauntlet = !VSubmenuDraft.SINGLETON_INSTANCE.isSingleSelected(); + final boolean gauntlet = VSubmenuDraft.SINGLETON_INSTANCE.isGauntlet(); final DeckProxy humanDeck = VSubmenuDraft.SINGLETON_INSTANCE.getLstDecks().getSelectedItem(); if (humanDeck == null) { @@ -154,17 +157,34 @@ public enum CSubmenuDraft implements ICDoc { } }); - // Restore Zero Indexing - final int aiIndex = Integer.parseInt(duelType)-1; - final Deck aiDeck = opponentDecks.getAiDecks().get(aiIndex); - if (aiDeck == null) { - throw new IllegalStateException("Draft: Computer deck is null!"); + List aiDecks = Lists.newArrayList(); + if (VSubmenuDraft.SINGLETON_INSTANCE.isSingleSelected()) { + // Restore Zero Indexing + final int aiIndex = Integer.parseInt(duelType)-1; + final Deck aiDeck = opponentDecks.getAiDecks().get(aiIndex); + if (aiDeck == null) { + throw new IllegalStateException("Draft: Computer deck is null!"); + } + aiDecks.add(aiDeck); + } else { + final int numOpponents = Integer.parseInt(duelType); + + List randomOpponents = Lists.newArrayList(opponentDecks.getAiDecks()); + Collections.shuffle(randomOpponents); + aiDecks = randomOpponents.subList(0, numOpponents); + for(Deck d : aiDecks) { + if (d == null) { + throw new IllegalStateException("Draft: Computer deck is null!"); + } + } } final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); - starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); + for(Deck aiDeck : aiDecks) { + starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); + } for (final RegisteredPlayer pl : starter) { pl.assignConspiracies(); } @@ -219,10 +239,15 @@ public enum CSubmenuDraft implements ICDoc { // 1-7 instead of 0-6 combo.addItem(String.valueOf(indx)); } - } else { + } else if (VSubmenuDraft.SINGLETON_INSTANCE.isGauntlet()) { // Gauntlet/Tournament combo.addItem("Gauntlet"); //combo.addItem("Tournament"); + } else { + combo.addItem("2"); + combo.addItem("3"); + combo.addItem("4"); + combo.addItem("5"); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java index da69fcadd8b..2e0e0100953 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java @@ -44,6 +44,7 @@ public enum VSubmenuDraft implements IVSubmenu { private final DeckManager lstDecks = new DeckManager(GameType.Draft, CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()); private final JRadioButton radSingle = new FRadioButton(localizer.getMessage("lblPlayAnOpponent")); + private final JRadioButton radMultiple = new FRadioButton(localizer.getMessage("lblPlayMultipleOpponents")); private final JRadioButton radAll = new FRadioButton(localizer.getMessage("lblPlayAll7opponents")); private final JComboBox cbOpponent = new JComboBox<>(); @@ -77,6 +78,7 @@ public enum VSubmenuDraft implements IVSubmenu { final JXButtonPanel grpPanel = new JXButtonPanel(); grpPanel.add(radSingle, "w 200px!, h 30px!"); + grpPanel.add(radMultiple, "w 200px!, h 30px!"); grpPanel.add(radAll, "w 200px!, h 30px!"); radSingle.setSelected(true); grpPanel.add(cbOpponent, "w 200px!, h 30px!"); @@ -124,6 +126,9 @@ public enum VSubmenuDraft implements IVSubmenu { public boolean isSingleSelected() { return radSingle.isSelected(); } + public boolean isGauntlet() { + return radAll.isSelected(); + } /** @return {@link forge.itemmanager.DeckManager} */ public DeckManager getLstDecks() { @@ -132,6 +137,7 @@ public enum VSubmenuDraft implements IVSubmenu { public JComboBox getCbOpponent() { return cbOpponent; } public JRadioButton getRadSingle() { return radSingle; } + public JRadioButton getRadMultiple() { return radMultiple; } public JRadioButton getRadAll() { return radAll; } //========== Overridden from IVDoc diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 34539fa15c2..09763e99337 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -364,7 +364,8 @@ lblSHORTCUT_CARD_ZOOM=Match: zoom the currently selected card lblBoosterDraft=Booster Draft lblHeaderBoosterDraft=Sanctioned Format: Booster Draft lblPlayAnOpponent=Play an opponent -lblPlayAll7opponents=Play all 7 opponents +lblPlayMultipleOpponents=Play multiple opponents +lblPlayAll7opponents=Play all opponents lblBuildorselectadeck=Build or select a deck lblDraftText1=In Draft mode, three booster packs are rotated around eight players. lblDraftText2=Build a deck from the cards you choose. The AI will do the same.