From 364bf3724fc06093ab13d222fee3012ac1d04a54 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 26 Mar 2018 06:57:15 +0100 Subject: [PATCH] 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. */