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/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

View File

@@ -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<T extends TabPageScreen<T>> extends FScreen {
protected final TabPage<T>[] tabPages;
private TabPage<T> selectedPage;
public TabPageScreen(TabPage[] tabPages0) {
super(new TabHeader(tabPages0));
@SuppressWarnings("unchecked")
public TabPageScreen(TabPage<T>[] tabPages0) {
super(new TabHeader<T>(tabPages0));
tabPages = tabPages0;
for (TabPage tabPage : tabPages) {
tabPage.parentScreen = this;
for (TabPage<T> tabPage : tabPages) {
tabPage.parentScreen = (T)this;
add(tabPage);
tabPage.setVisible(false);
}
setSelectedPage(tabPages[0]);
}
public TabPage getSelectedPage() {
public TabPage<T> getSelectedPage() {
return selectedPage;
}
public void setSelectedPage(TabPage tabPage0) {
public void setSelectedPage(TabPage<T> 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<T> tabPage : tabPages) {
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 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<T>[] 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<T> 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<T extends TabPageScreen<T>> 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;

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

View File

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

View File

@@ -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<DraftingProcessScreen> {
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<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
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" +
"Leave anyway?", "Leave Draft?", "Leave", "Cancel", false, canCloseCallback);
}

View File

@@ -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<SettingsScreen> {
private final FGroupList<FilesItem> lstItems = add(new FGroupList<FilesItem>());
protected FilesPage() {

View File

@@ -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<SettingsScreen> {
protected HelpPage() {
super("Help", FSkinImage.UNKNOWN);

View File

@@ -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<SettingsScreen> {
private final FGroupList<Setting> lstSettings = add(new FGroupList<Setting>());
public SettingsPage() {

View File

@@ -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<SettingsScreen> {
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(),