Draft Ranking on ImageView

- add an option to show draft card rankings
This commit is contained in:
Anthony Calosa
2022-02-11 14:12:44 +08:00
parent cde13348d6
commit 1eb4aa5647
40 changed files with 203 additions and 55 deletions

View File

@@ -58,10 +58,10 @@ public class FDeckViewer extends FDialog {
private FDeckViewer(final Deck deck0) {
this.deck = deck0;
this.setTitle(deck.getName());
this.cardManager = new CardManager(null, false, false) {
this.cardManager = new CardManager(null, false, false, false) {
@Override //show hovered card in Image View in dialog instead of main Detail/Picture panes
protected ImageView<PaperCard> createImageView(final ItemManagerModel<PaperCard> model0) {
return new ImageView<PaperCard>(this, model0) {
return new ImageView<PaperCard>(this, model0, false) {
@Override
protected void showHoveredItem(PaperCard item) {
final CardView card = CardView.getCardForUi(item);

View File

@@ -34,8 +34,8 @@ public class CardManager extends ItemManager<PaperCard> {
private boolean QuestMode;
public CardManager(final CDetailPicture cDetailPicture, final boolean wantUnique0, final boolean qm) {
super(PaperCard.class, cDetailPicture, wantUnique0);
public CardManager(final CDetailPicture cDetailPicture, final boolean wantUnique0, final boolean qm, boolean sr) {
super(PaperCard.class, cDetailPicture, wantUnique0, sr);
QuestMode = qm;
}

View File

@@ -68,7 +68,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
* @param gt
*/
public DeckManager(final GameType gt, final CDetailPicture cDetailPicture) {
super(DeckProxy.class, cDetailPicture, true);
super(DeckProxy.class, cDetailPicture, true, false);
this.gameType = gt;
this.addSelectionListener(new ListSelectionListener() {

View File

@@ -73,6 +73,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel implem
private boolean alwaysNonUnique = false;
private boolean allowMultipleSelections = false;
private boolean hideFilters = false;
private boolean showRanking = false;
private UiCommand itemActivateCommand;
private ContextMenuBuilder contextMenuBuilder;
private final Class<T> genericType;
@@ -125,7 +126,8 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel implem
/**
* ItemManager Constructor
*/
protected ItemManager(final Class<T> genericType0, final CDetailPicture cDetailPicture, final boolean wantUnique0) {
protected ItemManager(final Class<T> genericType0, final CDetailPicture cDetailPicture, final boolean wantUnique0, final boolean showRanking) {
this.showRanking = showRanking;
this.cDetailPicture = cDetailPicture;
this.genericType = genericType0;
this.wantUnique = wantUnique0;
@@ -143,7 +145,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel implem
}
protected ImageView<T> createImageView(final ItemManagerModel<T> model0) {
return new ImageView<>(this, model0);
return new ImageView<>(this, model0, this.showRanking);
}
public final CDetailPicture getCDetailPicture() {

View File

@@ -17,7 +17,7 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
private final boolean wantUnique02;
public SpellShopManager(final CDetailPicture cDetailPicture, final boolean wantUnique0) {
super(InventoryItem.class, cDetailPicture, wantUnique0);
super(InventoryItem.class, cDetailPicture, wantUnique0, false);
cDetailPicture2 = cDetailPicture;
wantUnique02 = wantUnique0;
}
@@ -34,7 +34,7 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
@Override
protected void buildAddFilterMenu(JMenu menu) {
CardManager CM = new CardManager(cDetailPicture2, wantUnique02, true);
CardManager CM = new CardManager(cDetailPicture2, wantUnique02, true, false);
CM.buildAddFilterMenu(menu, this);
}
}

View File

@@ -9,7 +9,7 @@ import forge.screens.match.controllers.CDetailPicture;
public class TokenManager extends ItemManager<PaperToken> {
public TokenManager(final CDetailPicture cDetailPicture, final boolean wantUnique0) {
super(PaperToken.class, cDetailPicture, wantUnique0);
super(PaperToken.class, cDetailPicture, wantUnique0, false);
}
@Override

View File

@@ -6,6 +6,7 @@ import forge.deck.DeckProxy;
import forge.deck.io.DeckPreferences;
import forge.game.card.Card;
import forge.game.card.CardView;
import forge.gamemodes.limited.CardRanker;
import forge.gui.framework.ILocalRepaint;
import forge.item.IPaperCard;
import forge.item.InventoryItem;
@@ -145,7 +146,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
private final FComboBoxWrapper<Object> cbPileByOptions = new FComboBoxWrapper<>();
private final FComboBoxWrapper<Integer> cbColumnCount = new FComboBoxWrapper<>();
public ImageView(final ItemManager<T> itemManager0, final ItemManagerModel<T> model0) {
public ImageView(final ItemManager<T> itemManager0, final ItemManagerModel<T> model0, final boolean showRanking) {
super(itemManager0, model0);
SItemManagerUtil.populateImageViewOptions(itemManager0, cbGroupByOptions, cbPileByOptions);
@@ -192,6 +193,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
//setup display
display = new CardViewDisplay();
display.setShowRanking(showRanking);
display.addMouseListener(new FMouseAdapter() {
@Override
public void onLeftMouseDown(MouseEvent e) {
@@ -1000,11 +1002,16 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
@SuppressWarnings("serial")
private class CardViewDisplay extends JPanel implements ILocalRepaint {
boolean showRanking = false;
private CardViewDisplay() {
setOpaque(false);
setFocusable(true);
}
public void setShowRanking(boolean showRanking) {
this.showRanking = showRanking;
}
@Override
public void repaintSelf() {
repaint(getVisibleRect());
@@ -1223,6 +1230,32 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
}
CardPanel.drawFoilEffect(g, card, bounds.x, bounds.y, bounds.width, bounds.height, borderSize);
}
//draw draft ranking
if (showRanking && FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_OVERLAY_DRAFT_RANKING)) {
double score = CardRanker.getRawScore((PaperCard) item);
int draftRank = score <= 0 ? 0 : score > 99 ? 99 : (int) Math.round(CardRanker.getRawScore((PaperCard) item));
String value = String.valueOf(draftRank);
g.setColor(Color.white);
Shape clip = g.getClip();
g.setClip(bounds);
int scale = (int)(g.getFontMetrics().getHeight()*3.5f);
int h = (int)(g.getFontMetrics().getHeight()/3.5f);
int w = g.getFontMetrics().stringWidth(value);
int x = (int)(bounds.x+bounds.width/2);
int y = (int)(bounds.y+bounds.height/2);
if (draftRank >= 90)
FSkin.drawImage(g, FSkin.getImage(FSkinProp.IMG_DRAFTRANK_S), x-scale/2, y-h-scale/2, scale, scale);
else if (draftRank >= 80 && draftRank <= 89)
FSkin.drawImage(g, FSkin.getImage(FSkinProp.IMG_DRAFTRANK_A), x-scale/2, y-h-scale/2, scale, scale);
else if (draftRank >= 60 && draftRank <= 79)
FSkin.drawImage(g, FSkin.getImage(FSkinProp.IMG_DRAFTRANK_B), x-scale/2, y-h-scale/2, scale, scale);
else if (draftRank >= 25 && draftRank <= 59)
FSkin.drawImage(g, FSkin.getImage(FSkinProp.IMG_DRAFTRANK_C), x-scale/2, y-h-scale/2, scale, scale);
else
FSkin.drawImage(g, FSkin.getImage(FSkinProp.IMG_DRAFTRANK_D), x-scale/2, y-h-scale/2, scale, scale);
g.drawString(value, x-w/2, y);
g.setClip(clip);
}
}
}
}

View File

@@ -104,8 +104,8 @@ public final class CEditorCommander extends CDeckEditor<Deck> {
customCards.getAllCardsNoAlt()), PaperCard.class);
}
CardManager catalogManager = new CardManager(getCDetailPicture(), true, false);
CardManager deckManager = new CardManager(getCDetailPicture(), false, false);
CardManager catalogManager = new CardManager(getCDetailPicture(), true, false, false);
CardManager deckManager = new CardManager(getCDetailPicture(), false, false, false);
deckManager.setAlwaysNonUnique(true);
catalogManager.setCaption("Catalog");

View File

@@ -131,8 +131,8 @@ public final class CEditorConstructed extends CDeckEditor<Deck> {
default:
}
catalogManager = new CardManager(getCDetailPicture(), wantUnique, false);
deckManager = new CardManager(getCDetailPicture(), false, false);
catalogManager = new CardManager(getCDetailPicture(), wantUnique, false, false);
deckManager = new CardManager(getCDetailPicture(), false, false, false);
deckManager.setAlwaysNonUnique(true);
final Localizer localizer = Localizer.getInstance();

View File

@@ -76,8 +76,8 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
public CEditorDraftingProcess(final CDetailPicture cDetailPicture0) {
super(FScreen.DRAFTING_PROCESS, cDetailPicture0, GameType.Draft);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false, true);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false, true);
//hide filters and options panel so more of pack is visible by default
catalogManager.setHideViewOptions(1, true);

View File

@@ -85,8 +85,8 @@ public final class CEditorLimited extends CDeckEditor<DeckGroup> {
public CEditorLimited(final IStorage<DeckGroup> deckMap0, final FScreen screen0, final CDetailPicture cDetailPicture0) {
super(screen0, cDetailPicture0, GameType.Sealed);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false, FScreen.DECK_EDITOR_DRAFT.equals(screen0));
final CardManager deckManager = new CardManager(cDetailPicture0, false, false, FScreen.DECK_EDITOR_DRAFT.equals(screen0));
catalogManager.setCaption("Sideboard");

View File

@@ -123,8 +123,8 @@ public final class CEditorQuest extends CDeckEditor<Deck> {
this.questData = questData0;
final CardManager catalogManager = new CardManager(cDetailPicture0, false, true);
final CardManager deckManager = new CardManager(cDetailPicture0, false, true);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, true, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, true, false);
catalogManager.setCaption("Quest Inventory");

View File

@@ -79,8 +79,8 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
public CEditorQuestDraftingProcess(final CDetailPicture cDetailPicture0) {
super(FScreen.DRAFTING_PROCESS, cDetailPicture0, GameType.QuestDraft);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false, true);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false, true);
//hide filters and options panel so more of pack is visible by default
catalogManager.setHideViewOptions(1, true);

View File

@@ -101,8 +101,8 @@ public final class CEditorQuestLimited extends CDeckEditor<DeckGroup> {
this.questData = questData0;
final CardManager catalogManager = new CardManager(cDetailPicture0, false, true);
final CardManager deckManager = new CardManager(cDetailPicture0, false, true);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, true, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, true, false);
catalogManager.setCaption("Sideboard");

View File

@@ -70,8 +70,8 @@ public final class CEditorVariant extends CDeckEditor<Deck> {
this.cardPoolCondition = poolCondition;
this.sectionMode = deckSection0;
final CardManager catalogManager = new CardManager(cDetailPicture0, true, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false);
final CardManager catalogManager = new CardManager(cDetailPicture0, true, false, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false, false);
deckManager.setAlwaysNonUnique(true);
final Localizer localizer = Localizer.getInstance();

View File

@@ -79,8 +79,8 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
public CEditorWinstonProcess(final CDetailPicture cDetailPicture0) {
super(FScreen.DRAFTING_PROCESS, cDetailPicture0, GameType.Draft);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false);
final CardManager catalogManager = new CardManager(cDetailPicture0, false, false, true);
final CardManager deckManager = new CardManager(cDetailPicture0, false, false, true);
//hide filters and options panel so more of pack is visible by default
catalogManager.setHideViewOptions(1, true);

View File

@@ -169,6 +169,7 @@ public enum CSubmenuPreferences implements ICDoc {
lstControls.add(Pair.of(view.getCbLoadCardsLazily(), FPref.LOAD_CARD_SCRIPTS_LAZILY));
lstControls.add(Pair.of(view.getCbLoadHistoricFormats(), FPref.LOAD_HISTORIC_FORMATS));
lstControls.add(Pair.of(view.getCbSmartCardArtSelectionOpt(), FPref.UI_SMART_CARD_ART));
lstControls.add(Pair.of(view.getCbShowDraftRanking(), FPref.UI_OVERLAY_DRAFT_RANKING));
for(final Pair<JCheckBox, FPref> kv : lstControls) {

View File

@@ -118,6 +118,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final JCheckBox cbUseExperimentalNetworkStream = new OptionsCheckBox(localizer.getMessage("lblExperimentalNetworkCompatibility"));
private final JCheckBox cbCardArtCoreExpansionsOnlyOpt = new OptionsCheckBox(localizer.getMessage("lblPrefArtExpansionOnly"));
private final JCheckBox cbSmartCardArtSelectionOpt = new OptionsCheckBox(localizer.getMessage("lblSmartCardArtOpt"));
private final JCheckBox cbShowDraftRanking = new OptionsCheckBox(localizer.getMessage("lblShowDraftRankingOverlay"));
private final Map<FPref, KeyboardShortcutField> shortcutFields = new HashMap<>();
@@ -299,6 +300,10 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSmartCardArtOpt")), "w 80%!, h 22px!, gap 28px 0 0 0, span 2 1");
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSmartCardArtOptNote")), descriptionConstraints);
//Draft Ranking Overlay
pnlPrefs.add(cbShowDraftRanking, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlShowDraftRankingOverlay")), descriptionConstraints);
// Advanced
pnlPrefs.add(new SectionLabel(localizer.getMessage("AdvancedSettings")), sectionConstraints);
@@ -819,6 +824,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbSmartCardArtSelectionOpt() { return cbSmartCardArtSelectionOpt; }
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbShowDraftRanking() { return cbShowDraftRanking; }
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbEnforceDeckLegality() {
return cbEnforceDeckLegality;

View File

@@ -39,7 +39,7 @@ public enum VWorkshopCatalog implements IVDoc<CWorkshopCatalog> {
//========== Constructor
VWorkshopCatalog() {
this.cardManager = new CardManager(cDetailPicture, true, false);
this.cardManager = new CardManager(cDetailPicture, true, false, false);
this.cardManager.setCaption(localizer.getMessage("lblCatalog"));
final Iterable<PaperCard> allCards = Iterables.concat(FModel.getMagicDb().getCommonCards().getAllCardsNoAlt(), FModel.getMagicDb().getVariantCards().getAllCards());
this.cardManager.setPool(ItemPool.createFrom(allCards, PaperCard.class), true);

View File

@@ -1108,7 +1108,8 @@ public class FSkin {
private static String preferredDir;
private static String preferredName;
private static BufferedImage bimDefaultSprite, bimFavIcon, bimPreferredSprite, bimFoils, bimQuestDraftDeck, bimOldFoils,
bimDefaultAvatars, bimPreferredAvatars, bimTrophies, bimAbilities, bimManaIcons, bimPhyrexian, bimDefaultSleeve, bimDefaultSleeve2, bimDefaultDeckbox, bimPrefferedSetLogo, bimDefaultWatermark;
bimDefaultAvatars, bimPreferredAvatars, bimTrophies, bimAbilities, bimManaIcons, bimPhyrexian, bimDefaultSleeve,
bimDefaultSleeve2, bimDefaultDeckbox, bimPrefferedSetLogo, bimDefaultWatermark, bimDefaultDraftRank;
private static int x0, y0, w0, h0, newW, newH, preferredW, preferredH;
private static int[] tempCoords;
private static int defaultFontSize = 12;
@@ -1250,6 +1251,7 @@ public class FSkin {
final File f16 = new File(preferredDir + ForgeConstants.SPRITE_SETLOGO_FILE);
final File f17 = new File(defaultDir + ForgeConstants.SPRITE_WATERMARK_FILE);
final File f18 = new File(defaultDir +ForgeConstants.SPRITE_PHYREXIAN_FILE);
final File f19 = new File(defaultDir + ForgeConstants.SPRITE_DRAFTRANKS_FILE);
try {
int p = 0;
@@ -1275,6 +1277,8 @@ public class FSkin {
FView.SINGLETON_INSTANCE.incrementSplashProgessBar(++p);
bimDefaultDeckbox = ImageIO.read(f14);
FView.SINGLETON_INSTANCE.incrementSplashProgessBar(++p);
bimDefaultDraftRank = ImageIO.read(f19);
FView.SINGLETON_INSTANCE.incrementSplashProgessBar(++p);
bimPrefferedSetLogo = f16.exists() ? ImageIO.read(f16) : ImageIO.read(f15);
FView.SINGLETON_INSTANCE.incrementSplashProgessBar(++p);
bimDefaultWatermark = ImageIO.read(f17);
@@ -1346,6 +1350,9 @@ public class FSkin {
case DECKBOX:
setImage(prop, bimDefaultDeckbox);
break;
case DRAFTRANKS:
setImage(prop, bimDefaultDraftRank);
break;
case SETLOGO:
setImage(prop, bimPrefferedSetLogo);
break;
@@ -1375,6 +1382,7 @@ public class FSkin {
bimDefaultSleeve.flush();
bimDefaultSleeve2.flush();
bimDefaultDeckbox.flush();
bimDefaultDraftRank.flush();
bimPrefferedSetLogo.flush();
bimDefaultWatermark.flush();
bimQuestDraftDeck.flush();
@@ -1393,6 +1401,7 @@ public class FSkin {
bimDefaultSleeve = null;
bimDefaultSleeve2 = null;
bimDefaultDeckbox = null;
bimDefaultDraftRank = null;
bimPrefferedSetLogo = null;
bimDefaultWatermark = null;
bimPreferredAvatars = null;

View File

@@ -22,6 +22,7 @@ import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.ImageCache;
import forge.error.ExceptionHandler;
import forge.gamemodes.limited.BoosterDraft;
import forge.gui.FThreads;
import forge.gui.GuiBase;
import forge.gui.error.BugReporter;
@@ -221,6 +222,7 @@ public class Forge implements ApplicationListener {
/* call preloadExtendedArt here, if we put it above we will *
* get error: No OpenGL context found in the current thread. */
preloadExtendedArt();
preloadBoosterDrafts();
}
});
}
@@ -250,7 +252,10 @@ public class Forge implements ApplicationListener {
if (!filteredkeys.isEmpty())
ImageCache.preloadCache(filteredkeys);
}
private void preloadBoosterDrafts() {
//preloading of custom drafts
BoosterDraft.initializeCustomDrafts();
}
public static void openHomeScreen(int index, FScreen lastMatch) {
openScreen(HomeScreen.instance);
HomeScreen.instance.openMenu(index);

View File

@@ -125,6 +125,13 @@ public enum FSkinImage implements FImage {
WATERMARK_W (FSkinProp.IMG_WATERMARK_W, SourceFile.WATERMARKS),
WATERMARK_C (FSkinProp.IMG_WATERMARK_C, SourceFile.WATERMARKS),
//draft ranks
DRAFTRANK_D (FSkinProp.IMG_DRAFTRANK_D, SourceFile.DRAFTRANKS),
DRAFTRANK_C (FSkinProp.IMG_DRAFTRANK_C, SourceFile.DRAFTRANKS),
DRAFTRANK_B (FSkinProp.IMG_DRAFTRANK_B, SourceFile.DRAFTRANKS),
DRAFTRANK_A (FSkinProp.IMG_DRAFTRANK_A, SourceFile.DRAFTRANKS),
DRAFTRANK_S (FSkinProp.IMG_DRAFTRANK_S, SourceFile.DRAFTRANKS),
//CardBG
CARDBG_A (FSkinProp.IMG_CARDBG_A, SourceFile.CARDBG),
CARDBG_B (FSkinProp.IMG_CARDBG_B, SourceFile.CARDBG),
@@ -497,6 +504,7 @@ public enum FSkinImage implements FImage {
PHYREXIAN(ForgeConstants.SPRITE_PHYREXIAN_FILE),
SETLOGOS(ForgeConstants.SPRITE_SETLOGO_FILE),
WATERMARKS(ForgeConstants.SPRITE_WATERMARK_FILE),
DRAFTRANKS(ForgeConstants.SPRITE_DRAFTRANKS_FILE),
CRACKS(ForgeConstants.SPRITE_CRACKS_FILE),
CARDBG(ForgeConstants.SPRITE_CARDBG_FILE),
PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE);

View File

@@ -162,7 +162,7 @@ public class FDeckChooser extends FScreen {
&& selectedDeckType != DeckType.VINTAGE_CARDGEN_DECK && selectedDeckType != DeckType.MODERN_COLOR_DECK &&
selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK
&& selectedDeckType != DeckType.RANDOM_COMMANDER_DECK && selectedDeckType != DeckType.RANDOM_CARDGEN_COMMANDER_DECK) {
FDeckViewer.show(getDeck());
FDeckViewer.show(getDeck(), false, DeckType.DRAFT_DECK.equals(selectedDeckType));
}
}
});

View File

@@ -682,6 +682,15 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
return false;
}
}
protected boolean isDraftEditor() {
switch (editorType) {
case Draft:
case QuestDraft:
return true;
default:
return false;
}
}
public static boolean allowsReplacement(final EditorType editorType){
switch (editorType) {
@@ -766,6 +775,9 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
CardManagerPage.this.buildMenu(menu, card);
}
});
cardManager.setShowRanking(ItemManagerConfig.DRAFT_CONSPIRACY.equals(config0)
|| ItemManagerConfig.DRAFT_PACK.equals(config0) || ItemManagerConfig.DRAFT_POOL.equals(config0)
|| ItemManagerConfig.DRAFT_DECKS.equals(config0) || (parentScreen != null && parentScreen.isDraftEditor()));
}
protected void initialize() {
@@ -773,6 +785,9 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
cardManager.setup(config);
else //fix planar conquest deck editor and maybe others...
cardManager.setup(config, parentScreen.getColOverrides(config));
cardManager.setShowRanking(ItemManagerConfig.DRAFT_CONSPIRACY.equals(config)
|| ItemManagerConfig.DRAFT_PACK.equals(config) || ItemManagerConfig.DRAFT_POOL.equals(config)
|| ItemManagerConfig.DRAFT_DECKS.equals(config) || (parentScreen != null && parentScreen.isDraftEditor()));
}
protected boolean canAddCards() {
@@ -1695,6 +1710,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
int packNumber = draft.getCurrentBoosterIndex() + 1;
caption = Localizer.getInstance().getMessage("lblPackN", String.valueOf(packNumber));
cardManager.setPool(pool);
cardManager.setShowRanking(true);
}
@Override

View File

@@ -114,9 +114,12 @@ public class FDeckViewer extends FScreen {
private DeckSection currentSection;
public static void show(final Deck deck0) {
show(deck0, false);
show(deck0, false, false);
}
public static void show(final Deck deck0, boolean noPreload) {
show(deck0, noPreload, false);
}
public static void show(final Deck deck0, boolean noPreload, boolean showRanking) {
if (deck0 == null) { return; }
if (!noPreload){
@@ -124,12 +127,12 @@ public class FDeckViewer extends FScreen {
ImageCache.preloadCache(deck0);
}
deckViewer = new FDeckViewer(deck0);
deckViewer = new FDeckViewer(deck0, showRanking);
deckViewer.setRotate180(MatchController.getView() != null && MatchController.getView().isTopHumanPlayerActive());
Forge.openScreen(deckViewer);
}
private FDeckViewer(Deck deck0) {
private FDeckViewer(Deck deck0, boolean showRanking) {
super(new MenuHeader(deck0.getName(), menu) {
@Override
protected boolean displaySidebarForLandscapeMode() {
@@ -139,6 +142,7 @@ public class FDeckViewer extends FScreen {
deck = deck0;
cardManager = new CardManager(false);
cardManager.setPool(deck.getMain());
cardManager.setShowRanking(showRanking);
currentSection = DeckSection.Main;
updateCaption();

View File

@@ -74,6 +74,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
private final List<ItemFilter<? extends T>> filters = new ArrayList<>();
private boolean hideFilters = false;
private boolean wantUnique = false;
private boolean showRanking = false;
private boolean multiSelectMode = false;
private FEventHandler selectionChangedHandler, itemActivateHandler;
private ContextMenuBuilder<T> contextMenuBuilder;
@@ -820,10 +821,18 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
return wantUnique;
}
public boolean getShowRanking() {
return showRanking;
}
public void setWantUnique(boolean unique) {
wantUnique = unique;
}
public void setShowRanking(boolean showRanking0) {
showRanking = showRanking0;
}
public void setSelectionSupport(int minSelections0, int maxSelections0) {
for (ItemView<T> view : views) {
view.setSelectionSupport(minSelections0, maxSelections0);

View File

@@ -17,11 +17,14 @@ import forge.card.CardRenderer.CardStackPosition;
import forge.deck.*;
import forge.deck.io.DeckPreferences;
import forge.game.card.CardView;
import forge.gamemodes.limited.CardRanker;
import forge.gamemodes.planarconquest.ConquestCommander;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.itemmanager.*;
import forge.itemmanager.filters.ItemFilter;
import forge.localinstance.properties.ForgePreferences;
import forge.model.FModel;
import forge.toolbox.*;
import forge.toolbox.FEvent.FEventHandler;
import forge.util.ImageUtil;
@@ -985,6 +988,26 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
if (item instanceof PaperCard) {
CardRenderer.drawCard(g, (PaperCard) item, x, y, w, h, pos);
if (itemManager.getShowRanking() && FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_OVERLAY_DRAFT_RANKING)) {
double score = CardRanker.getRawScore((PaperCard) item);
int draftRank = score <= 0 ? 0 : score > 99 ? 99 : (int) Math.round(CardRanker.getRawScore((PaperCard) item));
float rankSize = w/2;
float y2 = y+(rankSize-(rankSize*0.1f));
float x2 = x+rankSize/2;
if (draftRank >= 90) {
g.drawImage(FSkinImage.DRAFTRANK_S, x2, y2+1, rankSize, rankSize);
} else if (draftRank >= 80 && draftRank <= 89 ) {
g.drawImage(FSkinImage.DRAFTRANK_A, x2, y2+1, rankSize, rankSize);
} else if (draftRank >= 60 && draftRank <= 79 ) {
g.drawImage(FSkinImage.DRAFTRANK_B, x2, y2+1, rankSize, rankSize);
} else if (draftRank >= 25 && draftRank <= 59 ) {
g.drawImage(FSkinImage.DRAFTRANK_C, x2, y2+1, rankSize, rankSize);
} else {
g.drawImage(FSkinImage.DRAFTRANK_D, x2, y2+1, rankSize, rankSize);
}
String value = String.valueOf(draftRank);
g.drawText(value, FSkinFont.forHeight(rankSize/4), Color.WHITE, x, y, w, h, true, Align.center, true);
}
} else if (item instanceof ConquestCommander) {
CardRenderer.drawCard(g, ((ConquestCommander) item).getCard(), x, y, w, h, pos);
} else if (deckSelectMode) {

View File

@@ -595,13 +595,17 @@ public class SettingsPage extends TabPage<SettingsScreen> {
localizer.getMessage("lblShowCardIDOverlays"),
localizer.getMessage("nlShowCardIDOverlays")),
5);
lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_DRAFT_RANKING,
localizer.getMessage("lblShowDraftRankingOverlay"),
localizer.getMessage("nlShowDraftRankingOverlay")),
5);
lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_ABILITY_ICONS,
localizer.getMessage("lblShowAbilityIconsOverlays"),
localizer.getMessage("nlShowAbilityIconsOverlays")),
5);
lstSettings.addItem(new BooleanSetting(FPref.UI_USE_LASER_ARROWS,
localizer.getMessage("lblUseLaserArrows"),
localizer.getMessage("nlUseLaserArrows")),
localizer.getMessage("lblUseLaserArrows"),
localizer.getMessage("nlUseLaserArrows")),
5);
//Vibration Options
lstSettings.addItem(new BooleanSetting(FPref.UI_VIBRATE_ON_LIFE_LOSS,

View File

@@ -66,7 +66,7 @@ Name=Adam Styborkski's Pauper Cube
1 Clutch of Currents|BFZ
1 Coalition Honor Guard|EMA
1 Colossal Might|ARB
1 Common Iguana
1 Common Iguana|UST
1 Compulsive Research|STA
1 Compulsory Rest|AKR
1 Consume Strength|APC

View File

@@ -1044,6 +1044,8 @@ nlShowMatchBackground=Zeige Bilder im Spielfeldhintergrund.
nlTheme=Wähle ein Thema um die Bildschirmanzeigen anzupassen.
nlVibrateAfterLongPress=Aktiviert Vibration bei langem Druck, z.B. beim Zoomen.
nlVibrateWhenLosingLife=Aktiviert Vibration bei Lebenspunktverlust.
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=Rand-Masken-Option
nlBorderMaskOption=Wendet die gewählte Option auf die Kartenbilder an (Im Zweifel wähle Beschneiden/Crop).
lblEnableRoundBorder=Aktiviere Maske mit runden Ränder

View File

@@ -1045,6 +1045,8 @@ nlShowMatchBackground=Show match background image on battlefield, otherwise back
nlTheme=Sets the theme that determines how display components are skinned.
nlVibrateAfterLongPress=Enable quick vibration to signify a long press, such as for card zooming.
nlVibrateWhenLosingLife=Enable vibration when your player loses life or takes damage during a game.
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=Border Mask Option
nlBorderMaskOption=Applies the selected border option for card images (If unsure, choose Crop).
lblEnableRoundBorder=Enable Round Border Mask

View File

@@ -1044,6 +1044,8 @@ nlShowMatchBackground=Muestra la imagen de fondo de la partida en el campo de ba
nlTheme=Establece el tema que determina el aspecto global del juego.
nlVibrateAfterLongPress=Habilita la vibración rápida cuando se realice una pulsación prolongada, como p.ej. al realizar zoom de la carta.
nlVibrateWhenLosingLife=Habilita la vibración cuando tu jugador pierde vidas o sufre daños.
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=Opción de máscara de borde
nlBorderMaskOption=Aplica la opción de borde seleccionada para las imágenes de las cartas (si no estás seguro, elige Crop).
lblEnableRoundBorder=Habilitar máscara de bordes redondeados

View File

@@ -1043,6 +1043,8 @@ nlShowMatchBackground=Mostra l''immagine di sfondo dell''incontro sul campo di b
nlTheme=Imposta il tema che determina l''aspetto visivo dei vari componenti dell''interfaccia.
nlVibrateAfterLongPress=Abilitare una rapida vibrazione per indicare una pressione prolungata, ad esempio quando si ingrandisce una carta.
nlVibrateWhenLosingLife=Attiva le vibrazioni quando il giocatore perde punti vita o subisce danni durante una partita.
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=Opzioni della maschera dei bordi
nlBorderMaskOption=Applica l''opzione selezionata ai bordi delle carte (Nel dubbio, scegli Ritaglia).
lblEnableRoundBorder=Abilita maschera bordi arrotondati

View File

@@ -1045,6 +1045,8 @@ nlShowMatchBackground=戦場の背景画像を常時します。そうでない
nlTheme=UI コンポーネントのスキンを使うテーマを設定します。
nlVibrateAfterLongPress=ズームインとかのために長押した時の振動を有効にします。
nlVibrateWhenLosingLife=プレーヤーがゲーム中にライフを失ったり、ダメージを受けたりした時に振動を有効にします。
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=枠のマスクオプション
nlBorderMaskOption=カード画像の枠に選択したマスクを適用します(分からない場合は Crop にしてください)。
lblEnableRoundBorder=ラウンドボーダーマスクを有効にする

View File

@@ -1045,6 +1045,8 @@ nlShowMatchBackground=在战场显示背景图片,否则显示背景纹理。
nlTheme=设置显示的组件使用的外观主题。
nlVibrateAfterLongPress=启用长按触发震动,例如长按缩放卡牌图片。
nlVibrateWhenLosingLife=启用当玩家在游戏中失去生命或收到伤害时震动。
lblShowDraftRankingOverlay=Show Draft Ranking
nlShowDraftRankingOverlay=Shows the card ranking in Draft Editor.
lblBorderMaskOption=边框遮罩选项
nlBorderMaskOption=将选定的边框选项应用于卡图如果你不清楚该功能的作用请选Crop
lblEnableRoundBorder=启用圆角边框掩码

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

View File

@@ -71,10 +71,13 @@ public class BoosterDraft implements IBoosterDraft {
private int packsInDraft;
private final Map<String, Float> draftPicks = new TreeMap<>();
static final List<CustomLimited> customs = new ArrayList<>();
protected LimitedPoolType draftFormat;
protected final List<Supplier<List<PaperCard>>> product = new ArrayList<>();
public static void initializeCustomDrafts() {
loadCustomDrafts();
}
public static BoosterDraft createDraft(final LimitedPoolType draftType) {
final BoosterDraft draft = new BoosterDraft(draftType);
if (!draft.generateProduct()) {
@@ -297,25 +300,26 @@ public class BoosterDraft implements IBoosterDraft {
* Looks for draft files, reads them, returns a list.
*/
private static List<CustomLimited> loadCustomDrafts() {
String[] dList;
final List<CustomLimited> customs = new ArrayList<>();
if (customs.isEmpty()) {
String[] dList;
// get list of custom draft files
final File dFolder = new File(ForgeConstants.DRAFT_DIR);
if (!dFolder.exists()) {
throw new RuntimeException("BoosterDraft : folder not found -- folder is " + dFolder.getAbsolutePath());
}
// get list of custom draft files
final File dFolder = new File(ForgeConstants.DRAFT_DIR);
if (!dFolder.exists()) {
throw new RuntimeException("BoosterDraft : folder not found -- folder is " + dFolder.getAbsolutePath());
}
if (!dFolder.isDirectory()) {
throw new RuntimeException("BoosterDraft : not a folder -- " + dFolder.getAbsolutePath());
}
if (!dFolder.isDirectory()) {
throw new RuntimeException("BoosterDraft : not a folder -- " + dFolder.getAbsolutePath());
}
dList = dFolder.list();
dList = dFolder.list();
for (final String element : dList) {
if (element.endsWith(FILE_EXT)) {
final List<String> dfData = FileUtil.readFile(ForgeConstants.DRAFT_DIR + element);
customs.add(CustomLimited.parse(dfData, FModel.getDecks().getCubes()));
for (final String element : dList) {
if (element.endsWith(FILE_EXT)) {
final List<String> dfData = FileUtil.readFile(ForgeConstants.DRAFT_DIR + element);
customs.add(CustomLimited.parse(dfData, FModel.getDecks().getCubes()));
}
}
}
return customs;

View File

@@ -126,6 +126,7 @@ public final class ForgeConstants {
public static final String SPRITE_PLANAR_CONQUEST_FILE = "sprite_planar_conquest.png";
public static final String SPRITE_SETLOGO_FILE = "sprite_setlogo.png";
public static final String SPRITE_WATERMARK_FILE = "sprite_watermark.png";
public static final String SPRITE_DRAFTRANKS_FILE = "sprite_draftranks.png";
public static String SPRITE_CARDBG_FILE = "sprite_cardbg.png";
public static final String FONT_FILE = "font1.ttf";
public static final String SPLASH_BG_FILE = "bg_splash.png";

View File

@@ -81,6 +81,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
UI_OVERLAY_CARD_MANA_COST ("true"),
UI_OVERLAY_CARD_ID ("true"),
UI_OVERLAY_ABILITY_ICONS("true"),
UI_OVERLAY_DRAFT_RANKING("true"),
UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"),
UI_PREFERRED_ART("LATEST_ART_ALL_EDITIONS"),
UI_SMART_CARD_ART("false"),

View File

@@ -422,6 +422,13 @@ public enum FSkinProp {
IMG_WATERMARK_W (new int[] {2, 1006, 500, 500}, PropType.WATERMARKS),
IMG_WATERMARK_C (new int[] {504, 1006, 500, 500}, PropType.WATERMARKS),
//FOR DRAFT RANKING
IMG_DRAFTRANK_D (new int[] {2, 2, 240, 240}, PropType.DRAFTRANKS),
IMG_DRAFTRANK_C (new int[] {244, 2, 240, 240}, PropType.DRAFTRANKS),
IMG_DRAFTRANK_B (new int[] {2, 244, 240, 240}, PropType.DRAFTRANKS),
IMG_DRAFTRANK_A (new int[] {244, 244, 240, 240}, PropType.DRAFTRANKS),
IMG_DRAFTRANK_S (new int[] {2, 486, 240, 240}, PropType.DRAFTRANKS),
//FOR CARDBG
IMG_CARDBG_A (new int[] {2, 2, 339, 496}, PropType.CARDBG),
IMG_CARDBG_B (new int[] {343, 2, 339, 496}, PropType.CARDBG),
@@ -574,6 +581,7 @@ public enum FSkinProp {
DECKBOX,
SETLOGO,
WATERMARKS,
DRAFTRANKS,
CARDBG,
FAVICON
}