From 81373d2b69c3ec1c59bdaee2f1ab659510d089e1 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Sun, 25 Mar 2018 19:58:52 +0100 Subject: [PATCH 01/15] Initial fiddling with Brawl game formats --- .../src/main/java/forge/deck/DeckFormat.java | 31 +++++++++++++++++++ .../src/main/java/forge/game/GameType.java | 1 + 2 files changed, 32 insertions(+) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index a95b9ead2a8..83cf61faf62 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -68,6 +68,37 @@ public enum DeckFormat { return true; } }), + Pauper ( Range.is(60), Range.between(0, 10), 1, new Predicate() { + private final Set bannedCards = new HashSet(Arrays.asList( + "Adriana's Valor", "Advantageous Proclamation", "Amulet of Quoz", "Ancestral Recall", "Assemble the Rank and Vile", + "Backup Plan", "Balance", "Biorhythm", "Black Lotus", "Brago's Favor", "Braids, Cabal Minion", "Bronze Tablet", + "Channel", "Chaos Orb", "Coalition Victory", "Contract from Below", "Darkpact", "Demonic Attorney", "Double Stroke", + "Echoing Boon", "Emissary's Ploy", "Emrakul, the Aeons Torn", "Erayo, Soratami Ascendant", "Falling Star", + "Fastbond", "Gifts Ungiven", "Griselbrand", "Hired Heist", "Hold the Perimeter", "Hymn of the Wilds", "Immediate Action", + "Incendiary Dissent", "Iterative Analysis", "Jeweled Bird", "Karakas", "Leovold, Emissary of Trest", "Library of Alexandria", + "Limited Resources", "Mox Emerald", "Mox Jet", "Mox Pearl", "Mox Ruby", "Mox Sapphire", "Muzzio's Preparations", + "Natural Unity", "Painter's Servant", "Panoptic Mirror", "Power Play", "Primeval Titan", "Prophet of Kruphix", + "Rebirth", "Recurring Nightmare", "Rofellos, Llanowar Emissary", "Secret Summoning", "Secrets of Paradise", + "Sentinel Dispatch", "Shahrazad", "Sovereign's Realm", "Summoner's Bond", "Sundering Titan", "Sway of the Stars", + "Sylvan Primordial", "Tempest Efreet", "Time Vault", "Time Walk", "Timmerian Fiends", "Tinker", "Tolarian Academy", + "Trade Secrets", "Unexpected Potential", "Upheaval", "Weight Advantage", "Worldfire", "Worldknit", "Yawgmoth's Bargain")); + @Override + public boolean apply(CardRules rules) { + if (bannedCards.contains(rules.getName())) { + return false; + } + return true; + } + }), + Brawl ( Range.is(59), Range.between(0, 15), 1, new Predicate() { + @Override + public boolean apply(CardRules rules) { + //must be standard legal + //FModel.getFormats().getStandard(); + + return true; + } + }), TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate() { private final Set bannedCards = new HashSet(Arrays.asList( "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java index ac5fa2032b8..4347bfdd8b9 100644 --- a/forge-game/src/main/java/forge/game/GameType.java +++ b/forge-game/src/main/java/forge/game/GameType.java @@ -23,6 +23,7 @@ public enum GameType { Vanguard (DeckFormat.Vanguard, true, true, true, "Vanguard", "Each player has a special \"Avatar\" card that affects the game."), Commander (DeckFormat.Commander, false, false, false, "Commander", "Each player has a legendary \"General\" card which can be cast at any time and determines deck colors."), TinyLeaders (DeckFormat.TinyLeaders, false, false, false, "Tiny Leaders", "Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Each card must have CMC less than 4."), + Brawl (DeckFormat.Brawl, false, false, false, "Brawl", "Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Only cards legal in Standard may be used."), Planeswalker (DeckFormat.PlanarConquest, false, false, true, "Planeswalker", "Each player has a Planeswalker card which can be cast at any time."), Planechase (DeckFormat.Planechase, false, false, true, "Planechase", "Plane cards apply global effects. The Plane card changes when a player rolls \"Planeswalk\" on the planar die."), Archenemy (DeckFormat.Archenemy, false, false, true, "Archenemy", "One player is the Archenemy and fights the other players by playing Scheme cards."), From 364bf3724fc06093ab13d222fee3012ac1d04a54 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 26 Mar 2018 06:57:15 +0100 Subject: [PATCH 02/15] Added UI elements required for Brawl variant --- .../src/main/java/forge/deck/DeckFormat.java | 2 +- .../src/main/java/forge/game/GameRules.java | 3 +- .../forge/game/player/RegisteredPlayer.java | 4 ++ .../java/forge/deckchooser/FDeckChooser.java | 2 + .../java/forge/gui/framework/FScreen.java | 9 +++ .../main/java/forge/screens/home/CLobby.java | 12 ++++ .../java/forge/screens/home/PlayerPanel.java | 9 ++- .../main/java/forge/screens/home/VLobby.java | 66 ++++++++++++++++++- .../src/forge/deck/FDeckChooser.java | 17 +++++ .../src/forge/deck/FDeckEditor.java | 6 ++ .../screens/constructed/LobbyScreen.java | 19 ++++-- .../screens/constructed/PlayerPanel.java | 30 ++++++++- .../achievement/ConstructedAchievements.java | 1 + .../src/main/java/forge/deck/DeckProxy.java | 21 ++++++ .../src/main/java/forge/deck/DeckType.java | 1 + .../java/forge/deck/RandomDeckGenerator.java | 3 + .../java/forge/deck/io/DeckPreferences.java | 11 +++- .../src/main/java/forge/match/GameLobby.java | 18 ++++- .../forge/match/input/InputPassPriority.java | 3 + .../java/forge/model/CardCollections.java | 9 +++ .../java/forge/properties/ForgeConstants.java | 1 + .../forge/properties/ForgePreferences.java | 14 ++++ 22 files changed, 241 insertions(+), 20 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 83cf61faf62..0b2a34a8720 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -162,7 +162,7 @@ public enum DeckFormat { } private boolean hasCommander() { - return this == Commander || this == TinyLeaders; + return this == Commander || this == TinyLeaders || this == Brawl; } /** diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 803d2020b40..dc7ed4cddf1 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders); + return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + || appliedVariants.contains(GameType.Brawl); } public boolean canCloneUseTargetsImage() { diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index 0c3c559798c..fbf9ffef6fb 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -124,6 +124,10 @@ public class RegisteredPlayer { start.commanders = deck.getCommanders(); start.setStartingLife(start.getStartingLife() + 5); } + if (appliedVariants.contains(GameType.Brawl)) { + start.commanders = deck.getCommanders(); + start.setStartingLife(start.getStartingLife() + 10); + } if (appliedVariants.contains(GameType.Planechase)) { start.planes = planes; } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index f51b9a51897..2e99933917e 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -136,6 +136,8 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { updateDecks(DeckProxy.getAllCommanderDecks(), ItemManagerConfig.COMMANDER_DECKS); }else if(deckFormat.equals(DeckFormat.TinyLeaders)){ updateDecks(DeckProxy.getAllTinyLeadersDecks(), ItemManagerConfig.COMMANDER_DECKS); + }else if(deckFormat.equals(DeckFormat.Brawl)){ + updateDecks(DeckProxy.getAllBrawlDecks(), ItemManagerConfig.COMMANDER_DECKS); }else { updateDecks(DeckProxy.getAllConstructedDecks(), ItemManagerConfig.CONSTRUCTED_DECKS); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java b/forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java index 0b930b435bd..77dc5e2c4b2 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java @@ -79,6 +79,15 @@ public class FScreen { "Close Editor", ForgeConstants.EDITOR_LAYOUT_FILE, false); + public static final FScreen DECK_EDITOR_BRAWL = new FScreen( + VDeckEditorUI.SINGLETON_INSTANCE, + CDeckEditorUI.SINGLETON_INSTANCE, + "Brawl Deck Editor", + FSkin.getImage(FSkinProp.IMG_PACK), + true, + "Close Editor", + ForgeConstants.EDITOR_LAYOUT_FILE, + false); public static final FScreen DECK_EDITOR_PLANECHASE = new FScreen( VDeckEditorUI.SINGLETON_INSTANCE, CDeckEditorUI.SINGLETON_INSTANCE, diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java index d76f52543eb..a3c0c092e26 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java @@ -95,6 +95,14 @@ public class CLobby { view.focusOnAvatar(); } }); + final FDeckChooser fdbcom = view.getBrawlDeckChooser(iSlot); + fdbcom.initialize(FPref.BRAWL_DECK_STATES[iSlot], defaultDeckTypeForBrawlSlot(iSlot)); + fdbcom.populate(); + fdbcom.getDecksComboBox().addListener(new IDecksComboBoxListener() { + @Override public final void deckTypeSelected(final DecksComboBoxEvent ev) { + view.focusOnAvatar(); + } + }); } final ForgePreferences prefs = FModel.getPreferences(); @@ -131,4 +139,8 @@ public class CLobby { private static DeckType defaultDeckTypeForTinyLeaderSlot(final int iSlot) { return iSlot == 0 ? DeckType.TINY_LEADERS_DECKS : DeckType.RANDOM_CARDGEN_COMMANDER_DECK; } + + private static DeckType defaultDeckTypeForBrawlSlot(final int iSlot) { + return iSlot == 0 ? DeckType.BRAWL_DECKS : DeckType.CUSTOM_DECK; + } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index 2a54a8b6efd..4ed8b46e75c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -335,7 +335,8 @@ public class PlayerPanel extends FPanel { private void updateVariantControlsVisibility() { final boolean isTinyLeaders = lobby.hasVariant(GameType.TinyLeaders); - final boolean isCommanderApplied = mayEdit && (lobby.hasVariant(GameType.Commander) || isTinyLeaders); + final boolean isBrawl = lobby.hasVariant(GameType.Brawl); + final boolean isCommanderApplied = mayEdit && (lobby.hasVariant(GameType.Commander) || isTinyLeaders || isBrawl); final boolean isPlanechaseApplied = mayEdit && lobby.hasVariant(GameType.Planechase); final boolean isVanguardApplied = mayEdit && lobby.hasVariant(GameType.Vanguard); final boolean isArchenemyApplied = mayEdit && lobby.hasVariant(GameType.Archenemy); @@ -508,7 +509,7 @@ public class PlayerPanel extends FPanel { cmdDeckSelectorBtn.setCommand(new Runnable() { @Override public void run() { - lobby.setCurrentGameMode(lobby.hasVariant(GameType.TinyLeaders) ? GameType.TinyLeaders : GameType.Commander); + lobby.setCurrentGameMode(lobby.hasVariant(GameType.TinyLeaders) ? GameType.TinyLeaders : lobby.hasVariant(GameType.Brawl) ? GameType.Brawl : GameType.Commander); cmdDeckSelectorBtn.requestFocusInWindow(); lobby.changePlayerFocus(index); } @@ -521,6 +522,10 @@ public class PlayerPanel extends FPanel { lobby.setCurrentGameMode(GameType.TinyLeaders); Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_TINY_LEADERS); CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true)); + } else if (lobby.hasVariant(GameType.Brawl)) { + lobby.setCurrentGameMode(GameType.Brawl); + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_BRAWL); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true)); } else { lobby.setCurrentGameMode(GameType.Commander); Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 8680c84d9ce..bacca8434e2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -91,13 +91,14 @@ public class VLobby implements ILobbyView { private final VariantCheckBox vntMomirBasic = new VariantCheckBox(GameType.MomirBasic); private final VariantCheckBox vntCommander = new VariantCheckBox(GameType.Commander); private final VariantCheckBox vntTinyLeaders = new VariantCheckBox(GameType.TinyLeaders); + private final VariantCheckBox vntBrawl = new VariantCheckBox(GameType.Brawl); private final VariantCheckBox vntPlanechase = new VariantCheckBox(GameType.Planechase); private final VariantCheckBox vntArchenemy = new VariantCheckBox(GameType.Archenemy); private final VariantCheckBox vntArchenemyRumble = new VariantCheckBox(GameType.ArchenemyRumble); private final ImmutableList vntBoxesLocal = - ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders, vntPlanechase, vntArchenemy, vntArchenemyRumble); + ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders, vntBrawl, vntPlanechase, vntArchenemy, vntArchenemyRumble); private final ImmutableList vntBoxesNetwork = - ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); + ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders, vntBrawl /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); // Player frame elements private final JPanel playersFrame = new JPanel(new MigLayout("insets 0, gap 0 5, wrap, hidemode 3")); @@ -119,8 +120,13 @@ public class VLobby implements ILobbyView { private final List> tinyLeadersDeckLists = new ArrayList>(); private final List tinyLeadersDeckPanels = new ArrayList(MAX_PLAYERS); + + private final List> brawlDeckLists = new ArrayList>(); + private final List brawlDeckPanels = new ArrayList(MAX_PLAYERS); + private final List commanderDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); private final List tinyLeadersDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); + private final List brawlDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); private final List> schemeDeckLists = new ArrayList>(); private final List schemeDeckPanels = new ArrayList(MAX_PLAYERS); @@ -227,6 +233,8 @@ public class VLobby implements ILobbyView { fdcom.restoreSavedState(); final FDeckChooser fdtl = getTinyLeaderDeckChooser(iPlayer); fdtl.restoreSavedState(); + final FDeckChooser fdbr = getBrawlDeckChooser(iPlayer); + fdbr.restoreSavedState(); } } @@ -272,6 +280,17 @@ public class VLobby implements ILobbyView { default: break; } + final FDeckChooser brawlDeckChooser = getBrawlDeckChooser(slot); + brawlDeckChooser.setIsAi(type==LobbySlotType.AI); + selectedDeckType = brawlDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + brawlDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } } @Override @@ -299,6 +318,7 @@ public class VLobby implements ILobbyView { final FDeckChooser deckChooser = getDeckChooser(i); final FDeckChooser commanderDeckChooser = getCommanderDeckChooser(i); final FDeckChooser tinyLeaderDeckChooser = getTinyLeaderDeckChooser(i); + final FDeckChooser brawlDeckChooser = getBrawlDeckChooser(i); final PlayerPanel panel; final boolean isNewPanel; if (hasPanel) { @@ -315,6 +335,7 @@ public class VLobby implements ILobbyView { deckChooser.restoreSavedState(); commanderDeckChooser.restoreSavedState(); tinyLeaderDeckChooser.restoreSavedState(); + brawlDeckChooser.restoreSavedState(); if (i == 0) { slot.setIsDevMode(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED)); changePlayerFocus(0); @@ -341,6 +362,7 @@ public class VLobby implements ILobbyView { deckChooser.setIsAi(isSlotAI); commanderDeckChooser.setIsAi(isSlotAI); tinyLeaderDeckChooser.setIsAi(isSlotAI); + brawlDeckChooser.setIsAi(isSlotAI); if (fullUpdate && (type == LobbySlotType.LOCAL || isSlotAI)) { selectDeck(i); } @@ -461,6 +483,15 @@ public class VLobby implements ILobbyView { tinyLeaderChooser.initialize(); tinyLeadersDeckChoosers.add(tinyLeaderChooser); + final FDeckChooser brawlChooser = new FDeckChooser(null, isPlayerAI(playerIndex), GameType.Brawl, true); + brawlChooser.getLstDecks().setSelectCommand(new UiCommand() { + @Override public final void run() { + selectBrawlDeck(playerIndex); + } + }); + brawlChooser.initialize(); + brawlDeckChoosers.add(brawlChooser); + /* // Tiny Leaders deck list buildDeckPanel("Tiny Leaders Deck", playerIndex, tinyLeadersDeckLists, tinyLeadersDeckPanels, new ListSelectionListener() { @@ -523,7 +554,7 @@ public class VLobby implements ILobbyView { } private void selectMainDeck(final int playerIndex) { - if (hasVariant(GameType.Commander) || hasVariant(GameType.TinyLeaders)) { + if (hasVariant(GameType.Commander) || hasVariant(GameType.TinyLeaders) || hasVariant(GameType.Brawl)) { // These game types use specific deck panel return; } @@ -573,6 +604,23 @@ public class VLobby implements ILobbyView { mainChooser.saveState(); } + private void selectBrawlDeck(final int playerIndex) { + if (!hasVariant(GameType.Brawl)) { + // Only these game types use this specific deck panel + return; + } + final FDeckChooser mainChooser = getBrawlDeckChooser(playerIndex); + final DeckType type = mainChooser.getSelectedDeckType(); + final Deck deck = mainChooser.getDeck(); + final Collection selectedDecks = mainChooser.getLstDecks().getSelectedItems(); + if (playerIndex < activePlayersNum && lobby.mayEdit(playerIndex)) { + final String text = type.toString() + ": " + Lang.joinHomogenous(selectedDecks, DeckProxy.FN_GET_NAME); + playerPanels.get(playerIndex).setCommanderDeckSelectorButtonText(text); + fireDeckChangeListener(playerIndex, deck); + } + mainChooser.saveState(); + } + private void selectSchemeDeck(final int playerIndex) { @@ -712,6 +760,9 @@ public class VLobby implements ILobbyView { case TinyLeaders: decksFrame.add(tinyLeadersDeckChoosers.get(playerWithFocus), "grow, push"); break; + case Brawl: + decksFrame.add(brawlDeckChoosers.get(playerWithFocus), "grow, push"); + break; case Planechase: decksFrame.add(planarDeckPanels.get(playerWithFocus), "grow, push"); break; @@ -763,6 +814,10 @@ public class VLobby implements ILobbyView { return tinyLeadersDeckChoosers.get(playernum); } + public final FDeckChooser getBrawlDeckChooser(final int playernum) { + return brawlDeckChoosers.get(playernum); + } + GameType getCurrentGameMode() { return lobby.getGameType(); } @@ -921,6 +976,11 @@ public class VLobby implements ILobbyView { return tinyLeadersDeckLists; } + /** Gets the list of tiny leaders deck lists. */ + public List> getBrawlDeckLists() { + return brawlDeckLists; + } + /** Gets the list of scheme deck lists. */ public List> getSchemeDeckLists() { return schemeDeckLists; diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index d2b3d4abd02..6b151c5459e 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -183,6 +183,7 @@ public class FDeckChooser extends FScreen { break; //delay initialize for constructed until saved decks can be reloaded case Commander: case TinyLeaders: + case Brawl: case Gauntlet: initialize(null, DeckType.CUSTOM_DECK); break; @@ -220,6 +221,9 @@ public class FDeckChooser extends FScreen { case TinyLeaders: lstDecks.setSelectedString(DeckPreferences.getTinyLeadersDeck()); break; + case Brawl: + lstDecks.setSelectedString(DeckPreferences.getBrawlDeck()); + break; case Archenemy: lstDecks.setSelectedString(DeckPreferences.getSchemeDeck()); break; @@ -389,6 +393,8 @@ public class FDeckChooser extends FScreen { return EditorType.Commander; case TinyLeaders: return EditorType.TinyLeaders; + case Brawl: + return EditorType.Brawl; case Archenemy: return EditorType.Archenemy; case Planechase: @@ -454,6 +460,7 @@ public class FDeckChooser extends FScreen { break; case Commander: case TinyLeaders: + case Brawl: cmbDeckTypes.addItem(DeckType.CUSTOM_DECK); cmbDeckTypes.addItem(DeckType.RANDOM_DECK); if(FModel.isdeckGenMatrixLoaded()) { @@ -564,6 +571,10 @@ public class FDeckChooser extends FScreen { pool = DeckProxy.getAllTinyLeadersDecks(); config = ItemManagerConfig.COMMANDER_DECKS; break; + case Brawl: + pool = DeckProxy.getAllBrawlDecks(); + config = ItemManagerConfig.COMMANDER_DECKS; + break; case Archenemy: pool = DeckProxy.getAllSchemeDecks(); config = ItemManagerConfig.SCHEME_DECKS; @@ -971,6 +982,12 @@ public class FDeckChooser extends FScreen { return; } + if (selectedDeckType == DeckType.BRAWL_DECKS) { + //cannot create gauntlet for tiny leaders decks, so just start single match + testVariantDeck(userDeck, GameType.Brawl); + return; + } + GuiChoose.getInteger("How many opponents are you willing to face?", 1, 50, new Callback() { @Override public void run(final Integer numOpponents) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 721fe5775f2..faafdcaff40 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -89,6 +89,12 @@ public class FDeckEditor extends TabPageScreen { return new Deck(); } }), DeckFormat.TinyLeaders.isLegalCardPredicate()), + Brawl(new DeckController(FModel.getDecks().getCommander(), new Supplier() { + @Override + public Deck get() { + return new Deck(); + } + }), Predicates.and(DeckFormat.Brawl.isLegalCardPredicate(),FModel.getFormats().getStandard().getFilterPrinted())),//include standard format requirement Archenemy(new DeckController(FModel.getDecks().getScheme(), new Supplier() { @Override public Deck get() { diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index ca56725750b..c8124e1b765 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -122,6 +122,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { cbVariants.addItem(GameType.MomirBasic); cbVariants.addItem(GameType.Commander); cbVariants.addItem(GameType.TinyLeaders); + cbVariants.addItem(GameType.Brawl); cbVariants.addItem(GameType.Planechase); cbVariants.addItem(GameType.Archenemy); cbVariants.addItem(GameType.ArchenemyRumble); @@ -154,13 +155,13 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { - playerPanels.get(0).initialize(FPref.CONSTRUCTED_P1_DECK_STATE, FPref.COMMANDER_P1_DECK_STATE, FPref.TINY_LEADER_P1_DECK_STATE, DeckType.PRECONSTRUCTED_DECK); - playerPanels.get(1).initialize(FPref.CONSTRUCTED_P2_DECK_STATE, FPref.COMMANDER_P2_DECK_STATE, FPref.TINY_LEADER_P2_DECK_STATE, DeckType.COLOR_DECK); + playerPanels.get(0).initialize(FPref.CONSTRUCTED_P1_DECK_STATE, FPref.COMMANDER_P1_DECK_STATE, FPref.TINY_LEADER_P1_DECK_STATE, FPref.BRAWL_P1_DECK_STATE, DeckType.PRECONSTRUCTED_DECK); + playerPanels.get(1).initialize(FPref.CONSTRUCTED_P2_DECK_STATE, FPref.COMMANDER_P2_DECK_STATE, FPref.TINY_LEADER_P2_DECK_STATE, FPref.BRAWL_P2_DECK_STATE, DeckType.COLOR_DECK); if(getNumPlayers()>2) { - playerPanels.get(2).initialize(FPref.CONSTRUCTED_P3_DECK_STATE, FPref.COMMANDER_P3_DECK_STATE, FPref.TINY_LEADER_P3_DECK_STATE, DeckType.COLOR_DECK); + playerPanels.get(2).initialize(FPref.CONSTRUCTED_P3_DECK_STATE, FPref.COMMANDER_P3_DECK_STATE, FPref.TINY_LEADER_P3_DECK_STATE, FPref.BRAWL_P3_DECK_STATE, DeckType.COLOR_DECK); } if(getNumPlayers()>3) { - playerPanels.get(3).initialize(FPref.CONSTRUCTED_P4_DECK_STATE, FPref.COMMANDER_P4_DECK_STATE, FPref.TINY_LEADER_P4_DECK_STATE, DeckType.COLOR_DECK); + playerPanels.get(3).initialize(FPref.CONSTRUCTED_P4_DECK_STATE, FPref.COMMANDER_P4_DECK_STATE, FPref.TINY_LEADER_P4_DECK_STATE, FPref.BRAWL_P4_DECK_STATE, DeckType.COLOR_DECK); } /*playerPanels.get(4).initialize(FPref.CONSTRUCTED_P5_DECK_STATE, DeckType.COLOR_DECK); playerPanels.get(5).initialize(FPref.CONSTRUCTED_P6_DECK_STATE, DeckType.COLOR_DECK); @@ -346,6 +347,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { lstVariants.addItem(new Variant(GameType.MomirBasic)); lstVariants.addItem(new Variant(GameType.Commander)); lstVariants.addItem(new Variant(GameType.TinyLeaders)); + lstVariants.addItem(new Variant(GameType.Brawl)); lstVariants.addItem(new Variant(GameType.Planechase)); lstVariants.addItem(new Variant(GameType.Archenemy)); lstVariants.addItem(new Variant(GameType.ArchenemyRumble)); @@ -479,10 +481,10 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { else { panel = new PlayerPanel(this, allowNetworking, i, slot, lobby.mayEdit(i), lobby.hasControl()); if(i==2) { - panel.initialize(FPref.CONSTRUCTED_P3_DECK_STATE, FPref.COMMANDER_P3_DECK_STATE, FPref.TINY_LEADER_P3_DECK_STATE, DeckType.COLOR_DECK); + panel.initialize(FPref.CONSTRUCTED_P3_DECK_STATE, FPref.COMMANDER_P3_DECK_STATE, FPref.TINY_LEADER_P3_DECK_STATE, FPref.BRAWL_P3_DECK_STATE, DeckType.COLOR_DECK); } if(i==3) { - panel.initialize(FPref.CONSTRUCTED_P4_DECK_STATE, FPref.COMMANDER_P4_DECK_STATE, FPref.TINY_LEADER_P4_DECK_STATE, DeckType.COLOR_DECK); + panel.initialize(FPref.CONSTRUCTED_P4_DECK_STATE, FPref.COMMANDER_P4_DECK_STATE, FPref.TINY_LEADER_P4_DECK_STATE, FPref.BRAWL_P4_DECK_STATE, DeckType.COLOR_DECK); } playerPanels.add(panel); playersScroll.add(panel); @@ -534,7 +536,10 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { deck = playerPanel.getTinyLeadersDeck(); playerPanel.getTinyLeadersDeckChooser().saveState(); } - else { + else if (hasVariant(GameType.Brawl)) { + deck = playerPanel.getBrawlDeck(); + playerPanel.getBrawlDeckChooser().saveState(); + }else { deck = playerPanel.getDeck(); playerPanel.getDeckChooser().saveState(); } diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index 8f8c33009d5..42482b0a551 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -71,10 +71,11 @@ public class PlayerPanel extends FContainer { private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: Random Generated Deck").build(); private final FLabel btnCommanderDeck = new FLabel.ButtonBuilder().text("Commander Deck: Random Generated Deck").build(); private final FLabel btnTinyLeadersDeck = new FLabel.ButtonBuilder().text("Tiny Leaders Deck: Random Generated Deck").build(); + private final FLabel btnBrawlDeck = new FLabel.ButtonBuilder().text("Brawl Deck: Random Generated Deck").build(); private final FLabel btnPlanarDeck = new FLabel.ButtonBuilder().text("Planar Deck: Random Generated Deck").build(); private final FLabel btnVanguardAvatar = new FLabel.ButtonBuilder().text("Vanguard Avatar: Random").build(); - private final FDeckChooser deckChooser, lstSchemeDecks, lstCommanderDecks, lstTinyLeadersDecks, lstPlanarDecks; + private final FDeckChooser deckChooser, lstSchemeDecks, lstCommanderDecks, lstTinyLeadersDecks, lstBrawlDecks, lstPlanarDecks; private final FVanguardChooser lstVanguardAvatars; public PlayerPanel(final LobbyScreen screen0, final boolean allowNetworking0, final int index0, final LobbySlot slot, final boolean mayEdit0, final boolean mayControl0) { @@ -128,6 +129,17 @@ public class PlayerPanel extends FContainer { } } }); + lstBrawlDecks = new FDeckChooser(GameType.Brawl, isAi, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + if( ((DeckManager)e.getSource()).getSelectedItem() != null) { + btnTinyLeadersDeck.setText("Brawl Deck: " + ((DeckManager) e.getSource()).getSelectedItem().getName()); + lstTinyLeadersDecks.saveState(); + }else{ + btnTinyLeadersDeck.setText("Brawl Deck"); + } + } + }); lstSchemeDecks = new FDeckChooser(GameType.Archenemy, isAi, new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -235,10 +247,11 @@ public class PlayerPanel extends FContainer { cbTeam.setEnabled(true); } - public void initialize(FPref savedStateSetting, FPref savedStateSettingCommander, FPref savedStateSettingTinyLeader, DeckType defaultDeckType) { + public void initialize(FPref savedStateSetting, FPref savedStateSettingCommander, FPref savedStateSettingTinyLeader, FPref savedStateSettingBrawl, DeckType defaultDeckType) { deckChooser.initialize(savedStateSetting, defaultDeckType); lstCommanderDecks.initialize(savedStateSettingCommander, DeckType.COMMANDER_DECK); lstTinyLeadersDecks.initialize(savedStateSettingTinyLeader, DeckType.TINY_LEADERS_DECKS); + lstBrawlDecks.initialize(savedStateSettingBrawl, DeckType.BRAWL_DECKS); lstPlanarDecks.initialize(null, DeckType.RANDOM_DECK); lstSchemeDecks.initialize(null, DeckType.RANDOM_DECK); } @@ -404,6 +417,7 @@ public class PlayerPanel extends FContainer { public void updateVariantControlsVisibility() { boolean isCommanderApplied = false; boolean isTinyLeadersApplied = false; + boolean isBrawlApplied = false; boolean isPlanechaseApplied = false; boolean isVanguardApplied = false; boolean isArchenemyApplied = false; @@ -429,6 +443,10 @@ public class PlayerPanel extends FContainer { isTinyLeadersApplied = true; isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that break; + case Brawl: + isBrawlApplied = true; + isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that + break; case Planechase: isPlanechaseApplied = true; break; @@ -693,6 +711,10 @@ public class PlayerPanel extends FContainer { return lstTinyLeadersDecks; } + public FDeckChooser getBrawlDeckChooser() { + return lstBrawlDecks; + } + public Deck getDeck() { return deckChooser.getDeck(); @@ -706,6 +728,10 @@ public class PlayerPanel extends FContainer { return lstTinyLeadersDecks.getDeck(); } + public Deck getBrawlDeck() { + return lstBrawlDecks.getDeck(); + } + public Deck getSchemeDeck() { return lstSchemeDecks.getDeck(); } diff --git a/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java b/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java index 1fcef0f8f58..f4f60c162ee 100644 --- a/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java @@ -15,6 +15,7 @@ public class ConstructedAchievements extends AchievementCollection { add(new VariantWins(GameType.MomirBasic, 25, 50, 100)); add(new VariantWins(GameType.Commander, 25, 50, 100)); add(new VariantWins(GameType.TinyLeaders, 25, 50, 100)); + add(new VariantWins(GameType.Brawl, 25, 50, 100)); add(new VariantWins(GameType.Planechase, 25, 50, 100)); add(new VariantWins(GameType.Archenemy, 25, 50, 100)); add(new Poisoned(15, 25, 40)); diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index b896f0104d2..d773b1c0ff7 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -370,6 +370,27 @@ public class DeckProxy implements InventoryItem { return result; } + public static Iterable getAllBrawlDecks() { + return getAllBrawlDecks(null); + } + public static Iterable getAllBrawlDecks(Predicate filter) { + final List result = new ArrayList(); + if (filter == null) { + filter = DeckFormat.Brawl.hasLegalCardsPredicate(); + } + else { + filter = Predicates.and(DeckFormat.Brawl.hasLegalCardsPredicate(), filter); + } + filter = Predicates.and(new Predicate() { + @Override + public boolean apply(Deck input) { + return FModel.getFormats().getStandard().isDeckLegal(input); + } + }, filter); + addDecksRecursivelly("Tiny Leaders", GameType.Brawl, result, "", FModel.getDecks().getBrawl(), filter); + return result; + } + public static Iterable getAllSchemeDecks() { return getAllSchemeDecks(null); } diff --git a/forge-gui/src/main/java/forge/deck/DeckType.java b/forge-gui/src/main/java/forge/deck/DeckType.java index 5eabef8f923..8fea8c7b7da 100644 --- a/forge-gui/src/main/java/forge/deck/DeckType.java +++ b/forge-gui/src/main/java/forge/deck/DeckType.java @@ -10,6 +10,7 @@ public enum DeckType { RANDOM_COMMANDER_DECK ("Random Commander Decks"), RANDOM_CARDGEN_COMMANDER_DECK ("Random Commander Card-based Decks"), TINY_LEADERS_DECKS ("Tiny Leaders Decks"), + BRAWL_DECKS ("Brawl Decks"), SCHEME_DECKS ("Scheme Decks"), PLANAR_DECKS ("Planar Decks"), DRAFT_DECKS ("Draft Decks"), diff --git a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java index 499862f2460..4e209200331 100644 --- a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java @@ -135,6 +135,9 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable allPrefs = new HashMap(); public static String getCurrentDeck() { @@ -69,6 +69,15 @@ public class DeckPreferences { save(); } + public static String getBrawlDeck() { + return brawlDeck; + } + public static void setBrawlDeck(String brawlDeck0) { + if (brawlDeck.equals(brawlDeck0)) { return; } + brawlDeck = brawlDeck0; + save(); + } + public static String getPlanarDeck() { return planarDeck; } diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 8f8fee20c09..7867078cbb4 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -232,10 +232,17 @@ public abstract class GameLobby implements IHasGameType { break; case Commander: data.appliedVariants.remove(GameType.TinyLeaders); + data.appliedVariants.remove(GameType.Brawl); data.appliedVariants.remove(GameType.MomirBasic); break; case TinyLeaders: data.appliedVariants.remove(GameType.Commander); + data.appliedVariants.remove(GameType.Brawl); + data.appliedVariants.remove(GameType.MomirBasic); + break; + case Brawl: + data.appliedVariants.remove(GameType.Commander); + data.appliedVariants.remove(GameType.TinyLeaders); data.appliedVariants.remove(GameType.MomirBasic); break; case Vanguard: @@ -244,6 +251,7 @@ public abstract class GameLobby implements IHasGameType { case MomirBasic: data.appliedVariants.remove(GameType.Commander); data.appliedVariants.remove(GameType.TinyLeaders); + data.appliedVariants.remove(GameType.Brawl); data.appliedVariants.remove(GameType.Vanguard); break; default: @@ -263,6 +271,8 @@ public abstract class GameLobby implements IHasGameType { currentGameType = GameType.Commander; } else if (hasVariant(GameType.TinyLeaders)) { currentGameType = GameType.TinyLeaders; + } else if (hasVariant(GameType.Brawl)) { + currentGameType = GameType.Brawl; } else { currentGameType = GameType.Constructed; } @@ -326,7 +336,7 @@ public abstract class GameLobby implements IHasGameType { SOptionPane.showMessageDialog(TextUtil.concatNoSpace("Please specify a deck for ", slot.getName())); return null; } - if (hasVariant(GameType.Commander) || hasVariant(GameType.TinyLeaders)) { + if (hasVariant(GameType.Commander) || hasVariant(GameType.TinyLeaders) || hasVariant(GameType.Brawl)) { if (!slot.getDeck().has(DeckSection.Commander)) { SOptionPane.showMessageDialog(TextUtil.concatNoSpace(slot.getName(), " doesn't have a commander")); return null; @@ -339,9 +349,11 @@ public abstract class GameLobby implements IHasGameType { GameType autoGenerateVariant = null; boolean isCommanderMatch = false; boolean isTinyLeadersMatch = false; + boolean isBrawlMatch = false; if (!variantTypes.isEmpty()) { isTinyLeadersMatch = variantTypes.contains(GameType.TinyLeaders); - isCommanderMatch = isTinyLeadersMatch || variantTypes.contains(GameType.Commander); + isBrawlMatch = variantTypes.contains(GameType.Brawl); + isCommanderMatch = isBrawlMatch || isTinyLeadersMatch || variantTypes.contains(GameType.Commander); if (!isCommanderMatch) { for (final GameType variant : variantTypes) { if (variant.isAutoGenerated()) { @@ -403,7 +415,7 @@ public abstract class GameLobby implements IHasGameType { else { PaperCard vanguardAvatar = null; if (isCommanderMatch) { - final GameType commanderGameType = isTinyLeadersMatch ? GameType.TinyLeaders : GameType.Commander; + final GameType commanderGameType = isTinyLeadersMatch ? GameType.TinyLeaders : isBrawlMatch ? GameType.Brawl : GameType.Commander; if (checkLegality) { final String errMsg = commanderGameType.getDeckFormat().getDeckConformanceProblem(deck); if (errMsg != null) { diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index 9078f3b671f..8b5dff87428 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -28,6 +28,8 @@ import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.player.PlayerControllerHuman; import forge.properties.ForgePreferences.FPref; +import forge.sound.SoundEffectType; +import forge.sound.SoundSystem; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; @@ -62,6 +64,7 @@ public class InputPassPriority extends InputSyncronizedBase { } getController().getGui().alertUser(); + SoundSystem.instance.play(SoundEffectType.WinDuel, false); } /** {@inheritDoc} */ diff --git a/forge-gui/src/main/java/forge/model/CardCollections.java b/forge-gui/src/main/java/forge/model/CardCollections.java index 0bdb7f4188b..611cf8ebd69 100644 --- a/forge-gui/src/main/java/forge/model/CardCollections.java +++ b/forge-gui/src/main/java/forge/model/CardCollections.java @@ -42,6 +42,7 @@ public class CardCollections { private IStorage plane; private IStorage commander; private IStorage tinyLeaders; + private IStorage brawl; public CardCollections() { } @@ -118,4 +119,12 @@ public class CardCollections { } return tinyLeaders; } + + public IStorage getBrawl() { + if (brawl == null) { + brawl = new StorageImmediatelySerialized("Brawl decks", + new DeckStorage(new File(ForgeConstants.DECK_BRAWL_DIR), ForgeConstants.DECK_BASE_DIR)); + } + return brawl; + } } diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index ed1bd6a54d9..716e30804ef 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -219,6 +219,7 @@ public final class ForgeConstants { public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR; public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves" + PATH_SEPARATOR; public static final String DECK_TINY_LEADERS_DIR= DECK_BASE_DIR + "tiny_leaders" + PATH_SEPARATOR; + public static final String DECK_BRAWL_DIR= DECK_BASE_DIR + "brawl" + PATH_SEPARATOR; public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences"; public static final String DECK_PREFS_FILE = USER_PREFS_DIR + "deck.preferences"; diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index c5258999e0e..f4d5e2ee15d 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -50,6 +50,14 @@ public class ForgePreferences extends PreferencesStore { TINY_LEADER_P6_DECK_STATE(""), TINY_LEADER_P7_DECK_STATE(""), TINY_LEADER_P8_DECK_STATE(""), + BRAWL_P1_DECK_STATE(""), + BRAWL_P2_DECK_STATE(""), + BRAWL_P3_DECK_STATE(""), + BRAWL_P4_DECK_STATE(""), + BRAWL_P5_DECK_STATE(""), + BRAWL_P6_DECK_STATE(""), + BRAWL_P7_DECK_STATE(""), + BRAWL_P8_DECK_STATE(""), UI_LANDSCAPE_MODE ("false"), UI_COMPACT_MAIN_MENU ("false"), UI_USE_OLD ("false"), @@ -240,6 +248,12 @@ public class ForgePreferences extends PreferencesStore { TINY_LEADER_P5_DECK_STATE, TINY_LEADER_P6_DECK_STATE, TINY_LEADER_P7_DECK_STATE, TINY_LEADER_P8_DECK_STATE }; + public static FPref[] BRAWL_DECK_STATES = { + BRAWL_P1_DECK_STATE, BRAWL_P2_DECK_STATE, + BRAWL_P3_DECK_STATE, BRAWL_P4_DECK_STATE, + BRAWL_P5_DECK_STATE, BRAWL_P6_DECK_STATE, + BRAWL_P7_DECK_STATE, BRAWL_P8_DECK_STATE }; + } /** Instantiates a ForgePreferences object. */ From 756c272821b02d5ad6bcf473c2bf489e5a9bf020 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 26 Mar 2018 20:39:34 +0100 Subject: [PATCH 03/15] Fixed brawl deck editor and deckformat rules for brawl --- .../src/main/java/forge/card/CardRules.java | 5 +++++ .../main/java/forge/card/CardRulesPredicates.java | 2 ++ .../src/main/java/forge/deck/DeckFormat.java | 3 +++ .../deckeditor/controllers/CEditorCommander.java | 15 +++++++++++---- .../main/java/forge/screens/home/PlayerPanel.java | 6 +++--- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index a1121fe47bd..a16a8152179 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -207,6 +207,11 @@ public final class CardRules implements ICardCharacteristics { return canBeCommander() && Iterables.contains(mainPart.getKeywords(), "Partner"); } + public boolean canBeBrawlCommander() { + CardType type = mainPart.getType(); + return (type.isLegendary() && type.isCreature()) || type.isPlaneswalker(); + } + public String getMeldWith() { return meldWith; } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index d2ce6e24fb8..cd8a3ec4e23 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -572,6 +572,8 @@ public final class CardRulesPredicates { public static final Predicate IS_NON_CREATURE_SPELL = Predicates.not(Predicates.or(Presets.IS_CREATURE, Presets.IS_LAND)); public static final Predicate CAN_BE_COMMANDER = Predicates.or(CardRulesPredicates.rules(StringOp.CONTAINS_IC, "can be your commander"), Predicates.and(Presets.IS_CREATURE, Presets.IS_LEGENDARY)); + public static final Predicate CAN_BE_BRAWL_COMMANDER = Predicates.or(Presets.IS_PLANESWALKER, + Predicates.and(Presets.IS_CREATURE, Presets.IS_LEGENDARY)); /** The Constant IS_NONCREATURE_SPELL_FOR_GENERATOR. **/ @SuppressWarnings("unchecked") diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 0b2a34a8720..780280eebad 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -421,6 +421,9 @@ public enum DeckFormat { if (cardPoolFilter != null && !cardPoolFilter.apply(rules)) { return false; } + if(this.equals(DeckFormat.Brawl)){ + return rules.canBeBrawlCommander(); + } return rules.canBeCommander(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index a823809d781..72a1012235d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -17,9 +17,11 @@ */ package forge.screens.deckeditor.controllers; +import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import forge.UiCommand; +import forge.card.CardRules; import forge.card.CardRulesPredicates; import forge.deck.Deck; import forge.deck.DeckSection; @@ -65,13 +67,18 @@ public final class CEditorCommander extends ACEditorBase { * all cards are available. */ @SuppressWarnings("serial") - public CEditorCommander(final CDetailPicture cDetailPicture, boolean tinyLeaders) { - super(tinyLeaders ? FScreen.DECK_EDITOR_TINY_LEADERS : FScreen.DECK_EDITOR_COMMANDER, cDetailPicture); + public CEditorCommander(final CDetailPicture cDetailPicture, boolean tinyLeaders, boolean brawl) { + super(tinyLeaders ? FScreen.DECK_EDITOR_TINY_LEADERS : brawl ? FScreen.DECK_EDITOR_BRAWL : FScreen.DECK_EDITOR_COMMANDER, cDetailPicture); allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); allSections.add(DeckSection.Commander); - commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES)),PaperCard.class); + Predicate commanderFilter = CardRulesPredicates.Presets.CAN_BE_COMMANDER ; + if(brawl){ + commanderFilter = CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER; + } + + commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES)),PaperCard.class); normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); CardManager catalogManager = new CardManager(getCDetailPicture(), true, false); @@ -88,7 +95,7 @@ public final class CEditorCommander extends ACEditorBase { return new Deck(); } }; - this.controller = new DeckController(tinyLeaders ? FModel.getDecks().getTinyLeaders() :FModel.getDecks().getCommander(), this, newCreator); + this.controller = new DeckController(tinyLeaders ? FModel.getDecks().getTinyLeaders() :brawl ? FModel.getDecks().getBrawl(): FModel.getDecks().getCommander(), this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index 4ed8b46e75c..3b07c6b6f05 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -521,15 +521,15 @@ public class PlayerPanel extends FPanel { if (lobby.hasVariant(GameType.TinyLeaders)) { lobby.setCurrentGameMode(GameType.TinyLeaders); Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_TINY_LEADERS); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true)); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true, false)); } else if (lobby.hasVariant(GameType.Brawl)) { lobby.setCurrentGameMode(GameType.Brawl); Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_BRAWL); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true)); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), false, true)); } else { lobby.setCurrentGameMode(GameType.Commander); Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), false)); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), false, false)); } } }); From 5b8342188cba6f7c51d0ccb8ec97de220c27fff2 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 26 Mar 2018 22:42:14 +0100 Subject: [PATCH 04/15] Fixed adding planeswalker commanders from pool in android brawl deck editor --- .../src/main/java/forge/deck/DeckFormat.java | 3 -- .../java/forge/game/card/CardFactoryUtil.java | 2 +- .../controllers/CEditorCommander.java | 16 ++++++--- .../src/forge/deck/FDeckChooser.java | 12 +++++++ .../src/forge/deck/FDeckEditor.java | 35 +++++++++++++++---- .../screens/constructed/LobbyScreen.java | 10 ++++++ .../screens/constructed/PlayerPanel.java | 23 +++++++++--- 7 files changed, 81 insertions(+), 20 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 780280eebad..0b2a34a8720 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -421,9 +421,6 @@ public enum DeckFormat { if (cardPoolFilter != null && !cardPoolFilter.apply(rules)) { return false; } - if(this.equals(DeckFormat.Brawl)){ - return rules.canBeBrawlCommander(); - } return rules.canBeCommander(); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index da4557d290c..3d5be8cc42c 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2078,7 +2078,7 @@ public class CardFactoryUtil { " | ValidBlocker$ Creature | Secondary$ True " + " | TriggerDescription$ Afflict " + n + " (" + inst.getReminderText() + ")"; - final String abStringAfflict = "DB$ Loselife | Defined$ TriggeredDefendingPlayer" + + final String abStringAfflict = "DB$ LoseLife | Defined$ TriggeredDefendingPlayer" + " | LifeAmount$ " + n; final Trigger afflictTrigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index 72a1012235d..4d8a1a3c826 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -73,13 +73,21 @@ public final class CEditorCommander extends ACEditorBase { allSections.add(DeckSection.Sideboard); allSections.add(DeckSection.Commander); - Predicate commanderFilter = CardRulesPredicates.Presets.CAN_BE_COMMANDER ; if(brawl){ - commanderFilter = CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER; + Predicate commanderFilter = CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER; + commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.and( + FModel.getFormats().getStandard().getFilterPrinted(),Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES))),PaperCard.class); + }else{ + Predicate commanderFilter = CardRulesPredicates.Presets.CAN_BE_COMMANDER ; + commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES)),PaperCard.class); } - commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES)),PaperCard.class); - normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); + + if(brawl){ + normalPool = ItemPool.createFrom(FModel.getFormats().getStandard().getAllCards(), PaperCard.class); + }else { + normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); + } CardManager catalogManager = new CardManager(getCDetailPicture(), true, false); CardManager deckManager = new CardManager(getCDetailPicture(), true, false); diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 6b151c5459e..1415085bec7 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -238,6 +238,9 @@ public class FDeckChooser extends FScreen { case TINY_LEADERS_DECKS: lstDecks.setSelectedString(DeckPreferences.getTinyLeadersDeck()); break; + case BRAWL_DECKS: + lstDecks.setSelectedString(DeckPreferences.getBrawlDeck()); + break; case SCHEME_DECKS: lstDecks.setSelectedString(DeckPreferences.getSchemeDeck()); break; @@ -307,6 +310,7 @@ public class FDeckChooser extends FScreen { switch (selectedDeckType) { case COMMANDER_DECK: case TINY_LEADERS_DECKS: + case BRAWL_DECKS: case SCHEME_DECKS: case PLANAR_DECKS: case DRAFT_DECKS: @@ -335,6 +339,7 @@ public class FDeckChooser extends FScreen { case CONSTRUCTED_DECK: case COMMANDER_DECK: case TINY_LEADERS_DECKS: + case BRAWL_DECKS: case SCHEME_DECKS: case PLANAR_DECKS: case DRAFT_DECKS: @@ -378,6 +383,8 @@ public class FDeckChooser extends FScreen { return EditorType.Commander; case TINY_LEADERS_DECKS: return EditorType.TinyLeaders; + case BRAWL_DECKS: + return EditorType.Brawl; case SCHEME_DECKS: return EditorType.Archenemy; case PLANAR_DECKS: @@ -473,6 +480,7 @@ public class FDeckChooser extends FScreen { cmbDeckTypes.addItem(DeckType.CONSTRUCTED_DECK); cmbDeckTypes.addItem(DeckType.COMMANDER_DECK); cmbDeckTypes.addItem(DeckType.TINY_LEADERS_DECKS); + cmbDeckTypes.addItem(DeckType.BRAWL_DECKS); cmbDeckTypes.addItem(DeckType.SCHEME_DECKS); cmbDeckTypes.addItem(DeckType.PLANAR_DECKS); cmbDeckTypes.addItem(DeckType.DRAFT_DECKS); @@ -601,6 +609,10 @@ public class FDeckChooser extends FScreen { pool = DeckProxy.getAllTinyLeadersDecks(); config = ItemManagerConfig.COMMANDER_DECKS; break; + case BRAWL_DECKS: + pool = DeckProxy.getAllBrawlDecks(); + config = ItemManagerConfig.COMMANDER_DECKS; + break; case RANDOM_COMMANDER_DECK: pool = CommanderDeckGenerator.getCommanderDecks(lstDecks.getGameType().getDeckFormat(),isAi, false); config = ItemManagerConfig.STRING_ONLY; diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index faafdcaff40..d31382f6447 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -11,11 +11,9 @@ import forge.Forge; import forge.Forge.KeyInputAdapter; import forge.Graphics; import forge.assets.*; -import forge.card.CardDb; -import forge.card.CardEdition; -import forge.card.CardPreferences; -import forge.card.CardRulesPredicates; +import forge.card.*; import forge.deck.io.DeckPreferences; +import forge.item.IPaperCard; import forge.item.PaperCard; import forge.itemmanager.CardManager; import forge.itemmanager.ColumnDef; @@ -83,13 +81,13 @@ public class FDeckEditor extends TabPageScreen { return new Deck(); } }), null), - TinyLeaders(new DeckController(FModel.getDecks().getCommander(), new Supplier() { + TinyLeaders(new DeckController(FModel.getDecks().getTinyLeaders(), new Supplier() { @Override public Deck get() { return new Deck(); } }), DeckFormat.TinyLeaders.isLegalCardPredicate()), - Brawl(new DeckController(FModel.getDecks().getCommander(), new Supplier() { + Brawl(new DeckController(FModel.getDecks().getBrawl(), new Supplier() { @Override public Deck get() { return new Deck(); @@ -182,6 +180,7 @@ public class FDeckEditor extends TabPageScreen { }; case Commander: case TinyLeaders: + case Brawl: return new DeckEditorPage[] { new CatalogPage(ItemManagerConfig.CARD_CATALOG), new DeckSectionPage(DeckSection.Main), @@ -513,6 +512,7 @@ public class FDeckEditor extends TabPageScreen { return CardLimit.None; case Commander: case TinyLeaders: + case Brawl: case PlanarConquest: return CardLimit.Singleton; } @@ -916,15 +916,26 @@ public class FDeckEditor extends TabPageScreen { break; case Commander: case TinyLeaders: + case Brawl: final List commanders = parentScreen.getDeck().getCommanders(); if (commanders.isEmpty()) { //if no commander set for deck, only show valid commanders additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); + if(editorType.equals(EditorType.Brawl)){ + //brawl commander filter + additionalFilter = Predicates.and(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.IS_PLANESWALKER,Predicates.and( + CardRulesPredicates.Presets.IS_CREATURE,CardRulesPredicates.Presets.IS_LEGENDARY)), PaperCard.FN_GET_RULES), + FModel.getFormats().getStandard().getFilterPrinted()); + } + cardManager.setCaption("Commanders"); } else { //if a commander has been set, only show cards that match its color identity additionalFilter = DeckFormat.Commander.isLegalCardForCommanderOrLegalPartnerPredicate(commanders); + if(editorType.equals(EditorType.Brawl)){ + additionalFilter = Predicates.and(additionalFilter,FModel.getFormats().getStandard().getFilterPrinted()); + } cardManager.setCaption("Cards"); } //fall through to below @@ -1023,7 +1034,14 @@ public class FDeckEditor extends TabPageScreen { } } if (parentScreen.getCommanderPage() != null) { - if (parentScreen.editorType != EditorType.PlanarConquest && DeckFormat.Commander.isLegalCommander(card.getRules()) && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) { + boolean isLegalCommander; + if(parentScreen.editorType.equals(EditorType.Brawl)){ + CardType cardType = card.getRules().getType(); + isLegalCommander = cardType.isPlaneswalker() || (cardType.isCreature() && cardType.isLegendary()); + }else{ + isLegalCommander = DeckFormat.Commander.isLegalCommander(card.getRules()); + } + if (parentScreen.editorType != EditorType.PlanarConquest && isLegalCommander && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) { addItem(menu, "Set", "as Commander", parentScreen.getCommanderPage().getIcon(), true, true, new Callback() { @Override public void run(Integer result) { @@ -1613,6 +1631,9 @@ public class FDeckEditor extends TabPageScreen { case TinyLeaders: DeckPreferences.setTinyLeadersDeck(deckStr); break; + case Brawl: + DeckPreferences.setBrawlDeck(deckStr); + break; case Archenemy: DeckPreferences.setSchemeDeck(deckStr); break; diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index c8124e1b765..d7cf3c109c6 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -458,6 +458,16 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { default: break; } + final FDeckChooser brawlDeckChooser = playerPanels.get(slot).getBrawlDeckChooser(); + selectedDeckType = brawlDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + brawlDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } } @Override diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index 42482b0a551..f265f37c917 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -71,7 +71,7 @@ public class PlayerPanel extends FContainer { private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: Random Generated Deck").build(); private final FLabel btnCommanderDeck = new FLabel.ButtonBuilder().text("Commander Deck: Random Generated Deck").build(); private final FLabel btnTinyLeadersDeck = new FLabel.ButtonBuilder().text("Tiny Leaders Deck: Random Generated Deck").build(); - private final FLabel btnBrawlDeck = new FLabel.ButtonBuilder().text("Brawl Deck: Random Generated Deck").build(); + private final FLabel btnBrawlDeck = new FLabel.ButtonBuilder().text("Brawl Deck: Random Generated Deck").build(); private final FLabel btnPlanarDeck = new FLabel.ButtonBuilder().text("Planar Deck: Random Generated Deck").build(); private final FLabel btnVanguardAvatar = new FLabel.ButtonBuilder().text("Vanguard Avatar: Random").build(); @@ -133,10 +133,10 @@ public class PlayerPanel extends FContainer { @Override public void handleEvent(FEvent e) { if( ((DeckManager)e.getSource()).getSelectedItem() != null) { - btnTinyLeadersDeck.setText("Brawl Deck: " + ((DeckManager) e.getSource()).getSelectedItem().getName()); - lstTinyLeadersDecks.saveState(); + btnBrawlDeck.setText("Brawl Deck: " + ((DeckManager) e.getSource()).getSelectedItem().getName()); + lstBrawlDecks.saveState(); }else{ - btnTinyLeadersDeck.setText("Brawl Deck"); + btnBrawlDeck.setText("Brawl Deck"); } } }); @@ -210,6 +210,14 @@ public class PlayerPanel extends FContainer { Forge.openScreen(lstTinyLeadersDecks); } }); + add(btnBrawlDeck); + btnBrawlDeck.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + lstBrawlDecks.setHeaderCaption("Select Brawl Deck for " + txtPlayerName.getText()); + Forge.openScreen(lstBrawlDecks); + } + }); add(btnSchemeDeck); btnSchemeDeck.setCommand(new FEventHandler() { @Override @@ -295,6 +303,10 @@ public class PlayerPanel extends FContainer { btnTinyLeadersDeck.setBounds(x, y, w, fieldHeight); y += dy; } + else if (btnBrawlDeck.isVisible()) { + btnBrawlDeck.setBounds(x, y, w, fieldHeight); + y += dy; + } else if (btnDeck.isVisible()) { btnDeck.setBounds(x, y, w, fieldHeight); y += dy; @@ -317,7 +329,7 @@ public class PlayerPanel extends FContainer { if (!btnDeck.isVisible()) { rows--; } - if (btnCommanderDeck.isVisible() || btnTinyLeadersDeck.isVisible()) { + if (btnCommanderDeck.isVisible() || btnTinyLeadersDeck.isVisible() || btnBrawlDeck.isVisible()) { rows++; } if (btnSchemeDeck.isVisible()) { @@ -464,6 +476,7 @@ public class PlayerPanel extends FContainer { btnDeck.setVisible(isDeckBuildingAllowed); btnCommanderDeck.setVisible(isCommanderApplied && mayEdit); btnTinyLeadersDeck.setVisible(isTinyLeadersApplied && mayEdit); + btnBrawlDeck.setVisible(isBrawlApplied && mayEdit); btnSchemeDeck.setVisible(archenemyVisiblity && mayEdit); From 6a38654a23765fba78a289da0fa4ae756f0d12e8 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Tue, 27 Mar 2018 06:50:39 +0100 Subject: [PATCH 05/15] Code cleanup --- .../src/main/java/forge/deck/DeckFormat.java | 23 +------------------ .../src/forge/deck/FDeckEditor.java | 3 +-- .../forge/match/input/InputPassPriority.java | 2 +- .../java/forge/properties/ForgeConstants.java | 2 +- 4 files changed, 4 insertions(+), 26 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 0b2a34a8720..b1986eca49c 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -68,28 +68,7 @@ public enum DeckFormat { return true; } }), - Pauper ( Range.is(60), Range.between(0, 10), 1, new Predicate() { - private final Set bannedCards = new HashSet(Arrays.asList( - "Adriana's Valor", "Advantageous Proclamation", "Amulet of Quoz", "Ancestral Recall", "Assemble the Rank and Vile", - "Backup Plan", "Balance", "Biorhythm", "Black Lotus", "Brago's Favor", "Braids, Cabal Minion", "Bronze Tablet", - "Channel", "Chaos Orb", "Coalition Victory", "Contract from Below", "Darkpact", "Demonic Attorney", "Double Stroke", - "Echoing Boon", "Emissary's Ploy", "Emrakul, the Aeons Torn", "Erayo, Soratami Ascendant", "Falling Star", - "Fastbond", "Gifts Ungiven", "Griselbrand", "Hired Heist", "Hold the Perimeter", "Hymn of the Wilds", "Immediate Action", - "Incendiary Dissent", "Iterative Analysis", "Jeweled Bird", "Karakas", "Leovold, Emissary of Trest", "Library of Alexandria", - "Limited Resources", "Mox Emerald", "Mox Jet", "Mox Pearl", "Mox Ruby", "Mox Sapphire", "Muzzio's Preparations", - "Natural Unity", "Painter's Servant", "Panoptic Mirror", "Power Play", "Primeval Titan", "Prophet of Kruphix", - "Rebirth", "Recurring Nightmare", "Rofellos, Llanowar Emissary", "Secret Summoning", "Secrets of Paradise", - "Sentinel Dispatch", "Shahrazad", "Sovereign's Realm", "Summoner's Bond", "Sundering Titan", "Sway of the Stars", - "Sylvan Primordial", "Tempest Efreet", "Time Vault", "Time Walk", "Timmerian Fiends", "Tinker", "Tolarian Academy", - "Trade Secrets", "Unexpected Potential", "Upheaval", "Weight Advantage", "Worldfire", "Worldknit", "Yawgmoth's Bargain")); - @Override - public boolean apply(CardRules rules) { - if (bannedCards.contains(rules.getName())) { - return false; - } - return true; - } - }), + Pauper ( Range.is(60), Range.between(0, 10), 1), Brawl ( Range.is(59), Range.between(0, 15), 1, new Predicate() { @Override public boolean apply(CardRules rules) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index d31382f6447..c0bd5ec42b9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1036,8 +1036,7 @@ public class FDeckEditor extends TabPageScreen { if (parentScreen.getCommanderPage() != null) { boolean isLegalCommander; if(parentScreen.editorType.equals(EditorType.Brawl)){ - CardType cardType = card.getRules().getType(); - isLegalCommander = cardType.isPlaneswalker() || (cardType.isCreature() && cardType.isLegendary()); + isLegalCommander = card.getRules().canBeBrawlCommander(); }else{ isLegalCommander = DeckFormat.Commander.isLegalCommander(card.getRules()); } diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index 8b5dff87428..cab74400821 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -64,7 +64,7 @@ public class InputPassPriority extends InputSyncronizedBase { } getController().getGui().alertUser(); - SoundSystem.instance.play(SoundEffectType.WinDuel, false); + } /** {@inheritDoc} */ diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 716e30804ef..effecd1e325 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -219,7 +219,7 @@ public final class ForgeConstants { public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR; public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves" + PATH_SEPARATOR; public static final String DECK_TINY_LEADERS_DIR= DECK_BASE_DIR + "tiny_leaders" + PATH_SEPARATOR; - public static final String DECK_BRAWL_DIR= DECK_BASE_DIR + "brawl" + PATH_SEPARATOR; + public static final String DECK_BRAWL_DIR = DECK_BASE_DIR + "brawl" + PATH_SEPARATOR; public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences"; public static final String DECK_PREFS_FILE = USER_PREFS_DIR + "deck.preferences"; From e2ee43fb2d2de2d197409dee4ee0de9fe4aab083 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Tue, 27 Mar 2018 06:50:39 +0100 Subject: [PATCH 06/15] Code cleanup --- .../src/main/java/forge/deck/DeckFormat.java | 26 +++---------------- .../src/forge/deck/FDeckEditor.java | 3 +-- .../forge/match/input/InputPassPriority.java | 2 +- .../java/forge/properties/ForgeConstants.java | 2 +- 4 files changed, 7 insertions(+), 26 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 0b2a34a8720..12b3dbc7aa2 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -68,28 +68,7 @@ public enum DeckFormat { return true; } }), - Pauper ( Range.is(60), Range.between(0, 10), 1, new Predicate() { - private final Set bannedCards = new HashSet(Arrays.asList( - "Adriana's Valor", "Advantageous Proclamation", "Amulet of Quoz", "Ancestral Recall", "Assemble the Rank and Vile", - "Backup Plan", "Balance", "Biorhythm", "Black Lotus", "Brago's Favor", "Braids, Cabal Minion", "Bronze Tablet", - "Channel", "Chaos Orb", "Coalition Victory", "Contract from Below", "Darkpact", "Demonic Attorney", "Double Stroke", - "Echoing Boon", "Emissary's Ploy", "Emrakul, the Aeons Torn", "Erayo, Soratami Ascendant", "Falling Star", - "Fastbond", "Gifts Ungiven", "Griselbrand", "Hired Heist", "Hold the Perimeter", "Hymn of the Wilds", "Immediate Action", - "Incendiary Dissent", "Iterative Analysis", "Jeweled Bird", "Karakas", "Leovold, Emissary of Trest", "Library of Alexandria", - "Limited Resources", "Mox Emerald", "Mox Jet", "Mox Pearl", "Mox Ruby", "Mox Sapphire", "Muzzio's Preparations", - "Natural Unity", "Painter's Servant", "Panoptic Mirror", "Power Play", "Primeval Titan", "Prophet of Kruphix", - "Rebirth", "Recurring Nightmare", "Rofellos, Llanowar Emissary", "Secret Summoning", "Secrets of Paradise", - "Sentinel Dispatch", "Shahrazad", "Sovereign's Realm", "Summoner's Bond", "Sundering Titan", "Sway of the Stars", - "Sylvan Primordial", "Tempest Efreet", "Time Vault", "Time Walk", "Timmerian Fiends", "Tinker", "Tolarian Academy", - "Trade Secrets", "Unexpected Potential", "Upheaval", "Weight Advantage", "Worldfire", "Worldknit", "Yawgmoth's Bargain")); - @Override - public boolean apply(CardRules rules) { - if (bannedCards.contains(rules.getName())) { - return false; - } - return true; - } - }), + Pauper ( Range.is(60), Range.between(0, 10), 1), Brawl ( Range.is(59), Range.between(0, 15), 1, new Predicate() { @Override public boolean apply(CardRules rules) { @@ -421,6 +400,9 @@ public enum DeckFormat { if (cardPoolFilter != null && !cardPoolFilter.apply(rules)) { return false; } + if(this.equals(DeckFormat.Brawl)) { + return rules.canBeBrawlCommander(); + } return rules.canBeCommander(); } diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index d31382f6447..c0bd5ec42b9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1036,8 +1036,7 @@ public class FDeckEditor extends TabPageScreen { if (parentScreen.getCommanderPage() != null) { boolean isLegalCommander; if(parentScreen.editorType.equals(EditorType.Brawl)){ - CardType cardType = card.getRules().getType(); - isLegalCommander = cardType.isPlaneswalker() || (cardType.isCreature() && cardType.isLegendary()); + isLegalCommander = card.getRules().canBeBrawlCommander(); }else{ isLegalCommander = DeckFormat.Commander.isLegalCommander(card.getRules()); } diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index 8b5dff87428..cab74400821 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -64,7 +64,7 @@ public class InputPassPriority extends InputSyncronizedBase { } getController().getGui().alertUser(); - SoundSystem.instance.play(SoundEffectType.WinDuel, false); + } /** {@inheritDoc} */ diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 716e30804ef..effecd1e325 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -219,7 +219,7 @@ public final class ForgeConstants { public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves" + PATH_SEPARATOR; public static final String CONQUEST_SAVE_DIR = USER_CONQUEST_DIR + "saves" + PATH_SEPARATOR; public static final String DECK_TINY_LEADERS_DIR= DECK_BASE_DIR + "tiny_leaders" + PATH_SEPARATOR; - public static final String DECK_BRAWL_DIR= DECK_BASE_DIR + "brawl" + PATH_SEPARATOR; + public static final String DECK_BRAWL_DIR = DECK_BASE_DIR + "brawl" + PATH_SEPARATOR; public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences"; public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences"; public static final String DECK_PREFS_FILE = USER_PREFS_DIR + "deck.preferences"; From ba41a2798108a8b2e7779053678eda66c7ae6876 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Tue, 27 Mar 2018 23:53:27 +0100 Subject: [PATCH 07/15] Corrected name of brawl deck builder button --- .../src/main/java/forge/screens/home/PlayerPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index 3b07c6b6f05..aca3837935c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -347,7 +347,7 @@ public class PlayerPanel extends FPanel { deckLabel.setVisible(isDeckBuildingAllowed); deckBtn.setVisible(isDeckBuildingAllowed); cmdDeckSelectorBtn.setVisible(isCommanderApplied); - cmdDeckEditor.setText(isTinyLeaders ? "TL Deck Editor" : "Commander Deck Editor"); + cmdDeckEditor.setText(isTinyLeaders ? "TL Deck Editor" : isBrawl ? "Brawl Editor" : "Commander Deck Editor"); cmdDeckEditor.setVisible(isCommanderApplied); cmdLabel.setVisible(isCommanderApplied); From edf6d48e6b9de692699574d85e9d50a2ba38dbae Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 28 Mar 2018 00:01:39 +0100 Subject: [PATCH 08/15] Remove commander damage rule from Brawl --- forge-game/src/main/java/forge/game/player/Player.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 e919719ef5f..87dbb585b97 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -550,8 +550,9 @@ public class Player extends GameEntity implements Comparable { } } - //Tiny Leaders ignore commander damage rule. - if (source.isCommander() && isCombat && this.getGame().getRules().getGameType() != GameType.TinyLeaders) { + //Tiny Leaders and Brawl ignore commander damage rule. + if (source.isCommander() && isCombat && this.getGame().getRules().getGameType() != GameType.TinyLeaders + && this.getGame().getRules().getGameType() != GameType.Brawl) { commanderDamage.put(source, getCommanderDamage(source) + amount); view.updateCommanderDamage(this); } From ed564b904fb63c4be06bc831094ecb37f91a2ef6 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 28 Mar 2018 23:41:57 +0100 Subject: [PATCH 09/15] Random brawl deck generator working on Desktop --- .../src/main/java/forge/StaticData.java | 11 ++++ .../src/main/java/forge/deck/DeckFormat.java | 57 ++++++++++++++----- .../java/forge/deckchooser/FDeckChooser.java | 10 ++-- .../forge/deck/CommanderDeckGenerator.java | 28 +++++++++ .../src/main/java/forge/deck/DeckProxy.java | 2 +- .../src/main/java/forge/deck/DeckgenUtil.java | 16 +++++- .../src/main/java/forge/model/FModel.java | 2 + 7 files changed, 104 insertions(+), 22 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index db072cae62f..57a79f63dd3 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -1,5 +1,6 @@ package forge; +import com.google.common.base.Predicate; import forge.card.CardDb; import forge.card.CardEdition; import forge.card.CardRules; @@ -32,6 +33,16 @@ public class StaticData { private final TokenDb allTokens; private final CardEdition.Collection editions; + public Predicate getStandardPredicate() { + return standardPredicate; + } + + public void setStandardPredicate(Predicate standardPredicate) { + this.standardPredicate = standardPredicate; + } + + private Predicate standardPredicate; + // Loaded lazily: private IStorage boosters; private IStorage specialBoosters; diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 12b3dbc7aa2..75c74c4813a 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -35,6 +35,7 @@ import forge.util.TextUtil; import org.apache.commons.lang3.Range; import org.apache.commons.lang3.tuple.ImmutablePair; +import java.awt.print.Paper; import java.util.*; import java.util.Map.Entry; @@ -69,15 +70,7 @@ public enum DeckFormat { } }), Pauper ( Range.is(60), Range.between(0, 10), 1), - Brawl ( Range.is(59), Range.between(0, 15), 1, new Predicate() { - @Override - public boolean apply(CardRules rules) { - //must be standard legal - //FModel.getFormats().getStandard(); - - return true; - } - }), + Brawl ( Range.is(59), Range.between(0, 15), 1, StaticData.instance().getStandardPredicate(), null), TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate() { private final Set bannedCards = new HashSet(Arrays.asList( "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", @@ -127,17 +120,32 @@ public enum DeckFormat { private final Range sideRange; // null => no check private final int maxCardCopies; private final Predicate cardPoolFilter; + private final Predicate paperCardPoolFilter; private final static String ADVPROCLAMATION = "Advantageous Proclamation"; private final static String SOVREALM = "Sovereign's Realm"; - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { - this(mainRange0, sideRange0, maxCardCopies0, null); - } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { + private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate paperCardPoolFilter0, Predicate cardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; cardPoolFilter = cardPoolFilter0; + paperCardPoolFilter = paperCardPoolFilter0; + } + + private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { + mainRange = mainRange0; + sideRange = sideRange0; + maxCardCopies = maxCardCopies0; + paperCardPoolFilter = null; + cardPoolFilter = cardPoolFilter0; + } + + private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { + mainRange = mainRange0; + sideRange = sideRange0; + maxCardCopies = maxCardCopies0; + paperCardPoolFilter = null; + cardPoolFilter = null; } private boolean hasCommander() { @@ -374,7 +382,16 @@ public enum DeckFormat { public IDeckGenPool getCardPool(IDeckGenPool basePool) { if (cardPoolFilter == null) { - return basePool; + if (paperCardPoolFilter == null) { + return basePool; + } + DeckGenPool filteredPool = new DeckGenPool(); + for (PaperCard pc : basePool.getAllCards()) { + if (paperCardPoolFilter.apply(pc)) { + filteredPool.add(pc); + } + } + return filteredPool; } DeckGenPool filteredPool = new DeckGenPool(); for (PaperCard pc : basePool.getAllCards()) { @@ -391,7 +408,10 @@ public enum DeckFormat { public boolean isLegalCard(PaperCard pc) { if (cardPoolFilter == null) { - return true; + if (paperCardPoolFilter == null) { + return true; + } + return paperCardPoolFilter.apply(pc); } return cardPoolFilter.apply(pc.getRules()); } @@ -426,6 +446,13 @@ public enum DeckFormat { } } } + if (paperCardPoolFilter != null) { + for (final Entry cp : deck.getAllCardsInASinglePool()) { + if (!paperCardPoolFilter.apply(cp.getKey())) { + return false; + } + } + } return true; } }; diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index 2e99933917e..eaf276bda6d 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -180,8 +180,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } private void updateRandomCommander() { - if((!lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Commander)&& - !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.TinyLeaders)))){ + if((!lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Commander))&& + !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.TinyLeaders))&& + !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Brawl))){ return; } lstDecks.setAllowMultipleSelections(false); @@ -202,8 +203,9 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } private void updateRandomCardGenCommander() { - if((!lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Commander)&& - !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.TinyLeaders)))){ + if((!lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Commander))&& + !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.TinyLeaders))&& + !(lstDecks.getGameType().getDeckFormat().equals(DeckFormat.Brawl))){ return; } lstDecks.setAllowMultipleSelections(false); diff --git a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java index fc08fb0d616..e0ceeb1935e 100644 --- a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java @@ -23,6 +23,9 @@ import java.util.Map; */ public class CommanderDeckGenerator extends DeckProxy implements Comparable { public static List getCommanderDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){ + if(format.equals(DeckFormat.Brawl)){ + return getBrawlDecks(format, isForAi, isCardGen); + } ItemPool uniqueCards; if(isCardGen){ uniqueCards = new ItemPool(PaperCard.class); @@ -50,6 +53,31 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable getBrawlDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){ + ItemPool uniqueCards; + if(isCardGen){ + uniqueCards = new ItemPool(PaperCard.class); + //TODO: upate to actual Brawl model from real Brawl decks + Iterable legendNames=CardRelationMatrixGenerator.cardPools.get(FModel.getFormats().getStandard().getName()).keySet(); + for(String legendName:legendNames) { + uniqueCards.add(FModel.getMagicDb().getCommonCards().getUniqueByName(legendName)); + } + }else { + uniqueCards = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getUniqueCards(), PaperCard.class); + } + Predicate canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY; + @SuppressWarnings("unchecked") + Iterable legends = Iterables.filter(uniqueCards.toFlatList(), Predicates.and(format.isLegalCardPredicate(), + Predicates.compose(Predicates.and( + CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, + canPlay), PaperCard.FN_GET_RULES))); + final List decks = new ArrayList(); + for(PaperCard legend: legends) { + decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); + } + return decks; + } + private final PaperCard legend; private final int index; private final DeckFormat format; diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index d773b1c0ff7..4069a84cb98 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -387,7 +387,7 @@ public class DeckProxy implements InventoryItem { return FModel.getFormats().getStandard().isDeckLegal(input); } }, filter); - addDecksRecursivelly("Tiny Leaders", GameType.Brawl, result, "", FModel.getDecks().getBrawl(), filter); + addDecksRecursivelly("Brawl", GameType.Brawl, result, "", FModel.getDecks().getBrawl(), filter); return result; } diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index e663cf86c8d..86aa4381d05 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -542,7 +542,11 @@ public class DeckgenUtil { PaperCard selectedPartner=null; if(isCardGen){ List> potentialCards = new ArrayList<>(); - potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName())); + if(format.equals(DeckFormat.Brawl)){ + potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(FModel.getFormats().getStandard().getName()).get(commander.getName())); + }else { + potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName())); + } Random r = new Random(); //Collections.shuffle(potentialCards, r); List preSelectedCards = new ArrayList<>(); @@ -590,9 +594,17 @@ public class DeckgenUtil { Iterable colorList = Iterables.filter(format.getCardPool(cardDb).getAllCards(), Predicates.compose(Predicates.or(new CardThemedDeckBuilder.MatchColorIdentity(commander.getRules().getColorIdentity()), DeckGeneratorBase.COLORLESS_CARDS), PaperCard.FN_GET_RULES)); + if(format.equals(DeckFormat.Brawl)){ + Iterable colorListFiltered = Iterables.filter(colorList,FModel.getFormats().getStandard().getFilterPrinted()); + colorList=colorListFiltered; + } List cardList = Lists.newArrayList(colorList); Collections.shuffle(cardList, new Random()); - List shortList = cardList.subList(1, 400); + int shortlistlength=400; + if(cardList.size()<400){ + shortlistlength=cardList.size(); + } + List shortList = cardList.subList(1, shortlistlength); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,shortList,forAi,format); } diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 33f6bfc8d89..83202bf6ea2 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -173,6 +173,8 @@ public final class FModel { formats.add(format); } + magicDb.setStandardPredicate(formats.getStandard().getFilterPrinted()); + blocks = new StorageBase<>("Block definitions", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "blocks.txt", magicDb.getEditions())); questPreferences = new QuestPreferences(); conquestPreferences = new ConquestPreferences(); From 08dc5f5654e2bebb09203267966a8a073fdb8b04 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 29 Mar 2018 06:33:02 +0100 Subject: [PATCH 10/15] Fixed deckformat to fully support Brawl requiring standard legal cards. Deck generation for brawl working on desktop and android. --- .../src/main/java/forge/StaticData.java | 21 ++++++++++++------- .../src/main/java/forge/deck/DeckgenUtil.java | 10 +++++---- .../src/main/java/forge/model/FModel.java | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 57a79f63dd3..546b5413d59 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -33,15 +33,8 @@ public class StaticData { private final TokenDb allTokens; private final CardEdition.Collection editions; - public Predicate getStandardPredicate() { - return standardPredicate; - } - - public void setStandardPredicate(Predicate standardPredicate) { - this.standardPredicate = standardPredicate; - } - private Predicate standardPredicate; + private Predicate modernPredicate; // Loaded lazily: private IStorage boosters; @@ -197,6 +190,18 @@ public class StaticData { public TokenDb getAllTokens() { return allTokens; } + public Predicate getStandardPredicate() { + return standardPredicate; + } + + public void setStandardPredicate(Predicate standardPredicate) { this.standardPredicate = standardPredicate; } + + public void setModernPredicate(Predicate modernPredicate) { this.modernPredicate = standardPredicate; } + + public Predicate getModernPredicate() { + return modernPredicate; + } + public PaperCard getCardByEditionDate(PaperCard card, Date editionDate) { PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), editionDate, CardDb.SetPreference.LatestCoreExp, card.getArtIndex()); diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 86aa4381d05..a7405af9450 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -592,12 +592,13 @@ public class DeckgenUtil { cardDb = FModel.getMagicDb().getCommonCards(); //shuffle first 400 random cards Iterable colorList = Iterables.filter(format.getCardPool(cardDb).getAllCards(), - Predicates.compose(Predicates.or(new CardThemedDeckBuilder.MatchColorIdentity(commander.getRules().getColorIdentity()), - DeckGeneratorBase.COLORLESS_CARDS), PaperCard.FN_GET_RULES)); - if(format.equals(DeckFormat.Brawl)){ + Predicates.and(format.isLegalCardPredicate(),Predicates.compose(Predicates.or( + new CardThemedDeckBuilder.MatchColorIdentity(commander.getRules().getColorIdentity()), + DeckGeneratorBase.COLORLESS_CARDS), PaperCard.FN_GET_RULES))); + /*if(format.equals(DeckFormat.Brawl)){ Iterable colorListFiltered = Iterables.filter(colorList,FModel.getFormats().getStandard().getFilterPrinted()); colorList=colorListFiltered; - } + }*/ List cardList = Lists.newArrayList(colorList); Collections.shuffle(cardList, new Random()); int shortlistlength=400; @@ -605,6 +606,7 @@ public class DeckgenUtil { shortlistlength=cardList.size(); } List shortList = cardList.subList(1, shortlistlength); + shortList.remove(commander); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,shortList,forAi,format); } diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 83202bf6ea2..5b5fdb0c0d0 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -174,6 +174,7 @@ public final class FModel { } magicDb.setStandardPredicate(formats.getStandard().getFilterPrinted()); + magicDb.setModernPredicate(formats.getModern().getFilterPrinted()); blocks = new StorageBase<>("Block definitions", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "blocks.txt", magicDb.getEditions())); questPreferences = new QuestPreferences(); From 9e053865e14ac2e56f6077c92759cb84d4fb5655 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 29 Mar 2018 07:00:37 +0100 Subject: [PATCH 11/15] Code cleanup --- .../src/main/java/forge/deck/DeckFormat.java | 4 +-- .../src/forge/deck/FDeckEditor.java | 26 +++++++++++-------- .../src/main/java/forge/deck/DeckProxy.java | 6 ----- .../src/main/java/forge/deck/DeckgenUtil.java | 2 +- .../java/forge/deck/RandomDeckGenerator.java | 2 ++ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 75c74c4813a..59fadb03616 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -70,7 +70,7 @@ public enum DeckFormat { } }), Pauper ( Range.is(60), Range.between(0, 10), 1), - Brawl ( Range.is(59), Range.between(0, 15), 1, StaticData.instance().getStandardPredicate(), null), + Brawl ( Range.is(59), Range.between(0, 15), 1, null, StaticData.instance().getStandardPredicate()), TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate() { private final Set bannedCards = new HashSet(Arrays.asList( "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", @@ -124,7 +124,7 @@ public enum DeckFormat { private final static String ADVPROCLAMATION = "Advantageous Proclamation"; private final static String SOVREALM = "Sovereign's Realm"; - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate paperCardPoolFilter0, Predicate cardPoolFilter0) { + private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index c0bd5ec42b9..4e5bfc66180 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -92,7 +92,7 @@ public class FDeckEditor extends TabPageScreen { public Deck get() { return new Deck(); } - }), Predicates.and(DeckFormat.Brawl.isLegalCardPredicate(),FModel.getFormats().getStandard().getFilterPrinted())),//include standard format requirement + }), DeckFormat.Brawl.isLegalCardPredicate()), Archenemy(new DeckController(FModel.getDecks().getScheme(), new Supplier() { @Override public Deck get() { @@ -920,21 +920,25 @@ public class FDeckEditor extends TabPageScreen { final List commanders = parentScreen.getDeck().getCommanders(); if (commanders.isEmpty()) { //if no commander set for deck, only show valid commanders - additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); - if(editorType.equals(EditorType.Brawl)){ - //brawl commander filter - additionalFilter = Predicates.and(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.IS_PLANESWALKER,Predicates.and( - CardRulesPredicates.Presets.IS_CREATURE,CardRulesPredicates.Presets.IS_LEGENDARY)), PaperCard.FN_GET_RULES), - FModel.getFormats().getStandard().getFilterPrinted()); + switch (editorType) { + case TinyLeaders: + case Commander: + additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); + break; + case Brawl: + additionalFilter = DeckFormat.Brawl.isLegalCommanderPredicate(); } - cardManager.setCaption("Commanders"); } else { //if a commander has been set, only show cards that match its color identity - additionalFilter = DeckFormat.Commander.isLegalCardForCommanderOrLegalPartnerPredicate(commanders); - if(editorType.equals(EditorType.Brawl)){ - additionalFilter = Predicates.and(additionalFilter,FModel.getFormats().getStandard().getFilterPrinted()); + switch (editorType) { + case TinyLeaders: + case Commander: + additionalFilter = DeckFormat.Commander.isLegalCardForCommanderOrLegalPartnerPredicate(commanders); + break; + case Brawl: + additionalFilter = DeckFormat.Brawl.isLegalCardForCommanderOrLegalPartnerPredicate(commanders); } cardManager.setCaption("Cards"); } diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 4069a84cb98..d120d57d496 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -381,12 +381,6 @@ public class DeckProxy implements InventoryItem { else { filter = Predicates.and(DeckFormat.Brawl.hasLegalCardsPredicate(), filter); } - filter = Predicates.and(new Predicate() { - @Override - public boolean apply(Deck input) { - return FModel.getFormats().getStandard().isDeckLegal(input); - } - }, filter); addDecksRecursivelly("Brawl", GameType.Brawl, result, "", FModel.getDecks().getBrawl(), filter); return result; } diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index a7405af9450..eafb2df8c59 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -542,7 +542,7 @@ public class DeckgenUtil { PaperCard selectedPartner=null; if(isCardGen){ List> potentialCards = new ArrayList<>(); - if(format.equals(DeckFormat.Brawl)){ + if(format.equals(DeckFormat.Brawl)){//TODO: replace with actual Brawl based data potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(FModel.getFormats().getStandard().getName()).get(commander.getName())); }else { potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName())); diff --git a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java index 4e209200331..7efa871b472 100644 --- a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java @@ -80,6 +80,8 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable Date: Thu, 29 Mar 2018 08:47:15 +0100 Subject: [PATCH 12/15] Fixed failing tests due to missing StaticData. Fixed Commander-based fully random deck generation. --- .../src/main/java/forge/deck/DeckFormat.java | 2 +- .../src/main/java/forge/deck/DeckgenUtil.java | 32 +++---------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 59fadb03616..1991967ef24 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -70,7 +70,7 @@ public enum DeckFormat { } }), Pauper ( Range.is(60), Range.between(0, 10), 1), - Brawl ( Range.is(59), Range.between(0, 15), 1, null, StaticData.instance().getStandardPredicate()), + Brawl ( Range.is(59), Range.between(0, 15), 1, null, StaticData.instance() == null ? null : StaticData.instance().getStandardPredicate()), TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate() { private final Set bannedCards = new HashSet(Arrays.asList( "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index eafb2df8c59..abd5cb732dd 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -498,40 +498,18 @@ public class DeckgenUtil { final DeckFormat format = gameType.getDeckFormat(); Predicate canPlay = forAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY; @SuppressWarnings("unchecked") - Iterable legends = cardDb.getAllCards(Predicates.compose(Predicates.and( + Iterable legends = cardDb.getAllCards(Predicates.and(format.isLegalCardPredicate(), + Predicates.compose(Predicates.and( new Predicate() { @Override public boolean apply(CardRules rules) { return format.isLegalCommander(rules); } }, - canPlay), PaperCard.FN_GET_RULES)); + 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, format, comColors.get(0), comColors.get(1)); - gen.setSingleton(true); - gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - CardPool cards = gen.getDeck(gameType.getDeckFormat().getMainRange().getMaximum(), forAi); - - // After generating card lists, build deck. - deck = new Deck("Generated " + gameType.toString() + " deck (" + commander.getName() + ")"); - deck.setDirectory("generated/commander"); - deck.getMain().addAll(cards); - deck.getOrCreate(DeckSection.Commander).add(commander); - - return deck; + commander = Aggregates.random(legends); + return generateRandomCommanderDeck(commander, format, forAi, false); } /** Generate a ramdom Commander deck. */ From 8e074e2093af13a805a0d2c955ddfd39490659c5 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 29 Mar 2018 11:15:06 +0100 Subject: [PATCH 13/15] Removed unwanted import --- forge-core/src/main/java/forge/deck/DeckFormat.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 1991967ef24..f28d981b708 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -35,7 +35,6 @@ import forge.util.TextUtil; import org.apache.commons.lang3.Range; import org.apache.commons.lang3.tuple.ImmutablePair; -import java.awt.print.Paper; import java.util.*; import java.util.Map.Entry; From e26887036e64550a44ab8414adb2c7424cd55e77 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 29 Mar 2018 16:28:32 +0100 Subject: [PATCH 14/15] Now using filterrules rather than printing rules to determine if a card is brawl legal - still using printing rules to determine which basic lands to use in generated decks --- forge-gui/src/main/java/forge/deck/DeckgenUtil.java | 6 +++--- forge-gui/src/main/java/forge/model/FModel.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index abd5cb732dd..8e1d2684666 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -573,14 +573,14 @@ public class DeckgenUtil { Predicates.and(format.isLegalCardPredicate(),Predicates.compose(Predicates.or( new CardThemedDeckBuilder.MatchColorIdentity(commander.getRules().getColorIdentity()), DeckGeneratorBase.COLORLESS_CARDS), PaperCard.FN_GET_RULES))); - /*if(format.equals(DeckFormat.Brawl)){ + if(format.equals(DeckFormat.Brawl)){//for Brawl - add additional filterprinted rule to remove old reprints for a consistent look Iterable colorListFiltered = Iterables.filter(colorList,FModel.getFormats().getStandard().getFilterPrinted()); colorList=colorListFiltered; - }*/ + } List cardList = Lists.newArrayList(colorList); Collections.shuffle(cardList, new Random()); int shortlistlength=400; - if(cardList.size()<400){ + if(cardList.size() shortList = cardList.subList(1, shortlistlength); diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 5b5fdb0c0d0..32ee8cec852 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -173,8 +173,8 @@ public final class FModel { formats.add(format); } - magicDb.setStandardPredicate(formats.getStandard().getFilterPrinted()); - magicDb.setModernPredicate(formats.getModern().getFilterPrinted()); + magicDb.setStandardPredicate(formats.getStandard().getFilterRules()); + magicDb.setModernPredicate(formats.getModern().getFilterRules()); blocks = new StorageBase<>("Block definitions", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "blocks.txt", magicDb.getEditions())); questPreferences = new QuestPreferences(); From 3ea9f7d2182ffa34e536181450c53eff3dce76da Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 29 Mar 2018 21:06:41 +0100 Subject: [PATCH 15/15] Removed unwanted whitespace and imports --- .../src/main/java/forge/match/input/InputPassPriority.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index cab74400821..9078f3b671f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -28,8 +28,6 @@ import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.player.PlayerControllerHuman; import forge.properties.ForgePreferences.FPref; -import forge.sound.SoundEffectType; -import forge.sound.SoundSystem; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; @@ -64,7 +62,6 @@ public class InputPassPriority extends InputSyncronizedBase { } getController().getGui().alertUser(); - } /** {@inheritDoc} */