From 181aa0f2ab233f5ff9f47bb9a8bbd412389f709d Mon Sep 17 00:00:00 2001 From: churrufli Date: Thu, 20 Jun 2019 13:35:21 +0200 Subject: [PATCH] Moving hard-coded text to res files --- .../java/forge/deckchooser/FDeckChooser.java | 5 +- .../java/forge/itemmanager/DeckManager.java | 19 +- .../forge/itemmanager/views/ItemListView.java | 5 +- .../controllers/CEditorConstructed.java | 14 +- .../deckeditor/views/VCurrentDeck.java | 2 +- .../main/java/forge/screens/home/VLobby.java | 4 +- .../java/forge/screens/match/views/VDock.java | 22 +- .../forge/screens/match/views/VPrompt.java | 10 +- forge-gui/res/languages/de-DE.properties | 54 +- forge-gui/res/languages/en-US.properties | 54 +- forge-gui/res/languages/es-es.properties | 84 +- .../java/forge/itemmanager/ColumnDef.java | 932 +++++++++--------- 12 files changed, 690 insertions(+), 515 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index a75f9a27318..4050aed6580 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -65,7 +65,8 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { chooser.populate(); final Dimension parentSize = JOptionPane.getRootFrame().getSize(); chooser.setMinimumSize(new Dimension((int)(parentSize.getWidth() / 2), (int)parentSize.getHeight() - 200)); - final FOptionPane optionPane = new FOptionPane(null, title, null, chooser, ImmutableList.of("OK", "Cancel"), 0); + final Localizer localizer = Localizer.getInstance(); + final FOptionPane optionPane = new FOptionPane(null, title, null, chooser, ImmutableList.of(localizer.getMessage("lblOk"), localizer.getMessage("lblCancel")), 0); optionPane.setDefaultFocus(chooser); chooser.lstDecks.setItemActivateCommand(new UiCommand() { @Override @@ -152,7 +153,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { lstDecks.setPool(ColorDeckGenerator.getColorDecks(lstDecks, formatFilter, isAi)); lstDecks.setup(ItemManagerConfig.STRING_ONLY); - btnRandom.setText("Random Colors"); + btnRandom.setText(localizer.getMessage("lblRandomColors")); btnRandom.setCommand(new UiCommand() { @Override public void run() { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index d327133e330..9284329e600 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -15,6 +15,7 @@ import javax.swing.event.ListSelectionListener; import forge.deck.Deck; import forge.screens.deckeditor.controllers.CEditorConstructed; import forge.screens.home.quest.DialogChooseFormats; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import forge.Singletons; @@ -200,6 +201,7 @@ public final class DeckManager extends ItemManager implements IHasGam } @Override + protected void buildAddFilterMenu(final JMenu menu) { GuiUtils.addSeparator(menu); //separate from current search item @@ -210,7 +212,9 @@ public final class DeckManager extends ItemManager implements IHasGam merge(hierarchy, buildHierarchy(path)); } } - final JMenu folder = GuiUtils.createMenu("Folder"); + + final Localizer localizer = Localizer.getInstance(); + final JMenu folder = GuiUtils.createMenu(localizer.getMessage("lblFolder")); if (hierarchy.size() > 0) { buildNestedMenu(hierarchy, folder, null); } @@ -219,7 +223,8 @@ public final class DeckManager extends ItemManager implements IHasGam } menu.add(folder); - final JMenu fmt = GuiUtils.createMenu("Format"); + final JMenu fmt = GuiUtils.createMenu(localizer.getMessage("lblFormat")); + for (final GameFormat f : FModel.getFormats().getFilterList()) { GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() { @Override @@ -231,7 +236,7 @@ public final class DeckManager extends ItemManager implements IHasGam menu.add(fmt); - GuiUtils.addMenuItem(menu, "Formats...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblFormats") + "...", null, new Runnable() { @Override public void run() { final DeckFormatFilter existingFilter = getFilter(DeckFormatFilter.class); if (existingFilter != null) { @@ -253,7 +258,7 @@ public final class DeckManager extends ItemManager implements IHasGam }); - GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblSets") + "...", null, new Runnable() { @Override public void run() { final DeckSetFilter existingFilter = getFilter(DeckSetFilter.class); if (existingFilter != null) { @@ -272,7 +277,7 @@ public final class DeckManager extends ItemManager implements IHasGam } }); - final JMenu world = GuiUtils.createMenu("Quest world"); + final JMenu world = GuiUtils.createMenu(localizer.getMessage("lblQuestWorld")); for (final QuestWorld w : FModel.getWorlds()) { GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() { @Override public void run() { @@ -284,7 +289,7 @@ public final class DeckManager extends ItemManager implements IHasGam GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Colors", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblColors"), null, new Runnable() { @Override public void run() { addFilter(new DeckColorFilter(DeckManager.this)); @@ -293,7 +298,7 @@ public final class DeckManager extends ItemManager implements IHasGam GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Advanced...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblAdvanced") + "...", null, new Runnable() { @Override @SuppressWarnings("unchecked") public void run() { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java index 855e2c8250c..c7dc42ba265 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java @@ -65,6 +65,7 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import forge.assets.FSkinProp; @@ -108,7 +109,7 @@ public final class ItemListView extends ItemView { private final ItemTable table = new ItemTable(); private final ItemTableModel tableModel; - + final Localizer localizer = Localizer.getInstance(); public ItemTableModel getTableModel() { return this.tableModel; } @@ -176,7 +177,7 @@ public final class ItemListView extends ItemView { getPnlOptions().removeAll(); if (config.getShowUniqueCardsOption()) { - final FCheckBox chkBox = new FCheckBox("Unique Cards Only", this.itemManager.getWantUnique()); + final FCheckBox chkBox = new FCheckBox(localizer.getMessage("lblUniqueCardsOnly"), this.itemManager.getWantUnique()); chkBox.setFont(ROW_FONT); chkBox.setToolTipText("Toggle whether to show unique cards only"); chkBox.addChangeListener(new ChangeListener() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java index ed8d4d7d0d1..b1f1faa55df 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java @@ -268,22 +268,22 @@ public final class CEditorConstructed extends CDeckEditor { cmb.addMoveAlternateItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltosideboard")); break; case Sideboard: - cmb.addMoveItems(localizer.getMessage("lblAdd"), "to sideboard"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltosideboard")); break; case Commander: - cmb.addMoveItems("Set", "as commander"); + cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblascommander")); break; case Avatar: - cmb.addMoveItems("Set", "as avatar"); + cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblasavatar")); break; case Schemes: - cmb.addMoveItems(localizer.getMessage("lblAdd"), "to scheme deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltoschemedeck")); break; case Planes: - cmb.addMoveItems(localizer.getMessage("lblAdd"), "to planar deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltoplanardeck")); break; case Conspiracy: - cmb.addMoveItems(localizer.getMessage("lblAdd"), "to conspiracy deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltoconspiracydeck")); break; } } @@ -293,7 +293,7 @@ public final class CEditorConstructed extends CDeckEditor { switch (sectionMode) { case Main: cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromdeck")); - cmb.addMoveAlternateItems("Move", "to sideboard"); + cmb.addMoveAlternateItems(localizer.getMessage("lblMove"), localizer.getMessage("lbltosideboard")); break; case Sideboard: cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromsideboard")); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java index d0b6a7cafef..c4448e2360c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java @@ -79,7 +79,7 @@ public enum VCurrentDeck implements IVDoc { .tooltip(localizer.getMessage("ttImportDeck")) .opaque(true).hoverable(true).build(); - private final FTextField txfTitle = new FTextField.Builder().ghostText("[New Deck]").build(); + private final FTextField txfTitle = new FTextField.Builder().ghostText("[" + localizer.getMessage("lblNewDeck") +"]").build(); private final JPanel pnlHeader = new JPanel(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 6c237306774..c3daa6db574 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -720,7 +720,7 @@ public class VLobby implements ILobbyView { switch (forGameType) { case Constructed: decksFrame.add(deckChoosers.get(playerWithFocus), "grow, push"); - if (deckChoosers.get(playerWithFocus).getSelectedDeckType().toString().contains("Random")) { + if (deckChoosers.get(playerWithFocus).getSelectedDeckType().toString().contains(localizer.getMessage("lblRandom"))) { final String strCheckboxConstraints = "h 30px!, gap 0 20px 0 0"; decksFrame.add(cbSingletons, strCheckboxConstraints); decksFrame.add(cbArtifacts, strCheckboxConstraints); @@ -894,7 +894,7 @@ public class VLobby implements ILobbyView { final List usedNames = getPlayerNames(); do { newName = NameGenerator.getRandomName(gender, type, usedNames); - confirmMsg = localizer.getMessage("lblconfirmName").replace("%s","\"" +newName + "\""); + confirmMsg = localizer.getMessage("lblconfirmName").replace("%n","\"" +newName + "\""); } while (!FOptionPane.showConfirmDialog(confirmMsg, title, localizer.getMessage("lblUseThisName"), localizer.getMessage("lblTryAgain"), true)); return newName; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDock.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDock.java index 7fadd9b25f6..addecfac226 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDock.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDock.java @@ -27,6 +27,7 @@ import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.FSkin.SkinnedLabel; +import forge.util.Localizer; import javax.swing.*; @@ -39,20 +40,19 @@ import java.awt.event.MouseEvent; *

(V at beginning of class name denotes a view class.) */ public class VDock implements IVDoc { - + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Dock"); - + private final DragTab tab = new DragTab(localizer.getMessage("lblDock")); // Dock button instances - private final DockButton btnConcede = new DockButton(FSkin.getIcon(FSkinProp.ICO_CONCEDE), "Concede Game"); - private final DockButton btnSettings = new DockButton(FSkin.getIcon(FSkinProp.ICO_SETTINGS), "Game Settings"); - private final DockButton btnEndTurn = new DockButton(FSkin.getIcon(FSkinProp.ICO_ENDTURN), "End Turn"); - private final DockButton btnViewDeckList = new DockButton(FSkin.getIcon(FSkinProp.ICO_DECKLIST), "View Deck List"); - private final DockButton btnRevertLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_REVERTLAYOUT), "Revert Layout"); - private final DockButton btnOpenLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_OPENLAYOUT), "Open Layout"); - private final DockButton btnSaveLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_SAVELAYOUT), "Save Layout"); - private final DockButton btnAlphaStrike = new DockButton(FSkin.getIcon(FSkinProp.ICO_ALPHASTRIKE), "Alpha Strike"); + private final DockButton btnConcede = new DockButton(FSkin.getIcon(FSkinProp.ICO_CONCEDE), localizer.getMessage("lblConcedeGame")); + private final DockButton btnSettings = new DockButton(FSkin.getIcon(FSkinProp.ICO_SETTINGS), localizer.getMessage("lblGameSettings")); + private final DockButton btnEndTurn = new DockButton(FSkin.getIcon(FSkinProp.ICO_ENDTURN), localizer.getMessage("lblEndTurn")); + private final DockButton btnViewDeckList = new DockButton(FSkin.getIcon(FSkinProp.ICO_DECKLIST), localizer.getMessage("lblViewDeckList")); + private final DockButton btnRevertLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_REVERTLAYOUT), localizer.getMessage("lblRevertLayout")); + private final DockButton btnOpenLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_OPENLAYOUT), localizer.getMessage("lblOpenLayout")); + private final DockButton btnSaveLayout = new DockButton(FSkin.getIcon(FSkinProp.ICO_SAVELAYOUT), localizer.getMessage("lblSaveLayout")); + private final DockButton btnAlphaStrike = new DockButton(FSkin.getIcon(FSkinProp.ICO_ALPHASTRIKE), localizer.getMessage("lblAlphaStrike")); private final FLabel btnTargeting = new FLabel.Builder().icon(FSkin.getIcon(FSkinProp.ICO_ARCSOFF)) .hoverable(true).iconInBackground(true).iconScaleFactor(1.0).build(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java index 0e5d565d118..9aad473f1d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java @@ -27,6 +27,7 @@ import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.controllers.CPrompt; import forge.toolbox.*; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -46,11 +47,12 @@ public class VPrompt implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Prompt"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblPrompt")); // Various components - private final FButton btnOK = new FButton("OK"); - private final FButton btnCancel = new FButton("Cancel"); + private final FButton btnOK = new FButton(localizer.getMessage("lblOk")); + private final FButton btnCancel = new FButton(localizer.getMessage("lblCancel")); private final FHtmlViewer tarMessage = new FHtmlViewer(); private final FScrollPane messageScroller = new FScrollPane(tarMessage, false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); @@ -122,7 +124,7 @@ public class VPrompt implements IVDoc { container.add(lblGames, "span 2, w 10:100%, h 22px!"); tarMessage.setFont(FSkin.getRelativeFont(14)); } - lblGames.setText("Game Setup"); + lblGames.setText(localizer.getMessage("lblGameSetup")); container.add(messageScroller, "span 2, w 10:100%, h 0:100%"); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 27ac3ac67c6..5cfecfde4be 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -233,6 +233,7 @@ lblUseThisName=Nutzen lblTryAgain=Neu lblAddAPlayer=Spieler hinzufügen lblVariants=Varianten +lblRandom=Random #VSubmenuConstructed.java lblConstructedMode=Constructed-Modus lblConstructed=Constructed @@ -368,6 +369,7 @@ btnBuildNewSealedDeck=Erstelle neues Sealed Deck #FDeckChooser.java lblViewDeck=Zeige Deck lblRandomDeck=Zufälliges Deck +lblRandomColors=Random Colors #GameType.java lblSealed=Sealed lblDraft=Draft @@ -734,6 +736,9 @@ lbl4starcards=4 star cards lbl5starcards=5 star cards lblXcopiesof=X copies of lblcopiesof=copies of +#ItemListView.java +lblUniqueCardsOnly=Unique Cards Only +ttUniqueCardsOnly=Toggle whether to show unique cards only #ACEditorBase.java lblAddcard=Add card ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) @@ -766,7 +771,7 @@ lblCollapseallgroups=Collapse all groups lblGroupby=group by lblPileby=pile by lblColumns=Columns -#CEditorVariant.java +#CEditorVariant.java, CEditorConstructed.java lblCatalog=Catalog lblAdd=Add lbltodeck=to deck @@ -778,10 +783,22 @@ lblasavatar=as avatar lblfromschemedeck=from scheme deck lblfromplanardeck=from planar deck lblfromconspiracydeck=from conspiracy deck +lbltoschemedeck=to scheme deck +lbltoplanardeck=to planar deck +lbltoconspiracydeck=to conspiracy deck +lblMove=Move +#VDock.java +lblDock=Dock +lblViewDeckList=View DeckList +lblRevertLayout=Revert Layout +lblOpenLayout=OpenLayout +lblSaveLayout=Save Layout #GroupDef.java lblColor=Color lblColorIdentity=Color Identity lblSet=Set +lblSet2=Set +#Set word has different meanings in other languages lblDefault=Default lblType=Type lblPlaneswalkerDeckSort=Planeswalker Deck Sort @@ -823,3 +840,38 @@ ttbtnRandDeck5=Generate 5 color constructed deck in current deck area #DeckCotroller.java lblCurrentDeck2=Current Deck lblUntitled=Untitled +#VPrompt.java +lblPrompt=Prompt +lblGameSetup=Game Setup +#ColumnDef.java +lblAIStatus=AI Status +lblCMC=CMC +ttCMC=CMC +lblCN=CN +ttCN=Collector Number Order +ttColor=Color +lblCost=Cost +ttCost=Cost +lblDecks=Decks +lblDeleteEdit=Delete/Edit +lblSetEdition=Mystery column. We don't know what it does or if that's what it should do. +ttFavorite=Favorite +lblFolder=Folder +ttFormats=Formats deck is legal in +lblMain=Main +ttMain=MainDeck +lblQty=Qty +lblQuantity=Quantity +lblSide=Side +lblSideboard=Sideboard +lblNew=New +lblOwned=Owned +lblPower=Power +ttPower=Power +lblPrice=Price +ttPrice=Price +lblRanking=Ranking +lblDraftRanking=Draft Ranking +lblToughness=Toughness +ttToughness=Toughness +ttType=Type \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 04f38684d60..cedefb81c72 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -233,6 +233,7 @@ lblUseThisName=Use this name lblTryAgain=Try Again lblAddAPlayer=Add a Player lblVariants=Variants +lblRandom=Random #VSubmenuConstructed.java lblConstructedMode=Constructed Mode lblConstructed=Constructed @@ -368,6 +369,7 @@ btnBuildNewSealedDeck=Build New Sealed Deck #FDeckChooser.java lblViewDeck=View Deck lblRandomDeck=Random Deck +lblRandomColors=Random Colors #GameType.java lblSealed=Sealed lblDraft=Draft @@ -734,6 +736,9 @@ lbl4starcards=4 star cards lbl5starcards=5 star cards lblXcopiesof=X copies of lblcopiesof=copies of +#ItemListView.java +lblUniqueCardsOnly=Unique Cards Only +ttUniqueCardsOnly=Toggle whether to show unique cards only #ACEditorBase.java lblAddcard=Add card ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) @@ -766,7 +771,7 @@ lblCollapseallgroups=Collapse all groups lblGroupby=group by lblPileby=pile by lblColumns=Columns -#CEditorVariant.java +#CEditorVariant.java, CEditorConstructed.java lblCatalog=Catalog lblAdd=Add lbltodeck=to deck @@ -778,10 +783,22 @@ lblasavatar=as avatar lblfromschemedeck=from scheme deck lblfromplanardeck=from planar deck lblfromconspiracydeck=from conspiracy deck +lbltoschemedeck=to scheme deck +lbltoplanardeck=to planar deck +lbltoconspiracydeck=to conspiracy deck +lblMove=Move +#VDock.java +lblDock=Dock +lblViewDeckList=View DeckList +lblRevertLayout=Revert Layout +lblOpenLayout=Open Layout +lblSaveLayout=Save Layout #GroupDef.java lblColor=Color lblColorIdentity=Color Identity lblSet=Set +lblSet2=Set +#Set word has different meanings in other languages lblDefault=Default lblType=Type lblPlaneswalkerDeckSort=Planeswalker Deck Sort @@ -823,3 +840,38 @@ ttbtnRandDeck5=Generate 5 color constructed deck in current deck area #DeckCotroller.java lblCurrentDeck2=Current Deck lblUntitled=Untitled +#VPrompt.java +lblPrompt=Prompt +lblGameSetup=Game Setup +#ColumnDef.java +lblAIStatus=AI Status +lblCMC=CMC +ttCMC=CMC +lblCN=CN +ttCN=Collector Number Order +ttColor=Color +lblCost=Cost +ttCost=Cost +lblDecks=Decks +lblDeleteEdit=Delete/Edit +lblSetEdition=Mystery column. We don't know what it does or if that's what it should do. +ttFavorite=Favorite +lblFolder=Folder +ttFormats=Formats deck is legal in +lblMain=Main +ttMain=Main Deck +lblQty=Qty +lblQuantity=Quantity +lblSide=Side +lblSideboard=Sideboard +lblNew=New +lblOwned=Owned +lblPower=Power +ttPower=Power +lblPrice=Price +ttPrice=Price +lblRanking=Ranking +lblDraftRanking=Draft Ranking +lblToughness=Toughness +ttToughness=Toughness +ttType=Type \ No newline at end of file diff --git a/forge-gui/res/languages/es-es.properties b/forge-gui/res/languages/es-es.properties index 6e04781e980..793a7c577ee 100644 --- a/forge-gui/res/languages/es-es.properties +++ b/forge-gui/res/languages/es-es.properties @@ -233,6 +233,7 @@ lblUseThisName=Usar este nombre lblTryAgain=Probar de nuevo lblAddAPlayer=Añadir Jugador lblVariants=Variantes +lblRandom=Aleatorio #VSubmenuConstructed.java lblConstructedMode=Modo Construido lblConstructed=Construido @@ -368,6 +369,7 @@ btnBuildNewSealedDeck=Nuevo Mazo Sellado #FDeckChooser.java lblViewDeck=Ver Mazo lblRandomDeck=Mazo Aleatorio +lblRandomColors=Colores Aleatorios #GameType.java lblSealed=Sellado lblDraft=Draft @@ -641,7 +643,7 @@ lblEasy=Fácil lblMedium=Medio lblHard=Difícil lblExpert=Experto -lblWinsforBooster=Victorias para Booster +lblWinsforBooster=Victorias para Sobres lblWinsforRankIncrease=Victorias por subir de Nivel lblWinsforMediumAI=Victoria por IA nivel Medio lblWinsforHardAI=Victoria por IA nivel Dificil @@ -659,8 +661,8 @@ lblMoreDuelChoices=Más Opciones de Duelo lblCommon=Común lblUncommon=Infrecuente lblRare=Rara -lblSpecialBoosters=Boosters Espciales -ttSpecialBoosters=Permite que en la tienda aparezcan boosters especiales, específicos para cada color, y como recompensas. +lblSpecialBoosters=Sobres Especiales +ttSpecialBoosters=Permite que en la tienda aparezcan sobres especiales, específicos para cada color y como recompensas. lblMaximumPacks=Pack máximos lblMinimumPacks=Pack mínimos lblStartingPacks=Packs de Inicio @@ -680,7 +682,7 @@ ttPlaysetSize=El número de copias de cartas a conservar antes de vender extras. lblPlaysetSizeBasicLand=Playset: Tierras Básicas ttPlaysetSizeBasicLand=El número de copias de tierras básicas a conservar antes de vender extras. lblPlaysetSizeAnyNumber=Playset: Cartas sin límite -ttPlaysetSizeAnyNumber=El número de copias de Ratas Implacables u otras cartassimilares sin límite, antes de vender extras. +ttPlaysetSizeAnyNumber=El número de copias de Ratas Implacables u otras cartas similares sin límite, antes de vender extras. lblItemLevelRestriction=Restricción de nivel del Artículo lblFoilfilterAlwaysOn=Filtro Foil Siempre Activado lblRatingsfilterAlwaysOn=Filtro de Clasificación Siempre Activado @@ -734,6 +736,9 @@ lbl4starcards=Cartas 4 estrellas lbl5starcards=Cartas 5 estrellas lblXcopiesof=X copias de lblcopiesof=copias de +#ItemListView.java +lblUniqueCardsOnly=Solo Cartas Únicas +ttUniqueCardsOnly=Alternar para mostrar solo cartas únicas #ACEditorBase.java lblAddcard=Añadir carta ttAddcard=Añade la carta seleccionada al mazo actual (o haz doble clic en la fila o presiona la barra espaciadora) @@ -766,7 +771,7 @@ lblCollapseallgroups=Contraer todos los grupos lblGroupby=agrupar por lblPileby=apilar por lblColumns=Columnas -#CEditorVariant.java +#CEditorVariant.java, CEditorConstructed.java lblCatalog=Catálogo lblAdd=Añadir lbltodeck=al mazo @@ -778,10 +783,22 @@ lblasavatar=como avatar lblfromschemedeck=del mazo de escenario lblfromplanardeck=del mazo planar lblfromconspiracydeck=del mazo conspiracy +lbltoschemedeck=al mazo de escenario +lbltoplanardeck=al mazo planar +lbltoconspiracydeck=al mazo conspiracy +lblMove=Mover +#VDock.java +lblDock=Dock +lblViewDeckList=Ver Lista del Mazo +lblRevertLayout=Revertir Disposición de Elementos +lblOpenLayout=Abrir Disposición de Elementos +lblSaveLayout=Salvar Disposición de Elementos #GroupDef.java lblColor=Color lblColorIdentity=Identidad de Color lblSet=Edición +lblSet2=Establecer +#Set word has different meanings in other languages lblDefault=por defecto lblType=Tipo lblPlaneswalkerDeckSort=por Planewalkers @@ -811,15 +828,50 @@ lblFoil=Foil lblPersonalRating=Puntuación Personal lblAdvanced=Avanzado #VDeckgen.java -lblDeckGeneration=Deck Generation -btnRandCardpool=Random Cardpool -ttbtnRandCardpool=Generate random constructed cardpool in current deck area -btnRandDeck2=Constructed (2 color) -ttbtnRandDeck2=Generate 2 color constructed deck in current deck area -btnRandDeck3=Constructed (3 color) -ttbtnRandDeck3=Generate 3 color constructed deck in current deck area -btnRandDeck5=Constructed (5 color) -ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +lblDeckGeneration=Generación de Mazos +btnRandCardpool=Pool de Cartas Aleatorio +ttbtnRandCardpool=Genera un grupo de cartas para formato construido de manera aleatoria en el área de Mazo Actual +btnRandDeck2=Construido (2 colores) +ttbtnRandDeck2=Genera un Mazo Construido de 2 colores en el área de Mazo Actual +btnRandDeck3=Construido (3 colores) +ttbtnRandDeck3=Genera un Mazo Construido de 3 colores en el área de Mazo Actual +btnRandDeck5=Construido (5 colores) +ttbtnRandDeck5=Genera un Mazo Construido de 5 colores en el área de Mazo Actual #DeckCotroller.java -lblCurrentDeck2=Current Deck -lblUntitled=Untitled +lblCurrentDeck2=Mazo Actual +lblUntitled=Sin Título +#VPrompt.java +lblPrompt=Aviso +lblGameSetup=Configuración del Juego +#ColumnDef.java +lblAIStatus=Estado de la IA +lblCMC=CMC +ttCMC=Coste de Maná Convertido +lblCN=CN +ttCN=Orden de Número de Coleccionista +ttColor=Color +lblCost=Coste +ttCost=Coste +lblDecks=Mazos +lblDeleteEdit=Borrar/Editar +lblSetEdition=Mystery column. We don't know what it does or if that's what it should do. +ttFavorite=Favorite +lblFolder=Carpeta +ttFormats=Formats deck is legal in +lblMain=Principal +ttMain=Mazo Principal +lblQty=Cantidad +lblQuantity=Cantidad +lblSide=Banquillo +lblSideboard=Banquillo +lblNew=Nuevo +lblOwned=Adquirida +lblPower=Fuerza +ttPower=Power +lblPrice=Precio +ttPrice=Price +lblRanking=Ranking +lblDraftRanking=Ranking en el Draft +lblToughness=Resistencia +ttToughness=Toughness +ttType=Type \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index 4d9087d7b8a..4d5ff2507f9 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -30,172 +30,14 @@ import forge.item.PaperCard; import forge.itemmanager.ItemColumnConfig.SortState; import forge.limited.DraftRankCache; import forge.model.FModel; +import forge.util.Localizer; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Map.Entry; public enum ColumnDef { - /**The column containing the inventory item name.*/ - STRING("", "", 0, false, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return from.getKey() instanceof Comparable ? (Comparable)from.getKey() : from.getKey().getName(); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return from.getKey().toString(); - } - }), - /**The name column.*/ - NAME("Name", "Name", 180, false, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toSortableName(from.getKey().getName()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return from.getKey().getName(); - } - }), - - /**The column for sorting cards in collector order.*/ - COLLECTOR_ORDER("CN", "Collector Number Order", 20, false, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toCollectorPrefix(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return ""; - } - }), - /**The type column.*/ - TYPE("Type", "Type", 100, false, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toType(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toType(from.getKey()); - } - }), - /**The mana cost column.*/ - COST("Cost", "Cost", 70, true, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toManaCost(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toCardRules(from.getKey()); - } - }), - /**The color column.*/ - COLOR("Color", "Color", 46, true, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toColor(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toColor(from.getKey()); - } - }), - /**The power column.*/ - POWER("Power", "Power", 20, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toPower(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toPower(from.getKey()); - } - }), - /**The toughness column.*/ - TOUGHNESS("Toughness", "Toughness", 20, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toToughness(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toToughness(from.getKey()); - } - }), - /**The converted mana cost column.*/ - CMC("CMC", "CMC", 20, true, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toCMC(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toCMC(from.getKey()); - } - }), - /**The rarity column.*/ - RARITY("Rarity", "Rarity", 20, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toRarity(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toRarity(from.getKey()); - } - }), - /**The set code column.*/ - SET("Set", "Set", 38, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - InventoryItem i = from.getKey(); - return i instanceof InventoryItemFromSet ? FModel.getMagicDb().getEditions() - .get(((InventoryItemFromSet) i).getEdition()) : CardEdition.UNKNOWN; - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - InventoryItem i = from.getKey(); - return i instanceof InventoryItemFromSet ? ((InventoryItemFromSet) i).getEdition() : "n/a"; - } - }), - /**The AI compatibility flag column*/ - AI("AI", "AI Status", 30, true, SortState.ASC, + AI("lblAI", "lblAIStatus", 30, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -216,81 +58,111 @@ public enum ColumnDef { return ai.getRemAIDecks() ? (ai.getRemRandomDecks() ? "AI ?" : "AI") : (ai.getRemRandomDecks() ? "?" : ""); } - }), - /**The Draft ranking column.*/ - RANKING("Ranking", "Draft Ranking", 50, true, SortState.ASC, + })/**The AI compatibility flag column*/ + , + CMC("lblCMC", "ttCMC", 20, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return toRanking(from.getKey(), false); + return toCMC(from.getKey()); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return toRanking(from.getKey(), true); + return toCMC(from.getKey()); } - }), - /**The quantity column.*/ - QUANTITY("Qty", "Quantity", 25, true, SortState.ASC, + })/**The converted mana cost column.*/ + , + + COLLECTOR_ORDER("lblCN", "ttCN", 20, false, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return from.getValue(); + return toCollectorPrefix(from.getKey()); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return from.getValue(); + return ""; } - }), - /**The quantity in deck column.*/ - DECK_QUANTITY("Quantity", "Quantity", 50, true, SortState.ASC, + })/**The column for sorting cards in collector order.*/ + , + COLOR("lblColor", "ttColor", 46, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return from.getValue(); + return toColor(from.getKey()); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return from.getValue(); + return toColor(from.getKey()); } - }), - /**The new inventory flag column.*/ - NEW("New", "New", 30, true, SortState.DESC, - null, null), //functions will be set later - /**The price column.*/ - PRICE("Price", "Price", 35, true, SortState.DESC, - null, null), - /**The quantity owned column.*/ - OWNED("Owned", "Owned", 20, true, SortState.ASC, - null, null), - /**The deck name column.*/ - DECKS("Decks", "Decks", 20, true, SortState.ASC, - null, null), - /**The favorite flag column.*/ - FAVORITE("", "Favorite", 18, true, SortState.DESC, + })/**The color column.*/ + , + COST("lblCost", "ttCost", 70, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - IPaperCard card = toCard(from.getKey()); - if (card == null) { - return -1; - } - return CardPreferences.getPrefs(card).getStarCount(); + return toManaCost(from.getKey()); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return toCard(from.getKey()); + return toCardRules(from.getKey()); } - }), - /**The favorite deck flag column.*/ - DECK_FAVORITE("", "Favorite", 18, true, SortState.DESC, + })/**The mana cost column.*/ + , + DECKS("lblDecks", "lblDecks", 20, true, SortState.ASC, + null, null)/**The deck name column.*/ + , + DECK_ACTIONS("", "lblDeleteEdit", 40, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return 0; + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toDeck(from.getKey()); + } + })/**The edit/delete deck column.*/ + , + DECK_COLOR("lblColor", "lblColor", 70, true, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toDeckColor(from.getKey()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toDeckColor(from.getKey()); + } + })/**The deck color column.*/ + , + DECK_EDITION("lblSet", "lblSetEdition", 38, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toDeck(from.getKey()).getEdition(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toDeck(from.getKey()).getEdition().getCode(); + } + })/**The deck edition column, a mystery to us all.*/ + , + DECK_FAVORITE("", "ttFavorite", 18, true, SortState.DESC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -306,23 +178,9 @@ public enum ColumnDef { public Object apply(final Entry from) { return toDeck(from.getKey()); } - }), - /**The edit/delete deck column.*/ - DECK_ACTIONS("", "Delete/Edit", 40, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return 0; - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toDeck(from.getKey()); - } - }), - /**The deck folder column.*/ - DECK_FOLDER("Folder", "Folder", 80, false, SortState.ASC, + })/**The favorite deck flag column.*/ + , + DECK_FOLDER("lblFolder", "lblFolder", 80, false, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -334,23 +192,9 @@ public enum ColumnDef { public Object apply(final Entry from) { return toDeckFolder(from.getKey()); } - }), - /**The deck color column.*/ - DECK_COLOR("Color", "Color", 70, true, SortState.ASC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toDeckColor(from.getKey()); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toDeckColor(from.getKey()); - } - }), - /**The deck format column.*/ - DECK_FORMAT("Format", "Formats deck is legal in", 60, false, SortState.DESC, + })/**The deck folder column.*/ + , + DECK_FORMAT("lblFormat", "ttFormats", 60, false, SortState.DESC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -360,9 +204,9 @@ public enum ColumnDef { } Iterable all = deck.getExhaustiveFormats(); int acc = 0; - for(GameFormat gf : all) { + for (GameFormat gf : all) { int ix = gf.getIndex(); - if( ix < 30 && ix > 0) + if (ix < 30 && ix > 0) acc |= 0x40000000 >> (ix - 1); } return acc; @@ -377,23 +221,9 @@ public enum ColumnDef { } return deck.getFormatsString(); } - }), - /**The deck edition column, a mystery to us all.*/ - DECK_EDITION("Set", "Mystery column. We don't know what it does or if that's what it should do.", 38, true, SortState.DESC, - new Function, Comparable>() { - @Override - public Comparable apply(final Entry from) { - return toDeck(from.getKey()).getEdition(); - } - }, - new Function, Object>() { - @Override - public Object apply(final Entry from) { - return toDeck(from.getKey()).getEdition().getCode(); - } - }), - /**The main library size column.*/ - DECK_MAIN("Main", "Main Deck", 30, true, SortState.ASC, + })/**The deck format column.*/ + , + DECK_MAIN("lblMain", "ttMain", 30, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -405,9 +235,23 @@ public enum ColumnDef { public Object apply(final Entry from) { return toDeck(from.getKey()).getMainSize(); } - }), - /**The sideboard size column.*/ - DECK_SIDE("Side", "Sideboard", 30, true, SortState.ASC, + })/**The main library size column.*/ + , + DECK_QUANTITY("lblQty", "lblQuantity", 50, true, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return from.getValue(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return from.getValue(); + } + })/**The quantity in deck column.*/ + , + DECK_SIDE("lblSide", "lblSideboard", 30, true, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -419,13 +263,174 @@ public enum ColumnDef { public Object apply(final Entry from) { return toDeck(from.getKey()).getSideSize(); } - }); + })/**The sideboard size column.*/ + , + FAVORITE("", "ttFavorite", 18, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + IPaperCard card = toCard(from.getKey()); + if (card == null) { + return -1; + } + return CardPreferences.getPrefs(card).getStarCount(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toCard(from.getKey()); + } + })/**The favorite flag column.*/ + , + NAME("lblName", "lblName", 180, false, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toSortableName(from.getKey().getName()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return from.getKey().getName(); + } + })/**The name column.*/ + , + NEW("lblNew", "lblNew", 30, true, SortState.DESC, + null, null)/**The new inventory flag column.*/ + , //functions will be set later + OWNED("lblOwned", "lblOwned", 20, true, SortState.ASC, + null, null)/**The quantity owned column.*/ + , + POWER("lblPower", "ttPower", 20, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toPower(from.getKey()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toPower(from.getKey()); + } + })/**The power column.*/ + , + PRICE("lblPrice", "ttPrice", 35, true, SortState.DESC, + null, null)/**The price column.*/ + , + QUANTITY("lblQty", "lblQuantity", 25, true, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return from.getValue(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return from.getValue(); + } + })/**The quantity column.*/ + , + RANKING("lblRanking", "lblDraftRanking", 50, true, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toRanking(from.getKey(), false); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toRanking(from.getKey(), true); + } + })/**The Draft ranking column.*/ + , + RARITY("lblRarity", "lblRarity", 20, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toRarity(from.getKey()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toRarity(from.getKey()); + } + })/**The rarity column.*/ + , + SET("lblSet", "lblSet", 38, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + InventoryItem i = from.getKey(); + return i instanceof InventoryItemFromSet ? FModel.getMagicDb().getEditions() + .get(((InventoryItemFromSet) i).getEdition()) : CardEdition.UNKNOWN; + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + InventoryItem i = from.getKey(); + return i instanceof InventoryItemFromSet ? ((InventoryItemFromSet) i).getEdition() : "n/a"; + } + })/**The set code column.*/ + , + STRING("", "", 0, false, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return from.getKey() instanceof Comparable ? (Comparable) from.getKey() : from.getKey().getName(); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return from.getKey().toString(); + } + })/**The column containing the inventory item name.*/ + , + TOUGHNESS("lblToughness", "ttToughness", 20, true, SortState.DESC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toToughness(from.getKey()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toToughness(from.getKey()); + } + })/**The toughness column.*/ + , + TYPE("lblType", "ttType", 100, false, SortState.ASC, + new Function, Comparable>() { + @Override + public Comparable apply(final Entry from) { + return toType(from.getKey()); + } + }, + new Function, Object>() { + @Override + public Object apply(final Entry from) { + return toType(from.getKey()); + } + })/**The type column.*/ + ; ColumnDef(String shortName0, String longName0, int preferredWidth0, boolean isWidthFixed0, SortState sortState0, - Function, Comparable> fnSort0, - Function, Object> fnDisplay0) { - this.shortName = shortName0; - this.longName = longName0; + Function, Comparable> fnSort0, + Function, Object> fnDisplay0) { + + final Localizer localizer = Localizer.getInstance(); + + if (shortName0 != null && !shortName0.isEmpty()) { this.shortName = localizer.getMessage(shortName0);} else {this.shortName = shortName0;} + if (longName0 != null && !longName0.isEmpty()) { this.longName = localizer.getMessage(longName0);} else {this.longName = longName0;} + this.preferredWidth = preferredWidth0; this.isWidthFixed = isWidthFixed0; this.sortState = sortState0; @@ -444,57 +449,60 @@ public enum ColumnDef { public String toString() { return this.longName; } -/** - *Converts a card name to a sortable name. - * Trim leading quotes, then move article last, then replace characters. - * Because An-Havva Constable. - * Capitals and lowercase sorted as one: "my deck" before "Myr Retribution" - * Apostrophes matter, though: "D'Avenant" before "Danitha" - * TO DO: Commas before apostrophes: "Rakdos, Lord of Riots" before "Rakdos's Return" - * @param printedName The name of the card. - * @return A sortable name. - */ + + /** + *Converts a card name to a sortable name. + * Trim leading quotes, then move article last, then replace characters. + * Because An-Havva Constable. + * Capitals and lowercase sorted as one: "my deck" before "Myr Retribution" + * Apostrophes matter, though: "D'Avenant" before "Danitha" + * TO DO: Commas before apostrophes: "Rakdos, Lord of Riots" before "Rakdos's Return" + * @param printedName The name of the card. + * @return A sortable name. + */ private static String toSortableName(String printedName) { - if (printedName.startsWith("\"")) printedName = printedName.substring(1); - return moveArticleToEnd(printedName).toLowerCase().replaceAll("[^\\s'0-9a-z]",""); + if (printedName.startsWith("\"")) printedName = printedName.substring(1); + return moveArticleToEnd(printedName).toLowerCase().replaceAll("[^\\s'0-9a-z]", ""); } - + /**Article words. These words get kicked to the end of a sortable name. - For localization, simply overwrite this array with appropriate words. - Words in this list are used by the method String moveArticleToEnd(String), useful - for alphabetizing phrases, in particular card or other inventory object names.*/ + For localization, simply overwrite this array with appropriate words. + Words in this list are used by the method String moveArticleToEnd(String), useful + for alphabetizing phrases, in particular card or other inventory object names.*/ private static final String[] ARTICLE_WORDS = { - "A", - "An", - "The" + "A", + "An", + "The" }; - + /**Detects whether a string begins with an article word - @param str The name of the card. - @return The sort-friendly name of the card. Example: "The Hive" becomes "Hive The".*/ - private static String moveArticleToEnd(String str){ - String articleWord; - for (int i = 0; i < ARTICLE_WORDS.length; i++){ - articleWord = ARTICLE_WORDS[i]; - if (str.startsWith(articleWord + " ")){ - str = str.substring(articleWord.length()+1) + " " + articleWord; - return str; - } - } - return str; + @param str The name of the card. + @return The sort-friendly name of the card. Example: "The Hive" becomes "Hive The".*/ + private static String moveArticleToEnd(String str) { + String articleWord; + for (int i = 0; i < ARTICLE_WORDS.length; i++) { + articleWord = ARTICLE_WORDS[i]; + if (str.startsWith(articleWord + " ")) { + str = str.substring(articleWord.length() + 1) + " " + articleWord; + return str; + } + } + return str; } - + private static String toType(final InventoryItem i) { - return i instanceof IPaperCard ? ((IPaperCard)i).getRules().getType().toString() : i.getItemType(); + return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getType().toString() : i.getItemType(); } private static IPaperCard toCard(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i) : null; } + private static ManaCost toManaCost(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getManaCost() : ManaCost.NO_COST; } + private static CardRules toCardRules(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i).getRules() : null; } @@ -508,7 +516,7 @@ public enum ColumnDef { if (i instanceof PaperCard) { result = ((IPaperCard) i).getRules().getIntPower(); if (result == Integer.MAX_VALUE) { - if (((IPaperCard)i).getRules().getType().isPlaneswalker()) { + if (((IPaperCard) i).getRules().getType().isPlaneswalker()) { result = ((IPaperCard) i).getRules().getInitialLoyalty(); } } @@ -523,13 +531,13 @@ public enum ColumnDef { private static Integer toCMC(final InventoryItem i) { return i instanceof PaperCard ? ((IPaperCard) i).getRules().getManaCost().getCMC() : -1; } - - private static CardRarity toRarity(final InventoryItem i) { + + private static CardRarity toRarity(final InventoryItem i) { return i instanceof PaperCard ? ((IPaperCard) i).getRarity() : CardRarity.Unknown; } private static Double toRanking(final InventoryItem i, boolean truncate) { - if (i instanceof IPaperCard){ + if (i instanceof IPaperCard) { IPaperCard cp = (IPaperCard) i; Double ranking = DraftRankCache.getRanking(cp.getName(), cp.getEdition()); if (ranking != null) { @@ -545,222 +553,224 @@ public enum ColumnDef { private static DeckProxy toDeck(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i) : null; } + private static ColorSet toDeckColor(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i).getColor() : null; } + private static String toDeckFolder(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i).getPath() + "/" : null; } - + /**Generates a sortable numeric string based on a card's attributes. - This is a multi-layer sort. It is coded in layers to make it easier to manipulate. - This method can be fed any inventory item, but is only useful for paper cards. - @param i An inventory item. - @return A sortable numeric string based on the item's attributes.*/ + This is a multi-layer sort. It is coded in layers to make it easier to manipulate. + This method can be fed any inventory item, but is only useful for paper cards. + @param i An inventory item. + @return A sortable numeric string based on the item's attributes.*/ private static String toCollectorPrefix(final InventoryItem i) { - //make sure it's a card. if not, pointless to proceed. - return (i instanceof PaperCard ? toBasicLandsLast(i) + " " : "") + toSortableName(i.getName()); + //make sure it's a card. if not, pointless to proceed. + return (i instanceof PaperCard ? toBasicLandsLast(i) + " " : "") + toSortableName(i.getName()); } - + /**Returns 1 for land, otherwise 0 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toLandsLast(final InventoryItem i) { - //nonland? - return !(((IPaperCard) i).getRules().getType().isLand()) ? - "0" + toArtifactsWithColorlessCostsLast(i) - //land - : "1"; + //nonland? + return !(((IPaperCard) i).getRules().getType().isLand()) ? + "0" + toArtifactsWithColorlessCostsLast(i) + //land + : "1"; } - + /**Returns 1 for artifacts without color shards in their mana cost, otherwise 0 and continues sorting. - As of 2019, colored artifacts appear here if there are no colored shards in their casting cost. - @param i A paper card. - @return Part of a sortable numeric string.*/ + As of 2019, colored artifacts appear here if there are no colored shards in their casting cost. + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toArtifactsWithColorlessCostsLast(final InventoryItem i) { - forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); - - return !(((IPaperCard) i).getRules().getType().isArtifact() && (toColor(i).isColorless() || - //If it isn't colorless, see if it can be paid with only white, only blue, only black. - //No need to check others since three-color hybrid shards don't exist. - manaCost.canBePaidWithAvaliable(MagicColor.WHITE) && - manaCost.canBePaidWithAvaliable(MagicColor.BLUE) && - manaCost.canBePaidWithAvaliable(MagicColor.BLACK))) - ? "0" + toSplitLast(i): "1"; + ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); + + return !(((IPaperCard) i).getRules().getType().isArtifact() && (toColor(i).isColorless() || + //If it isn't colorless, see if it can be paid with only white, only blue, only black. + //No need to check others since three-color hybrid shards don't exist. + manaCost.canBePaidWithAvaliable(MagicColor.WHITE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLUE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLACK))) + ? "0" + toSplitLast(i) : "1"; } - + /**Returns 1 for split cards or 0 for other cards; continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toSplitLast(final InventoryItem i) { - return ((IPaperCard) i).getRules().getSplitType() != CardSplitType.Split ? - "0" + toConspiracyFirst(i) : "1" + toSplitCardSort(i); + return ((IPaperCard) i).getRules().getSplitType() != CardSplitType.Split ? + "0" + toConspiracyFirst(i) : "1" + toSplitCardSort(i); } - + /**Returns 0 for Conspiracy cards, otherwise 1 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toConspiracyFirst(final InventoryItem i) { return ((IPaperCard) i).getRules().getType().isConspiracy() ? "0" //is a Conspiracy : "1" + toColorlessFirst(i); //isn't a Conspiracy } - + /**Returns 0 for colorless cards, otherwise 1 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toColorlessFirst(final InventoryItem i) { - return toColor(i).isColorless() ? - "0" : "1" + toMonocolorFirst(i); + return toColor(i).isColorless() ? + "0" : "1" + toMonocolorFirst(i); } - + /**Returns 0 for monocolor cards, 1 for multicolor cards; continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toMonocolorFirst(final InventoryItem i) { - return toColor(i).isMonoColor() ? - "0" + toWubrgOrder(i): "1" + toGoldFirst(i); + return toColor(i).isMonoColor() ? + "0" + toWubrgOrder(i) : "1" + toGoldFirst(i); } - + /**Returns 0 for gold cards and continues sorting, 1 otherwise. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toGoldFirst(final InventoryItem i) { - forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); - - return !(manaCost.canBePaidWithAvaliable(MagicColor.WHITE) | manaCost.canBePaidWithAvaliable(MagicColor.BLUE) | - manaCost.canBePaidWithAvaliable(MagicColor.BLACK) | manaCost.canBePaidWithAvaliable(MagicColor.RED) | - manaCost.canBePaidWithAvaliable(MagicColor.GREEN)) ? "0" : "1"; + ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); + + return !(manaCost.canBePaidWithAvaliable(MagicColor.WHITE) | manaCost.canBePaidWithAvaliable(MagicColor.BLUE) | + manaCost.canBePaidWithAvaliable(MagicColor.BLACK) | manaCost.canBePaidWithAvaliable(MagicColor.RED) | + manaCost.canBePaidWithAvaliable(MagicColor.GREEN)) ? "0" : "1"; } - + /**Entry point for generating split card sortable strings. - Splits the card into two card faces, then sends it to the next - sorting method. - @param i A paper card. - @return Part of a sortable numeric string.*/ + Splits the card into two card faces, then sends it to the next + sorting method. + @param i A paper card. + @return Part of a sortable numeric string.*/ //Split card sorting is probably as complex as sorting gets. //This method serves as an entry point only, separating the two card parts for convenience. private static String toSplitCardSort(final InventoryItem i) { - CardRules rules = ((IPaperCard) i).getRules(); - forge.card.ICardFace mainPart = rules.getMainPart(); - forge.card.ICardFace otherPart = rules.getOtherPart(); - return toSplitSort(mainPart, otherPart); + CardRules rules = ((IPaperCard) i).getRules(); + ICardFace mainPart = rules.getMainPart(); + ICardFace otherPart = rules.getOtherPart(); + return toSplitSort(mainPart, otherPart); } - + /**Generates a sortable numeric string for split cards. - Split cards are sorted by color on both halves. - Sort order is C//C, W//W, U//U, B//B, R//R, G//G, - Gold/Gold, - W//U, U//B, B//R, R//G, G//W, - W//B, U//R, B//G, R//W, G//U, - W//R, U//G, B//W, R//U, G//B, - W//G, U//W, B//U, R//B, G//R. - Any that do not conform will sort at the end. - @param mainPart The first half of the card. - @param otherPart The other half of the card. - @return Part of a sortable numeric string.*/ - private static String toSplitSort(final ICardFace mainPart, final ICardFace otherPart) { - ColorSet mainPartColor = mainPart.getColor(); - ColorSet otherPartColor = otherPart.getColor(); - - return mainPartColor.isEqual(otherPartColor.getColor()) - - ? //both halves match - - (mainPartColor.isEqual(MagicColor.WHITE) ? "01" : - mainPartColor.isEqual(MagicColor.BLUE) ? "02" : - mainPartColor.isEqual(MagicColor.BLACK) ? "03" : - mainPartColor.isEqual(MagicColor.RED) ? "04" : - mainPartColor.isEqual(MagicColor.GREEN) ? "05" : "00") - - : //halves don't match - - //both halves gold - mainPartColor.isMulticolor() && otherPartColor.isMulticolor() ? "06" : - - //second color is << 1 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLUE) ? "11" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.BLACK) ? "12" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.RED) ? "13" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.GREEN) ? "14" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.WHITE) ? "15" : - - //second color is << 2 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLACK) ? "21" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.RED) ? "22" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.GREEN) ? "23" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.WHITE) ? "24" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLUE) ? "25" : - - //second color is << 3 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.RED) ? "31" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.GREEN) ? "32" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.WHITE) ? "33" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLUE) ? "34" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLACK) ? "35" : - - //second color is << 4 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.GREEN) ? "41" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.WHITE) ? "42" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.BLUE) ? "43" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLACK) ? "44" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.RED) ? "45" - - ://No split cards have been printed that don't fall into one of these groups. - - "99"; + Split cards are sorted by color on both halves. + Sort order is C//C, W//W, U//U, B//B, R//R, G//G, + Gold/Gold, + W//U, U//B, B//R, R//G, G//W, + W//B, U//R, B//G, R//W, G//U, + W//R, U//G, B//W, R//U, G//B, + W//G, U//W, B//U, R//B, G//R. + Any that do not conform will sort at the end. + @param mainPart The first half of the card. + @param otherPart The other half of the card. + @return Part of a sortable numeric string.*/ + private static String toSplitSort(final ICardFace mainPart, final ICardFace otherPart) { + ColorSet mainPartColor = mainPart.getColor(); + ColorSet otherPartColor = otherPart.getColor(); + + return mainPartColor.isEqual(otherPartColor.getColor()) + + ? //both halves match + + (mainPartColor.isEqual(MagicColor.WHITE) ? "01" : + mainPartColor.isEqual(MagicColor.BLUE) ? "02" : + mainPartColor.isEqual(MagicColor.BLACK) ? "03" : + mainPartColor.isEqual(MagicColor.RED) ? "04" : + mainPartColor.isEqual(MagicColor.GREEN) ? "05" : "00") + + : //halves don't match + + //both halves gold + mainPartColor.isMulticolor() && otherPartColor.isMulticolor() ? "06" : + + //second color is << 1 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLUE) ? "11" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.BLACK) ? "12" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.RED) ? "13" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.GREEN) ? "14" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.WHITE) ? "15" : + + //second color is << 2 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLACK) ? "21" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.RED) ? "22" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.GREEN) ? "23" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.WHITE) ? "24" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLUE) ? "25" : + + //second color is << 3 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.RED) ? "31" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.GREEN) ? "32" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.WHITE) ? "33" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLUE) ? "34" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLACK) ? "35" : + + //second color is << 4 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.GREEN) ? "41" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.WHITE) ? "42" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.BLUE) ? "43" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLACK) ? "44" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.RED) ? "45" + + ://No split cards have been printed that don't fall into one of these groups. + + "99"; } - + /**Returns 0 for white, 1 for blue, 2 for black, 3 for red, or 4 for green. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toWubrgOrder(final InventoryItem i) { - ColorSet color = toColor(i); - return color.hasWhite() ? "0" : color.hasBlue() ? "1" : color.hasBlack() ? "2" : - color.hasRed() ? "3" : "4"; + ColorSet color = toColor(i); + return color.hasWhite() ? "0" : color.hasBlue() ? "1" : color.hasBlack() ? "2" : + color.hasRed() ? "3" : "4"; } - + /**Returns 1 for Contraptions, otherwise 0 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toContraptionsLast(final InventoryItem i) { - return !(((IPaperCard) i).getRules().getType().hasSubtype("Contraption")) ? - "0" + toLandsLast(i) : "1"; + return !(((IPaperCard) i).getRules().getType().hasSubtype("Contraption")) ? + "0" + toLandsLast(i) : "1"; } - + /**Returns 1 for basic lands, 0 otherwise, and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toBasicLandsLast(final InventoryItem i) { - return !(((IPaperCard) i).getRules().getType().isBasicLand()) - ? "0" + toContraptionsLast(i) - : "1" + toFullArtFirst(i); + return !(((IPaperCard) i).getRules().getType().isBasicLand()) + ? "0" + toContraptionsLast(i) + : "1" + toFullArtFirst(i); } - + /**Currently only continues sorting. If Forge is updated to - use a flag for full-art lands, this method should be updated - to assign those 0 and regular lands 1, then continue sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + use a flag for full-art lands, this method should be updated + to assign those 0 and regular lands 1, then continue sorting. + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toFullArtFirst(final InventoryItem i) { - return toBasicLandSort(i); + return toBasicLandSort(i); } - + /**Returns 0 for wastes, 1 for plains, 2 for island, - 3 for swamp, 4 for mountain, 5 for forest. Snow - lands are treated like nonsnow. - @param i A paper card. - @return Part of a sortable numeric string.*/ + 3 for swamp, 4 for mountain, 5 for forest. Snow + lands are treated like nonsnow. + @param i A paper card. + @return Part of a sortable numeric string.*/ private static String toBasicLandSort(final InventoryItem i) { - CardType basicLandType = ((IPaperCard) i).getRules().getType(); - return basicLandType.hasStringType("Plains") ? "1" : ( - basicLandType.hasStringType("Island") ? "2" : ( - basicLandType.hasStringType("Swamp") ? "3" : ( - basicLandType.hasStringType("Mountain") ? "4" : ( - basicLandType.hasStringType("Forest") ? "5" : "0" - ) - ) - ) - ); + CardType basicLandType = ((IPaperCard) i).getRules().getType(); + return basicLandType.hasStringType("Plains") ? "1" : ( + basicLandType.hasStringType("Island") ? "2" : ( + basicLandType.hasStringType("Swamp") ? "3" : ( + basicLandType.hasStringType("Mountain") ? "4" : ( + basicLandType.hasStringType("Forest") ? "5" : "0" + ) + ) + ) + ); } }