mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Support building deck while drafting
This commit is contained in:
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
38
forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java
Normal file
38
forge-gui-mobile/src/forge/screens/draft/DraftMainPage.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user