Support building deck while drafting

This commit is contained in:
drdev
2014-06-07 17:47:44 +00:00
parent eb942adf41
commit ab8c07cb52
11 changed files with 210 additions and 75 deletions

4
.gitattributes vendored
View File

@@ -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/TabPageScreen.java -text
forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.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/constructed/ConstructedScreen.java -text
forge-gui-mobile/src/forge/screens/draft/CurrentPackPage.java -text forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java -text
forge-gui-mobile/src/forge/screens/draft/DraftDeckPage.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/DraftScreen.java -text
forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java -text forge-gui-mobile/src/forge/screens/draft/DraftSideboardPage.java -text
forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text

View File

@@ -16,26 +16,27 @@ import forge.toolbox.FScrollPane;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
import forge.util.Utils; import forge.util.Utils;
public class TabPageScreen extends FScreen { public class TabPageScreen<T extends TabPageScreen<T>> extends FScreen {
private final TabPage[] tabPages; protected final TabPage<T>[] tabPages;
private TabPage selectedPage; private TabPage<T> selectedPage;
public TabPageScreen(TabPage[] tabPages0) { @SuppressWarnings("unchecked")
super(new TabHeader(tabPages0)); public TabPageScreen(TabPage<T>[] tabPages0) {
super(new TabHeader<T>(tabPages0));
tabPages = tabPages0; tabPages = tabPages0;
for (TabPage tabPage : tabPages) { for (TabPage<T> tabPage : tabPages) {
tabPage.parentScreen = this; tabPage.parentScreen = (T)this;
add(tabPage); add(tabPage);
tabPage.setVisible(false); tabPage.setVisible(false);
} }
setSelectedPage(tabPages[0]); setSelectedPage(tabPages[0]);
} }
public TabPage getSelectedPage() { public TabPage<T> getSelectedPage() {
return selectedPage; return selectedPage;
} }
public void setSelectedPage(TabPage tabPage0) { public void setSelectedPage(TabPage<T> tabPage0) {
if (selectedPage == tabPage0) { return; } if (selectedPage == tabPage0) { return; }
if (selectedPage != null) { if (selectedPage != null) {
@@ -50,12 +51,12 @@ public class TabPageScreen extends FScreen {
@Override @Override
protected void doLayout(float startY, float width, float height) { protected void doLayout(float startY, float width, float height) {
height -= startY; height -= startY;
for (TabPage tabPage : tabPages) { for (TabPage<T> tabPage : tabPages) {
tabPage.setBounds(0, startY, width, height); tabPage.setBounds(0, startY, width, height);
} }
} }
private static class TabHeader extends Header { private static class TabHeader<T extends TabPageScreen<T>> extends Header {
public static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 1.4f); public static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 1.4f);
public static final float TAB_WIDTH = Math.round(HEIGHT * 1.2f); public static final float TAB_WIDTH = Math.round(HEIGHT * 1.2f);
private static final float BACK_BUTTON_WIDTH = Math.round(HEIGHT / 2); 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 FLabel btnBack;
private final FScrollPane scroller; private final FScrollPane scroller;
public TabHeader(TabPage[] tabPages) { public TabHeader(TabPage<T>[] tabPages) {
scroller = add(new FScrollPane() { scroller = add(new FScrollPane() {
@Override @Override
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
@@ -90,7 +91,7 @@ public class TabPageScreen extends FScreen {
}).build()); }).build());
btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT); btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT);
for (TabPage tabPage : tabPages) { for (TabPage<T> tabPage : tabPages) {
scroller.add(tabPage.createTab()); 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<T extends TabPageScreen<T>> extends FContainer {
private static final float TAB_PADDING = TabHeader.HEIGHT * 0.1f; 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 SEL_TAB_COLOR = FSkinColor.get(Colors.CLR_ACTIVE);
private static final FSkinColor TAB_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); private static final FSkinColor TAB_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT);
private static final FSkinFont TAB_FONT = FSkinFont.get(12); private static final FSkinFont TAB_FONT = FSkinFont.get(12);
protected TabPageScreen parentScreen; protected T parentScreen;
protected String caption; protected String caption;
protected FImage icon; protected FImage icon;

View File

@@ -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);
}
}

View File

@@ -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<DraftingProcessScreen> {
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);
}
}

View File

@@ -1,24 +1,20 @@
package forge.screens.draft; package forge.screens.draft;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.item.PaperCard; import forge.deck.CardPool;
import forge.itemmanager.CardManager; import forge.itemmanager.CardManager;
import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.ItemManagerConfig;
import forge.limited.BoosterDraft; import forge.limited.BoosterDraft;
import forge.screens.TabPageScreen.TabPage; import forge.screens.TabPageScreen.TabPage;
import forge.toolbox.FEvent; import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
import forge.util.ItemPool;
public class CurrentPackPage extends TabPage { public class DraftPackPage extends TabPage<DraftingProcessScreen> {
private final BoosterDraft draft;
private final CardManager lstPack = add(new CardManager(false)); private final CardManager lstPack = add(new CardManager(false));
protected CurrentPackPage(BoosterDraft draft0) { protected DraftPackPage() {
super("Pack 1", FSkinImage.PACK); super("Pack 1", FSkinImage.PACK);
draft = draft0;
//hide filters and options panel so more of pack is visible by default //hide filters and options panel so more of pack is visible by default
lstPack.setHideViewOptions(1, true); lstPack.setHideViewOptions(1, true);
lstPack.setAlwaysNonUnique(true); lstPack.setAlwaysNonUnique(true);
@@ -27,34 +23,33 @@ public class CurrentPackPage extends TabPage {
lstPack.setItemActivateHandler(new FEventHandler() { lstPack.setItemActivateHandler(new FEventHandler() {
@Override @Override
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
parentScreen.getMainPage().addCard(lstPack.getSelectedItem());
pickSelectedCard(); pickSelectedCard();
} }
}); });
showChoices(draft.nextChoice());
} }
private void showChoices(final ItemPool<PaperCard> list) { public void showChoices() {
BoosterDraft draft = parentScreen.getDraft();
CardPool pool = draft.nextChoice();
int packNumber = draft.getCurrentBoosterIndex() + 1; int packNumber = draft.getCurrentBoosterIndex() + 1;
caption = "Pack " + packNumber; caption = "Pack " + packNumber;
lstPack.setPool(list); lstPack.setPool(pool);
} }
private void pickSelectedCard() { private void pickSelectedCard() {
BoosterDraft draft = parentScreen.getDraft();
draft.setChoice(lstPack.getSelectedItem()); draft.setChoice(lstPack.getSelectedItem());
if (draft.hasNextChoice()) { if (draft.hasNextChoice()) {
showChoices(draft.nextChoice()); showChoices();
} }
else { else {
draft.finishedDrafting(); draft.finishedDrafting();
saveDraft(); parentScreen.saveDraft();
} }
} }
private void saveDraft() {
//TODO
}
@Override @Override
protected void doLayout(float width, float height) { protected void doLayout(float width, float height) {
lstPack.setBounds(0, 0, width, height); lstPack.setBounds(0, 0, width, height);

View File

@@ -1,25 +1,37 @@
package forge.screens.draft; package forge.screens.draft;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.deck.DeckSection;
import forge.item.PaperCard;
import forge.itemmanager.CardManager; import forge.itemmanager.CardManager;
import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.ItemManagerConfig;
import forge.limited.BoosterDraft;
import forge.screens.TabPageScreen.TabPage; import forge.screens.TabPageScreen.TabPage;
public class DraftSideboardPage extends TabPage { public class DraftSideboardPage extends TabPage<DraftingProcessScreen> {
private final BoosterDraft draft;
private final CardManager lstSideboard = add(new CardManager(false)); private final CardManager lstSideboard = add(new CardManager(false));
protected DraftSideboardPage(BoosterDraft draft0) { protected DraftSideboardPage() {
super("Side (0)", FSkinImage.FLASHBACK); super("Side (0)", FSkinImage.FLASHBACK);
draft = draft0;
lstSideboard.setCaption("Sideboard"); lstSideboard.setCaption("Sideboard");
lstSideboard.setAlwaysNonUnique(true); lstSideboard.setAlwaysNonUnique(true);
lstSideboard.setup(ItemManagerConfig.DRAFT_POOL); 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 @Override
protected void doLayout(float width, float height) { protected void doLayout(float width, float height) {
lstSideboard.setBounds(0, 0, width, height); lstSideboard.setBounds(0, 0, width, height);

View File

@@ -1,22 +1,137 @@
package forge.screens.draft; 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.BoosterDraft;
import forge.limited.IBoosterDraft;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.screens.TabPageScreen; import forge.screens.TabPageScreen;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.util.Callback; import forge.util.Callback;
import forge.util.MyRandom;
public class DraftingProcessScreen extends TabPageScreen { public class DraftingProcessScreen extends TabPageScreen<DraftingProcessScreen> {
private boolean saved;
private final BoosterDraft draft;
private final Deck deck;
@SuppressWarnings("unchecked")
public DraftingProcessScreen(BoosterDraft draft0) { public DraftingProcessScreen(BoosterDraft draft0) {
super(new TabPage[] { super(new TabPage[] {
new CurrentPackPage(draft0), new DraftPackPage(),
new DraftDeckPage(draft0), new DraftMainPage(),
new DraftSideboardPage(draft0) 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<String>() {
@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<Boolean>() {
@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 @Override
public void onClose(Callback<Boolean> canCloseCallback) { public void onClose(Callback<Boolean> 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" + 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); "Leave anyway?", "Leave Draft?", "Leave", "Cancel", false, canCloseCallback);
} }

View File

@@ -22,7 +22,7 @@ import forge.toolbox.FList;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.util.Callback; import forge.util.Callback;
public class FilesPage extends TabPage { public class FilesPage extends TabPage<SettingsScreen> {
private final FGroupList<FilesItem> lstItems = add(new FGroupList<FilesItem>()); private final FGroupList<FilesItem> lstItems = add(new FGroupList<FilesItem>());
protected FilesPage() { protected FilesPage() {

View File

@@ -3,7 +3,7 @@ package forge.screens.settings;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.screens.TabPageScreen.TabPage; import forge.screens.TabPageScreen.TabPage;
public class HelpPage extends TabPage { public class HelpPage extends TabPage<SettingsScreen> {
protected HelpPage() { protected HelpPage() {
super("Help", FSkinImage.UNKNOWN); super("Help", FSkinImage.UNKNOWN);

View File

@@ -23,7 +23,7 @@ import forge.toolbox.FGroupList;
import forge.toolbox.FList; import forge.toolbox.FList;
import forge.util.Utils; import forge.util.Utils;
public class SettingsPage extends TabPage { public class SettingsPage extends TabPage<SettingsScreen> {
private final FGroupList<Setting> lstSettings = add(new FGroupList<Setting>()); private final FGroupList<Setting> lstSettings = add(new FGroupList<Setting>());
public SettingsPage() { public SettingsPage() {

View File

@@ -7,7 +7,7 @@ import forge.assets.FSkinColor.Colors;
import forge.screens.TabPageScreen; import forge.screens.TabPageScreen;
import forge.util.Utils; import forge.util.Utils;
public class SettingsScreen extends TabPageScreen { public class SettingsScreen extends TabPageScreen<SettingsScreen> {
public static final float INSETS_FACTOR = 0.025f; public static final float INSETS_FACTOR = 0.025f;
public static final FSkinFont DESC_FONT = FSkinFont.get(11); public static final FSkinFont DESC_FONT = FSkinFont.get(11);
public static final FSkinColor DESC_COLOR = FSkinColor.get(Colors.CLR_TEXT).alphaColor(0.5f); 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); Forge.openScreen(settingsScreen);
} }
@SuppressWarnings("unchecked")
private SettingsScreen() { private SettingsScreen() {
super(new TabPage[] { super(new TabPage[] {
new SettingsPage(), new SettingsPage(),