diff --git a/.gitattributes b/.gitattributes index 8e7b5a062d4..15414c3042b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1164,8 +1164,8 @@ forge-gui-mobile/src/forge/screens/SplashScreen.java -text forge-gui-mobile/src/forge/screens/TabPageScreen.java -text forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java -text forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java -text -forge-gui-mobile/src/forge/screens/draft/CurrentPackPage.java -text -forge-gui-mobile/src/forge/screens/draft/DraftDeckPage.java -text +forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java -text +forge-gui-mobile/src/forge/screens/draft/DraftPackPage.java -text forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java -text forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java index 6eaf6e2e043..5044031d596 100644 --- a/forge-gui-mobile/src/forge/screens/TabPageScreen.java +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -16,26 +16,27 @@ import forge.toolbox.FScrollPane; import forge.toolbox.FEvent.FEventHandler; import forge.util.Utils; -public class TabPageScreen extends FScreen { - private final TabPage[] tabPages; - private TabPage selectedPage; +public class TabPageScreen> extends FScreen { + protected final TabPage[] tabPages; + private TabPage selectedPage; - public TabPageScreen(TabPage[] tabPages0) { - super(new TabHeader(tabPages0)); + @SuppressWarnings("unchecked") + public TabPageScreen(TabPage[] tabPages0) { + super(new TabHeader(tabPages0)); tabPages = tabPages0; - for (TabPage tabPage : tabPages) { - tabPage.parentScreen = this; + for (TabPage tabPage : tabPages) { + tabPage.parentScreen = (T)this; add(tabPage); tabPage.setVisible(false); } setSelectedPage(tabPages[0]); } - public TabPage getSelectedPage() { + public TabPage getSelectedPage() { return selectedPage; } - public void setSelectedPage(TabPage tabPage0) { + public void setSelectedPage(TabPage tabPage0) { if (selectedPage == tabPage0) { return; } if (selectedPage != null) { @@ -50,12 +51,12 @@ public class TabPageScreen extends FScreen { @Override protected void doLayout(float startY, float width, float height) { height -= startY; - for (TabPage tabPage : tabPages) { + for (TabPage tabPage : tabPages) { tabPage.setBounds(0, startY, width, height); } } - private static class TabHeader extends Header { + private static class TabHeader> extends Header { public static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 1.4f); public static final float TAB_WIDTH = Math.round(HEIGHT * 1.2f); private static final float BACK_BUTTON_WIDTH = Math.round(HEIGHT / 2); @@ -64,7 +65,7 @@ public class TabPageScreen extends FScreen { private final FLabel btnBack; private final FScrollPane scroller; - public TabHeader(TabPage[] tabPages) { + public TabHeader(TabPage[] tabPages) { scroller = add(new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { @@ -90,7 +91,7 @@ public class TabPageScreen extends FScreen { }).build()); btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT); - for (TabPage tabPage : tabPages) { + for (TabPage tabPage : tabPages) { scroller.add(tabPage.createTab()); } } @@ -122,13 +123,13 @@ public class TabPageScreen extends FScreen { } } - public static abstract class TabPage extends FContainer { + public static abstract class TabPage> extends FContainer { private static final float TAB_PADDING = TabHeader.HEIGHT * 0.1f; private static final FSkinColor SEL_TAB_COLOR = FSkinColor.get(Colors.CLR_ACTIVE); private static final FSkinColor TAB_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); private static final FSkinFont TAB_FONT = FSkinFont.get(12); - protected TabPageScreen parentScreen; + protected T parentScreen; protected String caption; protected FImage icon; diff --git a/forge-gui-mobile/src/forge/screens/draft/DraftDeckPage.java b/forge-gui-mobile/src/forge/screens/draft/DraftDeckPage.java deleted file mode 100644 index 6e08f49155d..00000000000 --- a/forge-gui-mobile/src/forge/screens/draft/DraftDeckPage.java +++ /dev/null @@ -1,27 +0,0 @@ -package forge.screens.draft; - -import forge.assets.FSkinImage; -import forge.itemmanager.CardManager; -import forge.itemmanager.ItemManagerConfig; -import forge.limited.BoosterDraft; -import forge.screens.TabPageScreen.TabPage; - -public class DraftDeckPage extends TabPage { - private final BoosterDraft draft; - private final CardManager lstDeck = add(new CardManager(false)); - - protected DraftDeckPage(BoosterDraft draft0) { - super("Main (0)", FSkinImage.DECKLIST); - - draft = draft0; - - lstDeck.setCaption("Main Deck"); - lstDeck.setAlwaysNonUnique(true); - lstDeck.setup(ItemManagerConfig.DRAFT_POOL); - } - - @Override - protected void doLayout(float width, float height) { - lstDeck.setBounds(0, 0, width, height); - } -} diff --git a/forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java b/forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java new file mode 100644 index 00000000000..723bbea4726 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java @@ -0,0 +1,38 @@ +package forge.screens.draft; + +import forge.assets.FSkinImage; +import forge.item.PaperCard; +import forge.itemmanager.CardManager; +import forge.itemmanager.ItemManagerConfig; +import forge.screens.TabPageScreen.TabPage; + +public class DraftMainPage extends TabPage { + private final CardManager lstMain = add(new CardManager(false)); + + protected DraftMainPage() { + super("Main (0)", FSkinImage.DECKLIST); + + lstMain.setCaption("Main Deck"); + lstMain.setAlwaysNonUnique(true); + lstMain.setup(ItemManagerConfig.DRAFT_POOL); + } + + public void refresh() { + lstMain.setPool(parentScreen.getDeck().getMain()); + updateCaption(); + } + + public void addCard(PaperCard card) { + lstMain.addItem(card, 1); + updateCaption(); + } + + private void updateCaption() { + caption = "Main (" + parentScreen.getDeck().getMain().countAll() + ")"; + } + + @Override + protected void doLayout(float width, float height) { + lstMain.setBounds(0, 0, width, height); + } +} diff --git a/forge-gui-mobile/src/forge/screens/draft/CurrentPackPage.java b/forge-gui-mobile/src/forge/screens/draft/DraftPackPage.java similarity index 70% rename from forge-gui-mobile/src/forge/screens/draft/CurrentPackPage.java rename to forge-gui-mobile/src/forge/screens/draft/DraftPackPage.java index 1bab697b6fc..ed02f41d146 100644 --- a/forge-gui-mobile/src/forge/screens/draft/CurrentPackPage.java +++ b/forge-gui-mobile/src/forge/screens/draft/DraftPackPage.java @@ -1,24 +1,20 @@ package forge.screens.draft; import forge.assets.FSkinImage; -import forge.item.PaperCard; +import forge.deck.CardPool; import forge.itemmanager.CardManager; import forge.itemmanager.ItemManagerConfig; import forge.limited.BoosterDraft; import forge.screens.TabPageScreen.TabPage; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; -import forge.util.ItemPool; -public class CurrentPackPage extends TabPage { - private final BoosterDraft draft; +public class DraftPackPage extends TabPage { private final CardManager lstPack = add(new CardManager(false)); - protected CurrentPackPage(BoosterDraft draft0) { + protected DraftPackPage() { super("Pack 1", FSkinImage.PACK); - draft = draft0; - //hide filters and options panel so more of pack is visible by default lstPack.setHideViewOptions(1, true); lstPack.setAlwaysNonUnique(true); @@ -27,34 +23,33 @@ public class CurrentPackPage extends TabPage { lstPack.setItemActivateHandler(new FEventHandler() { @Override public void handleEvent(FEvent e) { + parentScreen.getMainPage().addCard(lstPack.getSelectedItem()); pickSelectedCard(); } }); - showChoices(draft.nextChoice()); } - private void showChoices(final ItemPool list) { + public void showChoices() { + BoosterDraft draft = parentScreen.getDraft(); + CardPool pool = draft.nextChoice(); int packNumber = draft.getCurrentBoosterIndex() + 1; caption = "Pack " + packNumber; - lstPack.setPool(list); + lstPack.setPool(pool); } private void pickSelectedCard() { + BoosterDraft draft = parentScreen.getDraft(); draft.setChoice(lstPack.getSelectedItem()); if (draft.hasNextChoice()) { - showChoices(draft.nextChoice()); + showChoices(); } else { draft.finishedDrafting(); - saveDraft(); + parentScreen.saveDraft(); } } - private void saveDraft() { - //TODO - } - @Override protected void doLayout(float width, float height) { lstPack.setBounds(0, 0, width, height); diff --git a/forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java b/forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java index df260fa6479..add7fad4337 100644 --- a/forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java +++ b/forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java @@ -1,25 +1,37 @@ package forge.screens.draft; import forge.assets.FSkinImage; +import forge.deck.DeckSection; +import forge.item.PaperCard; import forge.itemmanager.CardManager; import forge.itemmanager.ItemManagerConfig; -import forge.limited.BoosterDraft; import forge.screens.TabPageScreen.TabPage; -public class DraftSideboardPage extends TabPage { - private final BoosterDraft draft; +public class DraftSideboardPage extends TabPage { private final CardManager lstSideboard = add(new CardManager(false)); - protected DraftSideboardPage(BoosterDraft draft0) { + protected DraftSideboardPage() { super("Side (0)", FSkinImage.FLASHBACK); - draft = draft0; - lstSideboard.setCaption("Sideboard"); lstSideboard.setAlwaysNonUnique(true); lstSideboard.setup(ItemManagerConfig.DRAFT_POOL); } + public void refresh() { + lstSideboard.setPool(parentScreen.getDeck().get(DeckSection.Sideboard)); + updateCaption(); + } + + public void addCard(PaperCard card) { + lstSideboard.addItem(card, 1); + updateCaption(); + } + + private void updateCaption() { + caption = "Side (" + parentScreen.getDeck().get(DeckSection.Sideboard).countAll() + ")"; + } + @Override protected void doLayout(float width, float height) { lstSideboard.setBounds(0, 0, width, height); diff --git a/forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java b/forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java index 8aa94f244ad..0dbb1edd07b 100644 --- a/forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java +++ b/forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java @@ -1,22 +1,137 @@ package forge.screens.draft; +import org.apache.commons.lang3.StringUtils; + +import forge.card.MagicColor; +import forge.deck.Deck; +import forge.deck.DeckGroup; +import forge.deck.DeckSection; import forge.limited.BoosterDraft; +import forge.limited.IBoosterDraft; +import forge.model.FModel; +import forge.properties.ForgePreferences.FPref; import forge.screens.TabPageScreen; import forge.toolbox.FOptionPane; import forge.util.Callback; +import forge.util.MyRandom; -public class DraftingProcessScreen extends TabPageScreen { +public class DraftingProcessScreen extends TabPageScreen { + private boolean saved; + private final BoosterDraft draft; + private final Deck deck; + + @SuppressWarnings("unchecked") public DraftingProcessScreen(BoosterDraft draft0) { super(new TabPage[] { - new CurrentPackPage(draft0), - new DraftDeckPage(draft0), - new DraftSideboardPage(draft0) + new DraftPackPage(), + new DraftMainPage(), + new DraftSideboardPage() }); + draft = draft0; + + //create starting point for draft deck with lands in sideboard + deck = new Deck(); + deck.getOrCreate(DeckSection.Sideboard); + + final String landSet = IBoosterDraft.LAND_SET_CODE[0].getCode(); + final boolean isZendikarSet = landSet.equals("ZEN"); // we want to generate one kind of Zendikar lands at a time only + final boolean zendikarSetMode = MyRandom.getRandom().nextBoolean(); + + final int landsCount = 10; + + for (String landName : MagicColor.Constant.BASIC_LANDS) { + int numArt = FModel.getMagicDb().getCommonCards().getArtCount(landName, landSet); + int minArtIndex = isZendikarSet ? (zendikarSetMode ? 1 : 5) : 1; + int maxArtIndex = isZendikarSet ? minArtIndex + 3 : numArt; + + if (FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_ART_IN_POOLS)) { + for (int i = minArtIndex; i <= maxArtIndex; i++) { + deck.get(DeckSection.Sideboard).add(landName, landSet, i, numArt > 1 ? landsCount : 30); + } + } + else { + deck.get(DeckSection.Sideboard).add(landName, landSet, 30); + } + } + + //show initial cards in card managers + getPackPage().showChoices(); + getMainPage().refresh(); + getSideboardPage().refresh(); + } + + public DraftPackPage getPackPage() { + return (DraftPackPage)tabPages[0]; + } + + public DraftMainPage getMainPage() { + return (DraftMainPage)tabPages[1]; + } + + public DraftSideboardPage getSideboardPage() { + return (DraftSideboardPage)tabPages[2]; + } + + public BoosterDraft getDraft() { + return draft; + } + + public Deck getDeck() { + return deck; + } + + public void saveDraft() { + FOptionPane.showInputDialog("Save this draft as:", "Save Draft", FOptionPane.QUESTION_ICON, new Callback() { + @Override + public void run(final String name) { + if (StringUtils.isEmpty(name)) { + saveDraft(); //re-prompt if user doesn't pick a name + return; + } + + // Check for overwrite case + for (DeckGroup d : FModel.getDecks().getDraft()) { + if (name.equalsIgnoreCase(d.getName())) { + FOptionPane.showConfirmDialog( + "There is already a deck named '" + name + "'. Overwrite?", + "Overwrite Deck?", false, new Callback() { + @Override + public void run(Boolean result) { + if (result) { + finishSave(name); + } + else { + saveDraft(); //If no overwrite, recurse. + } + } + }); + return; + } + } + + finishSave(name); + } + }); + } + + private void finishSave(String name) { + saved = true; + + // Construct computer's decks and save draft + final Deck[] computer = draft.getDecks(); + + final DeckGroup finishedDraft = new DeckGroup(name); + finishedDraft.setHumanDeck((Deck) deck.copyTo(name)); + finishedDraft.addAiDecks(computer); + + FModel.getDecks().getDraft().add(finishedDraft); } @Override public void onClose(Callback canCloseCallback) { - if (canCloseCallback == null) { return; } + if (saved || canCloseCallback == null) { + super.onClose(canCloseCallback); //can skip prompt if draft saved + } FOptionPane.showConfirmDialog("This will end the current draft and you will not be able to resume.\n\n" + "Leave anyway?", "Leave Draft?", "Leave", "Cancel", false, canCloseCallback); } diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index c6c686a12e0..c115432fb55 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -22,7 +22,7 @@ import forge.toolbox.FList; import forge.toolbox.FOptionPane; import forge.util.Callback; -public class FilesPage extends TabPage { +public class FilesPage extends TabPage { private final FGroupList lstItems = add(new FGroupList()); protected FilesPage() { diff --git a/forge-gui-mobile/src/forge/screens/settings/HelpPage.java b/forge-gui-mobile/src/forge/screens/settings/HelpPage.java index 4ef2a888067..fe0de52abbe 100644 --- a/forge-gui-mobile/src/forge/screens/settings/HelpPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/HelpPage.java @@ -3,7 +3,7 @@ package forge.screens.settings; import forge.assets.FSkinImage; import forge.screens.TabPageScreen.TabPage; -public class HelpPage extends TabPage { +public class HelpPage extends TabPage { protected HelpPage() { super("Help", FSkinImage.UNKNOWN); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index d8d65ffd748..2b0877fad1b 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -23,7 +23,7 @@ import forge.toolbox.FGroupList; import forge.toolbox.FList; import forge.util.Utils; -public class SettingsPage extends TabPage { +public class SettingsPage extends TabPage { private final FGroupList lstSettings = add(new FGroupList()); public SettingsPage() { diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java b/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java index d92f3e2c5e0..192c8b343ce 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java @@ -7,7 +7,7 @@ import forge.assets.FSkinColor.Colors; import forge.screens.TabPageScreen; import forge.util.Utils; -public class SettingsScreen extends TabPageScreen { +public class SettingsScreen extends TabPageScreen { public static final float INSETS_FACTOR = 0.025f; public static final FSkinFont DESC_FONT = FSkinFont.get(11); public static final FSkinColor DESC_COLOR = FSkinColor.get(Colors.CLR_TEXT).alphaColor(0.5f); @@ -23,6 +23,7 @@ public class SettingsScreen extends TabPageScreen { Forge.openScreen(settingsScreen); } + @SuppressWarnings("unchecked") private SettingsScreen() { super(new TabPage[] { new SettingsPage(),