diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index 9f716df533a..04bd308dfc5 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -30,7 +30,8 @@ public class FSkin { private static final Map images = new HashMap<>(512); private static final Map avatars = new HashMap<>(150); private static final Map sleeves = new HashMap<>(64); - private static final Map borders = new HashMap<>(2); + private static final Map borders = new HashMap<>(); + private static final Map deckbox = new HashMap<>(); private static Array allSkins; private static FileHandle preferredDir; @@ -196,6 +197,7 @@ public class FSkin { final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE); final FileHandle f11 = getSkinFile(ForgeConstants.SPRITE_BUTTONS_FILE); final FileHandle f12 = getSkinFile(ForgeConstants.SPRITE_START_FILE); + final FileHandle f13 = getDefaultSkinFile(ForgeConstants.SPRITE_DECKBOX_FILE); try { textures.put(f1.path(), new Texture(f1)); @@ -331,10 +333,18 @@ public class FSkin { FSkin.sleeves.put(scount++, new TextureRegion(txDefaultSleeves, i, j, 360, 500)); } } - + //borders Texture bordersBW = new Texture(f10); FSkin.borders.put(0, new TextureRegion(bordersBW, 2, 2, 672, 936)); FSkin.borders.put(1, new TextureRegion(bordersBW, 676, 2, 672, 936)); + //deckboxes + Texture deckboxes = new Texture(f13); + //gold bg + FSkin.deckbox.put(0, new TextureRegion(deckboxes, 2, 2, 488, 680)); + //deck box for card art + FSkin.deckbox.put(1, new TextureRegion(deckboxes, 492, 2, 488, 680)); + //generic deck box + FSkin.deckbox.put(2, new TextureRegion(deckboxes, 982, 2, 488, 680)); preferredIcons.dispose(); pxDefaultAvatars.dispose(); @@ -430,5 +440,9 @@ public class FSkin { return borders; } + public static Map getDeckbox() { + return deckbox; + } + public static boolean isLoaded() { return loaded; } } diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 36378199774..04f91ec73b9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -63,6 +63,7 @@ public class FDeckChooser extends FScreen { private Callback callback; private NetDeckCategory netDeckCategory; private boolean refreshingDeckType; + private boolean firstactivation = true; private final DeckManager lstDecks; private final FButton btnNewDeck = new FButton(Localizer.getInstance().getMessage("lblNewDeck")); @@ -226,6 +227,11 @@ public class FDeckChooser extends FScreen { @Override public void onActivate() { + //todo investigate why if we don't override, it will display blank for deckview when first activated + if(isAi() && firstactivation) { + needRefreshOnActivate = true; + firstactivation = false; + } if (needRefreshOnActivate) { needRefreshOnActivate = false; refreshDecksList(selectedDeckType, true, null); diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index d061dbc78e1..2986286479b 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -1,17 +1,22 @@ package forge.itemmanager.views; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import forge.Forge; import forge.Forge.KeyInputAdapter; import forge.Graphics; import forge.assets.FImage; +import forge.assets.FImageComplex; +import forge.assets.FSkin; import forge.assets.FSkinColor; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.assets.FSkinFont; import forge.assets.ImageCache; +import forge.card.CardFaceSymbols; import forge.card.CardRenderer; import forge.card.CardRenderer.CardStackPosition; import forge.card.CardZoom; +import forge.card.ColorSet; import forge.deck.ArchetypeDeckGenerator; import forge.deck.CardThemedDeckGenerator; import forge.deck.CommanderDeckGenerator; @@ -869,7 +874,7 @@ public class ImageView extends ItemView { ItemInfo item = getItemAtPoint(x + getLeft(), y + getTop()); if (item != null) { if(item.getKey() instanceof CardThemedDeckGenerator || item.getKey() instanceof CommanderDeckGenerator - || item.getKey() instanceof ArchetypeDeckGenerator){ + || item.getKey() instanceof ArchetypeDeckGenerator || item.getKey() instanceof DeckProxy){ FDeckViewer.show(((DeckProxy)item.getKey()).getDeck()); return true; } @@ -922,6 +927,7 @@ public class ImageView extends ItemView { private int index; private CardStackPosition pos; private boolean selected; + private final float IMAGE_SIZE = CardRenderer.MANA_SYMBOL_SIZE; private ItemInfo(T item0, Group group0) { item = item0; @@ -955,7 +961,8 @@ public class ImageView extends ItemView { final float w = getWidth(); final float h = getHeight(); - if (selected) { //if round border is enabled, the select highlight is also rounded.. + if (selected) { + //if round border is enabled, the select highlight is also rounded.. if (Forge.enableUIMask) { //fillroundrect has rough/aliased corner g.fillRoundRect(Color.GREEN, x - SEL_BORDER_SIZE, y - SEL_BORDER_SIZE, @@ -970,14 +977,56 @@ public class ImageView extends ItemView { } if (item instanceof PaperCard) { - CardRenderer.drawCard(g, (PaperCard)item, x, y, w, h, pos); - } - else { + CardRenderer.drawCard(g, (PaperCard) item, x, y, w, h, pos); + } else if (item instanceof DeckProxy) { + DeckProxy dp = ((DeckProxy) item); + ColorSet deckColor = dp.getColor(); + float scale = 0.75f; + Texture img = ImageCache.getImage(item); + if (img != null) {//generated decks have missing info... + if (Forge.enableUIMask){ + //commander bg + g.drawImage(FSkin.getDeckbox().get(0),x, y, w, h); + TextureRegion tr = ImageCache.croppedBorderImage(img); + g.drawImage(tr, x+(w-w*scale)/2, y+(h-h*scale)/1.5f, w*scale, h*scale); + } else { + g.drawImage(img, x, y, w, h); + } + g.drawText(item.getName(), GROUP_HEADER_FONT, Color.WHITE, x + PADDING, y + PADDING*2, w - 2 * PADDING, h - 2 * PADDING, true, Align.center, false); + } else { + if (!dp.isGeneratedDeck()){ + FImageComplex card = CardRenderer.getCardArt(dp.getHighestCMCCard().getImageKey(false), false, false, false); + if (card != null){ + //card art + card.draw(g, x+((w-w*scale)/2), y+((h-h*scale)/0.75f), w*scale, h*scale/1.85f); + //deck box + g.drawImage(FSkin.getDeckbox().get(1),x, y, w, h); + } + } else { + //generic box + g.drawImage(FSkin.getDeckbox().get(2),x, y, w, h); + } + if (deckColor != null && Forge.isLandscapeMode()) { //todo scale mana icons for decks on portrait mode + //deck color identity + float symbolSize = IMAGE_SIZE; + if (columnCount == 4) + symbolSize = IMAGE_SIZE * 1.25f; + else if (columnCount == 3) + symbolSize = IMAGE_SIZE * 1.5f; + else if (columnCount == 2) + symbolSize = IMAGE_SIZE * 1.75f; + else if (columnCount == 1) + symbolSize = IMAGE_SIZE * 2f; + CardFaceSymbols.drawColorSet(g, deckColor, x +((w/2) - (CardFaceSymbols.getWidth(deckColor, symbolSize)/1.9f)), y + (h*0.8f), symbolSize); + } + //deck name + g.drawText(item.getName(), GROUP_HEADER_FONT, Color.WHITE, x + PADDING, y + (h/16) + PADDING, w - 2 * PADDING, h - 2 * PADDING, true, Align.center, false); + } + } else { Texture img = ImageCache.getImage(item); if (img != null) { g.drawImage(img, x, y, w, h); - } - else { + } else { g.fillRect(Color.BLACK, x, y, w, h); g.drawText(item.getName(), GROUP_HEADER_FONT, Color.WHITE, x + PADDING, y + PADDING, w - 2 * PADDING, h - 2 * PADDING, true, Align.center, false); } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index 239baa355d3..92953a47b3d 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -101,17 +101,22 @@ public class ConquestRewardDialog extends FScrollPane { float startX = x; int cardCount = cardRevealers.size(); - cardRevealers.get(0).setBounds(x, y, cardWidth, cardHeight); - for (int i = 1; i < cardCount; i++) { - if (i % columnCount == 0) { - x = startX; - y += cardHeight + PADDING; + try { + cardRevealers.get(0).setBounds(x, y, cardWidth, cardHeight); + for (int i = 1; i < cardCount; i++) { + if (i % columnCount == 0) { + x = startX; + y += cardHeight + PADDING; + } + else { + x += cardWidth + PADDING; + } + cardRevealers.get(i).setBounds(x, y, cardWidth, cardHeight); } - else { - x += cardWidth + PADDING; - } - cardRevealers.get(i).setBounds(x, y, cardWidth, cardHeight); + } catch (Exception ex) { + System.err.println(ex.getMessage()); } + return new ScrollBounds(visibleWidth, y + cardHeight + PADDING); } diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index 96e19487634..cef977a37fb 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -13,10 +13,13 @@ import forge.assets.FSkinProp; import forge.assets.IHasSkinProp; import forge.assets.TextRenderer; import forge.assets.FSkinColor.Colors; +import forge.card.CardFaceSymbols; import forge.card.CardRenderer; import forge.card.CardZoom; import forge.card.CardRenderer.CardStackPosition; import forge.card.CardZoom.ActivateHandler; +import forge.card.mana.ManaCost; +import forge.card.mana.ManaCostParser; import forge.game.card.CardView; import forge.game.card.IHasCardView; import forge.game.player.PlayerView; @@ -29,8 +32,11 @@ import forge.itemmanager.filters.ItemFilter; import forge.screens.match.MatchController; import forge.screens.match.views.VAvatar; import forge.screens.match.views.VStack; +import forge.util.TextUtil; import forge.util.Utils; +import static forge.card.CardRenderer.MANA_SYMBOL_SIZE; + public class FChoiceList extends FList implements ActivateHandler { public static final FSkinColor ITEM_COLOR = FSkinColor.get(Colors.CLR_ZEBRA); public static final FSkinColor ALT_ITEM_COLOR = ITEM_COLOR.getContrastColor(-20); @@ -337,7 +343,17 @@ public class FChoiceList extends FList implements ActivateHandler { @Override public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { - g.drawText(getChoiceText(value), font, foreColor, x, y, w, h, allowDefaultItemWrap(), Align.left, true); + //update manacost text to draw symbols instead + if (value.toString().contains(" {")){ + String[] values = value.toString().split(" "); + String cost = TextUtil.fastReplace(values[1],"}{", " "); + cost = TextUtil.fastReplace(TextUtil.fastReplace(cost,"{", ""),"}", ""); + ManaCost manaCost = new ManaCost(new ManaCostParser(cost)); + CardFaceSymbols.drawManaCost(g, manaCost, x + font.getBounds(values[0]+" ").width, y + (h - MANA_SYMBOL_SIZE) / 2, MANA_SYMBOL_SIZE); + g.drawText(values[0], font, foreColor, x, y, w, h, allowDefaultItemWrap(), Align.left, true); + } else { + g.drawText(getChoiceText(value), font, foreColor, x, y, w, h, allowDefaultItemWrap(), Align.left, true); + } } } protected class NumberRenderer extends DefaultItemRenderer { diff --git a/forge-gui/res/skins/darkforge/sprite_avatars.png b/forge-gui/res/skins/darkforge/sprite_avatars.png new file mode 100644 index 00000000000..12dbcbb61ed Binary files /dev/null and b/forge-gui/res/skins/darkforge/sprite_avatars.png differ diff --git a/forge-gui/res/skins/default/sprite_deckbox.png b/forge-gui/res/skins/default/sprite_deckbox.png new file mode 100644 index 00000000000..3257bef98d9 Binary files /dev/null and b/forge-gui/res/skins/default/sprite_deckbox.png differ diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 01e46db5ecf..85941f113f3 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -1,11 +1,15 @@ package forge.deck; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.Map.Entry; +import forge.card.CardSplitType; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Function; @@ -260,6 +264,29 @@ public class DeckProxy implements InventoryItem { return highestRarity; } + public PaperCard getHighestCMCCard() { + PaperCard key = null; + Map keyCMC = new HashMap<>(64); + + for (final Entry pc : getDeck().getAllCardsInASinglePool()) { + if (pc.getKey().getRules().getManaCost() != null) { + if (pc.getKey().getRules().getSplitType() != CardSplitType.Split) + keyCMC.put(pc.getKey(),pc.getKey().getRules().getManaCost().getCMC()); + } + } + + if (!keyCMC.isEmpty()) { + int max = Collections.max(keyCMC.values()); + //get any max cmc + for (Entry entry : keyCMC.entrySet()) { + if (entry.getValue()==max) { + return entry.getKey(); + } + } + } + return key; + } + public Set getFormats() { if (formats == null) { formats = FModel.getFormats().getAllFormatsOfDeck(getDeck()); diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index bf1de97acb9..7834cdb58cf 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -100,6 +100,7 @@ public final class ForgeConstants { public static final String SPRITE_ABILITY_FILE = "sprite_ability.png"; public static final String SPRITE_BORDER_FILE = "sprite_border.png"; public static final String SPRITE_BUTTONS_FILE = "sprite_buttons.png"; + public static final String SPRITE_DECKBOX_FILE = "sprite_deckbox.png"; public static final String SPRITE_START_FILE = "sprite_start.png"; public static final String SPRITE_MANAICONS_FILE = "sprite_manaicons.png"; public static final String SPRITE_AVATARS_FILE = "sprite_avatars.png";