diff --git a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java index f96fc2f863b..c2435410ac9 100644 --- a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java @@ -1217,7 +1217,7 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg String searchStr = ""; if (searchByTextField.getText().length() >= 3) { useText = true; - searchStr = searchByTextField.getText().toLowerCase(); + searchStr = searchByTextField.getText().toLowerCase(Locale.ENGLISH); } for (CardType cardType : selectByTypeButtons.keySet()) { @@ -1267,20 +1267,20 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg boolean s = card.isSelected(); // Name if (!s) { - s |= card.getName().toLowerCase().contains(searchStr); + s |= card.getName().toLowerCase(Locale.ENGLISH).contains(searchStr); } // Sub & Super Types if (!s) { for (SuperType str : card.getSuperTypes()) { - s |= str.toString().toLowerCase().contains(searchStr); + s |= str.toString().toLowerCase(Locale.ENGLISH).contains(searchStr); } for (SubType str : card.getSubTypes()) { - s |= str.toString().toLowerCase().contains(searchStr); + s |= str.toString().toLowerCase(Locale.ENGLISH).contains(searchStr); } } // Rarity if (!s) { - s |= card.getRarity().toString().toLowerCase().contains(searchStr); + s |= card.getRarity().toString().toLowerCase(Locale.ENGLISH).contains(searchStr); } // Type line if (!s) { @@ -1288,7 +1288,7 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg for (CardType type : card.getCardTypes()) { t += ' ' + type.toString(); } - s |= t.toLowerCase().contains(searchStr); + s |= t.toLowerCase(Locale.ENGLISH).contains(searchStr); } // Casting cost if (!s) { @@ -1296,12 +1296,12 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg for (String m : card.getManaCost()) { mc += m; } - s |= mc.toLowerCase().contains(searchStr); + s |= mc.toLowerCase(Locale.ENGLISH).contains(searchStr); } // Rules if (!s) { for (String str : card.getRules()) { - s |= str.toLowerCase().contains(searchStr); + s |= str.toLowerCase(Locale.ENGLISH).contains(searchStr); } } card.setSelected(s); @@ -1348,21 +1348,21 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg } // Sub & Super Types for (SuperType type : card.getSuperTypes()) { - t += ' ' + type.toString().toLowerCase(); + t += ' ' + type.toString().toLowerCase(Locale.ENGLISH); } for (SubType str : card.getSubTypes()) { - t += " " + str.toString().toLowerCase(); + t += " " + str.toString().toLowerCase(Locale.ENGLISH); } for (String qty : qtys.keySet()) { int value = qtys.get(qty); - if (t.toLowerCase().contains(qty)) { + if (t.toLowerCase(Locale.ENGLISH).contains(qty)) { qtys.put(qty, ++value); } // Rules for (String str : card.getRules()) { - if (str.toLowerCase().contains(qty)) { + if (str.toLowerCase(Locale.ENGLISH).contains(qty)) { qtys.put(qty, ++value); } } @@ -1380,10 +1380,10 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg } mc = mc.replaceAll("\\{([WUBRG]).([WUBRG])\\}", "{$1}{$2}"); mc = mc.replaceAll("\\{", "#"); - mc = mc.toLowerCase(); + mc = mc.toLowerCase(Locale.ENGLISH); for (String pip : pips.keySet()) { int value = pips.get(pip); - while (mc.toLowerCase().contains(pip)) { + while (mc.toLowerCase(Locale.ENGLISH).contains(pip)) { pips.put(pip, ++value); mc = mc.replaceFirst(pip, ""); } diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java index 288f39fd2bf..be4c48e6918 100644 --- a/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java +++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java @@ -39,6 +39,7 @@ import java.awt.Font; import java.awt.event.KeyEvent; import java.text.DateFormat; import java.util.Date; +import java.util.Locale; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -196,15 +197,15 @@ public class ChatPanelBasic extends javax.swing.JPanel { Pattern profanityPattern = Pattern.compile(".*(1ab1a|1d1ot|13p3r|13sb1ans|13sbo|13s13|13sb1an|13sbo|13sy|1nbr3d|1nc3st|1njun|1ub3|\\Wbj|\\Wcum|\\Wdum|\\Wfag|\\Wfap|\\W[sf]uk|\\Wj1s|\\Wp3do|\\Wp33|\\Wpoo\\W|\\Wt1t|aho13|an1ngu|ana1|anus|ar3o1a|ar3o13|ary1an|axyx|axyxhat|axyxho13|axyxmast3r|axyxmunch|axyxw1p3|b1atch|b1gt1t|b1mbo|b1ow|b1tch|ba1s|bab3|bang|barf|bastard|bawdy|b3an3r|b3ard3dc1am|b3ast1a1ty|b3atch|b3at3r|b3av3r|b3otch|b3yotch|bo1nk|bod1y|bon3d|bon3r|bon3|bob|bot13|boty|bow31|br3ast|bug3r|bukak3|bung|busty|buxyx|c1t|caca|cahon3|cam31to3|carp3tmunch3r|cawk|c3rv1x|ch1nc|ch1nk|chod3|co1ta1|cockb1ock|cockho1st3r|cocknock3r|cocksmok3r|cocksuck3r|cock|condom|corksuck3r|crabs|cums1ut|cumshot|cumsta1n|cnt|cun1ngus|cuntfac3|cunthunt3r|cunt|d1ck|d1k3|d1do|d1mw1t|d1ng13|d1psh1p|dago|dam1t|damn1t|damn3d|damn|dawg13sty13|dog13sty13|dogysty13|dong|dop3y|douch3|drunk|dumb|dumas|dum|dumbas|dumy|dyk3|3jacu1at3|3n1arg3m3nt|3r3ct1on|3r3ct|3rot1c|3xtacy|3xtasy|f.ck|f1osy|f1st3d|f1st1ng|f1sty|fa1gt|fa1g|fack|fag1t|fag3d|fagot|fag|[sf]cuk|f31at1o|f31at3|f31ch1ng|f31ch3r|f31ch|f31tch3r|f31tch|foad|fobar|fond13|for3sk1n|fu.k|fudg3pack3r|[sf]uk|g1ans|g1go1o|ganja|ghay|gh3y|go1d3nshow3r|gonad|gok|gr1ngo|h1t13r|handjob|hardon|hokah|hok3r|homo|honky|hor|hotch|hot3r|horny|hump1ng|hump3d|hump|hym3n|j1sm|j1s3d|j1sm|j1s|jackas|jackho13|jackof|j3rk3d|j3rkof|j3rk|junk13|junky|k1an|k1k3|k1nky|knob3nd|kyk3|mams|masa|mast3rba|masturba|max1|m3ns3s|m3nstruat|m[sf]uck1ng|mofo|moron|moth3rf|mthrf|muf|n1ger|n1ga|n1mrod|n1ny|n1p13|nak3d|napa1m|napy|nas1|n3gro|noky|nympho|op1at3|op1um|ora1y|ora1|org13s|organ|orgasm|orgy|ovary|ovum|p1owb1t3r|p1mp|p1nko|p1s3d|p1sof|p1s|pak1|pant13|panty|past13|pasty|p3ck3r|p3doph1|p3p3|p3n1a1|p3n13|p3n1s|p3n3trat1on|p3n3trat3|p3rv3rs1on|p3yot3|pha1c|phuck|po1ack|po1ock|pontang|pop|pr1ck|pr1g|pron|pub1|pub3|punkas|punky|pus1|pusy|puto|qu1cky|qu1ck13|qu1m|qu3af|qu3ro|qu3rs|qu3r|r1mjob|r1tard|racy|rap1st|rap3d|rap3r|rap3|raunch|r31ch|r3cta1|r3ctum|r3ctus|r3tard|r3tar|rtard|rumpram3r|rump|s1av3|s13as|s1ut|sack|sad1s|scag|sch1ong|sch1so|scr3w|scrog|scrot|scrud|scum|s3aman|s3am3n|s3duc3|s3m3n|s3xua1|sh1t|skag|skank|sm3gma|smut|sn1p3r|snatch|sodom|sp1ck|sp1c|sp1k|sp3rm|spunk|st3amy|stfu|ston3d|str1p|strok3|stup1d|suck|sumofab1atch|t1nk13|t1t[sf]uck|tampon|tard|t3abag1ng|t3at|t3st1|t3st3|t3urd|thrust|tramp|trans|trashy|twat|ug1y|unw3d|ur1n3a|ut3rus|vag1na|vu1gar|vu1va|w1g3r|wang|wank3r|wank|w31n3r|w31rdo|w3dg13|w3n13|w3tback|w3w3|wh1t3y|wh1s|whor3).*"); Pattern profanity2Pattern = Pattern.compile(".*(1ab1a|1d1ot|13p3r|13sb1ans|13sbo|13s13|13sb1an|13sbo|13sy|1nbr3d|1nc3st|1njun|1ub3|\\Wbj|\\Wcum|\\Wdum|\\Wfag|\\Wfap|\\W[sf]uk|\\Wj1s|\\Wp3do|\\Wp3|\\Wpo\\W|\\Wt1t|aho13|an1ngu|ana1|anus|ar3o1a|ar3o13|ary1an|axyx|axyxhat|axyxho13|axyxmast3r|axyxmunch|axyxw1p3|b1atch|b1gt1t|b1mbo|b1ow|b1tch|ba1s|bab3|bang|barf|bastard|bawdy|b3an3r|b3ard3dc1am|b3ast1a1ty|b3atch|b3at3r|b3av3r|b3otch|b3yotch|bo1nk|bod1y|bon3d|bon3r|bon3|bob|bot13|boty|bow31|br3ast|bug3r|bukak3|bung|busty|buxyx|c1t|caca|cahon3|cam31to3|carp3tmunch3r|cawk|c3rv1x|ch1nc|ch1nk|chod3|co1ta1|cockb1ock|cockho1st3r|cocknock3r|cocksmok3r|cocksuck3r|cock|condom|corksuck3r|crabs|cums1ut|cumshot|cumsta1n|cnt|cun1ngus|cuntfac3|cunthunt3r|cunt|d1ck|d1k3|d1do|d1mw1t|d1ng13|d1psh1p|dago|dam1t|damn1t|damn3d|damn|dawg13sty13|dog13sty13|dogysty13|dong|dop3y|douch3|drunk|dumb|dum|dumas|dumbas|dumy|dyk3|3jacu1at3|3n1arg3m3nt|3r3ct1on|3r3ct|3rot1c|3xtacy|3xtasy|f.ck|f1osy|f1st3d|f1st1ng|f1sty|fa1gt|fa1g|fack|fag1t|fag3d|fagot|fag|[sf]cuk|f31at1o|f31at3|f31ch1ng|f31ch3r|f31ch|f31tch3r|f31tch|foad|fobar|fond13|for3sk1n|fu.k|fudg3pack3r|[sf]uk|g1ans|g1go1o|ganja|ghay|gh3y|go1d3nshow3r|gonad|gr1ngo|h1t13r|handjob|hardon|hokah|hok3r|homo|honky|hor|hotch|hot3r|horny|hump1ng|hump3d|hump|hym3n|j1sm|j1s3d|j1sm|j1s|jackas|jackho13|jackof|j3rk3d|j3rkof|j3rk|junk13|junky|k1an|k1k3|k1nky|knob3nd|kyk3|mams|masa|mast3rba|masturba|max1|m3ns3s|m3nstruat|m[sf]uck1ng|mofo|moron|moth3rf|mthrf|muf|n1ga|n1ger|n1mrod|n1ny|n1p13|nak3d|napa1m|napy|nas1|n3gro|noky|nympho|op1at3|op1um|ora1y|ora1|org13s|organ|orgasm|orgy|ovary|ovum|p1owb1t3r|p1mp|p1nko|p1s3d|p1sof|p1s|pak1|pant13|panty|past13|pasty|p3ck3r|p3doph1|p3p3|p3n1a1|p3n13|p3n1s|p3n3trat1on|p3n3trat3|p3rv3rs1on|p3yot3|pha1c|phuck|po1ack|po1ock|pontang|pop|porno|porn|pr1ck|pr1g|pron|pub1|pub3|punkas|punky|pus1|pusy|puto|qu1cky|qu1ck13|qu1m|qu3af|qu3ro|qu3rs|qu3r|r1mjob|r1tard|racy|rap1st|rap3d|rap3r|rap3|raunch|r31ch|r3cta1|r3ctum|r3ctus|r3tard|r3tar|rtard|rumpram3r|rump|s1av3|s13as|s1ut|sack|sad1s|scag|sch1ong|sch1so|scr3w|scrog|scrot|scrud|scum|s3aman|s3am3n|s3duc3|s3m3n|s3xua1|sh1t|skag|skank|sm3gma|smut|sn1p3r|snatch|sodom|sp1ck|sp1c|sp1k|sp3rm|spunk|st3amy|stfu|ston3d|str1p|strok3|stup1d|suck|sumofab1atch|t1nk13|t1t[sf]uck|tampon|tard|t3abag1ng|t3at|t3st1|t3st3|t3urd|thrust|tramp|trans|trashy|twat|ug1y|unw3d|ur1n3a|ut3rus|vag1na|vu1gar|vu1va|w1g3r|wang|wank3r|wank|w31n3r|w31rdo|w3dg13|w3n13|w3tback|w3w3|wh1t3y|wh1s|whor3).*"); - + private boolean containsSwearing(String message, String level) { - + if (level.equals("0")) { return false; } message = '.' + message + '.'; - message = message.toLowerCase(); + message = message.toLowerCase(Locale.ENGLISH); message = message.replaceAll("[a@]([s5][s5]+)", "axyx"); message = message.replaceAll("b.([t\\+][t\\+]+)", "buxyx"); message = message.replaceAll("(.)(\\1{1,})", "$1"); @@ -280,11 +281,11 @@ public class ChatPanelBasic extends javax.swing.JPanel { } if (messageType == MessageType.WHISPER_FROM) { if (username.equalsIgnoreCase(SessionHandler.getUserName())) { - if (message.toLowerCase().startsWith("profanity 0")) { + if (message.toLowerCase(Locale.ENGLISH).startsWith("profanity 0")) { PreferencesDialog.saveValue(PreferencesDialog.KEY_GAME_USE_PROFANITY_FILTER, "0"); - } else if (message.toLowerCase().startsWith("profanity 1")) { + } else if (message.toLowerCase(Locale.ENGLISH).startsWith("profanity 1")) { PreferencesDialog.saveValue(PreferencesDialog.KEY_GAME_USE_PROFANITY_FILTER, "1"); - } else if (message.toLowerCase().startsWith("profanity 2")) { + } else if (message.toLowerCase(Locale.ENGLISH).startsWith("profanity 2")) { PreferencesDialog.saveValue(PreferencesDialog.KEY_GAME_USE_PROFANITY_FILTER, "2"); } } @@ -435,7 +436,7 @@ public class ChatPanelBasic extends javax.swing.JPanel { this.txtMessage.repaint(); } } - + public void enableHyperlinks() { txtConversation.enableHyperlinks(); } diff --git a/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java b/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java index 7a60696a100..d250a559c8f 100644 --- a/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java +++ b/Mage.Client/src/main/java/mage/client/components/ability/AbilityPicker.java @@ -438,7 +438,7 @@ public class AbilityPicker extends JXPanel implements MouseWheelListener { return choice; } choice = Jsoup.parse(choice).text(); // decode HTML entities and strip tags - return choice.substring(0, 1).toUpperCase() + choice.substring(1); + return choice.substring(0, 1).toUpperCase(Locale.ENGLISH) + choice.substring(1); } @Override diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java index ed73fbf9b60..ad8278ee239 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java @@ -30,6 +30,7 @@ package mage.client.deck.generator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import mage.cards.Card; @@ -86,7 +87,7 @@ public final class DeckGenerator { String selectedColors = genDialog.getSelectedColors(); List allowedColors = new ArrayList<>(); - selectedColors = selectedColors != null ? selectedColors.toUpperCase() : getRandomColors("X"); + selectedColors = selectedColors != null ? selectedColors.toUpperCase(Locale.ENGLISH) : getRandomColors("X"); String format = genDialog.getSelectedFormat(); List setsToUse = ConstructedFormats.getSetsByFormat(format); diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/RatioAdjustingSliderPanel.java b/Mage.Client/src/main/java/mage/client/deck/generator/RatioAdjustingSliderPanel.java index 972911400c7..267d0442f0a 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/RatioAdjustingSliderPanel.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/RatioAdjustingSliderPanel.java @@ -25,13 +25,13 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.client.deck.generator; -import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; +import java.util.Locale; +import javax.swing.*; /** * @author Simown @@ -74,23 +74,24 @@ public class RatioAdjustingSliderPanel extends JPanel { } - private static class AdjustingSliderGroup - { + private static class AdjustingSliderGroup { + private final ArrayList storageSliders; private int sliderIndex = 0; - AdjustingSliderGroup(JStorageSlider... sliders) - { + AdjustingSliderGroup(JStorageSlider... sliders) { storageSliders = new ArrayList<>(); - for(JStorageSlider slider: sliders) { + for (JStorageSlider slider : sliders) { storageSliders.add(slider); slider.addChangeListener(e -> fireSliderChangedEvent((JStorageSlider) e.getSource())); } } + public void fireSliderChangedEvent(JStorageSlider source) { // We don't want to do anything if the value isn't changing - if(!source.getValueIsAdjusting()) + if (!source.getValueIsAdjusting()) { return; + } // Update the slider depending on how much it's changed relative to its previous position int change = (source.getValue() - source.getPreviousValue()); updateSliderPosition(change, source); @@ -98,11 +99,11 @@ public class RatioAdjustingSliderPanel extends JPanel { private void updateSliderPosition(int change, JStorageSlider source) { int remaining = change; - while (remaining != 0) { + while (remaining != 0) { // Get the currently indexed slider JStorageSlider slider = storageSliders.get(sliderIndex); // If it's not the slider that fired the event - if (slider != source) { + if (slider != source) { // Check we don't go over the upper and lower bounds if (remaining < 0 || (remaining > 0 && slider.getValue() > 0)) { // Adjust the currently selected slider by +/- 1 @@ -114,7 +115,7 @@ public class RatioAdjustingSliderPanel extends JPanel { // Select the next slider in the list of sliders sliderIndex = (sliderIndex + 1) % storageSliders.size(); } - for (JStorageSlider slider : storageSliders) { + for (JStorageSlider slider : storageSliders) { slider.setPreviousValue(slider.getValue()); } } @@ -156,7 +157,7 @@ public class RatioAdjustingSliderPanel extends JPanel { textLabels.add(titleLabel); sliderPanel.add(titleLabel, BorderLayout.WEST); // Slider - slider.setToolTipText("Percentage of " + label.trim().toLowerCase() + " in the generated deck."); + slider.setToolTipText("Percentage of " + label.trim().toLowerCase(Locale.ENGLISH) + " in the generated deck."); sliderPanel.add(slider, BorderLayout.CENTER); // Percentage JLabel percentageLabel = createChangingPercentageLabel(slider); @@ -166,7 +167,7 @@ public class RatioAdjustingSliderPanel extends JPanel { return sliderPanel; } - private static JLabel createChangingPercentageLabel(final JSlider slider) { + private static JLabel createChangingPercentageLabel(final JSlider slider) { final JLabel label = new JLabel(" " + String.valueOf(slider.getValue()) + '%'); @@ -174,7 +175,7 @@ public class RatioAdjustingSliderPanel extends JPanel { String value = String.valueOf(slider.getValue()); StringBuilder labelBuilder = new StringBuilder(); // Pad with spaces so all percentage labels are of equal size - for(int i = 0; i < (5-value.length()); i++) { + for (int i = 0; i < (5 - value.length()); i++) { labelBuilder.append(" "); } labelBuilder.append(value); @@ -186,16 +187,16 @@ public class RatioAdjustingSliderPanel extends JPanel { @Override public void setEnabled(boolean enabled) { - for(JStorageSlider slider: sg.getSliders()) { + for (JStorageSlider slider : sg.getSliders()) { slider.setEnabled(enabled); } - for(JLabel label: textLabels) { + for (JLabel label : textLabels) { label.setEnabled(enabled); } } public void resetValues() { - for(JStorageSlider slider: sg.getSliders()) { + for (JStorageSlider slider : sg.getSliders()) { slider.resetDefault(); } } @@ -227,7 +228,4 @@ public class RatioAdjustingSliderPanel extends JPanel { landSlider.previousValue = percentage; } - - - } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index 3d0a2d5a660..681c4fc5a16 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -1125,7 +1125,7 @@ class DeckFilter extends FileFilter { int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { - ext = s.substring(i + 1).toLowerCase(); + ext = s.substring(i + 1).toLowerCase(Locale.ENGLISH); } return (ext == null) ? false : ext.equals("dck"); } @@ -1149,10 +1149,10 @@ class ImportFilter extends FileFilter { int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { - ext = s.substring(i + 1).toLowerCase(); + ext = s.substring(i + 1).toLowerCase(Locale.ENGLISH); } if (ext != null) { - if (ext.toLowerCase().equals("dec") || ext.toLowerCase().equals("mwdeck") || ext.toLowerCase().equals("txt") || ext.toLowerCase().equals("dek")) { + if (ext.toLowerCase(Locale.ENGLISH).equals("dec") || ext.toLowerCase(Locale.ENGLISH).equals("mwdeck") || ext.toLowerCase(Locale.ENGLISH).equals("txt") || ext.toLowerCase(Locale.ENGLISH).equals("dek")) { return true; } } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index 3e5d446f6d4..a9c18d7bd5c 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -37,6 +37,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.UUID; import javax.imageio.ImageIO; import javax.swing.*; @@ -500,10 +501,10 @@ public class MageBook extends JComponent { className = className.replaceAll("[^a-zA-Z0-9]", ""); className = "mage.game.permanent.token." + className + "Token"; if (token.getTokenClassName() != null && token.getTokenClassName().length() > 0) { - if (token.getTokenClassName().toLowerCase().matches(".*token.*")) { + if (token.getTokenClassName().toLowerCase(Locale.ENGLISH).matches(".*token.*")) { className = token.getTokenClassName(); className = "mage.game.permanent.token." + className; - } else if (token.getTokenClassName().toLowerCase().matches(".*emblem.*")) { + } else if (token.getTokenClassName().toLowerCase(Locale.ENGLISH).matches(".*emblem.*")) { continue; } } @@ -541,7 +542,7 @@ public class MageBook extends JComponent { try { String className = emblem.getName(); if (emblem.getTokenClassName() != null && emblem.getTokenClassName().length() > 0) { - if (emblem.getTokenClassName().toLowerCase().matches(".*emblem.*")) { + if (emblem.getTokenClassName().toLowerCase(Locale.ENGLISH).matches(".*emblem.*")) { className = emblem.getTokenClassName(); className = "mage.game.command.emblems." + className; } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java index 7015a2cdd61..4643e8a0f33 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java @@ -44,7 +44,6 @@ import mage.view.CardsView; import org.apache.log4j.Logger; import org.jdesktop.swingx.JXPanel; import org.mage.card.arcane.ManaSymbols; -import org.mage.card.arcane.UI; import javax.swing.*; import javax.swing.table.AbstractTableModel; diff --git a/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java b/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java index fcfaed61531..7086e962993 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java @@ -37,7 +37,6 @@ import java.awt.Dimension; import java.awt.Point; import java.beans.PropertyVetoException; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; import java.util.UUID; import javax.swing.ImageIcon; diff --git a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java index 5a613389dcb..e1dee129253 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java @@ -51,11 +51,9 @@ import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -723,14 +721,14 @@ public class ConnectDialog extends MageDialog { }//GEN-LAST:event_btnFind2findPublicServerActionPerformed - private void connectXmageus(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connecXmageusW + private void connectXmageus(java.awt.event.ActionEvent evt) { String serverAddress = "xmage.us"; this.txtServer.setText(serverAddress); this.txtPort.setText("17171"); // Update userName and password according to the chosen server. this.txtUserName.setText(MagePreferences.getUserName(serverAddress)); this.txtPassword.setText(MagePreferences.getPassword(serverAddress)); - }//GEN-LAST:event_connectXmageus + } private void btnFlagSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFlagSearchActionPerformed doFastFlagSearch(); diff --git a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.form b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.form index 43875f57d71..6ca56f00a1a 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.form @@ -1,4 +1,4 @@ - +
@@ -7,6 +7,7 @@ + diff --git a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java index e42f74b3cb3..e4625c8bcf8 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java @@ -24,15 +24,14 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.client.dialog; +import java.util.Locale; +import javax.swing.*; import mage.client.SessionHandler; import org.apache.log4j.Logger; -import javax.swing.*; - /** * Feedback dialog. * @@ -47,17 +46,19 @@ public class FeedbackDialog extends javax.swing.JDialog { "Thank you or \"Devs, you are so cool!\"", "Question or \"I'm so curious about\""}; - /** Creates new form PreferencesDialog */ + /** + * Creates new form PreferencesDialog + */ public FeedbackDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); cbFeedbackType.setModel(new DefaultComboBoxModel(feedbackTypes)); } - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents @@ -259,16 +260,16 @@ public class FeedbackDialog extends javax.swing.JDialog { if (type == null || type.isEmpty()) { return ""; } - if (type.toLowerCase().startsWith("bug")) { + if (type.toLowerCase(Locale.ENGLISH).startsWith("bug")) { return "bug"; } - if (type.toLowerCase().startsWith("feature")) { + if (type.toLowerCase(Locale.ENGLISH).startsWith("feature")) { return "feature"; } - if (type.toLowerCase().startsWith("thank")) { + if (type.toLowerCase(Locale.ENGLISH).startsWith("thank")) { return "thank"; } - if (type.toLowerCase().startsWith("question")) { + if (type.toLowerCase(Locale.ENGLISH).startsWith("question")) { return "question"; } return ""; diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index 5bf1e16a951..81525896965 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.UUID; import javax.swing.*; import javax.swing.filechooser.FileFilter; @@ -1264,7 +1265,7 @@ class DeckFilter extends FileFilter { int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { - ext = s.substring(i + 1).toLowerCase(); + ext = s.substring(i + 1).toLowerCase(Locale.ENGLISH); } return (ext == null) ? false : ext.equals("dck"); } diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java index 80a28468f9e..b269843f584 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java @@ -210,11 +210,11 @@ public class PickChoiceDialog extends MageDialog { // load data to datamodel after filter or on startup String filter = choice.getSearchText(); if (filter == null){ filter = ""; } - filter = filter.toLowerCase(); + filter = filter.toLowerCase(Locale.ENGLISH); this.dataModel.clear(); for(KeyValueItem item: this.allItems){ - if(!choice.isSearchEnabled() || item.Value.toLowerCase().contains(filter)){ + if(!choice.isSearchEnabled() || item.Value.toLowerCase(Locale.ENGLISH).contains(filter)){ this.dataModel.addElement(item); } } diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickNumberDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickNumberDialog.java index 82a8f6c0c82..9d6ff7ea87f 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PickNumberDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PickNumberDialog.java @@ -35,8 +35,6 @@ package mage.client.dialog; import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index 76aeb4619e4..eb621b01dce 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -45,6 +45,7 @@ import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; @@ -3492,7 +3493,7 @@ public class PreferencesDialog extends javax.swing.JDialog { } private static void loadProxySettings(Preferences prefs) { - dialog.cbProxyType.setSelectedItem(Connection.ProxyType.valueOf(MageFrame.getPreferences().get(KEY_PROXY_TYPE, "NONE").toUpperCase())); + dialog.cbProxyType.setSelectedItem(Connection.ProxyType.valueOf(MageFrame.getPreferences().get(KEY_PROXY_TYPE, "NONE").toUpperCase(Locale.ENGLISH))); load(prefs, dialog.txtProxyServer, KEY_PROXY_ADDRESS, Config.serverName); load(prefs, dialog.txtProxyPort, KEY_PROXY_PORT, Integer.toString(Config.port)); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 4eb39e2b2eb..f6819e77025 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -52,7 +52,6 @@ import mage.client.util.gui.ArrowBuilder; import mage.client.util.gui.MageDialogState; import mage.constants.*; import mage.game.events.PlayerQueryEvent; -import mage.game.turn.Phase; import mage.view.*; import org.apache.log4j.Logger; import org.mage.card.arcane.CardPanel; diff --git a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java index 1bd86d7a3da..c09ed013830 100644 --- a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java @@ -45,7 +45,6 @@ import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; import mage.client.SessionHandler; import mage.client.components.MageTextArea; diff --git a/Mage.Client/src/main/java/mage/client/table/NewPlayerPanel.java b/Mage.Client/src/main/java/mage/client/table/NewPlayerPanel.java index 0f9cdc31ba2..bd5ae2e9a82 100644 --- a/Mage.Client/src/main/java/mage/client/table/NewPlayerPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/NewPlayerPanel.java @@ -24,25 +24,24 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ + */ -/* + /* * NewPlayerPanel.java * * Created on 15-Dec-2009, 10:09:46 PM */ - package mage.client.table; +import java.io.File; +import java.io.IOException; +import java.util.Locale; +import javax.swing.*; +import javax.swing.filechooser.FileFilter; import mage.client.MageFrame; import mage.client.deck.generator.DeckGenerator; import mage.client.util.Config; -import javax.swing.*; -import javax.swing.filechooser.FileFilter; -import java.io.File; -import java.io.IOException; - /** * * @author BetaSteward_at_googlemail.com @@ -51,7 +50,9 @@ public class NewPlayerPanel extends javax.swing.JPanel { private final JFileChooser fcSelectDeck; - /** Creates new form NewPlayerPanel */ + /** + * Creates new form NewPlayerPanel + */ public NewPlayerPanel() { initComponents(); fcSelectDeck = new JFileChooser(); @@ -86,7 +87,8 @@ public class NewPlayerPanel extends javax.swing.JPanel { this.txtPlayerDeck.setText(file.getPath()); try { MageFrame.getPreferences().put("lastDeckFolder", file.getCanonicalPath()); - } catch (IOException ex) { } + } catch (IOException ex) { + } } fcSelectDeck.setSelectedFile(null); } @@ -111,9 +113,8 @@ public class NewPlayerPanel extends javax.swing.JPanel { this.txtPlayerDeck.setText(deckFile); } - public int getLevel() { - return (Integer)spnLevel.getValue(); + return (Integer) spnLevel.getValue(); } public void showLevel(boolean show) { @@ -128,10 +129,10 @@ public class NewPlayerPanel extends javax.swing.JPanel { this.btnPlayerDeck.setVisible(show); } - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents @@ -211,7 +212,6 @@ public class NewPlayerPanel extends javax.swing.JPanel { generateDeck(); }//GEN-LAST:event_btnGenerateActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnGenerate; private javax.swing.JButton btnPlayerDeck; @@ -237,10 +237,10 @@ class DeckFilter extends FileFilter { String s = f.getName(); int i = s.lastIndexOf('.'); - if (i > 0 && i < s.length() - 1) { - ext = s.substring(i+1).toLowerCase(); + if (i > 0 && i < s.length() - 1) { + ext = s.substring(i + 1).toLowerCase(Locale.ENGLISH); } - return (ext==null)?false:ext.equals("dck"); + return (ext == null) ? false : ext.equals("dck"); } @Override @@ -248,4 +248,4 @@ class DeckFilter extends FileFilter { return "Deck Files"; } -} \ No newline at end of file +} diff --git a/Mage.Client/src/main/java/mage/client/util/CardViewEDHPowerLevelComparator.java b/Mage.Client/src/main/java/mage/client/util/CardViewEDHPowerLevelComparator.java index 2a1aa37a0c4..0698fdc8f50 100644 --- a/Mage.Client/src/main/java/mage/client/util/CardViewEDHPowerLevelComparator.java +++ b/Mage.Client/src/main/java/mage/client/util/CardViewEDHPowerLevelComparator.java @@ -28,6 +28,7 @@ package mage.client.util; import java.util.Comparator; +import java.util.Locale; import mage.view.CardView; /** @@ -99,7 +100,7 @@ public class CardViewEDHPowerLevelComparator implements Comparator { boolean whenYouCast = false; for (String str : card.getRules()) { - String s = str.toLowerCase(); + String s = str.toLowerCase(Locale.ENGLISH); annihilator |= s.contains("annihilator"); anyNumberOfTarget |= s.contains("any number"); buyback |= s.contains("buyback"); @@ -332,16 +333,16 @@ public class CardViewEDHPowerLevelComparator implements Comparator { } if (card.getCardTypes().contains("Plainswalker")) { - if (card.getName().toLowerCase().equals("jace, the mind sculptor")) { + if (card.getName().toLowerCase(Locale.ENGLISH).equals("jace, the mind sculptor")) { thisMaxPower = Math.max(thisMaxPower, 6); } - if (card.getName().toLowerCase().equals("ugin, the spirit dragon")) { + if (card.getName().toLowerCase(Locale.ENGLISH).equals("ugin, the spirit dragon")) { thisMaxPower = Math.max(thisMaxPower, 5); } thisMaxPower = Math.max(thisMaxPower, 4); } - String cn = card.getName().toLowerCase(); + String cn = card.getName().toLowerCase(Locale.ENGLISH); if (cn.equals("ancient tomb") || cn.equals("anafenza, the foremost") || cn.equals("arcum dagsson") diff --git a/Mage.Client/src/main/java/mage/client/util/DefaultActionCallback.java b/Mage.Client/src/main/java/mage/client/util/DefaultActionCallback.java index 33fc7f803c9..1789c6ef23b 100644 --- a/Mage.Client/src/main/java/mage/client/util/DefaultActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/util/DefaultActionCallback.java @@ -1,6 +1,5 @@ package mage.client.util; -import java.awt.event.MouseEvent; import java.util.UUID; import mage.client.SessionHandler; diff --git a/Mage.Client/src/main/java/mage/client/util/IgnoreList.java b/Mage.Client/src/main/java/mage/client/util/IgnoreList.java index 0fc95791b6f..89906031fa7 100644 --- a/Mage.Client/src/main/java/mage/client/util/IgnoreList.java +++ b/Mage.Client/src/main/java/mage/client/util/IgnoreList.java @@ -1,13 +1,12 @@ package mage.client.util; import com.google.common.collect.ImmutableSet; +import java.util.Arrays; +import java.util.Set; import mage.client.MageFrame; import mage.client.preference.MagePreferences; import mage.view.ChatMessage; -import java.util.Arrays; -import java.util.Set; - public final class IgnoreList { private static final String USAGE = "
\\ignore - shows current ignore list on this server." @@ -15,8 +14,8 @@ public final class IgnoreList { + "
\\unignore [username] - remove a username from your ignore list on this server.
"; public static final int MAX_IGNORE_LIST_SIZE = 50; - public static Set IGNORED_MESSAGE_TYPES = - ImmutableSet.of(ChatMessage.MessageType.TALK, + public static Set IGNORED_MESSAGE_TYPES + = ImmutableSet.of(ChatMessage.MessageType.TALK, ChatMessage.MessageType.WHISPER_FROM); public static String usage() { @@ -45,22 +44,13 @@ public final class IgnoreList { } if (userIsIgnored(serverAddress, user)) { - return new StringBuilder() - .append(user) - .append(" is already on your ignore list on ") - .append(serverAddress) - .toString(); + return user + " is already on your ignore list on " + serverAddress; } MagePreferences.addIgnoredUser(serverAddress, user); updateTablesTable(); - return new StringBuilder() - .append("Added ") - .append(user) - .append(" to your ignore list on ") - .append(serverAddress) - .toString(); + return "Added " + user + " to your ignore list on " + serverAddress; } private static void updateTablesTable() { @@ -76,19 +66,9 @@ public final class IgnoreList { } if (MagePreferences.removeIgnoredUser(serverAddress, user)) { updateTablesTable(); - return new StringBuilder() - .append("Removed ") - .append(user) - .append(" from your ignore list on ") - .append(serverAddress) - .toString(); + return "Removed " + user + " from your ignore list on " + serverAddress; } else { - return new StringBuilder() - .append("No such user \"") - .append(user) - .append("\" on your ignore list on ") - .append(serverAddress) - .toString(); + return "No such user \"" + user + "\" on your ignore list on " + serverAddress; } } diff --git a/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java index 3ce0b81d7ec..e7331c4e1a6 100644 --- a/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java +++ b/Mage.Client/src/main/java/mage/client/util/audio/MusicPlayer.java @@ -2,6 +2,7 @@ package mage.client.util.audio; import java.awt.List; import java.io.File; +import java.util.Locale; import java.util.concurrent.TimeUnit; import javax.sound.sampled.*; import mage.client.constants.Constants; @@ -38,7 +39,7 @@ public class MusicPlayer { } String filename; for (File f : fileread) { - filename = f.getName().toLowerCase(); + filename = f.getName().toLowerCase(Locale.ENGLISH); if (filename.endsWith(".mp3") || filename.endsWith(".wav")) { filelist.add(filename); } diff --git a/Mage.Client/src/main/java/mage/client/util/gui/ColorsChooser.java b/Mage.Client/src/main/java/mage/client/util/gui/ColorsChooser.java index 398b8715dbd..cdde35bd227 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/ColorsChooser.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/ColorsChooser.java @@ -6,6 +6,7 @@ import java.awt.FlowLayout; import java.awt.Image; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JComboBox; @@ -77,7 +78,7 @@ public class ColorsChooser extends JComboBox implements ListCellRenderer { private void drawOn(JPanel panel, String value) { List images = new ArrayList<>(); - value = value.toUpperCase(); + value = value.toUpperCase(Locale.ENGLISH); for (int i = 0; i < value.length(); i++) { char symbol = value.charAt(i); Image image = ManaSymbols.getSizedManaSymbol(String.valueOf(symbol)); diff --git a/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java b/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java index 6a5dd6c453c..2702815006b 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java @@ -2,6 +2,7 @@ package mage.client.util.gui; import java.awt.*; import java.util.ArrayList; +import java.util.Locale; import javax.swing.*; import mage.client.MageFrame; import mage.client.util.GUISizeHelper; @@ -65,7 +66,7 @@ public final class GuiDisplayUtil { out.append(c); } } - return out.toString().toLowerCase(); + return out.toString().toLowerCase(Locale.ENGLISH); } public static void keepComponentInsideScreen(int centerX, int centerY, Component component) { @@ -256,7 +257,7 @@ public final class GuiDisplayUtil { rarity = card.getRarity().getCode(); } if (card.getExpansionSetCode() != null) { - buffer.append(ManaSymbols.replaceSetCodeWithHTML(card.getExpansionSetCode().toUpperCase(), rarity, GUISizeHelper.symbolTooltipSize)); + buffer.append(ManaSymbols.replaceSetCodeWithHTML(card.getExpansionSetCode().toUpperCase(Locale.ENGLISH), rarity, GUISizeHelper.symbolTooltipSize)); } buffer.append(""); diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelComponentImpl.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelComponentImpl.java index e75da6e4f35..d7812ba2aaa 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelComponentImpl.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelComponentImpl.java @@ -1,818 +1,816 @@ -package org.mage.card.arcane; - -import com.google.common.base.Function; -import com.google.common.collect.MapMaker; -import mage.cards.action.ActionCallback; -import mage.client.dialog.PreferencesDialog; -import mage.client.util.ImageCaches; -import mage.client.util.ImageHelper; -import mage.components.ImagePanel; -import mage.components.ImagePanelStyle; -import mage.constants.AbilityType; -import mage.view.CardView; -import mage.view.CounterView; -import mage.view.PermanentView; -import mage.view.StackAbilityView; -import org.apache.log4j.Logger; -import org.jdesktop.swingx.graphics.GraphicsUtilities; -import org.mage.plugins.card.images.ImageCache; -import org.mage.plugins.card.utils.impl.ImageManagerImpl; -import mage.client.constants.Constants; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.UUID; - -/** - * Class for drawing the mage card object by using a form based JComponent - * approach - * - * @author arcane, nantuko, noxx, stravant, JayDi85 - */ -@SuppressWarnings({"unchecked", "rawtypes"}) -public class CardPanelComponentImpl extends CardPanel { - - private static final long serialVersionUID = -3272134219262184411L; - - private static final Logger LOGGER = Logger.getLogger(CardPanelComponentImpl.class); - - private static final int WIDTH_LIMIT = 90; // card width limit to create smaller counter - - private static final float ROUNDED_CORNER_SIZE = 0.1f; - private static final float BLACK_BORDER_SIZE = 0.03f; - private static final float SELECTION_BORDER_SIZE = 0.03f; - private static final int TEXT_GLOW_SIZE = 6; - private static final float TEXT_GLOW_INTENSITY = 3f; - - // size to show icons and text (help to see full size card without text) - private static final int CARD_MIN_SIZE_FOR_ICONS = 60; - private static final int CARD_MAX_SIZE_FOR_ICONS = 200; - - public final ScaledImagePanel imagePanel; - public ImagePanel overlayPanel; - - public JPanel iconPanel; - private JButton typeButton; - - public JPanel counterPanel; - private JLabel loyaltyCounterLabel; - private JLabel plusCounterLabel; - private JLabel otherCounterLabel; - private JLabel minusCounterLabel; - private int loyaltyCounter; - private int plusCounter; - private int otherCounter; - private int minusCounter; - private int lastCardWidth; - - private final GlowText titleText; - private final GlowText ptText; - private final JLabel fullImageText; - private String fullImagePath = null; - - private boolean hasImage = false; - - private boolean displayTitleAnyway; - private boolean displayFullImagePath; - - private final static Map IMAGE_CACHE; - - static class Key { - - final int width; - final int height; - final int cardWidth; - final int cardHeight; - final int cardXOffset; - final int cardYOffset; - final boolean hasImage; - final boolean isSelected; - final boolean isChoosable; - final boolean isPlayable; - final boolean canAttack; - - public Key(int width, int height, int cardWidth, int cardHeight, int cardXOffset, int cardYOffset, boolean hasImage, boolean isSelected, boolean isChoosable, boolean isPlayable, boolean canAttack) { - this.width = width; - this.height = height; - this.cardWidth = cardWidth; - this.cardHeight = cardHeight; - this.cardXOffset = cardXOffset; - this.cardYOffset = cardYOffset; - this.hasImage = hasImage; - this.isSelected = isSelected; - this.isChoosable = isChoosable; - this.isPlayable = isPlayable; - this.canAttack = canAttack; - } - - @Override - public int hashCode() { - int hash = 3; - hash = 19 * hash + this.width; - hash = 19 * hash + this.height; - hash = 19 * hash + this.cardWidth; - hash = 19 * hash + this.cardHeight; - hash = 19 * hash + this.cardXOffset; - hash = 19 * hash + this.cardYOffset; - hash = 19 * hash + (this.hasImage ? 1 : 0); - hash = 19 * hash + (this.isSelected ? 1 : 0); - hash = 19 * hash + (this.isChoosable ? 1 : 0); - hash = 19 * hash + (this.isPlayable ? 1 : 0); - hash = 19 * hash + (this.canAttack ? 1 : 0); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Key other = (Key) obj; - if (this.width != other.width) { - return false; - } - if (this.height != other.height) { - return false; - } - if (this.cardWidth != other.cardWidth) { - return false; - } - if (this.cardHeight != other.cardHeight) { - return false; - } - if (this.cardXOffset != other.cardXOffset) { - return false; - } - if (this.cardYOffset != other.cardYOffset) { - return false; - } - if (this.hasImage != other.hasImage) { - return false; - } - if (this.isSelected != other.isSelected) { - return false; - } - if (this.isChoosable != other.isChoosable) { - return false; - } - if (this.isPlayable != other.isPlayable) { - return false; - } - if (this.canAttack != other.canAttack) { - return false; - } - return true; - } - } - - static { - IMAGE_CACHE = ImageCaches.register(new MapMaker().softValues().makeComputingMap((Function) key -> createImage(key))); - } - - static private boolean canShowCardIcons(int cardFullWidth, boolean cardHasImage){ - // cards without images show icons and text always - // TODO: apply "card names on card" setting to icon too? - // TODO: fix card min-max size to hide (compare to settings size, not direct 60 and 200) - return ((cardFullWidth > 60) && (cardFullWidth < 200)) || (!cardHasImage); - } - - private static class CardSizes{ - Rectangle rectFull; - Rectangle rectSelection; - Rectangle rectBorder; - Rectangle rectCard; - - CardSizes(int offsetX, int offsetY, int fullWidth, int fullHeight){ - - int realBorderSizeX = Math.round(fullWidth * BLACK_BORDER_SIZE); - int realBorderSizeY = Math.round(fullWidth * BLACK_BORDER_SIZE); - int realSelectionSizeX = Math.round(fullWidth * SELECTION_BORDER_SIZE); - int realSelectionSizeY = Math.round(fullWidth * SELECTION_BORDER_SIZE); - - // card full size = select border + black border + real card - rectFull = new Rectangle(offsetX, offsetY, fullWidth, fullHeight); - rectSelection = new Rectangle(rectFull.x, rectFull.y, rectFull.width, rectFull.height); - rectBorder = new Rectangle(rectSelection.x + realSelectionSizeX, rectSelection.y + realSelectionSizeY, rectSelection.width - 2 * realSelectionSizeX, rectSelection.height - 2 * realSelectionSizeY); - rectCard = new Rectangle(rectBorder.x + realBorderSizeX, rectBorder.y + realBorderSizeY, rectBorder.width - 2 * realBorderSizeX, rectBorder.height - 2 * realBorderSizeY); - } - } - - public CardPanelComponentImpl(CardView newGameCard, UUID gameId, final boolean loadImage, ActionCallback callback, final boolean foil, Dimension dimension) { - // Call to super - super(newGameCard, gameId, loadImage, callback, foil, dimension); - - // Counter panel - if (!newGameCard.isAbility()) { - // panel to show counters on the card - counterPanel = new JPanel(); - counterPanel.setLayout(null); - counterPanel.setOpaque(false); - add(counterPanel); - - plusCounterLabel = new JLabel(""); - plusCounterLabel.setToolTipText("+1/+1"); - counterPanel.add(plusCounterLabel); - - minusCounterLabel = new JLabel(""); - minusCounterLabel.setToolTipText("-1/-1"); - counterPanel.add(minusCounterLabel); - - loyaltyCounterLabel = new JLabel(""); - loyaltyCounterLabel.setToolTipText("loyalty"); - counterPanel.add(loyaltyCounterLabel); - - otherCounterLabel = new JLabel(""); - counterPanel.add(otherCounterLabel); - - counterPanel.setVisible(false); - } - - // Ability icon - if (newGameCard.isAbility()) { - if (newGameCard.getAbilityType() == AbilityType.TRIGGERED) { - setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability"); - } else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED) { - setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability"); - } - } - - // Token icon - if (this.gameCard.isToken()) { - setTypeIcon(ImageManagerImpl.instance.getTokenIconImage(), "Token Permanent"); - } - - displayTitleAnyway = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_CARD_NAMES, "true").equals("true"); - displayFullImagePath = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_FULL_IMAGE_PATH, "false").equals("true"); - - // Title Text - titleText = new GlowText(); - setText(gameCard); -// int fontSize = (int) cardHeight / 11; -// titleText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); - titleText.setForeground(Color.white); - titleText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - titleText.setWrap(true); - add(titleText); - - // Full path to image text - fullImageText = new JLabel(); - fullImageText.setText(fullImagePath); - fullImageText.setForeground(Color.BLACK); - add(fullImageText); - - // PT Text - ptText = new GlowText(); - if (gameCard.isCreature()) { - ptText.setText(gameCard.getPower() + '/' + gameCard.getToughness()); - } else if (gameCard.isPlanesWalker()) { - ptText.setText(gameCard.getLoyalty()); - } -// ptText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); - ptText.setForeground(Color.white); - ptText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - add(ptText); - - // Sickness overlay - BufferedImage sickness = ImageManagerImpl.instance.getSicknessImage(); - overlayPanel = new ImagePanel(sickness, ImagePanelStyle.SCALED); - overlayPanel.setOpaque(false); - add(overlayPanel); - - // Imagel panel - imagePanel = new ScaledImagePanel(); - imagePanel.setBorder(BorderFactory.createLineBorder(Color.white)); - add(imagePanel); - - // Do we need to load? - if (loadImage) { - initialDraw(); - } else { - // Nothing to do - } - } - - private void setTypeIcon(BufferedImage bufferedImage, String toolTipText) { - iconPanel = new JPanel(); - iconPanel.setLayout(null); - iconPanel.setOpaque(false); - add(iconPanel); - - typeButton = new JButton(""); - typeButton.setLocation(2, 2); - typeButton.setSize(25, 25); - - iconPanel.setVisible(true); - typeButton.setIcon(new ImageIcon(bufferedImage)); - if (toolTipText != null) { - typeButton.setToolTipText(toolTipText); - } - iconPanel.add(typeButton); - } - - @Override - public void cleanUp() { - super.cleanUp(); - this.counterPanel = null; - } - - private void setText(CardView card) { - titleText.setText(!displayTitleAnyway && hasImage ? "" : card.getName()); - } - - private void setImage(BufferedImage srcImage) { - synchronized (imagePanel) { - if (srcImage != null) { - imagePanel.setImage(srcImage); - } else { - imagePanel.clearImage(); - } - repaint(); - } - doLayout(); - } - - private void setFullPath(String fullImagePath) { - this.fullImagePath = fullImagePath; - this.fullImagePath = this.fullImagePath.replaceAll("\\\\", "\\\\
"); - this.fullImagePath = this.fullImagePath.replaceAll("/", "/
"); - this.fullImagePath = "" + this.fullImagePath + ""; - fullImageText.setText(!displayFullImagePath ? "" : this.fullImagePath); - doLayout(); - } - - @Override - public void transferResources(final CardPanel panelAbstract) { - if (panelAbstract instanceof CardPanelComponentImpl) { - CardPanelComponentImpl panel = (CardPanelComponentImpl) panelAbstract; - synchronized (panel.imagePanel) { - if (panel.imagePanel.hasImage()) { - setImage(panel.imagePanel.getSrcImage()); - } - } - } - } - - @Override - public void setSelected(boolean isSelected) { - super.setSelected(isSelected); - if (isSelected) { - this.titleText.setGlowColor(Color.green); - } else { - this.titleText.setGlowColor(Color.black); - } - } - - @Override - protected void paintCard(Graphics2D g2d) { - float alpha = getAlpha(); - if (alpha != 1.0f) { - AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha); - g2d.setComposite(composite); - } - - g2d.drawImage( - IMAGE_CACHE.get( - new Key(getWidth(), getHeight(), getCardWidth(), getCardHeight(), getCardXOffset(), getCardYOffset(), - hasImage, isSelected(), isChoosable(), gameCard.isPlayable(), gameCard.isCanAttack())), - 0, 0, null); - g2d.dispose(); - } - - private static BufferedImage createImage(Key key) { - int cardWidth = key.cardWidth; - int cardHeight = key.cardHeight; - int cardXOffset = key.cardXOffset; - int cardYOffset = key.cardYOffset; - - BufferedImage image = GraphicsUtilities.createCompatibleTranslucentImage(key.width, key.height); - Graphics2D g2d = image.createGraphics(); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - // card full size = select border + black border + real card - CardSizes sizes = new CardSizes(cardXOffset, cardYOffset, cardWidth, cardHeight); - - // corners for selection and for border - int cornerSizeSelection = Math.max(4, Math.round(sizes.rectSelection.width * ROUNDED_CORNER_SIZE)); - int cornerSizeBorder = Math.max(4, Math.round(sizes.rectBorder.width * ROUNDED_CORNER_SIZE)); - - // DRAW ORDER from big to small: select -> select info -> border -> card - - // draw selection - if (key.isSelected) { - g2d.setColor(Color.green); - g2d.fillRoundRect(sizes.rectSelection.x + 1, sizes.rectSelection.y + 1, sizes.rectSelection.width - 2, sizes.rectSelection.height - 2, cornerSizeSelection, cornerSizeSelection); - } else if (key.isChoosable) { - g2d.setColor(new Color(250, 250, 0, 230)); - g2d.fillRoundRect(sizes.rectSelection.x + 1, sizes.rectSelection.y + 1, sizes.rectSelection.width - 2, sizes.rectSelection.height - 2, cornerSizeSelection, cornerSizeSelection); - } else if (key.isPlayable) { - g2d.setColor(new Color(153, 102, 204, 200)); - g2d.fillRoundRect(sizes.rectSelection.x, sizes.rectSelection.y, sizes.rectSelection.width, sizes.rectSelection.height, cornerSizeSelection, cornerSizeSelection); - } - - // draw empty card with border - if (!key.hasImage) { - // gray 1 px border - g2d.setColor(new Color(125, 125, 125, 255)); - g2d.fillRoundRect(sizes.rectBorder.x, sizes.rectBorder.y, sizes.rectBorder.width, sizes.rectBorder.height, cornerSizeBorder, cornerSizeBorder); - // color plate - g2d.setColor(new Color(30, 200, 200, 200)); - g2d.fillRoundRect(sizes.rectBorder.x + 1, sizes.rectBorder.y + 1, sizes.rectBorder.width - 2, sizes.rectBorder.height - 2, cornerSizeBorder, cornerSizeBorder); - } - - // draw attack border (inner part of selection) - if (key.canAttack) { - g2d.setColor(new Color(0, 0, 255, 230)); - g2d.fillRoundRect(sizes.rectBorder.x + 1, sizes.rectBorder.y + 1, sizes.rectBorder.width - 2, sizes.rectBorder.height - 2, cornerSizeBorder, cornerSizeBorder); - } - - // draw real card by component (see imagePanel and other layout's items) - - //TODO:uncomment - /* - if (gameCard.isAttacking()) { - g2d.setColor(new Color(200,10,10,200)); - g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize); - }*/ - g2d.dispose(); - - return image; - } - - @Override - protected void paintChildren(Graphics g) { - super.paintChildren(g); - - CardSizes realCard = new CardSizes(getCardXOffset(), getCardYOffset(), getCardWidth(), getCardHeight()); - - /* - // draw recs for debug - - // full card - g.setColor(new Color(255, 0, 0)); - g.drawRect(realCard.rectFull.x, realCard.rectFull.y, realCard.rectFull.width, realCard.rectFull.height); - - // real card - image - g.setColor(new Color(0, 0, 255)); - g.drawRect(imagePanel.getX(), imagePanel.getY(), imagePanel.getBounds().width, imagePanel.getBounds().height); - - // caption - g.setColor(new Color(0, 255, 255)); - g.drawRect(titleText.getX(), titleText.getY(), titleText.getBounds().width, titleText.getBounds().height); - - // life points - g.setColor(new Color(120, 0, 120)); - g.drawRect(ptText.getX(), ptText.getY(), ptText.getBounds().width, ptText.getBounds().height); - //*/ - - if (getShowCastingCost() && !isAnimationPanel() && canShowCardIcons(getCardWidth(), hasImage)) { - - int symbolMarginX = 2; // 2 px between icons - - String manaCost = ManaSymbols.getStringManaCost(gameCard.getManaCost()); - int manaWidth = getManaWidth(manaCost, symbolMarginX); - - // right top corner with margin (sizes from any sample card, length from black border to mana icon) - int manaMarginRight = Math.round(22f / 672f * getCardWidth()); - int manaMarginTop = Math.round(24f / 936f * getCardHeight()); - - int manaX = getCardXOffset() + getCardWidth() - manaMarginRight - manaWidth; - int manaY = getCardYOffset() + manaMarginTop; - - ManaSymbols.draw(g, manaCost, manaX, manaY, getSymbolWidth(), Color.black, symbolMarginX); - } - } - - private int getManaWidth(String manaCost, int symbolMarginX) { - int width = 0; - manaCost = manaCost.replace("\\", ""); - StringTokenizer tok = new StringTokenizer(manaCost, " "); - while (tok.hasMoreTokens()) { - tok.nextToken(); - if(width != 0) { - width += symbolMarginX; - } - width += getSymbolWidth(); - } - return width; - } - - @Override - public void doLayout() { - super.doLayout(); - - int cardWidth = getCardWidth(); - int cardHeight = getCardHeight(); - int cardXOffset = getCardXOffset(); - int cardYOffset = getCardYOffset(); - - CardSizes sizes = new CardSizes(cardXOffset, cardYOffset, cardWidth, cardHeight); - - // origin card without selection - Rectangle realCardSize = sizes.rectBorder; - imagePanel.setLocation(realCardSize.x, realCardSize.y); - imagePanel.setSize(realCardSize.width, realCardSize.height); - - if (hasSickness() && gameCard.isCreature() && isPermanent()) { - overlayPanel.setLocation(realCardSize.x, realCardSize.y); - overlayPanel.setSize(realCardSize.width, realCardSize.height); - } else { - overlayPanel.setVisible(false); - } - - if (iconPanel != null) { - iconPanel.setLocation(realCardSize.x, realCardSize.y); - iconPanel.setSize(realCardSize.width, realCardSize.height); - } - if (counterPanel != null) { - counterPanel.setLocation(realCardSize.x, realCardSize.y); - counterPanel.setSize(realCardSize.width, realCardSize.height); - int size = cardWidth > WIDTH_LIMIT ? 40 : 20; - - minusCounterLabel.setLocation(counterPanel.getWidth() - size, counterPanel.getHeight() - size * 2); - minusCounterLabel.setSize(size, size); - - plusCounterLabel.setLocation(5, counterPanel.getHeight() - size * 2); - plusCounterLabel.setSize(size, size); - - loyaltyCounterLabel.setLocation(counterPanel.getWidth() - size, counterPanel.getHeight() - size); - loyaltyCounterLabel.setSize(size, size); - - otherCounterLabel.setLocation(5, counterPanel.getHeight() - size); - otherCounterLabel.setSize(size, size); - - } - - // TITLE - - //old version - text hide on small fonts, why? - //int fontHeight = Math.round(cardHeight * (26f / 672)); - //boolean showText = (!isAnimationPanel() && fontHeight < 12); - - boolean showText = !isAnimationPanel() && canShowCardIcons(cardWidth, hasImage); - titleText.setVisible(showText); - ptText.setVisible(showText); - fullImageText.setVisible(fullImagePath != null); - - if (showText) { - int fontSize = cardHeight / 13; // startup font size (it same size on all zoom levels) - titleText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); - - // margins from card black border to text, not need? text show up good without margins - int titleMarginLeft = 0; //Math.round(28f / 672f * cardWidth); - int titleMarginRight = 0; - int titleMarginTop = 0 + Math.round(getCardCaptionTopOffset() / 100f * cardHeight);//Math.round(28f / 936f * cardHeight); - int titleMarginBottom = 0; - titleText.setBounds( - imagePanel.getX() + titleMarginLeft, - imagePanel.getY() + titleMarginTop, - imagePanel.getBounds().width - titleMarginLeft - titleMarginRight, - imagePanel.getBounds().height - titleMarginTop - titleMarginBottom - ); - - fullImageText.setFont(getFont().deriveFont(Font.PLAIN, 10)); - fullImageText.setBounds(titleText.getX(), titleText.getY(), titleText.getBounds().width, titleText.getBounds().height); - - // life points location (font as title) - ptText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); - Dimension ptSize = ptText.getPreferredSize(); - ptText.setSize(ptSize.width, ptSize.height); - - // right bottom corner with margin (sizes from any sample card) - int ptMarginRight = Math.round(64f / 672f * cardWidth); - int ptMarginBottom = Math.round(62f / 936f * cardHeight); - - int ptX = cardXOffset + cardWidth - ptMarginRight - ptSize.width; - int ptY = cardYOffset + cardHeight - ptMarginBottom - ptSize.height; - ptText.setLocation(ptX, ptY); - - // old version was with TEXT_GLOW_SIZE - //ptText.setLocation(cardXOffset + ptX - TEXT_GLOW_SIZE / 2 - offsetX, cardYOffset + ptY - TEXT_GLOW_SIZE / 2); - } - } - - @Override - public String toString() { - return gameCard.toString(); - } - - @Override - public void setCardBounds(int x, int y, int cardWidth, int cardHeight) { - // Call to super - super.setCardBounds(x, y, cardWidth, cardHeight); - - // Update image - if (imagePanel != null && imagePanel.getSrcImage() != null) { - updateArtImage(); - } - } - - @Override - public void setAlpha(float alpha) { - super.setAlpha(alpha); - - // Update components - if (alpha == 0) { - this.ptText.setVisible(false); - this.titleText.setVisible(false); - } else if (alpha == 1.0f) { - this.ptText.setVisible(true); - this.titleText.setVisible(true); - } - } - - /////////////////////////////////////////////////////////// - // Image updating code - private int updateArtImageStamp; - - @Override - public void updateArtImage() { - tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; - flippedAngle = isFlipped() ? CardPanel.FLIPPED_ANGLE : 0; - - //final CardView gameCard = this.gameCard; - final int stamp = ++updateArtImageStamp; - - Util.threadPool.submit(() -> { - try { - final BufferedImage srcImage; - if (gameCard.isFaceDown()) { - srcImage = getFaceDownImage(); - } else if (getCardWidth() > Constants.THUMBNAIL_SIZE_FULL.width) { - srcImage = ImageCache.getImage(gameCard, getCardWidth(), getCardHeight()); - } else { - srcImage = ImageCache.getThumbnail(gameCard); - } - if (srcImage == null) { - setFullPath(ImageCache.getFilePath(gameCard, getCardWidth())); - } - UI.invokeLater(() -> { - if (stamp == updateArtImageStamp) { - hasImage = srcImage != null; - setText(gameCard); - setImage(srcImage); - } - }); - } catch (Exception e) { - e.printStackTrace(); - } catch (Error err) { - err.printStackTrace(); - } - }); - } - - private BufferedImage getFaceDownImage() { - if (isPermanent()) { - if (((PermanentView) gameCard).isMorphed()) { - return ImageCache.getMorphImage(); - } else { - return ImageCache.getManifestImage(); - } - } else if (this.gameCard instanceof StackAbilityView) { - return ImageCache.getMorphImage(); - } else { - return ImageCache.getCardbackImage(); - } - } - - @Override - public void showCardTitle() { - displayTitleAnyway = true; - setText(gameCard); - } - - @Override - public void update(CardView card) { - // Super - super.update(card); - - // Update card text - if (card.isCreature() && card.isPlanesWalker()) { - ptText.setText(card.getPower() + '/' + card.getToughness() + " (" + card.getLoyalty() + ')'); - } else if (card.isCreature()) { - ptText.setText(card.getPower() + '/' + card.getToughness()); - } else if (card.isPlanesWalker()) { - ptText.setText(card.getLoyalty()); - } else { - ptText.setText(""); - } - setText(card); - - // Summoning Sickness overlay - if (hasSickness() && card.isCreature() && isPermanent()) { - overlayPanel.setVisible(true); - } else { - overlayPanel.setVisible(false); - } - - // Update counters panel - if (counterPanel != null) { - updateCounters(card); - } - - // Finally, queue a repaint - repaint(); - } - - private void updateCounters(CardView card) { - if (card.getCounters() != null && !card.getCounters().isEmpty()) { - String name = ""; - if (lastCardWidth != getCardWidth()) { - lastCardWidth = getCardWidth(); - plusCounter = 0; - minusCounter = 0; - otherCounter = 0; - loyaltyCounter = 0; - } - plusCounterLabel.setVisible(false); - minusCounterLabel.setVisible(false); - loyaltyCounterLabel.setVisible(false); - otherCounterLabel.setVisible(false); - for (CounterView counterView : card.getCounters()) { - if (counterView.getCount() == 0) { - continue; - } - switch (counterView.getName()) { - case "+1/+1": - if (counterView.getCount() != plusCounter) { - plusCounter = counterView.getCount(); - plusCounterLabel.setIcon(getCounterImageWithAmount(plusCounter, ImageManagerImpl.instance.getCounterImageGreen(), getCardWidth())); - } - plusCounterLabel.setVisible(true); - break; - case "-1/-1": - if (counterView.getCount() != minusCounter) { - minusCounter = counterView.getCount(); - minusCounterLabel.setIcon(getCounterImageWithAmount(minusCounter, ImageManagerImpl.instance.getCounterImageRed(), getCardWidth())); - } - minusCounterLabel.setVisible(true); - break; - case "loyalty": - if (counterView.getCount() != loyaltyCounter) { - loyaltyCounter = counterView.getCount(); - loyaltyCounterLabel.setIcon(getCounterImageWithAmount(loyaltyCounter, ImageManagerImpl.instance.getCounterImageViolet(), getCardWidth())); - } - loyaltyCounterLabel.setVisible(true); - break; - default: - if (name.isEmpty()) { // only first other counter is shown - name = counterView.getName(); - otherCounter = counterView.getCount(); - otherCounterLabel.setToolTipText(name); - otherCounterLabel.setIcon(getCounterImageWithAmount(otherCounter, ImageManagerImpl.instance.getCounterImageGrey(), getCardWidth())); - otherCounterLabel.setVisible(true); - } - } - } - - counterPanel.setVisible(true); - } else { - plusCounterLabel.setVisible(false); - minusCounterLabel.setVisible(false); - loyaltyCounterLabel.setVisible(false); - otherCounterLabel.setVisible(false); - counterPanel.setVisible(false); - } - - } - - private static ImageIcon getCounterImageWithAmount(int amount, BufferedImage image, int cardWidth) { - int factor = cardWidth > WIDTH_LIMIT ? 2 : 1; - int xOffset = amount > 9 ? 2 : 5; - int fontSize = factor == 1 ? amount < 10 ? 12 : amount < 100 ? 10 : amount < 1000 ? 7 : 6 - : amount < 10 ? 19 : amount < 100 ? 15 : amount < 1000 ? 12 : amount < 10000 ? 9 : 8; - BufferedImage newImage; - if (cardWidth > WIDTH_LIMIT) { - newImage = ImageManagerImpl.deepCopy(image); - } else { - newImage = ImageHelper.getResizedImage(image, 20, 20); - } - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Arial Black", amount > 100 ? Font.PLAIN : Font.BOLD, fontSize)); - graphics.drawString(Integer.toString(amount), xOffset * factor, 11 * factor); - return new ImageIcon(newImage); - } - - @Override - public Image getImage() { - if (this.hasImage) { - if (gameCard.isFaceDown()) { - return getFaceDownImage(); - } else { - return ImageCache.getImageOriginal(gameCard); - } - } - return null; - } -} +package org.mage.card.arcane; + +import com.google.common.base.Function; +import com.google.common.collect.MapMaker; +import mage.cards.action.ActionCallback; +import mage.client.dialog.PreferencesDialog; +import mage.client.util.ImageCaches; +import mage.client.util.ImageHelper; +import mage.components.ImagePanel; +import mage.components.ImagePanelStyle; +import mage.constants.AbilityType; +import mage.view.CardView; +import mage.view.CounterView; +import mage.view.PermanentView; +import mage.view.StackAbilityView; +import org.apache.log4j.Logger; +import org.jdesktop.swingx.graphics.GraphicsUtilities; +import org.mage.plugins.card.images.ImageCache; +import org.mage.plugins.card.utils.impl.ImageManagerImpl; +import mage.client.constants.Constants; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.UUID; + +/** + * Class for drawing the mage card object by using a form based JComponent + * approach + * + * @author arcane, nantuko, noxx, stravant, JayDi85 + */ +@SuppressWarnings({"unchecked", "rawtypes"}) +public class CardPanelComponentImpl extends CardPanel { + + private static final long serialVersionUID = -3272134219262184411L; + + private static final Logger LOGGER = Logger.getLogger(CardPanelComponentImpl.class); + + private static final int WIDTH_LIMIT = 90; // card width limit to create smaller counter + + private static final float ROUNDED_CORNER_SIZE = 0.1f; + private static final float BLACK_BORDER_SIZE = 0.03f; + private static final float SELECTION_BORDER_SIZE = 0.03f; + private static final int TEXT_GLOW_SIZE = 6; + private static final float TEXT_GLOW_INTENSITY = 3f; + + // size to show icons and text (help to see full size card without text) + private static final int CARD_MIN_SIZE_FOR_ICONS = 60; + private static final int CARD_MAX_SIZE_FOR_ICONS = 200; + + public final ScaledImagePanel imagePanel; + public ImagePanel overlayPanel; + + public JPanel iconPanel; + private JButton typeButton; + + public JPanel counterPanel; + private JLabel loyaltyCounterLabel; + private JLabel plusCounterLabel; + private JLabel otherCounterLabel; + private JLabel minusCounterLabel; + private int loyaltyCounter; + private int plusCounter; + private int otherCounter; + private int minusCounter; + private int lastCardWidth; + + private final GlowText titleText; + private final GlowText ptText; + private final JLabel fullImageText; + private String fullImagePath = null; + + private boolean hasImage = false; + + private boolean displayTitleAnyway; + private boolean displayFullImagePath; + + private final static Map IMAGE_CACHE; + + static class Key { + + final int width; + final int height; + final int cardWidth; + final int cardHeight; + final int cardXOffset; + final int cardYOffset; + final boolean hasImage; + final boolean isSelected; + final boolean isChoosable; + final boolean isPlayable; + final boolean canAttack; + + public Key(int width, int height, int cardWidth, int cardHeight, int cardXOffset, int cardYOffset, boolean hasImage, boolean isSelected, boolean isChoosable, boolean isPlayable, boolean canAttack) { + this.width = width; + this.height = height; + this.cardWidth = cardWidth; + this.cardHeight = cardHeight; + this.cardXOffset = cardXOffset; + this.cardYOffset = cardYOffset; + this.hasImage = hasImage; + this.isSelected = isSelected; + this.isChoosable = isChoosable; + this.isPlayable = isPlayable; + this.canAttack = canAttack; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 19 * hash + this.width; + hash = 19 * hash + this.height; + hash = 19 * hash + this.cardWidth; + hash = 19 * hash + this.cardHeight; + hash = 19 * hash + this.cardXOffset; + hash = 19 * hash + this.cardYOffset; + hash = 19 * hash + (this.hasImage ? 1 : 0); + hash = 19 * hash + (this.isSelected ? 1 : 0); + hash = 19 * hash + (this.isChoosable ? 1 : 0); + hash = 19 * hash + (this.isPlayable ? 1 : 0); + hash = 19 * hash + (this.canAttack ? 1 : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Key other = (Key) obj; + if (this.width != other.width) { + return false; + } + if (this.height != other.height) { + return false; + } + if (this.cardWidth != other.cardWidth) { + return false; + } + if (this.cardHeight != other.cardHeight) { + return false; + } + if (this.cardXOffset != other.cardXOffset) { + return false; + } + if (this.cardYOffset != other.cardYOffset) { + return false; + } + if (this.hasImage != other.hasImage) { + return false; + } + if (this.isSelected != other.isSelected) { + return false; + } + if (this.isChoosable != other.isChoosable) { + return false; + } + if (this.isPlayable != other.isPlayable) { + return false; + } + if (this.canAttack != other.canAttack) { + return false; + } + return true; + } + } + + static { + IMAGE_CACHE = ImageCaches.register(new MapMaker().softValues().makeComputingMap((Function) key -> createImage(key))); + } + + static private boolean canShowCardIcons(int cardFullWidth, boolean cardHasImage){ + // cards without images show icons and text always + // TODO: apply "card names on card" setting to icon too? + // TODO: fix card min-max size to hide (compare to settings size, not direct 60 and 200) + return ((cardFullWidth > 60) && (cardFullWidth < 200)) || (!cardHasImage); + } + + private static class CardSizes{ + Rectangle rectFull; + Rectangle rectSelection; + Rectangle rectBorder; + Rectangle rectCard; + + CardSizes(int offsetX, int offsetY, int fullWidth, int fullHeight){ + + int realBorderSizeX = Math.round(fullWidth * BLACK_BORDER_SIZE); + int realBorderSizeY = Math.round(fullWidth * BLACK_BORDER_SIZE); + int realSelectionSizeX = Math.round(fullWidth * SELECTION_BORDER_SIZE); + int realSelectionSizeY = Math.round(fullWidth * SELECTION_BORDER_SIZE); + + // card full size = select border + black border + real card + rectFull = new Rectangle(offsetX, offsetY, fullWidth, fullHeight); + rectSelection = new Rectangle(rectFull.x, rectFull.y, rectFull.width, rectFull.height); + rectBorder = new Rectangle(rectSelection.x + realSelectionSizeX, rectSelection.y + realSelectionSizeY, rectSelection.width - 2 * realSelectionSizeX, rectSelection.height - 2 * realSelectionSizeY); + rectCard = new Rectangle(rectBorder.x + realBorderSizeX, rectBorder.y + realBorderSizeY, rectBorder.width - 2 * realBorderSizeX, rectBorder.height - 2 * realBorderSizeY); + } + } + + public CardPanelComponentImpl(CardView newGameCard, UUID gameId, final boolean loadImage, ActionCallback callback, final boolean foil, Dimension dimension) { + // Call to super + super(newGameCard, gameId, loadImage, callback, foil, dimension); + + // Counter panel + if (!newGameCard.isAbility()) { + // panel to show counters on the card + counterPanel = new JPanel(); + counterPanel.setLayout(null); + counterPanel.setOpaque(false); + add(counterPanel); + + plusCounterLabel = new JLabel(""); + plusCounterLabel.setToolTipText("+1/+1"); + counterPanel.add(plusCounterLabel); + + minusCounterLabel = new JLabel(""); + minusCounterLabel.setToolTipText("-1/-1"); + counterPanel.add(minusCounterLabel); + + loyaltyCounterLabel = new JLabel(""); + loyaltyCounterLabel.setToolTipText("loyalty"); + counterPanel.add(loyaltyCounterLabel); + + otherCounterLabel = new JLabel(""); + counterPanel.add(otherCounterLabel); + + counterPanel.setVisible(false); + } + + // Ability icon + if (newGameCard.isAbility()) { + if (newGameCard.getAbilityType() == AbilityType.TRIGGERED) { + setTypeIcon(ImageManagerImpl.instance.getTriggeredAbilityImage(), "Triggered Ability"); + } else if (newGameCard.getAbilityType() == AbilityType.ACTIVATED) { + setTypeIcon(ImageManagerImpl.instance.getActivatedAbilityImage(), "Activated Ability"); + } + } + + // Token icon + if (this.gameCard.isToken()) { + setTypeIcon(ImageManagerImpl.instance.getTokenIconImage(), "Token Permanent"); + } + + displayTitleAnyway = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_CARD_NAMES, "true").equals("true"); + displayFullImagePath = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_FULL_IMAGE_PATH, "false").equals("true"); + + // Title Text + titleText = new GlowText(); + setText(gameCard); +// int fontSize = (int) cardHeight / 11; +// titleText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); + titleText.setForeground(Color.white); + titleText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); + titleText.setWrap(true); + add(titleText); + + // Full path to image text + fullImageText = new JLabel(); + fullImageText.setText(fullImagePath); + fullImageText.setForeground(Color.BLACK); + add(fullImageText); + + // PT Text + ptText = new GlowText(); + if (gameCard.isCreature()) { + ptText.setText(gameCard.getPower() + '/' + gameCard.getToughness()); + } else if (gameCard.isPlanesWalker()) { + ptText.setText(gameCard.getLoyalty()); + } +// ptText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); + ptText.setForeground(Color.white); + ptText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); + add(ptText); + + // Sickness overlay + BufferedImage sickness = ImageManagerImpl.instance.getSicknessImage(); + overlayPanel = new ImagePanel(sickness, ImagePanelStyle.SCALED); + overlayPanel.setOpaque(false); + add(overlayPanel); + + // Imagel panel + imagePanel = new ScaledImagePanel(); + imagePanel.setBorder(BorderFactory.createLineBorder(Color.white)); + add(imagePanel); + + // Do we need to load? + if (loadImage) { + initialDraw(); + } else { + // Nothing to do + } + } + + private void setTypeIcon(BufferedImage bufferedImage, String toolTipText) { + iconPanel = new JPanel(); + iconPanel.setLayout(null); + iconPanel.setOpaque(false); + add(iconPanel); + + typeButton = new JButton(""); + typeButton.setLocation(2, 2); + typeButton.setSize(25, 25); + + iconPanel.setVisible(true); + typeButton.setIcon(new ImageIcon(bufferedImage)); + if (toolTipText != null) { + typeButton.setToolTipText(toolTipText); + } + iconPanel.add(typeButton); + } + + @Override + public void cleanUp() { + super.cleanUp(); + this.counterPanel = null; + } + + private void setText(CardView card) { + titleText.setText(!displayTitleAnyway && hasImage ? "" : card.getName()); + } + + private void setImage(BufferedImage srcImage) { + synchronized (imagePanel) { + if (srcImage != null) { + imagePanel.setImage(srcImage); + } else { + imagePanel.clearImage(); + } + repaint(); + } + doLayout(); + } + + private void setFullPath(String fullImagePath) { + this.fullImagePath = fullImagePath; + this.fullImagePath = this.fullImagePath.replaceAll("\\\\", "\\\\
"); + this.fullImagePath = this.fullImagePath.replaceAll("/", "/
"); + this.fullImagePath = "" + this.fullImagePath + ""; + fullImageText.setText(!displayFullImagePath ? "" : this.fullImagePath); + doLayout(); + } + + @Override + public void transferResources(final CardPanel panelAbstract) { + if (panelAbstract instanceof CardPanelComponentImpl) { + CardPanelComponentImpl panel = (CardPanelComponentImpl) panelAbstract; + synchronized (panel.imagePanel) { + if (panel.imagePanel.hasImage()) { + setImage(panel.imagePanel.getSrcImage()); + } + } + } + } + + @Override + public void setSelected(boolean isSelected) { + super.setSelected(isSelected); + if (isSelected) { + this.titleText.setGlowColor(Color.green); + } else { + this.titleText.setGlowColor(Color.black); + } + } + + @Override + protected void paintCard(Graphics2D g2d) { + float alpha = getAlpha(); + if (alpha != 1.0f) { + AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha); + g2d.setComposite(composite); + } + + g2d.drawImage( + IMAGE_CACHE.get( + new Key(getWidth(), getHeight(), getCardWidth(), getCardHeight(), getCardXOffset(), getCardYOffset(), + hasImage, isSelected(), isChoosable(), gameCard.isPlayable(), gameCard.isCanAttack())), + 0, 0, null); + g2d.dispose(); + } + + private static BufferedImage createImage(Key key) { + int cardWidth = key.cardWidth; + int cardHeight = key.cardHeight; + int cardXOffset = key.cardXOffset; + int cardYOffset = key.cardYOffset; + + BufferedImage image = GraphicsUtilities.createCompatibleTranslucentImage(key.width, key.height); + Graphics2D g2d = image.createGraphics(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // card full size = select border + black border + real card + CardSizes sizes = new CardSizes(cardXOffset, cardYOffset, cardWidth, cardHeight); + + // corners for selection and for border + int cornerSizeSelection = Math.max(4, Math.round(sizes.rectSelection.width * ROUNDED_CORNER_SIZE)); + int cornerSizeBorder = Math.max(4, Math.round(sizes.rectBorder.width * ROUNDED_CORNER_SIZE)); + + // DRAW ORDER from big to small: select -> select info -> border -> card + + // draw selection + if (key.isSelected) { + g2d.setColor(Color.green); + g2d.fillRoundRect(sizes.rectSelection.x + 1, sizes.rectSelection.y + 1, sizes.rectSelection.width - 2, sizes.rectSelection.height - 2, cornerSizeSelection, cornerSizeSelection); + } else if (key.isChoosable) { + g2d.setColor(new Color(250, 250, 0, 230)); + g2d.fillRoundRect(sizes.rectSelection.x + 1, sizes.rectSelection.y + 1, sizes.rectSelection.width - 2, sizes.rectSelection.height - 2, cornerSizeSelection, cornerSizeSelection); + } else if (key.isPlayable) { + g2d.setColor(new Color(153, 102, 204, 200)); + g2d.fillRoundRect(sizes.rectSelection.x, sizes.rectSelection.y, sizes.rectSelection.width, sizes.rectSelection.height, cornerSizeSelection, cornerSizeSelection); + } + + // draw empty card with border + if (!key.hasImage) { + // gray 1 px border + g2d.setColor(new Color(125, 125, 125, 255)); + g2d.fillRoundRect(sizes.rectBorder.x, sizes.rectBorder.y, sizes.rectBorder.width, sizes.rectBorder.height, cornerSizeBorder, cornerSizeBorder); + // color plate + g2d.setColor(new Color(30, 200, 200, 200)); + g2d.fillRoundRect(sizes.rectBorder.x + 1, sizes.rectBorder.y + 1, sizes.rectBorder.width - 2, sizes.rectBorder.height - 2, cornerSizeBorder, cornerSizeBorder); + } + + // draw attack border (inner part of selection) + if (key.canAttack) { + g2d.setColor(new Color(0, 0, 255, 230)); + g2d.fillRoundRect(sizes.rectBorder.x + 1, sizes.rectBorder.y + 1, sizes.rectBorder.width - 2, sizes.rectBorder.height - 2, cornerSizeBorder, cornerSizeBorder); + } + + // draw real card by component (see imagePanel and other layout's items) + + //TODO:uncomment + /* + if (gameCard.isAttacking()) { + g2d.setColor(new Color(200,10,10,200)); + g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize); + }*/ + g2d.dispose(); + + return image; + } + + @Override + protected void paintChildren(Graphics g) { + super.paintChildren(g); + + CardSizes realCard = new CardSizes(getCardXOffset(), getCardYOffset(), getCardWidth(), getCardHeight()); + + /* + // draw recs for debug + + // full card + g.setColor(new Color(255, 0, 0)); + g.drawRect(realCard.rectFull.x, realCard.rectFull.y, realCard.rectFull.width, realCard.rectFull.height); + + // real card - image + g.setColor(new Color(0, 0, 255)); + g.drawRect(imagePanel.getX(), imagePanel.getY(), imagePanel.getBounds().width, imagePanel.getBounds().height); + + // caption + g.setColor(new Color(0, 255, 255)); + g.drawRect(titleText.getX(), titleText.getY(), titleText.getBounds().width, titleText.getBounds().height); + + // life points + g.setColor(new Color(120, 0, 120)); + g.drawRect(ptText.getX(), ptText.getY(), ptText.getBounds().width, ptText.getBounds().height); + //*/ + + if (getShowCastingCost() && !isAnimationPanel() && canShowCardIcons(getCardWidth(), hasImage)) { + + int symbolMarginX = 2; // 2 px between icons + + String manaCost = ManaSymbols.getStringManaCost(gameCard.getManaCost()); + int manaWidth = getManaWidth(manaCost, symbolMarginX); + + // right top corner with margin (sizes from any sample card, length from black border to mana icon) + int manaMarginRight = Math.round(22f / 672f * getCardWidth()); + int manaMarginTop = Math.round(24f / 936f * getCardHeight()); + + int manaX = getCardXOffset() + getCardWidth() - manaMarginRight - manaWidth; + int manaY = getCardYOffset() + manaMarginTop; + + ManaSymbols.draw(g, manaCost, manaX, manaY, getSymbolWidth(), Color.black, symbolMarginX); + } + } + + private int getManaWidth(String manaCost, int symbolMarginX) { + int width = 0; + manaCost = manaCost.replace("\\", ""); + StringTokenizer tok = new StringTokenizer(manaCost, " "); + while (tok.hasMoreTokens()) { + tok.nextToken(); + if(width != 0) { + width += symbolMarginX; + } + width += getSymbolWidth(); + } + return width; + } + + @Override + public void doLayout() { + super.doLayout(); + + int cardWidth = getCardWidth(); + int cardHeight = getCardHeight(); + int cardXOffset = getCardXOffset(); + int cardYOffset = getCardYOffset(); + + CardSizes sizes = new CardSizes(cardXOffset, cardYOffset, cardWidth, cardHeight); + + // origin card without selection + Rectangle realCardSize = sizes.rectBorder; + imagePanel.setLocation(realCardSize.x, realCardSize.y); + imagePanel.setSize(realCardSize.width, realCardSize.height); + + if (hasSickness() && gameCard.isCreature() && isPermanent()) { + overlayPanel.setLocation(realCardSize.x, realCardSize.y); + overlayPanel.setSize(realCardSize.width, realCardSize.height); + } else { + overlayPanel.setVisible(false); + } + + if (iconPanel != null) { + iconPanel.setLocation(realCardSize.x, realCardSize.y); + iconPanel.setSize(realCardSize.width, realCardSize.height); + } + if (counterPanel != null) { + counterPanel.setLocation(realCardSize.x, realCardSize.y); + counterPanel.setSize(realCardSize.width, realCardSize.height); + int size = cardWidth > WIDTH_LIMIT ? 40 : 20; + + minusCounterLabel.setLocation(counterPanel.getWidth() - size, counterPanel.getHeight() - size * 2); + minusCounterLabel.setSize(size, size); + + plusCounterLabel.setLocation(5, counterPanel.getHeight() - size * 2); + plusCounterLabel.setSize(size, size); + + loyaltyCounterLabel.setLocation(counterPanel.getWidth() - size, counterPanel.getHeight() - size); + loyaltyCounterLabel.setSize(size, size); + + otherCounterLabel.setLocation(5, counterPanel.getHeight() - size); + otherCounterLabel.setSize(size, size); + + } + + // TITLE + + //old version - text hide on small fonts, why? + //int fontHeight = Math.round(cardHeight * (26f / 672)); + //boolean showText = (!isAnimationPanel() && fontHeight < 12); + + boolean showText = !isAnimationPanel() && canShowCardIcons(cardWidth, hasImage); + titleText.setVisible(showText); + ptText.setVisible(showText); + fullImageText.setVisible(fullImagePath != null); + + if (showText) { + int fontSize = cardHeight / 13; // startup font size (it same size on all zoom levels) + titleText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); + + // margins from card black border to text, not need? text show up good without margins + int titleMarginLeft = 0; //Math.round(28f / 672f * cardWidth); + int titleMarginRight = 0; + int titleMarginTop = 0 + Math.round(getCardCaptionTopOffset() / 100f * cardHeight);//Math.round(28f / 936f * cardHeight); + int titleMarginBottom = 0; + titleText.setBounds( + imagePanel.getX() + titleMarginLeft, + imagePanel.getY() + titleMarginTop, + imagePanel.getBounds().width - titleMarginLeft - titleMarginRight, + imagePanel.getBounds().height - titleMarginTop - titleMarginBottom + ); + + fullImageText.setFont(getFont().deriveFont(Font.PLAIN, 10)); + fullImageText.setBounds(titleText.getX(), titleText.getY(), titleText.getBounds().width, titleText.getBounds().height); + + // life points location (font as title) + ptText.setFont(getFont().deriveFont(Font.BOLD, fontSize)); + Dimension ptSize = ptText.getPreferredSize(); + ptText.setSize(ptSize.width, ptSize.height); + + // right bottom corner with margin (sizes from any sample card) + int ptMarginRight = Math.round(64f / 672f * cardWidth); + int ptMarginBottom = Math.round(62f / 936f * cardHeight); + + int ptX = cardXOffset + cardWidth - ptMarginRight - ptSize.width; + int ptY = cardYOffset + cardHeight - ptMarginBottom - ptSize.height; + ptText.setLocation(ptX, ptY); + + // old version was with TEXT_GLOW_SIZE + //ptText.setLocation(cardXOffset + ptX - TEXT_GLOW_SIZE / 2 - offsetX, cardYOffset + ptY - TEXT_GLOW_SIZE / 2); + } + } + + @Override + public String toString() { + return gameCard.toString(); + } + + @Override + public void setCardBounds(int x, int y, int cardWidth, int cardHeight) { + // Call to super + super.setCardBounds(x, y, cardWidth, cardHeight); + + // Update image + if (imagePanel != null && imagePanel.getSrcImage() != null) { + updateArtImage(); + } + } + + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + + // Update components + if (alpha == 0) { + this.ptText.setVisible(false); + this.titleText.setVisible(false); + } else if (alpha == 1.0f) { + this.ptText.setVisible(true); + this.titleText.setVisible(true); + } + } + + /////////////////////////////////////////////////////////// + // Image updating code + private int updateArtImageStamp; + + @Override + public void updateArtImage() { + tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; + flippedAngle = isFlipped() ? CardPanel.FLIPPED_ANGLE : 0; + + //final CardView gameCard = this.gameCard; + final int stamp = ++updateArtImageStamp; + + Util.threadPool.submit(() -> { + try { + final BufferedImage srcImage; + if (gameCard.isFaceDown()) { + srcImage = getFaceDownImage(); + } else if (getCardWidth() > Constants.THUMBNAIL_SIZE_FULL.width) { + srcImage = ImageCache.getImage(gameCard, getCardWidth(), getCardHeight()); + } else { + srcImage = ImageCache.getThumbnail(gameCard); + } + if (srcImage == null) { + setFullPath(ImageCache.getFilePath(gameCard, getCardWidth())); + } + UI.invokeLater(() -> { + if (stamp == updateArtImageStamp) { + hasImage = srcImage != null; + setText(gameCard); + setImage(srcImage); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } catch (Error err) { + err.printStackTrace(); + } + }); + } + + private BufferedImage getFaceDownImage() { + if (isPermanent()) { + if (((PermanentView) gameCard).isMorphed()) { + return ImageCache.getMorphImage(); + } else { + return ImageCache.getManifestImage(); + } + } else if (this.gameCard instanceof StackAbilityView) { + return ImageCache.getMorphImage(); + } else { + return ImageCache.getCardbackImage(); + } + } + + @Override + public void showCardTitle() { + displayTitleAnyway = true; + setText(gameCard); + } + + @Override + public void update(CardView card) { + // Super + super.update(card); + + // Update card text + if (card.isCreature() && card.isPlanesWalker()) { + ptText.setText(card.getPower() + '/' + card.getToughness() + " (" + card.getLoyalty() + ')'); + } else if (card.isCreature()) { + ptText.setText(card.getPower() + '/' + card.getToughness()); + } else if (card.isPlanesWalker()) { + ptText.setText(card.getLoyalty()); + } else { + ptText.setText(""); + } + setText(card); + + // Summoning Sickness overlay + if (hasSickness() && card.isCreature() && isPermanent()) { + overlayPanel.setVisible(true); + } else { + overlayPanel.setVisible(false); + } + + // Update counters panel + if (counterPanel != null) { + updateCounters(card); + } + + // Finally, queue a repaint + repaint(); + } + + private void updateCounters(CardView card) { + if (card.getCounters() != null && !card.getCounters().isEmpty()) { + String name = ""; + if (lastCardWidth != getCardWidth()) { + lastCardWidth = getCardWidth(); + plusCounter = 0; + minusCounter = 0; + otherCounter = 0; + loyaltyCounter = 0; + } + plusCounterLabel.setVisible(false); + minusCounterLabel.setVisible(false); + loyaltyCounterLabel.setVisible(false); + otherCounterLabel.setVisible(false); + for (CounterView counterView : card.getCounters()) { + if (counterView.getCount() == 0) { + continue; + } + switch (counterView.getName()) { + case "+1/+1": + if (counterView.getCount() != plusCounter) { + plusCounter = counterView.getCount(); + plusCounterLabel.setIcon(getCounterImageWithAmount(plusCounter, ImageManagerImpl.instance.getCounterImageGreen(), getCardWidth())); + } + plusCounterLabel.setVisible(true); + break; + case "-1/-1": + if (counterView.getCount() != minusCounter) { + minusCounter = counterView.getCount(); + minusCounterLabel.setIcon(getCounterImageWithAmount(minusCounter, ImageManagerImpl.instance.getCounterImageRed(), getCardWidth())); + } + minusCounterLabel.setVisible(true); + break; + case "loyalty": + if (counterView.getCount() != loyaltyCounter) { + loyaltyCounter = counterView.getCount(); + loyaltyCounterLabel.setIcon(getCounterImageWithAmount(loyaltyCounter, ImageManagerImpl.instance.getCounterImageViolet(), getCardWidth())); + } + loyaltyCounterLabel.setVisible(true); + break; + default: + if (name.isEmpty()) { // only first other counter is shown + name = counterView.getName(); + otherCounter = counterView.getCount(); + otherCounterLabel.setToolTipText(name); + otherCounterLabel.setIcon(getCounterImageWithAmount(otherCounter, ImageManagerImpl.instance.getCounterImageGrey(), getCardWidth())); + otherCounterLabel.setVisible(true); + } + } + } + + counterPanel.setVisible(true); + } else { + plusCounterLabel.setVisible(false); + minusCounterLabel.setVisible(false); + loyaltyCounterLabel.setVisible(false); + otherCounterLabel.setVisible(false); + counterPanel.setVisible(false); + } + + } + + private static ImageIcon getCounterImageWithAmount(int amount, BufferedImage image, int cardWidth) { + int factor = cardWidth > WIDTH_LIMIT ? 2 : 1; + int xOffset = amount > 9 ? 2 : 5; + int fontSize = factor == 1 ? amount < 10 ? 12 : amount < 100 ? 10 : amount < 1000 ? 7 : 6 + : amount < 10 ? 19 : amount < 100 ? 15 : amount < 1000 ? 12 : amount < 10000 ? 9 : 8; + BufferedImage newImage; + if (cardWidth > WIDTH_LIMIT) { + newImage = ImageManagerImpl.deepCopy(image); + } else { + newImage = ImageHelper.getResizedImage(image, 20, 20); + } + Graphics graphics = newImage.getGraphics(); + graphics.setColor(Color.BLACK); + graphics.setFont(new Font("Arial Black", amount > 100 ? Font.PLAIN : Font.BOLD, fontSize)); + graphics.drawString(Integer.toString(amount), xOffset * factor, 11 * factor); + return new ImageIcon(newImage); + } + + @Override + public Image getImage() { + if (this.hasImage) { + if (gameCard.isFaceDown()) { + return getFaceDownImage(); + } else { + return ImageCache.getImageOriginal(gameCard); + } + } + return null; + } +} diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java index 498778c2b3f..10182f66545 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java @@ -9,16 +9,13 @@ import mage.view.CardView; import mage.view.CounterView; import mage.view.PermanentView; import mage.view.StackAbilityView; -import net.java.truevfs.access.TFile; import org.apache.log4j.Logger; import org.jdesktop.swingx.graphics.GraphicsUtilities; -import org.mage.plugins.card.dl.sources.DirectLinksForDownload; import org.mage.plugins.card.images.ImageCache; import mage.client.constants.Constants; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.File; import java.util.Map; import java.util.UUID; diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java index d32fa0cdd07..a042e9665ce 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java @@ -396,7 +396,7 @@ public abstract class CardRenderer { /* // Just draw the as a code String code = cardView.getExpansionSetCode(); - code = (code != null) ? code.toUpperCase() : ""; + code = (code != null) ? code.toUpperCase(Locale.ENGLISH) : ""; FontMetrics metrics = g.getFontMetrics(); setSymbolWidth = metrics.stringWidth(code); if (cardView.getRarity() == Rarity.COMMON) { diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/TextboxRuleParser.java b/Mage.Client/src/main/java/org/mage/card/arcane/TextboxRuleParser.java index 004ed7c7843..63c91b1490c 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/TextboxRuleParser.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/TextboxRuleParser.java @@ -13,7 +13,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import mage.view.CardView; import org.apache.log4j.Logger; -import org.apache.log4j.jmx.LoggerDynamicMBean; /** * diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/Util.java b/Mage.Client/src/main/java/org/mage/card/arcane/Util.java index 2c02a2d0c44..57f704056f9 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/Util.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/Util.java @@ -7,6 +7,7 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Collections; import java.util.Enumeration; +import java.util.Locale; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -16,8 +17,8 @@ import javax.swing.SwingUtilities; @SuppressWarnings({"rawtypes", "unchecked"}) public final class Util { - public static final boolean isMac = System.getProperty("os.name").toLowerCase().contains("mac"); - public static final boolean isWindows = !System.getProperty("os.name").toLowerCase().contains("windows"); + public static final boolean isMac = System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("mac"); + public static final boolean isWindows = !System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows"); public static final ThreadPoolExecutor threadPool; static private int threadCount; diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java index 0cfefa736a4..4099643d53d 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java @@ -3,6 +3,7 @@ package org.mage.plugins.card.dl.sources; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import mage.client.dialog.PreferencesDialog; @@ -368,7 +369,7 @@ public enum MagicCardsImageSource implements CardImageSource { String preferedLanguage = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PREF_LANGUAGE, "en"); StringBuilder url = new StringBuilder("http://magiccards.info/scans/").append(preferedLanguage).append('/'); - url.append(set.toLowerCase()).append('/').append(collectorId); + url.append(set.toLowerCase(Locale.ENGLISH)).append('/').append(collectorId); if (card.isTwoFacedCard()) { url.append(card.isSecondSide() ? "b" : "a"); @@ -395,7 +396,7 @@ public enum MagicCardsImageSource implements CardImageSource { if (card.getType() > 0) { name = name + ' ' + card.getType(); } - name = name.replaceAll(" ", "-").replace(",", "").toLowerCase(); + name = name.replaceAll(" ", "-").replace(",", "").toLowerCase(Locale.ENGLISH); String set = "not-supported-set"; if (setNameTokenReplacement.containsKey(card.getSet())) { set = setNameTokenReplacement.get(card.getSet()); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java index 52df3426fc9..2ae3fb1c19a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java @@ -31,6 +31,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import org.mage.plugins.card.images.CardDownloadData; @@ -257,7 +258,7 @@ public enum MagidexImageSource implements CardImageSource { @Override public String generateURL(CardDownloadData card) throws Exception { - String cardDownloadName = card.getDownloadName().toLowerCase(); + String cardDownloadName = card.getDownloadName().toLowerCase(Locale.ENGLISH); String cardSet = card.getSet(); if (cardDownloadName == null || cardSet == null) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgImageSource.java index e8e811e34f2..4743060a463 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgImageSource.java @@ -24,35 +24,34 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package org.mage.plugins.card.dl.sources; +import java.util.Locale; import org.mage.plugins.card.images.CardDownloadData; /** * Site was shutdown by wizards Feb. 2015 - * - * - * - * + * + * + * + * * @author LevelX2 */ +public enum MtgImageSource implements CardImageSource { -public enum MtgImageSource implements CardImageSource { - - instance; + instance; @Override public String getSourceName() { return "mtgimage.com"; } - + @Override public String getNextHttpImageUrl() { return null; } - + @Override public String getFileForHttpImage(String httpImageUrl) { return null; @@ -66,9 +65,9 @@ public enum MtgImageSource implements CardImageSource { throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet); } StringBuilder url = new StringBuilder("http://mtgimage.com/set/"); - url.append(cardSet.toUpperCase()).append('/'); + url.append(cardSet.toUpperCase(Locale.ENGLISH)).append('/'); - if (card.isSplitCard()) { + if (card.isSplitCard()) { url.append(card.getDownloadName().replaceAll(" // ", "")); } else { url.append(card.getDownloadName().replaceAll(" ", "%20")); @@ -98,12 +97,12 @@ public enum MtgImageSource implements CardImageSource { public float getAverageSize() { return 70.0f; } - + @Override public int getTotalImages() { return -1; } - + @Override public boolean isTokenSource() { return false; @@ -112,4 +111,4 @@ public enum MtgImageSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } -} \ No newline at end of file +} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java index e625219ae74..b7552db48c4 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.prefs.Preferences; @@ -317,13 +318,13 @@ public enum MythicspoilerComSource implements CardImageSource { private Map getSetLinks(String cardSet) { Map setLinks = new HashMap<>(); try { - String setNames = setsAliases.get(cardSet.toLowerCase()); + String setNames = setsAliases.get(cardSet.toLowerCase(Locale.ENGLISH)); Set aliasesStart = new HashSet<>(); if (cardNameAliasesStart.containsKey(cardSet)) { aliasesStart.addAll(cardNameAliasesStart.get(cardSet)); } if (setNames == null) { - setNames = cardSet.toLowerCase(); + setNames = cardSet.toLowerCase(Locale.ENGLISH); } Preferences prefs = MageFrame.getPreferences(); Connection.ProxyType proxyType = Connection.ProxyType.valueByText(prefs.get("proxyType", "None")); @@ -423,7 +424,7 @@ public enum MythicspoilerComSource implements CardImageSource { return null; } Map setLinks = sets.computeIfAbsent(cardSet, k -> getSetLinks(cardSet)); - String searchName = card.getDownloadName().toLowerCase() + String searchName = card.getDownloadName().toLowerCase(Locale.ENGLISH) .replaceAll(" ", "") .replaceAll("\\.", "") .replaceAll("&", "and") diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java index aafb2d1568f..a5b0e8f639c 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -3,6 +3,7 @@ package org.mage.plugins.card.dl.sources; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import org.mage.plugins.card.images.CardDownloadData; @@ -280,7 +281,7 @@ public enum ScryfallImageSource implements CardImageSource { if (setNameReplacement.containsKey(setName)) { setName = setNameReplacement.get(setName); } - return setName.toLowerCase(); + return setName.toLowerCase(Locale.ENGLISH); } private static final Map setNameReplacement = new HashMap() { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index 5a2f494d1d0..9cb1a49468b 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -38,6 +38,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.logging.Level; @@ -97,7 +98,7 @@ public enum TokensMtgImageSource implements CardImageSource { private String getEmblemName(String originalName) { for (SubType subType : SubType.getPlaneswalkerTypes(true)) { - if (originalName.toLowerCase().contains(subType.toString().toLowerCase())) { + if (originalName.toLowerCase(Locale.ENGLISH).contains(subType.toString().toLowerCase(Locale.ENGLISH))) { return subType.getDescription() + " Emblem"; } } @@ -111,13 +112,13 @@ public enum TokensMtgImageSource implements CardImageSource { int type = card.getType(); // handle emblems - if (name.toLowerCase().contains("emblem")) { + if (name.toLowerCase(Locale.ENGLISH).contains("emblem")) { name = getEmblemName(name); } // we should replace some set names - if (SET_NAMES_REPLACEMENT.containsKey(set.toLowerCase())) { - set = SET_NAMES_REPLACEMENT.get(set.toLowerCase()); + if (SET_NAMES_REPLACEMENT.containsKey(set.toLowerCase(Locale.ENGLISH))) { + set = SET_NAMES_REPLACEMENT.get(set.toLowerCase(Locale.ENGLISH)); } // Image URL contains token number @@ -187,7 +188,7 @@ public enum TokensMtgImageSource implements CardImageSource { @Override public boolean isImageProvided(String setCode, String cardName) { String searchName = cardName; - if (cardName.toLowerCase().contains("emblem")) { + if (cardName.toLowerCase(Locale.ENGLISH).contains("emblem")) { searchName = getEmblemName(cardName); } try { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index 6f436702fb1..88ab87dce04 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -493,7 +494,7 @@ public enum WizardCardsImageSource implements CardImageSource { if (setLinks == null || setLinks.isEmpty()) { return null; } - String searchKey = card.getDownloadName().toLowerCase().replace(" ", "").replace("&", "//"); + String searchKey = card.getDownloadName().toLowerCase(Locale.ENGLISH).replace(" ", "").replace("&", "//"); String link = setLinks.get(searchKey); if (link == null) { int length = collectorId.length(); @@ -576,7 +577,7 @@ public enum WizardCardsImageSource implements CardImageSource { } } Integer preferedMultiverseId = getLocalizedMultiverseId(preferedLanguage, multiverseId); - setLinks.put(cardName.toLowerCase() + numberChar, generateLink(preferedMultiverseId)); + setLinks.put(cardName.toLowerCase(Locale.ENGLISH) + numberChar, generateLink(preferedMultiverseId)); } } } @@ -652,11 +653,11 @@ public enum WizardCardsImageSource implements CardImageSource { } } Integer landMultiverseId = Integer.parseInt(variation.attr("href").replaceAll("[^\\d]", "")); - setLinks.put((cardName).toLowerCase() + colNumb, generateLink(landMultiverseId)); + setLinks.put((cardName).toLowerCase(Locale.ENGLISH) + colNumb, generateLink(landMultiverseId)); iteration++; } } else { - setLinks.put(cardName.toLowerCase(), generateLink(multiverseId)); + setLinks.put(cardName.toLowerCase(Locale.ENGLISH), generateLink(multiverseId)); } } @@ -758,7 +759,7 @@ public enum WizardCardsImageSource implements CardImageSource { // setLinks.putAll(getLandVariations(multiverseId, cardName)); // } else { // Integer preferedMultiverseId = getLocalizedMultiverseId(preferedLanguage, multiverseId); -// setLinks.put(cardName.toLowerCase(), generateLink(preferedMultiverseId)); +// setLinks.put(cardName.toLowerCase(Locale.ENGLISH), generateLink(preferedMultiverseId)); // } // } catch (IOException | NumberFormatException ex) { // logger.error("Exception when parsing the wizards page: " + ex.getMessage()); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index 09d354aa76d..f78417a845a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java @@ -1,8 +1,8 @@ package org.mage.plugins.card.images; -import mage.util.CardUtil; - +import java.util.Locale; import java.util.Objects; +import mage.util.CardUtil; /** * @@ -134,7 +134,7 @@ public class CardDownloadData { return CardUtil.parseCardNumberAsInt(collectorId); } - public boolean isCollectorIdWithStr(){ + public boolean isCollectorIdWithStr() { // card have special numbers like "103a", "180b" (scryfall style) return !getCollectorId().equals(getCollectorIdAsInt().toString()); } @@ -190,7 +190,7 @@ public class CardDownloadData { private String lastDitchTokenDescriptor() { String tmpName = this.name.replaceAll("[^a-zA-Z0-9]", ""); String descriptor = tmpName + "...."; - descriptor = descriptor.toUpperCase(); + descriptor = descriptor.toUpperCase(Locale.ENGLISH); return descriptor; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 1af10cfa488..9e333430b78 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -504,23 +505,23 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab tokenClassName = params[6].trim(); } - if (params[1].toLowerCase().equals("generate") && params[2].startsWith("TOK:")) { + if (params[1].toLowerCase(Locale.ENGLISH).equals("generate") && params[2].startsWith("TOK:")) { String set = params[2].substring(4); CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true); card.setTokenClassName(tokenClassName); list.add(card); // logger.debug("Token: " + set + "/" + card.getName() + " type: " + type); - } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) { + } else if (params[1].toLowerCase(Locale.ENGLISH).equals("generate") && params[2].startsWith("EMBLEM:")) { String set = params[2].substring(7); CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, "0", false, type, "", "", true, fileName); card.setTokenClassName(tokenClassName); list.add(card); - } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) { + } else if (params[1].toLowerCase(Locale.ENGLISH).equals("generate") && params[2].startsWith("EMBLEM-:")) { String set = params[2].substring(8); CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, "0", false, type, "", "", true, fileName); card.setTokenClassName(tokenClassName); list.add(card); - } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) { + } else if (params[1].toLowerCase(Locale.ENGLISH).equals("generate") && params[2].startsWith("EMBLEM!:")) { String set = params[2].substring(8); CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true, fileName); card.setTokenClassName(tokenClassName); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index ab0ab5cd664..8bcd8e1fd4f 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -4,6 +4,7 @@ import java.io.File; import java.net.InetSocketAddress; import java.net.Proxy; import java.util.HashMap; +import java.util.Locale; import java.util.prefs.Preferences; import mage.client.MageFrame; import mage.client.constants.Constants; @@ -116,7 +117,7 @@ public final class CardImageUtils { } public static String updateSet(String cardSet, boolean forUrl) { - String set = cardSet.toLowerCase(); + String set = cardSet.toLowerCase(Locale.ENGLISH); if (set.equals("con")) { set = "cfx"; } @@ -172,7 +173,7 @@ public final class CardImageUtils { throw new IllegalArgumentException("Card " + card.getName() + " have empty set."); } - String set = updateSet(card.getSet(), false).toUpperCase(); // TODO: research auto-replace... old code? + String set = updateSet(card.getSet(), false).toUpperCase(Locale.ENGLISH); // TODO: research auto-replace... old code? if (card.isToken()) { return buildImagePathToSetAsToken(set); @@ -236,7 +237,7 @@ public final class CardImageUtils { if (dirFile.exists() && !imageFile.exists()) { // search like names for (String fileName : dirFile.list()) { - if (fileName.toLowerCase().equals(finalFileName.toLowerCase())) { + if (fileName.toLowerCase(Locale.ENGLISH).equals(finalFileName.toLowerCase(Locale.ENGLISH))) { finalFileName = fileName; break; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java index ad7a161edcd..e37eb827c1f 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java @@ -11,6 +11,7 @@ import java.awt.image.FilteredImageSource; import java.awt.image.WritableRaster; import java.net.URL; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import javax.imageio.ImageIO; import mage.client.util.gui.BufferedImageBuilder; @@ -20,18 +21,17 @@ import org.mage.plugins.card.utils.Transparency; public enum ImageManagerImpl implements ImageManager { instance; - ImageManagerImpl() { init(); } public void init() { String[] phases = {"Untap", "Upkeep", "Draw", "Main1", - "Combat_Start", "Combat_Attack", "Combat_Block", "Combat_Damage", "Combat_End", - "Main2", "Cleanup", "Next_Turn"}; + "Combat_Start", "Combat_Attack", "Combat_Block", "Combat_Damage", "Combat_End", + "Main2", "Cleanup", "Next_Turn"}; phasesImages = new HashMap<>(); for (String name : phases) { - Image image = getImageFromResource("/phases/phase_" + name.toLowerCase() + ".png", new Rectangle(36, 36)); + Image image = getImageFromResource("/phases/phase_" + name.toLowerCase(Locale.ENGLISH) + ".png", new Rectangle(36, 36)); phasesImages.put(name, image); } } @@ -339,10 +339,10 @@ public enum ImageManagerImpl implements ImageManager { } return imageSkipYourNextTurnButton; } - + @Override public Image getToggleRecordMacroButtonImage() { - if(imageToggleRecordMacroButton == null) { + if (imageToggleRecordMacroButton == null) { imageToggleRecordMacroButton = getBufferedImageFromResource("/buttons/toggle_macro.png"); } return imageToggleRecordMacroButton; @@ -414,7 +414,7 @@ public enum ImageManagerImpl implements ImageManager { private static BufferedImage triggeredAbilityIcon; private static BufferedImage activatedAbilityIcon; private static BufferedImage lookedAtIcon; - private static BufferedImage revealedIcon; + private static BufferedImage revealedIcon; private static BufferedImage exileIcon; private static BufferedImage imageCopyIcon; private static BufferedImage imageCounterGreen; diff --git a/Mage.Client/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java b/Mage.Client/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java index f5a6a60138f..43c788e9836 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java @@ -3,6 +3,7 @@ package org.mage.plugins.theme; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; +import java.util.Locale; import java.util.Map; import javax.imageio.ImageIO; import javax.swing.*; @@ -49,7 +50,7 @@ public class ThemePluginImpl implements ThemePlugin { return false; } for (File f : filelist) { - String filename = f.getName().toLowerCase(); + String filename = f.getName().toLowerCase(Locale.ENGLISH); if (filename != null && (filename.endsWith(".png") || filename.endsWith(".jpg") || filename.endsWith(".bmp"))) { flist.add(filename); diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java index b2ed194eb8a..cce41e6041b 100644 --- a/Mage.Common/src/main/java/mage/view/CardView.java +++ b/Mage.Common/src/main/java/mage/view/CardView.java @@ -988,7 +988,7 @@ public class CardView extends SimpleCardView { public String getColorText() { String color = getColor().getDescription(); - return color.substring(0, 1).toUpperCase() + color.substring(1); + return color.substring(0, 1).toUpperCase(Locale.ENGLISH) + color.substring(1); } public String getTypeText() { diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java b/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java index a2f15557d07..b784adc6cbe 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java @@ -24,21 +24,15 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ + */ -/* + /* * ConnectDialog.java * * Created on 20-Jan-2010, 9:37:07 PM */ - package mage.server.console; -import mage.remote.Connection; -import mage.remote.Connection.ProxyType; -import org.apache.log4j.Logger; - -import javax.swing.*; import java.awt.*; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -46,8 +40,13 @@ import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; +import javax.swing.*; +import mage.remote.Connection; +import mage.remote.Connection.ProxyType; +import org.apache.log4j.Logger; /** * @@ -60,9 +59,11 @@ public class ConnectDialog extends JDialog { private Connection connection; private ConnectTask task; - /** Creates new form ConnectDialog */ + /** + * Creates new form ConnectDialog + */ public ConnectDialog() { - initComponents(); + initComponents(); cbProxyType.setModel(new DefaultComboBoxModel(Connection.ProxyType.values())); } @@ -73,7 +74,7 @@ public class ConnectDialog extends JDialog { this.chkAutoConnect.setSelected(Boolean.parseBoolean(ConsoleFrame.getPreferences().get("autoConnect", "false"))); this.txtProxyServer.setText(ConsoleFrame.getPreferences().get("proxyAddress", "localhost")); this.txtProxyPort.setText(ConsoleFrame.getPreferences().get("proxyPort", Integer.toString(17171))); - this.cbProxyType.setSelectedItem(Connection.ProxyType.valueOf(ConsoleFrame.getPreferences().get("proxyType", "NONE").toUpperCase())); + this.cbProxyType.setSelectedItem(Connection.ProxyType.valueOf(ConsoleFrame.getPreferences().get("proxyType", "NONE").toUpperCase(Locale.ENGLISH))); this.txtProxyUserName.setText(ConsoleFrame.getPreferences().get("proxyUsername", "")); this.txtPasswordField.setText(ConsoleFrame.getPreferences().get("proxyPassword", "")); this.showProxySettings(); @@ -87,13 +88,11 @@ public class ConnectDialog extends JDialog { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(true); - } - else if (cbProxyType.getSelectedItem() == Connection.ProxyType.HTTP) { + } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.HTTP) { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(true); this.pnlProxySettings.setVisible(true); - } - else if (cbProxyType.getSelectedItem() == Connection.ProxyType.NONE) { + } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.NONE) { this.pnlProxy.setVisible(false); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(false); @@ -115,10 +114,10 @@ public class ConnectDialog extends JDialog { Arrays.fill(input, '0'); } - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents @@ -377,7 +376,7 @@ public class ConnectDialog extends JDialog { JOptionPane.showMessageDialog(rootPane, "Please provide a port number"); return; } - if (Integer.valueOf(txtPort.getText()) < 1 || Integer.valueOf(txtPort.getText()) > 65535 ) { + if (Integer.valueOf(txtPort.getText()) < 1 || Integer.valueOf(txtPort.getText()) > 65535) { JOptionPane.showMessageDialog(rootPane, "Invalid port number"); txtPort.setText(ConsoleFrame.getPreferences().get("serverPort", Integer.toString(17171))); return; @@ -424,15 +423,15 @@ public class ConnectDialog extends JDialog { if (result) { lblStatus.setText(""); connected(); - } - else { + } else { lblStatus.setText("Could not connect"); } } catch (InterruptedException ex) { logger.fatal("Update Players Task error", ex); } catch (ExecutionException ex) { logger.fatal("Update Players Task error", ex); - } catch (CancellationException ex) {} + } catch (CancellationException ex) { + } } } @@ -441,7 +440,6 @@ public class ConnectDialog extends JDialog { this.setVisible(false); } - private void keyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_keyTyped char c = evt.getKeyChar(); if (!Character.isDigit(c)) { @@ -467,7 +465,7 @@ public class ConnectDialog extends JDialog { List servers = new ArrayList<>(); String inputLine; while ((inputLine = in.readLine()) != null) { - System.out.println("Found server: "+inputLine); + System.out.println("Found server: " + inputLine); servers.add(inputLine); } @@ -491,11 +489,14 @@ public class ConnectDialog extends JDialog { } in.close(); - } catch(Exception ex) { - logger.error(ex,ex); + } catch (Exception ex) { + logger.error(ex, ex); } finally { if (in != null) { - try { in.close(); } catch (Exception e) {} + try { + in.close(); + } catch (Exception e) { + } } } }//GEN-LAST:event_jButton1ActionPerformed @@ -505,10 +506,9 @@ public class ConnectDialog extends JDialog { }//GEN-LAST:event_cbProxyTypeActionPerformed private void txtPasswordFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPasswordFieldActionPerformed - // TODO add your handling code here: + // TODO add your handling code here: }//GEN-LAST:event_txtPasswordFieldActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; private javax.swing.JButton btnConnect; diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java index 5f4be053caf..7820d4d4b22 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java @@ -608,7 +608,7 @@ class UpdateUsersTask extends SwingWorker> { if (!panel.getjUserName().getText().equals("")) { List users2 = new ArrayList<>(); for (UserView user : users) { - if (user.getUserName().toUpperCase().matches(".*" + panel.getjUserName().getText().toUpperCase() + ".*")) { + if (user.getUserName().toUpperCase(Locale.ENGLISH).matches(".*" + panel.getjUserName().getText().toUpperCase(Locale.ENGLISH) + ".*")) { users2.add(user); } } @@ -697,7 +697,7 @@ class UpdateTablesTask extends SwingWorker> { if (!panel.getjUserName().getText().equals("")) { Collection tableViews2 = new ArrayList<>(); for (TableView table : tableViews) { - if (table.getControllerName().toUpperCase().matches(".*" + panel.getjUserName().getText().toUpperCase() + ".*")) { + if (table.getControllerName().toUpperCase(Locale.ENGLISH).matches(".*" + panel.getjUserName().getText().toUpperCase(Locale.ENGLISH) + ".*")) { tableViews2.add(table); } } diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java index ec32c1aa966..5c3a3ac39c0 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java @@ -275,7 +275,7 @@ public class Commander extends Constructed { boolean whenYouCast = false; for (String str : card.getRules()) { - String s = str.toLowerCase(); + String s = str.toLowerCase(Locale.ENGLISH); annihilator |= s.contains("annihilator"); anyNumberOfTarget |= s.contains("any number"); buyback |= s.contains("buyback"); @@ -521,16 +521,16 @@ public class Commander extends Constructed { } if (card.isPlaneswalker()) { - if (card.getName().toLowerCase().equals("jace, the mind sculptor")) { + if (card.getName().toLowerCase(Locale.ENGLISH).equals("jace, the mind sculptor")) { thisMaxPower = Math.max(thisMaxPower, 6); } - if (card.getName().toLowerCase().equals("ugin, the spirit dragon")) { + if (card.getName().toLowerCase(Locale.ENGLISH).equals("ugin, the spirit dragon")) { thisMaxPower = Math.max(thisMaxPower, 5); } thisMaxPower = Math.max(thisMaxPower, 4); } - String cn = card.getName().toLowerCase(); + String cn = card.getName().toLowerCase(Locale.ENGLISH); if (cn.equals("ancient tomb") || cn.equals("anafenza, the foremost") || cn.equals("arcum dagsson") @@ -678,7 +678,7 @@ public class Commander extends Constructed { ObjectColor color = null; for (Card commander : deck.getSideboard()) { int thisMaxPower = 0; - String cn = commander.getName().toLowerCase(); + String cn = commander.getName().toLowerCase(Locale.ENGLISH); if (color == null) { color = commander.getColor(null); } else { diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java index d479f1b569f..ed017b14229 100644 --- a/Mage.Server/src/main/java/mage/server/ChatManager.java +++ b/Mage.Server/src/main/java/mage/server/ChatManager.java @@ -245,7 +245,7 @@ public enum ChatManager { return true; } if (command.startsWith("CARD ")) { - Matcher matchPattern = getCardTextPattern.matcher(message.toLowerCase()); + Matcher matchPattern = getCardTextPattern.matcher(message.toLowerCase(Locale.ENGLISH)); if (matchPattern.find()) { String cardName = matchPattern.group(1); CardInfo cardInfo = CardRepository.instance.findPreferedCoreExpansionCard(cardName, true); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 70157884723..4f1800c0bc8 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -27,6 +27,7 @@ */ package mage.server; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; @@ -297,7 +298,7 @@ public class TableController { // Check power level for table (currently only used for EDH/Commander table) int edhPowerLevel = table.getMatch().getOptions().getEdhPowerLevel(); - if (edhPowerLevel > 0 && table.getValidator().getName().toLowerCase().equals("commander")) { + if (edhPowerLevel > 0 && table.getValidator().getName().toLowerCase(Locale.ENGLISH).equals("commander")) { int deckEdhPowerLevel = table.getValidator().getEdhPowerLevel(deck); if (deckEdhPowerLevel % 100 > edhPowerLevel) { String message = new StringBuilder("Your deck appears to be too powerful for this table.\n\nReduce the number of extra turn cards, infect, counters, fogs, reconsider your commander. ") diff --git a/Mage.Sets/src/mage/cards/a/AngelicSkirmisher.java b/Mage.Sets/src/mage/cards/a/AngelicSkirmisher.java index 8252259cc0a..f2e99691c04 100644 --- a/Mage.Sets/src/mage/cards/a/AngelicSkirmisher.java +++ b/Mage.Sets/src/mage/cards/a/AngelicSkirmisher.java @@ -28,6 +28,7 @@ package mage.cards.a; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; import mage.MageInt; @@ -121,7 +122,7 @@ class AngelicSkirmisherEffect extends OneShotEffect { if (ability != null) { GainAbilityControlledEffect effect = new GainAbilityControlledEffect(ability, Duration.EndOfTurn, new FilterControlledCreaturePermanent()); game.addEffect(effect, source); - game.informPlayers(sourcePermanent.getName() + ": " + controller.getLogName() + " has chosen " + abilityChoice.getChoice().toLowerCase()); + game.informPlayers(sourcePermanent.getName() + ": " + controller.getLogName() + " has chosen " + abilityChoice.getChoice().toLowerCase(Locale.ENGLISH)); return true; } } diff --git a/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java b/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java index b22e6a0da9b..40e365dff68 100644 --- a/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java +++ b/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java @@ -28,6 +28,7 @@ package mage.cards.c; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; import mage.abilities.Ability; @@ -113,7 +114,7 @@ public class ConfusionInTheRanks extends CardImpl { if (!message.isEmpty()) { message += "or "; } - message += cardTypeEntering.toString().toLowerCase() + ' '; + message += cardTypeEntering.toString().toLowerCase(Locale.ENGLISH) + ' '; } filterTarget.add(Predicates.or(cardTypesPredicates)); message += "you don't control"; diff --git a/Mage.Sets/src/mage/cards/c/CosmicHorror.java b/Mage.Sets/src/mage/cards/c/CosmicHorror.java index 3196ca0f58b..1d29fea9768 100644 --- a/Mage.Sets/src/mage/cards/c/CosmicHorror.java +++ b/Mage.Sets/src/mage/cards/c/CosmicHorror.java @@ -27,6 +27,7 @@ */ package mage.cards.c; +import java.util.Locale; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -38,8 +39,8 @@ import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.game.Game; import mage.game.permanent.Permanent; @@ -52,7 +53,7 @@ import mage.players.Player; public class CosmicHorror extends CardImpl { public CosmicHorror(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}{B}"); this.subtype.add(SubType.HORROR); this.power = new MageInt(7); this.toughness = new MageInt(7); @@ -95,7 +96,7 @@ class CosmicHorrorEffect extends OneShotEffect { Permanent cosmicHorror = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && cosmicHorror != null) { StringBuilder sb = new StringBuilder(cost.getText()).append('?'); - if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ")) { + if (!sb.toString().toLowerCase(Locale.ENGLISH).startsWith("exile ") && !sb.toString().toLowerCase(Locale.ENGLISH).startsWith("return ")) { sb.insert(0, "Pay "); } if (controller.chooseUse(Outcome.Benefit, sb.toString(), source, game)) { diff --git a/Mage.Sets/src/mage/cards/d/DemonicHordes.java b/Mage.Sets/src/mage/cards/d/DemonicHordes.java index fc9d2271d35..2faeafd614f 100644 --- a/Mage.Sets/src/mage/cards/d/DemonicHordes.java +++ b/Mage.Sets/src/mage/cards/d/DemonicHordes.java @@ -27,6 +27,7 @@ */ package mage.cards.d; +import java.util.Locale; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -40,8 +41,8 @@ import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.common.FilterLandPermanent; @@ -61,7 +62,7 @@ import mage.target.common.TargetOpponent; public class DemonicHordes extends CardImpl { public DemonicHordes(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}{B}"); this.subtype.add(SubType.DEMON); this.power = new MageInt(5); this.toughness = new MageInt(5); @@ -106,7 +107,7 @@ class DemonicHordesEffect extends OneShotEffect { Permanent demonicHordes = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && demonicHordes != null) { StringBuilder sb = new StringBuilder(cost.getText()).append('?'); - if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ")) { + if (!sb.toString().toLowerCase(Locale.ENGLISH).startsWith("exile ") && !sb.toString().toLowerCase(Locale.ENGLISH).startsWith("return ")) { sb.insert(0, "Pay "); } if (controller.chooseUse(Outcome.Benefit, sb.toString(), source, game)) { diff --git a/Mage.Sets/src/mage/cards/d/DustOfMoments.java b/Mage.Sets/src/mage/cards/d/DustOfMoments.java index 529125a9d16..012abcea484 100644 --- a/Mage.Sets/src/mage/cards/d/DustOfMoments.java +++ b/Mage.Sets/src/mage/cards/d/DustOfMoments.java @@ -28,6 +28,7 @@ package mage.cards.d; import java.util.List; +import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; @@ -145,7 +146,7 @@ public class DustOfMoments extends CardImpl { if (!game.isSimulation()) { game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") .append(controller.getLogName()).append(getActionStr()).append('s') - .append(counter.getCount()).append(' ').append(counterName.toLowerCase()) + .append(counter.getCount()).append(' ').append(counterName.toLowerCase(Locale.ENGLISH)) .append(" counter on ").append(card.getName()).toString()); } } @@ -170,7 +171,7 @@ public class DustOfMoments extends CardImpl { if (!game.isSimulation()) { game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") .append(controller.getLogName()).append(getActionStr()).append("s ") - .append(counter.getCount()).append(' ').append(counterName.toLowerCase()) + .append(counter.getCount()).append(' ').append(counterName.toLowerCase(Locale.ENGLISH)) .append(" counter on ").append(card.getName()).toString()); } } @@ -185,9 +186,9 @@ public class DustOfMoments extends CardImpl { StringBuilder sb = new StringBuilder(); sb.append(getActionStr()); if (counter.getCount() > 1) { - sb.append(Integer.toString(counter.getCount())).append(' ').append(counter.getName().toLowerCase()).append(" counters on each "); + sb.append(Integer.toString(counter.getCount())).append(' ').append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counters on each "); } else { - sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each "); + sb.append("a ").append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter on each "); } sb.append(permFilter.getMessage()); staticText = sb.toString(); diff --git a/Mage.Sets/src/mage/cards/e/Equipoise.java b/Mage.Sets/src/mage/cards/e/Equipoise.java index 46aafab810d..bdb79816bf3 100644 --- a/Mage.Sets/src/mage/cards/e/Equipoise.java +++ b/Mage.Sets/src/mage/cards/e/Equipoise.java @@ -27,7 +27,7 @@ */ package mage.cards.e; -import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; @@ -44,7 +44,6 @@ import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; @@ -113,7 +112,7 @@ class EquipoiseEffect extends OneShotEffect { int numberTargetPlayer = game.getBattlefield().count(filter, source.getSourceId(), targetPlayer.getId(), game); int excess = numberTargetPlayer - numberController; if (excess > 0) { - FilterPermanent filterChoose = new FilterPermanent(cardType.toString().toLowerCase() + (excess > 1 ? "s" : "") + " of target player"); + FilterPermanent filterChoose = new FilterPermanent(cardType.toString().toLowerCase(Locale.ENGLISH) + (excess > 1 ? "s" : "") + " of target player"); filterChoose.add(new ControllerIdPredicate(targetPlayer.getId())); filterChoose.add(new CardTypePredicate(cardType)); Target target = new TargetPermanent(excess, excess, filterChoose, true); diff --git a/Mage.Sets/src/mage/cards/f/Fatespinner.java b/Mage.Sets/src/mage/cards/f/Fatespinner.java index 8fe538a37f8..01c6b428375 100644 --- a/Mage.Sets/src/mage/cards/f/Fatespinner.java +++ b/Mage.Sets/src/mage/cards/f/Fatespinner.java @@ -28,6 +28,7 @@ package mage.cards.f; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import java.util.UUID; import mage.MageInt; @@ -108,7 +109,7 @@ class FatespinnerChooseEffect extends OneShotEffect { return false; } String chosenPhase = choice.getChoice(); - game.informPlayers(player.getLogName() + " has chosen to skip " + chosenPhase.toLowerCase() + '.'); + game.informPlayers(player.getLogName() + " has chosen to skip " + chosenPhase.toLowerCase(Locale.ENGLISH) + '.'); game.addEffect(new FatespinnerSkipEffect(chosenPhase), source); return true; } diff --git a/Mage.Sets/src/mage/cards/m/MogisGodOfSlaughter.java b/Mage.Sets/src/mage/cards/m/MogisGodOfSlaughter.java index a03c1aa8ad0..7d47a8c1eee 100644 --- a/Mage.Sets/src/mage/cards/m/MogisGodOfSlaughter.java +++ b/Mage.Sets/src/mage/cards/m/MogisGodOfSlaughter.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.Locale; import java.util.UUID; import mage.MageInt; import mage.MageObject; @@ -153,9 +154,9 @@ class DoUnlessTargetPaysCost extends OneShotEffect { StringBuilder sb = new StringBuilder(); String costText = cost.getText(); if (costText != null - && !costText.toLowerCase().startsWith("discard") - && !costText.toLowerCase().startsWith("sacrifice") - && !costText.toLowerCase().startsWith("remove")) { + && !costText.toLowerCase(Locale.ENGLISH).startsWith("discard") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("sacrifice") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("remove")) { sb.append("pay "); } return sb.append(costText).toString(); diff --git a/Mage.Sets/src/mage/cards/t/TabletOfTheGuilds.java b/Mage.Sets/src/mage/cards/t/TabletOfTheGuilds.java index 3120df514c7..4e946e86bc3 100644 --- a/Mage.Sets/src/mage/cards/t/TabletOfTheGuilds.java +++ b/Mage.Sets/src/mage/cards/t/TabletOfTheGuilds.java @@ -27,6 +27,7 @@ */ package mage.cards.t; +import java.util.Locale; import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; @@ -93,14 +94,14 @@ class TabletOfTheGuildsEntersBattlefieldEffect extends OneShotEffect { return false; } game.getState().setValue(permanent.getId() + "_color1", colorChoice.getColor().toString()); - colors = colorChoice.getChoice().toLowerCase() + " and "; + colors = colorChoice.getChoice().toLowerCase(Locale.ENGLISH) + " and "; colorChoice.getChoices().remove(colorChoice.getChoice()); colorChoice.setMessage("Choose the second color"); if (!player.choose(Outcome.GainLife, colorChoice, game) && player.canRespond()) { return false; } game.getState().setValue(permanent.getId() + "_color2", colorChoice.getColor().toString()); - colors = colors + colorChoice.getChoice().toLowerCase(); + colors = colors + colorChoice.getChoice().toLowerCase(Locale.ENGLISH); game.informPlayers(permanent.getName() + ": " + player.getLogName() + " has chosen " + colors); return true; } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java index 1f6c29416c9..ab1e8568d7e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java @@ -1,5 +1,11 @@ package org.mage.test.serverside; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Random; import mage.cards.Card; import mage.cards.Sets; import mage.cards.decks.Deck; @@ -17,12 +23,6 @@ import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - /** * @author ayratn */ @@ -61,7 +61,6 @@ public class PlayGameTest extends MageTestBase { // game.cheat(playerA.getId(), libraryCardsA, handCardsA, battlefieldCardsA, graveyardCardsA); // game.cheat(playerB.getId(), commandsB); // game.cheat(playerB.getId(), libraryCardsB, handCardsB, battlefieldCardsB, graveyardCardsB); - //boolean testMode = false; boolean testMode = true; @@ -80,7 +79,7 @@ public class PlayGameTest extends MageTestBase { } private Deck generateRandomDeck() { - String selectedColors = colorChoices.get(new Random().nextInt(colorChoices.size())).toUpperCase(); + String selectedColors = colorChoices.get(new Random().nextInt(colorChoices.size())).toUpperCase(Locale.ENGLISH); List allowedColors = new ArrayList<>(); logger.info("Building deck with colors: " + selectedColors); for (int i = 0; i < selectedColors.length(); i++) { diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java b/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java index 8d6a213307f..01aecf546ff 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/TestPlayRandomGame.java @@ -1,5 +1,11 @@ package org.mage.test.serverside; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Random; import mage.cards.Card; import mage.cards.Sets; import mage.cards.decks.Deck; @@ -16,12 +22,6 @@ import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - /** * @author ayratn */ @@ -70,7 +70,7 @@ public class TestPlayRandomGame extends MageTestBase { } private Deck generateRandomDeck() { - String selectedColors = colorChoices.get(new Random().nextInt(colorChoices.size())).toUpperCase(); + String selectedColors = colorChoices.get(new Random().nextInt(colorChoices.size())).toUpperCase(Locale.ENGLISH); List allowedColors = new ArrayList<>(); logger.info("Building deck with colors: " + selectedColors); for (int i = 0; i < selectedColors.length(); i++) { diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index b90f99abb7e..79b88f1110e 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -277,8 +277,8 @@ public class VerifyCardDataTest { for (String token : tokens) { if (!(token.equals(card.getName()) || containsInTypesOrText(ref, token) - || containsInTypesOrText(ref, token.toLowerCase()) - || (ref2 != null && (containsInTypesOrText(ref2, token) || containsInTypesOrText(ref2, token.toLowerCase()))))) { + || containsInTypesOrText(ref, token.toLowerCase(Locale.ENGLISH)) + || (ref2 != null && (containsInTypesOrText(ref2, token) || containsInTypesOrText(ref2, token.toLowerCase(Locale.ENGLISH)))))) { System.out.println("unexpected token " + token + " in " + card); } } diff --git a/Mage/src/main/java/mage/abilities/SpecialActions.java b/Mage/src/main/java/mage/abilities/SpecialActions.java index 72a5eb444c9..66906d5948c 100644 --- a/Mage/src/main/java/mage/abilities/SpecialActions.java +++ b/Mage/src/main/java/mage/abilities/SpecialActions.java @@ -28,7 +28,6 @@ package mage.abilities; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.UUID; diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java index a7566dafbc8..d5bcb7daf30 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java @@ -27,6 +27,7 @@ */ package mage.abilities; +import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.abilities.effects.Effect; @@ -124,7 +125,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge String superRule = super.getRule(true); StringBuilder sb = new StringBuilder(); if (!superRule.isEmpty()) { - String ruleLow = superRule.toLowerCase(); + String ruleLow = superRule.toLowerCase(Locale.ENGLISH); if (isOptional()) { if (ruleLow.startsWith("you ")) { if (!ruleLow.startsWith("you may")) { diff --git a/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java b/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java index 0acfd45616e..6dd21c8b275 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java @@ -30,7 +30,6 @@ package mage.abilities.abilityword; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; diff --git a/Mage/src/main/java/mage/abilities/common/AttacksAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksAttachedTriggeredAbility.java index 0efaa22f9c3..48a90bbd7ad 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksAttachedTriggeredAbility.java @@ -27,6 +27,7 @@ */ package mage.abilities.common; +import java.util.Locale; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.AttachmentType; @@ -88,7 +89,7 @@ public class AttacksAttachedTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { StringBuilder sb = new StringBuilder("Whenever "); - sb.append(attachmentType.verb().toLowerCase()); + sb.append(attachmentType.verb().toLowerCase(Locale.ENGLISH)); return sb.append(" creature attacks, ").append(super.getRule()).toString(); } } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java index 748ac55fd5f..a0c07ba7692 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java @@ -27,6 +27,7 @@ */ package mage.abilities.common; +import java.util.Locale; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.condition.Condition; import mage.abilities.effects.Effect; @@ -129,9 +130,9 @@ public class BeginningOfEndStepTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { StringBuilder sb = new StringBuilder(getEffects().getText(modes.getMode())); if (this.optional) { - if (sb.substring(0, 6).toLowerCase().equals("target")) { + if (sb.substring(0, 6).toLowerCase(Locale.ENGLISH).equals("target")) { sb.insert(0, "you may have "); - } else if (!sb.substring(0, 4).toLowerCase().equals("you ")) { + } else if (!sb.substring(0, 4).toLowerCase(Locale.ENGLISH).equals("you ")) { sb.insert(0, "you may "); } } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java index 51a6c378ef5..d0139521cc0 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java @@ -27,6 +27,7 @@ */ package mage.abilities.common; +import java.util.Locale; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.TargetController; @@ -141,9 +142,9 @@ public class BeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl { switch (targetController) { case YOU: if (this.optional) { - if (sb.substring(0, 6).toLowerCase().equals("target")) { + if (sb.substring(0, 6).toLowerCase(Locale.ENGLISH).equals("target")) { sb.insert(0, "you may have "); - } else if (!sb.substring(0, 4).toLowerCase().equals("you ")) { + } else if (!sb.substring(0, 4).toLowerCase(Locale.ENGLISH).equals("you ")) { sb.insert(0, "you may "); } } diff --git a/Mage/src/main/java/mage/abilities/common/LandfallAbility.java b/Mage/src/main/java/mage/abilities/common/LandfallAbility.java index d976c248451..59be3d43d89 100644 --- a/Mage/src/main/java/mage/abilities/common/LandfallAbility.java +++ b/Mage/src/main/java/mage/abilities/common/LandfallAbility.java @@ -29,7 +29,6 @@ package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java b/Mage/src/main/java/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java index 6de0cf8a907..eda1c525bab 100644 --- a/Mage/src/main/java/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java +++ b/Mage/src/main/java/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java @@ -30,7 +30,6 @@ package mage.abilities.common; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.TriggeredManaAbility; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; diff --git a/Mage/src/main/java/mage/abilities/condition/common/AnyPlayerControlsCondition.java b/Mage/src/main/java/mage/abilities/condition/common/AnyPlayerControlsCondition.java index a733ee74f0a..7a82029a152 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/AnyPlayerControlsCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/AnyPlayerControlsCondition.java @@ -31,9 +31,6 @@ import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.filter.FilterPermanent; import mage.game.Game; -import mage.players.Player; - -import java.util.Map; import java.util.UUID; /** diff --git a/Mage/src/main/java/mage/abilities/condition/common/DeliriumCondition.java b/Mage/src/main/java/mage/abilities/condition/common/DeliriumCondition.java index 1c535005449..260e43e4f55 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/DeliriumCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/DeliriumCondition.java @@ -28,7 +28,6 @@ package mage.abilities.condition.common; import java.util.EnumSet; -import java.util.HashSet; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.cards.Card; diff --git a/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java index e405cb7b06e..8e78b1c546f 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java @@ -30,7 +30,6 @@ package mage.abilities.condition.common; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.constants.CardType; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/abilities/condition/common/EnchantedTargetCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EnchantedTargetCondition.java index 663160ea4fc..8eff5fb51dd 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EnchantedTargetCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EnchantedTargetCondition.java @@ -4,7 +4,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.constants.CardType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; diff --git a/Mage/src/main/java/mage/abilities/condition/common/MyMainPhaseCondition.java b/Mage/src/main/java/mage/abilities/condition/common/MyMainPhaseCondition.java index f09a6d77958..20e4ae7db80 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/MyMainPhaseCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/MyMainPhaseCondition.java @@ -28,7 +28,6 @@ package mage.abilities.condition.common; import java.util.EnumSet; -import java.util.HashSet; import java.util.Set; import mage.constants.TurnPhase; diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceIsSpellCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceIsSpellCondition.java index 51a31399db1..b3242cec954 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/SourceIsSpellCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceIsSpellCondition.java @@ -30,7 +30,6 @@ package mage.abilities.condition.common; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.constants.CardType; import mage.game.Game; /** diff --git a/Mage/src/main/java/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java b/Mage/src/main/java/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java index 2af8d31efcc..7d2087ab503 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java @@ -10,7 +10,6 @@ import mage.abilities.Ability; import mage.abilities.costs.Cost; import mage.abilities.costs.CostImpl; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ParleyCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ParleyCount.java index 4a40e33d6ce..fe9bbdf59d1 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ParleyCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ParleyCount.java @@ -36,7 +36,6 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.cards.Card; import mage.cards.CardsImpl; -import mage.constants.CardType; import mage.game.Game; import mage.players.Player; diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageAttachedEffect.java index 2cc1200ee2b..064513a3460 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageAttachedEffect.java @@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; /** * diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageEachOtherEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageEachOtherEffect.java index da8a815b3a1..505022199f8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageEachOtherEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageEachOtherEffect.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; -import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java index bba8baab7f9..bb3c8496625 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java @@ -1,5 +1,6 @@ package mage.abilities.effects.common; +import java.util.Locale; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; @@ -88,8 +89,7 @@ public class DoIfCostPaid extends OneShotEffect { } } player.resetStoredBookmark(game); // otherwise you can e.g. undo card drawn with Mentor of the Meek - } - else if (!otherwiseEffects.isEmpty()) { + } else if (!otherwiseEffects.isEmpty()) { for (Effect effect : otherwiseEffects) { effect.setTargetPointer(this.targetPointer); if (effect instanceof OneShotEffect) { @@ -99,8 +99,7 @@ public class DoIfCostPaid extends OneShotEffect { } } } - } - else if (!otherwiseEffects.isEmpty()) { + } else if (!otherwiseEffects.isEmpty()) { for (Effect effect : otherwiseEffects) { effect.setTargetPointer(this.targetPointer); if (effect instanceof OneShotEffect) { @@ -135,12 +134,12 @@ public class DoIfCostPaid extends OneShotEffect { StringBuilder sb = new StringBuilder(); String costText = cost.getText(); if (costText != null - && !costText.toLowerCase().startsWith("put") - && !costText.toLowerCase().startsWith("exile") - && !costText.toLowerCase().startsWith("discard") - && !costText.toLowerCase().startsWith("sacrifice") - && !costText.toLowerCase().startsWith("remove") - && !costText.toLowerCase().startsWith("pay")) { + && !costText.toLowerCase(Locale.ENGLISH).startsWith("put") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("exile") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("discard") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("sacrifice") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("remove") + && !costText.toLowerCase(Locale.ENGLISH).startsWith("pay")) { sb.append("pay "); } return sb.append(costText).toString(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/EnterBattlefieldPayCostOrPutGraveyardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/EnterBattlefieldPayCostOrPutGraveyardEffect.java index 838f4a18fa3..5ca029d50eb 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/EnterBattlefieldPayCostOrPutGraveyardEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/EnterBattlefieldPayCostOrPutGraveyardEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common; +import java.util.Locale; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.costs.Cost; @@ -77,7 +78,7 @@ public class EnterBattlefieldPayCostOrPutGraveyardEffect extends ReplacementEffe boolean replace = true; if (cost.canPay(source, source.getSourceId(), player.getId(), game)) { if (player.chooseUse(outcome, - cost.getText().substring(0, 1).toUpperCase() + cost.getText().substring(1) + cost.getText().substring(0, 1).toUpperCase(Locale.ENGLISH) + cost.getText().substring(1) + "? (otherwise " + sourceObject.getLogName() + " is put into graveyard)", source, game)) { cost.clearPaid(); replace = !cost.pay(source, game, source.getSourceId(), source.getControllerId(), false, null); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileFromZoneTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileFromZoneTargetEffect.java index 4ff7097f657..30df84cf478 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileFromZoneTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileFromZoneTargetEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common; +import java.util.Locale; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -106,6 +107,6 @@ public class ExileFromZoneTargetEffect extends OneShotEffect { } private void setText() { - staticText = "target player exiles " + CardUtil.numberToText(amount, "a") + ' ' + filter.getMessage() + " from his or her " + zone.toString().toLowerCase(); + staticText = "target player exiles " + CardUtil.numberToText(amount, "a") + ' ' + filter.getMessage() + " from his or her " + zone.toString().toLowerCase(Locale.ENGLISH); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileSourceUnlessPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileSourceUnlessPaysEffect.java index 1b10a2c554a..3993002f4f1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileSourceUnlessPaysEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileSourceUnlessPaysEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common; +import java.util.Locale; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.costs.Cost; @@ -38,7 +39,7 @@ import mage.players.Player; import mage.util.CardUtil; /** - * + * * @author fireshoes */ public class ExileSourceUnlessPaysEffect extends OneShotEffect { @@ -61,7 +62,7 @@ public class ExileSourceUnlessPaysEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && sourcePermanent != null) { StringBuilder sb = new StringBuilder(cost.getText()).append('?'); - if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ")) { + if (!sb.toString().toLowerCase(Locale.ENGLISH).startsWith("exile ") && !sb.toString().toLowerCase(Locale.ENGLISH).startsWith("return ")) { sb.insert(0, "Pay "); } String message = CardUtil.replaceSourceName(sb.toString(), sourcePermanent.getLogName()); @@ -91,12 +92,12 @@ public class ExileSourceUnlessPaysEffect extends OneShotEffect { StringBuilder sb = new StringBuilder("exile {this} unless you "); String costText = cost.getText(); - if (costText.toLowerCase().startsWith("discard") - || costText.toLowerCase().startsWith("remove") - || costText.toLowerCase().startsWith("return") - || costText.toLowerCase().startsWith("exile") - || costText.toLowerCase().startsWith("sacrifice")) { - sb.append(costText.substring(0, 1).toLowerCase()); + if (costText.toLowerCase(Locale.ENGLISH).startsWith("discard") + || costText.toLowerCase(Locale.ENGLISH).startsWith("remove") + || costText.toLowerCase(Locale.ENGLISH).startsWith("return") + || costText.toLowerCase(Locale.ENGLISH).startsWith("exile") + || costText.toLowerCase(Locale.ENGLISH).startsWith("sacrifice")) { + sb.append(costText.substring(0, 1).toLowerCase(Locale.ENGLISH)); sb.append(costText.substring(1)); } else { sb.append("pay ").append(costText); diff --git a/Mage/src/main/java/mage/abilities/effects/common/FightTargetsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/FightTargetsEffect.java index 1cf4b86d38f..dc5a3034c2a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/FightTargetsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/FightTargetsEffect.java @@ -31,7 +31,6 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java b/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java index 986711813a5..8fed10126d3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/HideawayPlayEffect.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Outcome; import mage.game.ExileZone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java index 359666cd8d0..ebf8ca4eed2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java @@ -30,6 +30,7 @@ package mage.abilities.effects.common; import static java.lang.Integer.min; +import java.util.Locale; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; @@ -291,7 +292,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff sb.append(" of them into your "); } - sb.append(targetPickedCards.toString().toLowerCase()); + sb.append(targetPickedCards.toString().toLowerCase(Locale.ENGLISH)); if (targetZoneLookedCards == Zone.LIBRARY) { sb.append(". Put the rest "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java index 081cd81b8c8..7bffd0719a6 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java @@ -31,7 +31,6 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.PreventionEffectImpl; -import mage.constants.CardType; import mage.constants.Duration; import mage.game.Game; import mage.game.events.GameEvent; diff --git a/Mage/src/main/java/mage/abilities/effects/common/RegenerateAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RegenerateAttachedEffect.java index 2bf62a4b5b2..332ab812283 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RegenerateAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RegenerateAttachedEffect.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,21 +20,20 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common; +import java.util.Locale; import java.util.UUID; - +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; import mage.constants.AttachmentType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.abilities.Ability; -import mage.abilities.effects.ReplacementEffectImpl; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -103,6 +102,6 @@ public class RegenerateAttachedEffect extends ReplacementEffectImpl { } private void setText() { - staticText = "Regenerate " + attachmentType.verb().toLowerCase() + " creature"; + staticText = "Regenerate " + attachmentType.verb().toLowerCase(Locale.ENGLISH) + " creature"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java index c5a7b20e6ba..296efa7fa81 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RegenerateTargetEffect.java @@ -25,14 +25,14 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common; -import mage.constants.Duration; -import mage.constants.Outcome; +import java.util.Locale; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -43,9 +43,9 @@ import mage.target.Target; * * @author maurer.it_at_gmail.com */ -public class RegenerateTargetEffect extends ReplacementEffectImpl { +public class RegenerateTargetEffect extends ReplacementEffectImpl { - public RegenerateTargetEffect ( ) { + public RegenerateTargetEffect() { super(Duration.EndOfTurn, Outcome.Regenerate); } @@ -82,7 +82,7 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { //20110204 - 701.11c - event.getAmount() is used to signal if regeneration is allowed - + return event.getAmount() == 0 && event.getTargetId().equals(targetPointer.getFirst(game, source)) && !this.used; } @@ -95,7 +95,7 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl { sb.append("Regenerate "); Target target = mode.getTargets().get(0); if (target != null) { - if (!target.getTargetName().toLowerCase().startsWith("another")) { + if (!target.getTargetName().toLowerCase(Locale.ENGLISH).startsWith("another")) { sb.append("target "); } sb.append(target.getTargetName()); diff --git a/Mage/src/main/java/mage/abilities/effects/common/RevealTopLandToBattlefieldElseHandEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RevealTopLandToBattlefieldElseHandEffect.java index ec06e46b057..62b7b680400 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RevealTopLandToBattlefieldElseHandEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RevealTopLandToBattlefieldElseHandEffect.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardsImpl; -import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/effects/common/RollDiceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RollDiceEffect.java index 8b3dfc5e738..506d0f7befe 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RollDiceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RollDiceEffect.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.effects.OneShotEffect; diff --git a/Mage/src/main/java/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java index f4073747136..75cb98bcbb0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java @@ -1,5 +1,6 @@ package mage.abilities.effects.common; +import java.util.Locale; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.costs.Cost; @@ -34,7 +35,7 @@ public class SacrificeSourceUnlessPaysEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && sourcePermanent != null) { StringBuilder sb = new StringBuilder(cost.getText()).append('?'); - if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ")) { + if (!sb.toString().toLowerCase(Locale.ENGLISH).startsWith("exile ") && !sb.toString().toLowerCase(Locale.ENGLISH).startsWith("return ")) { sb.insert(0, "Pay "); } String message = CardUtil.replaceSourceName(sb.toString(), sourcePermanent.getLogName()); @@ -69,13 +70,13 @@ public class SacrificeSourceUnlessPaysEffect extends OneShotEffect { StringBuilder sb = new StringBuilder("sacrifice {this} unless you "); String costText = cost.getText(); - if (costText.toLowerCase().startsWith("discard") - || costText.toLowerCase().startsWith("remove") - || costText.toLowerCase().startsWith("return") - || costText.toLowerCase().startsWith("put") - || costText.toLowerCase().startsWith("exile") - || costText.toLowerCase().startsWith("sacrifice")) { - sb.append(costText.substring(0, 1).toLowerCase()); + if (costText.toLowerCase(Locale.ENGLISH).startsWith("discard") + || costText.toLowerCase(Locale.ENGLISH).startsWith("remove") + || costText.toLowerCase(Locale.ENGLISH).startsWith("return") + || costText.toLowerCase(Locale.ENGLISH).startsWith("put") + || costText.toLowerCase(Locale.ENGLISH).startsWith("exile") + || costText.toLowerCase(Locale.ENGLISH).startsWith("sacrifice")) { + sb.append(costText.substring(0, 1).toLowerCase(Locale.ENGLISH)); sb.append(costText.substring(1)); } else { sb.append("pay ").append(costText); diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/MustBeBlockedByAllAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/MustBeBlockedByAllAttachedEffect.java index 24fa94d0b0f..83743a19794 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/MustBeBlockedByAllAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/MustBeBlockedByAllAttachedEffect.java @@ -25,15 +25,14 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common.combat; +import java.util.Locale; import java.util.UUID; - -import mage.constants.AttachmentType; -import mage.constants.Duration; import mage.abilities.Ability; import mage.abilities.effects.RequirementEffect; +import mage.constants.AttachmentType; +import mage.constants.Duration; import mage.game.Game; import mage.game.permanent.Permanent; @@ -51,7 +50,7 @@ public class MustBeBlockedByAllAttachedEffect extends RequirementEffect { public MustBeBlockedByAllAttachedEffect(Duration duration, AttachmentType attachmentType) { super(duration); this.attachmentType = attachmentType; - staticText = "All creatures able to block " + attachmentType.verb().toLowerCase() + " creature do so"; + staticText = "All creatures able to block " + attachmentType.verb().toLowerCase(Locale.ENGLISH) + " creature do so"; } public MustBeBlockedByAllAttachedEffect(final MustBeBlockedByAllAttachedEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeSourceEffect.java index 4858b6e169b..5087109fa56 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeSourceEffect.java @@ -28,6 +28,7 @@ package mage.abilities.effects.common.continuous; import java.util.ArrayList; +import java.util.Locale; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.Mode; @@ -104,7 +105,7 @@ public class AddCardTypeSourceEffect extends ContinuousEffectImpl { } article = true; } - sb.append(cardType.toString().toLowerCase()).append(" "); + sb.append(cardType.toString().toLowerCase(Locale.ENGLISH)).append(" "); } sb.append(" in addition to its other types ").append(this.getDuration().toString()); return sb.toString(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeTargetEffect.java index 24fd3a05d4c..822b264e64e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardTypeTargetEffect.java @@ -28,6 +28,7 @@ package mage.abilities.effects.common.continuous; import java.util.ArrayList; +import java.util.Locale; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; @@ -110,7 +111,7 @@ public class AddCardTypeTargetEffect extends ContinuousEffectImpl { } article = true; } - sb.append(cardType.toString().toLowerCase()).append(" "); + sb.append(cardType.toString().toLowerCase(Locale.ENGLISH)).append(" "); } sb.append("in addition to its other types"); if (getDuration().equals(Duration.EndOfTurn)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java index f1a6aca4dda..51e1805ec94 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java @@ -27,13 +27,13 @@ */ package mage.abilities.effects.common.continuous; +import java.util.Locale; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.ContinuousEffectImpl; -import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Layer; import mage.constants.Outcome; @@ -126,7 +126,7 @@ public class BoostTargetEffect extends ContinuousEffectImpl { } sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(" target ").append(target.getTargetName()).append(" get "); } else { - if (!target.getTargetName().toUpperCase().startsWith("ANOTHER")) { + if (!target.getTargetName().toUpperCase(Locale.ENGLISH).startsWith("ANOTHER")) { sb.append("target "); } sb.append(target.getTargetName()).append(" gets "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java index 962a782ead3..f82d9011ac2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllEffect.java @@ -29,6 +29,7 @@ package mage.abilities.effects.common.continuous; import java.util.HashMap; import java.util.Iterator; +import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.MageObjectReference; @@ -180,12 +181,12 @@ public class GainAbilityAllEffect extends ContinuousEffectImpl { } sb.append(filter.getMessage()); if (duration == Duration.WhileOnBattlefield) { - if (filter.getMessage().toLowerCase().startsWith("each")) { + if (filter.getMessage().toLowerCase(Locale.ENGLISH).startsWith("each")) { sb.append(" has "); } else { sb.append(" have "); } - } else if (filter.getMessage().toLowerCase().startsWith("each")) { + } else if (filter.getMessage().toLowerCase(Locale.ENGLISH).startsWith("each")) { sb.append(" gains "); } else { sb.append(" gain "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java index 91f1d4af731..4660a926cd2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java @@ -170,7 +170,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl { } sb.append(target.getMaxNumberOfTargets()).append(" target ").append(target.getTargetName()).append(" gain "); } else { - if (!target.getTargetName().toUpperCase().startsWith("ANOTHER")) { + if (!target.getTargetName().toUpperCase(Locale.ENGLISH).startsWith("ANOTHER")) { sb.append("target "); } sb.append(target.getTargetName()).append(" gains "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAllEffect.java index b896c2b9502..0acebdda8a2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAllEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common.counter; +import java.util.Locale; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -69,7 +70,7 @@ public class AddCountersAllEffect extends OneShotEffect { for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { permanent.addCounters(counter.copy(), source, game); if (!game.isSimulation()) { - game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " puts " + counter.getCount() + ' ' + counter.getName().toLowerCase() + game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " puts " + counter.getCount() + ' ' + counter.getName().toLowerCase(Locale.ENGLISH) + " counter on " + permanent.getLogName()); } } @@ -83,9 +84,9 @@ public class AddCountersAllEffect extends OneShotEffect { StringBuilder sb = new StringBuilder(); sb.append("put "); if (counter.getCount() > 1) { - sb.append(CardUtil.numberToText(counter.getCount(), "a")).append(' ').append(counter.getName().toLowerCase()).append(" counters on each "); + sb.append(CardUtil.numberToText(counter.getCount(), "a")).append(' ').append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counters on each "); } else { - sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each "); + sb.append("a ").append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter on each "); } sb.append(filter.getMessage()); staticText = sb.toString(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAttachedEffect.java index 2824f7f5e7c..ddf90f5bdef 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersAttachedEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common.counter; +import java.util.Locale; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; @@ -41,7 +42,6 @@ import mage.util.CardUtil; * * @author LevelX2 */ - public class AddCountersAttachedEffect extends OneShotEffect { private Counter counter; @@ -99,7 +99,7 @@ public class AddCountersAttachedEffect extends OneShotEffect { } else { sb.append("a "); } - sb.append(counter.getName().toLowerCase()).append(" counter on "); + sb.append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter on "); sb.append(textEnchanted); if (!amount.getMessage().isEmpty()) { sb.append(" for each ").append(amount.getMessage()); diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersSourceEffect.java index 9376340acff..6d5062415a0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersSourceEffect.java @@ -28,6 +28,7 @@ package mage.abilities.effects.common.counter; import java.util.ArrayList; +import java.util.Locale; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; @@ -110,7 +111,7 @@ public class AddCountersSourceEffect extends OneShotEffect { if (informPlayers && !game.isSimulation()) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - game.informPlayers(player.getLogName() + " puts " + newCounter.getCount() + ' ' + newCounter.getName().toLowerCase() + " counter on " + card.getLogName()); + game.informPlayers(player.getLogName() + " puts " + newCounter.getCount() + ' ' + newCounter.getName().toLowerCase(Locale.ENGLISH) + " counter on " + card.getLogName()); } } } @@ -137,7 +138,7 @@ public class AddCountersSourceEffect extends OneShotEffect { int amountAdded = permanent.getCounters(game).getCount(newCounter.getName()) - before; Player player = game.getPlayer(source.getControllerId()); if (player != null) { - game.informPlayers(player.getLogName() + " puts " + amountAdded + ' ' + newCounter.getName().toLowerCase() + " counter on " + permanent.getLogName()); + game.informPlayers(player.getLogName() + " puts " + amountAdded + ' ' + newCounter.getName().toLowerCase(Locale.ENGLISH) + " counter on " + permanent.getLogName()); } } } @@ -161,7 +162,7 @@ public class AddCountersSourceEffect extends OneShotEffect { sb.append("a "); plural = false; } - sb.append(counter.getName().toLowerCase()).append(" counter"); + sb.append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter"); if (plural) { sb.append('s'); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java index f61e9d73a06..a890ba73ece 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common.counter; +import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; @@ -102,7 +103,7 @@ public class AddCountersTargetEffect extends OneShotEffect { affectedTargets++; if (!game.isSimulation()) { game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " puts " - + numberAdded + ' ' + counter.getName().toLowerCase() + " counter on " + permanent.getLogName()); + + numberAdded + ' ' + counter.getName().toLowerCase(Locale.ENGLISH) + " counter on " + permanent.getLogName()); } } else if (player != null) { Counter newCounter = counter.copy(); @@ -111,7 +112,7 @@ public class AddCountersTargetEffect extends OneShotEffect { affectedTargets++; if (!game.isSimulation()) { game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " puts " - + counter.getCount() + ' ' + counter.getName().toLowerCase() + " counter on " + player.getLogName()); + + counter.getCount() + ' ' + counter.getName().toLowerCase(Locale.ENGLISH) + " counter on " + player.getLogName()); } } else if (card != null) { card.addCounters(counter, source, game); @@ -140,7 +141,7 @@ public class AddCountersTargetEffect extends OneShotEffect { } else { sb.append("a "); } - sb.append(counter.getName().toLowerCase()).append(" counter"); + sb.append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter"); if (counter.getCount() > 1) { sb.append('s'); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java index 0e59f9641ee..7fd58157229 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java @@ -29,6 +29,7 @@ package mage.abilities.effects.common.counter; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -98,7 +99,7 @@ public class AddRemoveAllTimeSuspentCountersEffect extends OneShotEffect { if (!game.isSimulation()) { game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") .append(controller.getLogName()).append(actionStr) - .append(counter.getCount()).append(' ').append(counterName.toLowerCase()) + .append(counter.getCount()).append(' ').append(counterName.toLowerCase(Locale.ENGLISH)) .append(" counter on ").append(card.getName()).toString()); } } @@ -110,9 +111,9 @@ public class AddRemoveAllTimeSuspentCountersEffect extends OneShotEffect { final String actionsStr2 = removeCounter ? "remove " : " put "; sb.append(actionsStr2); if (counter.getCount() > 1) { - sb.append(Integer.toString(counter.getCount())).append(' ').append(counter.getName().toLowerCase()).append(" counters on each "); + sb.append(Integer.toString(counter.getCount())).append(' ').append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counters on each "); } else { - sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each "); + sb.append("a ").append(counter.getName().toLowerCase(Locale.ENGLISH)).append(" counter on each "); } sb.append(filter.getMessage()); staticText = sb.toString(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/replacement/DealtDamageToCreatureBySourceDies.java b/Mage/src/main/java/mage/abilities/effects/common/replacement/DealtDamageToCreatureBySourceDies.java index 6dbd12b9977..145e2432da5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/replacement/DealtDamageToCreatureBySourceDies.java +++ b/Mage/src/main/java/mage/abilities/effects/common/replacement/DealtDamageToCreatureBySourceDies.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common.replacement; import mage.abilities.Ability; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java index 21ac9b98751..056be1d72e3 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java @@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java index 225a530f542..bc3538456ce 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java @@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java index 32a979618b6..8e4d35b21db 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/SupportEffect.java @@ -31,7 +31,6 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage/src/main/java/mage/abilities/keyword/AnnihilatorAbility.java b/Mage/src/main/java/mage/abilities/keyword/AnnihilatorAbility.java index a16a527a63d..69b360804df 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AnnihilatorAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AnnihilatorAbility.java @@ -32,7 +32,6 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.events.GameEvent; diff --git a/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java b/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java index 70f7f534002..2f0b744d3a2 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ConvokeAbility.java @@ -29,6 +29,7 @@ package mage.abilities.keyword; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.UUID; import mage.Mana; import mage.ObjectColor; @@ -242,7 +243,7 @@ class ConvokeEffect extends OneShotEffect { manaPool.addMana(Mana.ColorlessMana(1), game, source); manaPool.unlockManaType(ManaType.COLORLESS); } - manaName = chooseManaType.getChoice().toLowerCase(); + manaName = chooseManaType.getChoice().toLowerCase(Locale.ENGLISH); } else { manaPool.addMana(Mana.ColorlessMana(1), game, source); manaPool.unlockManaType(ManaType.COLORLESS); diff --git a/Mage/src/main/java/mage/abilities/keyword/EchoAbility.java b/Mage/src/main/java/mage/abilities/keyword/EchoAbility.java index e978cb9dc0e..d7230c9b1ee 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EchoAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EchoAbility.java @@ -27,6 +27,7 @@ */ package mage.abilities.keyword; +import java.util.Locale; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; @@ -209,8 +210,8 @@ class EchoEffect extends OneShotEffect { public String getText(Mode mode) { StringBuilder sb = new StringBuilder("sacrifice {this} unless you "); String costText = cost.getText(); - if (costText.toLowerCase().startsWith("discard")) { - sb.append(costText.substring(0, 1).toLowerCase()); + if (costText.toLowerCase(Locale.ENGLISH).startsWith("discard")) { + sb.append(costText.substring(0, 1).toLowerCase(Locale.ENGLISH)); sb.append(costText.substring(1)); } else { sb.append("pay ").append(costText); diff --git a/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java b/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java index 3dc4faac65e..483424869be 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java @@ -30,7 +30,6 @@ package mage.abilities.keyword; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; -import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; diff --git a/Mage/src/main/java/mage/abilities/keyword/ExertAbility.java b/Mage/src/main/java/mage/abilities/keyword/ExertAbility.java index 690ea53e143..9a5432df92a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ExertAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ExertAbility.java @@ -1,206 +1,205 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of BetaSteward_at_googlemail.com. - */ -package mage.abilities.keyword; - -import java.util.HashSet; -import java.util.Set; -import mage.MageObjectReference; -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.common.BecomesExertSourceTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.Effect; -import mage.abilities.effects.ReplacementEffectImpl; -import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.WatcherScope; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.targetpointer.FixedTarget; -import mage.watchers.Watcher; - -/** - * - * @author LevelX2 - */ -public class ExertAbility extends SimpleStaticAbility { - - private String ruleText; - - public ExertAbility(BecomesExertSourceTriggeredAbility ability) { - this(ability, false); - } - - public ExertAbility(BecomesExertSourceTriggeredAbility ability, boolean exertOnlyOncePerTurn) { - super(Zone.BATTLEFIELD, new ExertReplacementEffect(exertOnlyOncePerTurn)); - ruleText = (exertOnlyOncePerTurn - ? "If {this} hasn't been exerted this turn, you may exert it" - : "You may exert {this}") + " as it attacks. "; - if (ability != null) { - this.addSubAbility(ability); - ruleText += "When you do,"; - ability.getEffects().forEach(effect -> { - ruleText += " " + effect.getText(ability.getModes().getMode()); - }); - ruleText += ". "; - ability.setRuleVisible(false); - } - ruleText += "(An exerted creature won't untap during your next untap step.)"; - if (exertOnlyOncePerTurn) { - getWatchers().add(new ExertedThisTurnWatcher()); - } - } - - public ExertAbility(final ExertAbility ability) { - super(ability); - this.ruleText = ability.ruleText; - - } - - @Override - public ExertAbility copy() { - return new ExertAbility(this); - } - - @Override - public String getRule() { - return ruleText; - } -} - -class ExertReplacementEffect extends ReplacementEffectImpl { - - final private boolean exertOnlyOncePerTurn; - - public ExertReplacementEffect(boolean exertOnlyOncePerTurn) { - super(Duration.WhileOnBattlefield, Outcome.Detriment); - staticText = "You may exert {this} as it attacks"; - this.exertOnlyOncePerTurn = exertOnlyOncePerTurn; - } - - public ExertReplacementEffect(ExertReplacementEffect effect) { - super(effect); - this.exertOnlyOncePerTurn = effect.exertOnlyOncePerTurn; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.ATTACKER_DECLARED; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - return event.getSourceId().equals(source.getSourceId()); - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Permanent creature = game.getPermanent(event.getSourceId()); - Player controller = game.getPlayer(source.getControllerId()); - if (creature != null && controller != null) { - if (exertOnlyOncePerTurn) { - MageObjectReference creatureReference = new MageObjectReference(creature.getId(), creature.getZoneChangeCounter(game), game); - ExertedThisTurnWatcher watcher = (ExertedThisTurnWatcher) game.getState().getWatchers().get(ExertedThisTurnWatcher.class.getSimpleName()); - if (watcher != null && watcher.getExertedThisTurnCreatures().contains(creatureReference)) { - return false; - } - } - if (controller.chooseUse(outcome, "Exert " + creature.getLogName() + '?', - "An exerted creature won't untap during your next untap step.", "Yes", "No", source, game)) { - if (!game.isSimulation()) { - game.informPlayers(controller.getLogName() + " exerted " + creature.getName()); - } - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.BECOMES_EXERTED, creature.getId(), creature.getId(), creature.getControllerId())); - ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", creature.getControllerId()); - effect.setTargetPointer(new FixedTarget(creature, game)); - game.addEffect(effect, source); - } - } - return false; - } - - @Override - public String getText(Mode mode) { - return staticText; - } - - @Override - public ExertReplacementEffect copy() { - return new ExertReplacementEffect(this); - } - -} - -class ExertedThisTurnWatcher extends Watcher { - - private final Set exertedThisTurnCreatures; - - public ExertedThisTurnWatcher() { - super(ExertedThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME); - exertedThisTurnCreatures = new HashSet<>(); - } - - public ExertedThisTurnWatcher(final ExertedThisTurnWatcher watcher) { - super(watcher); - exertedThisTurnCreatures = new HashSet<>(watcher.exertedThisTurnCreatures); - } - - @Override - public Watcher copy() { - return new ExertedThisTurnWatcher(this); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.BECOMES_EXERTED) { - this.exertedThisTurnCreatures.add(new MageObjectReference(event.getSourceId(), game)); - } - } - - public Set getExertedThisTurnCreatures() { - return this.exertedThisTurnCreatures; - } - - @Override - public void reset() { - super.reset(); - exertedThisTurnCreatures.clear(); - } - -} +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.keyword; + +import java.util.HashSet; +import java.util.Set; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public class ExertAbility extends SimpleStaticAbility { + + private String ruleText; + + public ExertAbility(BecomesExertSourceTriggeredAbility ability) { + this(ability, false); + } + + public ExertAbility(BecomesExertSourceTriggeredAbility ability, boolean exertOnlyOncePerTurn) { + super(Zone.BATTLEFIELD, new ExertReplacementEffect(exertOnlyOncePerTurn)); + ruleText = (exertOnlyOncePerTurn + ? "If {this} hasn't been exerted this turn, you may exert it" + : "You may exert {this}") + " as it attacks. "; + if (ability != null) { + this.addSubAbility(ability); + ruleText += "When you do,"; + ability.getEffects().forEach(effect -> { + ruleText += " " + effect.getText(ability.getModes().getMode()); + }); + ruleText += ". "; + ability.setRuleVisible(false); + } + ruleText += "(An exerted creature won't untap during your next untap step.)"; + if (exertOnlyOncePerTurn) { + getWatchers().add(new ExertedThisTurnWatcher()); + } + } + + public ExertAbility(final ExertAbility ability) { + super(ability); + this.ruleText = ability.ruleText; + + } + + @Override + public ExertAbility copy() { + return new ExertAbility(this); + } + + @Override + public String getRule() { + return ruleText; + } +} + +class ExertReplacementEffect extends ReplacementEffectImpl { + + final private boolean exertOnlyOncePerTurn; + + public ExertReplacementEffect(boolean exertOnlyOncePerTurn) { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "You may exert {this} as it attacks"; + this.exertOnlyOncePerTurn = exertOnlyOncePerTurn; + } + + public ExertReplacementEffect(ExertReplacementEffect effect) { + super(effect); + this.exertOnlyOncePerTurn = effect.exertOnlyOncePerTurn; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ATTACKER_DECLARED; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getSourceId().equals(source.getSourceId()); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent creature = game.getPermanent(event.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (creature != null && controller != null) { + if (exertOnlyOncePerTurn) { + MageObjectReference creatureReference = new MageObjectReference(creature.getId(), creature.getZoneChangeCounter(game), game); + ExertedThisTurnWatcher watcher = (ExertedThisTurnWatcher) game.getState().getWatchers().get(ExertedThisTurnWatcher.class.getSimpleName()); + if (watcher != null && watcher.getExertedThisTurnCreatures().contains(creatureReference)) { + return false; + } + } + if (controller.chooseUse(outcome, "Exert " + creature.getLogName() + '?', + "An exerted creature won't untap during your next untap step.", "Yes", "No", source, game)) { + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + " exerted " + creature.getName()); + } + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.BECOMES_EXERTED, creature.getId(), creature.getId(), creature.getControllerId())); + ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", creature.getControllerId()); + effect.setTargetPointer(new FixedTarget(creature, game)); + game.addEffect(effect, source); + } + } + return false; + } + + @Override + public String getText(Mode mode) { + return staticText; + } + + @Override + public ExertReplacementEffect copy() { + return new ExertReplacementEffect(this); + } + +} + +class ExertedThisTurnWatcher extends Watcher { + + private final Set exertedThisTurnCreatures; + + public ExertedThisTurnWatcher() { + super(ExertedThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME); + exertedThisTurnCreatures = new HashSet<>(); + } + + public ExertedThisTurnWatcher(final ExertedThisTurnWatcher watcher) { + super(watcher); + exertedThisTurnCreatures = new HashSet<>(watcher.exertedThisTurnCreatures); + } + + @Override + public Watcher copy() { + return new ExertedThisTurnWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.BECOMES_EXERTED) { + this.exertedThisTurnCreatures.add(new MageObjectReference(event.getSourceId(), game)); + } + } + + public Set getExertedThisTurnCreatures() { + return this.exertedThisTurnCreatures; + } + + @Override + public void reset() { + super.reset(); + exertedThisTurnCreatures.clear(); + } + +} diff --git a/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java b/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java index 6a6adb78396..771e368ca90 100644 --- a/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java @@ -35,7 +35,6 @@ import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java b/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java index e510c857ead..c8dd8b47915 100644 --- a/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/IntimidateAbility.java @@ -4,7 +4,6 @@ import mage.abilities.Ability; import mage.abilities.EvasionAbility; import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; -import mage.constants.CardType; import mage.constants.Duration; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/abilities/keyword/RecoverAbility.java b/Mage/src/main/java/mage/abilities/keyword/RecoverAbility.java index 24821a1fd49..0ca43303b75 100644 --- a/Mage/src/main/java/mage/abilities/keyword/RecoverAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/RecoverAbility.java @@ -35,7 +35,6 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSourceEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java index 2d7910e6096..fb96512b55a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SupportAbility.java @@ -30,7 +30,6 @@ package mage.abilities.keyword; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.keyword.SupportEffect; import mage.cards.Card; -import mage.constants.CardType; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java index 25be09ac979..978c0fd913b 100644 --- a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java @@ -42,7 +42,6 @@ import mage.constants.Zone; import mage.filter.FilterMana; import mage.game.Game; import mage.players.Player; -import mage.util.CardUtil; /** * diff --git a/Mage/src/main/java/mage/abilities/mana/conditional/ArtifactCastManaCondition.java b/Mage/src/main/java/mage/abilities/mana/conditional/ArtifactCastManaCondition.java index 7df3d147049..6144d884fc1 100644 --- a/Mage/src/main/java/mage/abilities/mana/conditional/ArtifactCastManaCondition.java +++ b/Mage/src/main/java/mage/abilities/mana/conditional/ArtifactCastManaCondition.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; -import mage.constants.CardType; import mage.game.Game; /** diff --git a/Mage/src/main/java/mage/abilities/mana/conditional/CreatureCastManaCondition.java b/Mage/src/main/java/mage/abilities/mana/conditional/CreatureCastManaCondition.java index f1deebbca72..bf4e13c765e 100644 --- a/Mage/src/main/java/mage/abilities/mana/conditional/CreatureCastManaCondition.java +++ b/Mage/src/main/java/mage/abilities/mana/conditional/CreatureCastManaCondition.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; -import mage.constants.CardType; import mage.game.Game; /** diff --git a/Mage/src/main/java/mage/cards/SplitCardHalfImpl.java b/Mage/src/main/java/mage/cards/SplitCardHalfImpl.java index 8637d27e9a8..4649864452e 100644 --- a/Mage/src/main/java/mage/cards/SplitCardHalfImpl.java +++ b/Mage/src/main/java/mage/cards/SplitCardHalfImpl.java @@ -10,7 +10,6 @@ import mage.constants.SpellAbilityType; import mage.constants.Zone; import mage.game.Game; -import java.util.ArrayList; import java.util.List; import java.util.UUID; diff --git a/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java b/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java index b19a5850c07..c4477817423 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java +++ b/Mage/src/main/java/mage/cards/decks/importer/DeckImporterUtil.java @@ -27,10 +27,10 @@ */ package mage.cards.decks.importer; -import mage.cards.decks.DeckCardLists; - import java.io.File; +import java.util.Locale; import java.util.Scanner; +import mage.cards.decks.DeckCardLists; /** * @@ -40,7 +40,7 @@ public final class DeckImporterUtil { public static final String[] SIDEBOARD_MARKS = new String[]{"//sideboard", "sb: "}; - public static boolean haveSideboardSection(String file){ + public static boolean haveSideboardSection(String file) { // search for sideboard section: // or //sideboard // or SB: 1 card name -- special deckstats.net @@ -48,10 +48,10 @@ public final class DeckImporterUtil { File f = new File(file); try (Scanner scanner = new Scanner(f)) { while (scanner.hasNextLine()) { - String line = scanner.nextLine().trim().toLowerCase(); + String line = scanner.nextLine().trim().toLowerCase(Locale.ENGLISH); - for(String mark: SIDEBOARD_MARKS){ - if (line.startsWith(mark)){ + for (String mark : SIDEBOARD_MARKS) { + if (line.startsWith(mark)) { return true; } } @@ -65,15 +65,15 @@ public final class DeckImporterUtil { } public static DeckImporter getDeckImporter(String file) { - if (file.toLowerCase().endsWith("dec")) { + if (file.toLowerCase(Locale.ENGLISH).endsWith("dec")) { return new DecDeckImporter(); - } else if (file.toLowerCase().endsWith("mwdeck")) { + } else if (file.toLowerCase(Locale.ENGLISH).endsWith("mwdeck")) { return new MWSDeckImporter(); - } else if (file.toLowerCase().endsWith("txt")) { + } else if (file.toLowerCase(Locale.ENGLISH).endsWith("txt")) { return new TxtDeckImporter(haveSideboardSection(file)); - } else if (file.toLowerCase().endsWith("dck")) { + } else if (file.toLowerCase(Locale.ENGLISH).endsWith("dck")) { return new DckDeckImporter(); - } else if (file.toLowerCase().endsWith("dek")) { + } else if (file.toLowerCase(Locale.ENGLISH).endsWith("dek")) { return new DekDeckImporter(); } else { return null; diff --git a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java index de7904451ee..c1f490e833f 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java @@ -27,15 +27,15 @@ */ package mage.cards.decks.importer; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - /** * * @author BetaSteward_at_googlemail.com @@ -50,8 +50,8 @@ public class TxtDeckImporter extends DeckImporter { private boolean switchSideboardByEmptyLine = true; // all cards after first empty line will be sideboard (like mtgo format) private int nonEmptyLinesTotal = 0; - public TxtDeckImporter(boolean haveSideboardSection){ - if(haveSideboardSection){ + public TxtDeckImporter(boolean haveSideboardSection) { + if (haveSideboardSection) { switchSideboardByEmptyLine = false; } } @@ -63,8 +63,8 @@ public class TxtDeckImporter extends DeckImporter { // process comment: // skip or force to sideboard - String commentString = line.toLowerCase(); - if (commentString.startsWith("//")){ + String commentString = line.toLowerCase(Locale.ENGLISH); + if (commentString.startsWith("//")) { // use start, not contains (card names may contain commands like "Legerdemain") if (commentString.startsWith("//sideboard")) { @@ -77,15 +77,15 @@ public class TxtDeckImporter extends DeckImporter { // remove inner card comments from text line: 2 Blinding Fog #some text (like deckstats format) int commentDelim = line.indexOf('#'); - if(commentDelim >= 0){ + if (commentDelim >= 0) { line = line.substring(0, commentDelim).trim(); } // switch sideboard by empty line if (switchSideboardByEmptyLine && line.isEmpty() && nonEmptyLinesTotal > 0) { - if(!sideboard){ + if (!sideboard) { sideboard = true; - }else{ + } else { sbMessage.append("Found empty line at ").append(lineCount).append(", but sideboard already used. Use //sideboard switcher OR one empty line to devide your cards.").append('\n'); } @@ -98,9 +98,9 @@ public class TxtDeckImporter extends DeckImporter { // single line sideboard card from deckstats.net // SB: 3 Carnage Tyrant boolean singleLineSideBoard = false; - if (line.startsWith("SB:")){ - line = line.replace("SB:", "").trim(); - singleLineSideBoard = true; + if (line.startsWith("SB:")) { + line = line.replace("SB:", "").trim(); + singleLineSideBoard = true; } line = line.replace("\t", " "); // changing tabs to blanks as delimiter @@ -122,7 +122,7 @@ public class TxtDeckImporter extends DeckImporter { } try { int num = Integer.parseInt(lineNum.replaceAll("\\D+", "")); - if ((num < 0) || (num > 100)){ + if ((num < 0) || (num > 100)) { sbMessage.append("Invalid number (too small or too big): ").append(lineNum).append(" at line ").append(lineCount).append('\n'); return; } diff --git a/Mage/src/main/java/mage/cards/mock/MockCard.java b/Mage/src/main/java/mage/cards/mock/MockCard.java index 38d19d82ecd..680ecb4007c 100644 --- a/Mage/src/main/java/mage/cards/mock/MockCard.java +++ b/Mage/src/main/java/mage/cards/mock/MockCard.java @@ -7,7 +7,6 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.cards.CardImpl; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; -import mage.constants.CardType; import org.apache.log4j.Logger; /** diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 73694df541c..f768d137145 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -397,7 +397,7 @@ public enum CardRepository { public List findCardsCaseInsensitive(String name) { try { - String sqlName = name.toLowerCase().replaceAll("\'", "\'\'"); + String sqlName = name.toLowerCase(Locale.ENGLISH).replaceAll("\'", "\'\'"); GenericRawResults rawResults = cardDao.queryRaw( "select * from " + CardRepository.VERSION_ENTITY_NAME + " where lower(name) = '" + sqlName + '\'', cardDao.getRawRowMapper()); diff --git a/Mage/src/main/java/mage/choices/ChoiceColor.java b/Mage/src/main/java/mage/choices/ChoiceColor.java index 2eedbdf0d46..0f3c896bfa3 100644 --- a/Mage/src/main/java/mage/choices/ChoiceColor.java +++ b/Mage/src/main/java/mage/choices/ChoiceColor.java @@ -32,8 +32,6 @@ import mage.Mana; import mage.ObjectColor; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; /** * diff --git a/Mage/src/main/java/mage/constants/PhaseStep.java b/Mage/src/main/java/mage/constants/PhaseStep.java index 9a0d167b74c..0a4ed889672 100644 --- a/Mage/src/main/java/mage/constants/PhaseStep.java +++ b/Mage/src/main/java/mage/constants/PhaseStep.java @@ -1,7 +1,5 @@ package mage.constants; -import mage.game.turn.Phase; - /** * * @author North diff --git a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java index 503d290e054..5c6198571a7 100644 --- a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java @@ -28,6 +28,7 @@ package mage.filter.predicate.other; import java.util.HashMap; +import java.util.Locale; import mage.cards.Card; import mage.cards.SplitCard; import mage.constants.SubType; @@ -70,7 +71,7 @@ public class CardTextPredicate implements Predicate { } // first check in card name - if (inNames && input.getName().toLowerCase().contains(text.toLowerCase())) { + if (inNames && input.getName().toLowerCase(Locale.ENGLISH).contains(text.toLowerCase(Locale.ENGLISH))) { if (isUnique && seenCards.keySet().contains(input.getName())) { return false; } @@ -81,7 +82,7 @@ public class CardTextPredicate implements Predicate { } //separate by spaces - String[] tokens = text.toLowerCase().split(" "); + String[] tokens = text.toLowerCase(Locale.ENGLISH).split(" "); for (String token : tokens) { boolean found = false; if (!token.isEmpty()) { @@ -89,20 +90,20 @@ public class CardTextPredicate implements Predicate { if (inRules) { if (input.isSplitCard()) { for (String rule : ((SplitCard) input).getLeftHalfCard().getRules(game)) { - if (rule.toLowerCase().contains(token)) { + if (rule.toLowerCase(Locale.ENGLISH).contains(token)) { found = true; break; } } for (String rule : ((SplitCard) input).getRightHalfCard().getRules(game)) { - if (rule.toLowerCase().contains(token)) { + if (rule.toLowerCase(Locale.ENGLISH).contains(token)) { found = true; break; } } } for (String rule : input.getRules(game)) { - if (rule.toLowerCase().contains(token)) { + if (rule.toLowerCase(Locale.ENGLISH).contains(token)) { found = true; break; } diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java index b7cddc3f15e..a36e3bdffb0 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/CommanderPredicate.java @@ -5,7 +5,6 @@ */ package mage.filter.predicate.permanent; -import mage.constants.CardType; import mage.filter.predicate.Predicate; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/EnchantedPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/EnchantedPredicate.java index a8c0e8f873a..e3cac058896 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/EnchantedPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/EnchantedPredicate.java @@ -28,7 +28,6 @@ package mage.filter.predicate.permanent; import java.util.UUID; -import mage.constants.CardType; import mage.filter.predicate.Predicate; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/game/combat/Combat.java b/Mage/src/main/java/mage/game/combat/Combat.java index 52b77917ccb..8abc77f1c81 100644 --- a/Mage/src/main/java/mage/game/combat/Combat.java +++ b/Mage/src/main/java/mage/game/combat/Combat.java @@ -29,7 +29,6 @@ package mage.game.combat; import java.io.Serializable; import java.util.*; -import java.util.stream.Collectors; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.RequirementEffect; diff --git a/Mage/src/main/java/mage/game/command/Emblem.java b/Mage/src/main/java/mage/game/command/Emblem.java index 85d6fe8d9ab..363619a9468 100644 --- a/Mage/src/main/java/mage/game/command/Emblem.java +++ b/Mage/src/main/java/mage/game/command/Emblem.java @@ -27,7 +27,6 @@ */ package mage.game.command; -import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.UUID; diff --git a/Mage/src/main/java/mage/game/permanent/token/AnthousaWarriorToken.java b/Mage/src/main/java/mage/game/permanent/token/AnthousaWarriorToken.java index 5cd59f5aafd..a87434bc813 100644 --- a/Mage/src/main/java/mage/game/permanent/token/AnthousaWarriorToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/AnthousaWarriorToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/ArchitectOfTheUntamedBeastToken.java b/Mage/src/main/java/mage/game/permanent/token/ArchitectOfTheUntamedBeastToken.java index abdd03049ba..180a592d2f0 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ArchitectOfTheUntamedBeastToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ArchitectOfTheUntamedBeastToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/BaruFistOfKrosaToken.java b/Mage/src/main/java/mage/game/permanent/token/BaruFistOfKrosaToken.java index f02508dd2d7..4e8493f456e 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BaruFistOfKrosaToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/BaruFistOfKrosaToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/CurseOfTheSwineBoarToken.java b/Mage/src/main/java/mage/game/permanent/token/CurseOfTheSwineBoarToken.java index 48794ab47a2..1f9e692913f 100644 --- a/Mage/src/main/java/mage/game/permanent/token/CurseOfTheSwineBoarToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/CurseOfTheSwineBoarToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/ForlornPseudammaZombieToken.java b/Mage/src/main/java/mage/game/permanent/token/ForlornPseudammaZombieToken.java index 8bbea73b005..5f8b0c09d65 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ForlornPseudammaZombieToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ForlornPseudammaZombieToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/HippoToken2.java b/Mage/src/main/java/mage/game/permanent/token/HippoToken2.java index 9a3a043ca35..cefd402e35e 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HippoToken2.java +++ b/Mage/src/main/java/mage/game/permanent/token/HippoToken2.java @@ -31,11 +31,6 @@ package mage.game.permanent.token; import mage.MageInt; import mage.constants.CardType; import mage.constants.SubType; -import mage.util.RandomUtil; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; /** * @author Stravant diff --git a/Mage/src/main/java/mage/game/permanent/token/HorrorToken.java b/Mage/src/main/java/mage/game/permanent/token/HorrorToken.java index 42798c5b6d0..d14678bded9 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HorrorToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HorrorToken.java @@ -27,9 +27,6 @@ */ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/HunterToken.java b/Mage/src/main/java/mage/game/permanent/token/HunterToken.java index a98d6e1b047..d4a6e58e9cb 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HunterToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HunterToken.java @@ -28,12 +28,8 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; -import mage.MageInt; /** * diff --git a/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java b/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java index 0f280f16c12..51174406c93 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java @@ -28,9 +28,6 @@ package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; diff --git a/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java b/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java index bd64e604bb1..067f4050f5c 100644 --- a/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java @@ -30,7 +30,6 @@ package mage.game.permanent.token; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; -import mage.abilities.keyword.TrampleAbility; /** * diff --git a/Mage/src/main/java/mage/game/permanent/token/Token.java b/Mage/src/main/java/mage/game/permanent/token/Token.java index 57aced4814c..da68147b512 100644 --- a/Mage/src/main/java/mage/game/permanent/token/Token.java +++ b/Mage/src/main/java/mage/game/permanent/token/Token.java @@ -27,6 +27,10 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.UUID; import mage.MageObject; import mage.MageObjectImpl; import mage.ObjectColor; @@ -45,10 +49,6 @@ import mage.players.Player; import mage.util.RandomUtil; import mage.util.SubTypeList; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - public class Token extends MageObjectImpl { protected String description; @@ -134,7 +134,7 @@ public class Token extends MageObjectImpl { String cardType = this.cardType.toString().replaceAll("[^a-zA-Z0-9]", ""); String originalset = this.getOriginalExpansionSetCode(); String descriptor = name + '.' + color + '.' + subtype + '.' + cardType + '.' + this.power + '.' + this.toughness; - descriptor = descriptor.toUpperCase(); + descriptor = descriptor.toUpperCase(Locale.ENGLISH); return descriptor; } diff --git a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java index 19e66874fb5..530c90d829b 100644 --- a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java @@ -38,7 +38,6 @@ import mage.game.events.*; import mage.game.events.TableEvent.EventType; import mage.game.match.Match; import mage.game.match.MatchPlayer; -import mage.game.result.ResultProtos.*; import mage.game.result.ResultProtos.MatchPlayerProto; import mage.game.result.ResultProtos.MatchProto; import mage.game.result.ResultProtos.MatchQuitStatus; diff --git a/Mage/src/main/java/mage/watchers/common/CreatureWasCastWatcher.java b/Mage/src/main/java/mage/watchers/common/CreatureWasCastWatcher.java index 493d88495d1..c26508837df 100644 --- a/Mage/src/main/java/mage/watchers/common/CreatureWasCastWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CreatureWasCastWatcher.java @@ -31,7 +31,6 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.WatcherScope; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/watchers/common/PlayerCastCreatureWatcher.java b/Mage/src/main/java/mage/watchers/common/PlayerCastCreatureWatcher.java index e452076b711..534ce7046f5 100644 --- a/Mage/src/main/java/mage/watchers/common/PlayerCastCreatureWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/PlayerCastCreatureWatcher.java @@ -30,7 +30,6 @@ package mage.watchers.common; import java.util.HashSet; import java.util.Set; import java.util.UUID; -import mage.constants.CardType; import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; diff --git a/Mage/src/test/java/mage/ContinuousEffectImplTest.java b/Mage/src/test/java/mage/ContinuousEffectImplTest.java index 603c32ad166..8c48825e76a 100644 --- a/Mage/src/test/java/mage/ContinuousEffectImplTest.java +++ b/Mage/src/test/java/mage/ContinuousEffectImplTest.java @@ -1,6 +1,5 @@ package mage; -import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.constants.DependencyType; import mage.constants.Duration; diff --git a/Mage/src/test/java/mage/ManaTest.java b/Mage/src/test/java/mage/ManaTest.java index 1ad59de4684..9f971bddc4c 100644 --- a/Mage/src/test/java/mage/ManaTest.java +++ b/Mage/src/test/java/mage/ManaTest.java @@ -1,6 +1,5 @@ package mage; -import static junit.framework.TestCase.assertFalse; import mage.constants.ColoredManaSymbol; import mage.constants.ManaType; import mage.filter.FilterMana; @@ -11,7 +10,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.util.Objects; /** * Custom unit tests for {link Mana}. diff --git a/Mage/src/test/java/mage/counters/CounterTest.java b/Mage/src/test/java/mage/counters/CounterTest.java index ae66b607806..2bf57a6d369 100644 --- a/Mage/src/test/java/mage/counters/CounterTest.java +++ b/Mage/src/test/java/mage/counters/CounterTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; -import java.util.Objects; /** * Custom unit tests for {@link Counter}