diff --git a/Mage.Client/src/main/java/mage/client/cards/CardIconsPanel.java b/Mage.Client/src/main/java/mage/client/cards/CardIconsPanel.java index 9e73f25b259..1f72e456da0 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardIconsPanel.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardIconsPanel.java @@ -175,7 +175,32 @@ public class CardIconsPanel extends JPanel { this.removeAll(); if (newIcons != null) { this.icons.clear(); - this.icons.addAll(newIcons); + TreeMap> cardIconMap = new TreeMap<>(); + newIcons.forEach(icon -> cardIconMap.computeIfAbsent(icon.getIconType(), k -> new ArrayList<>()).add(icon)); + + for (Map.Entry> entry : cardIconMap.entrySet()) { + List combined = entry.getValue() + .stream() + .filter(icon -> icon != null && icon.canBeCombined()) + .sorted(CardIconComparator.instance) + .collect(Collectors.toList()); + + if (combined.size() > 1) { + entry.getValue().removeAll(combined); + + String combinedHint = combined.stream() + .map(CardIcon::getCombinedInfo) + .collect(Collectors.joining("
")); + + CardIcon combinedIcon = new CardIconImpl(entry.getKey(), combinedHint); + + this.icons.add(combinedIcon); + this.icons.addAll(entry.getValue()); + } else { + this.icons.addAll(entry.getValue()); + } + + } } // auto-hide panel on empty icons diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/SvgUtils.java b/Mage.Client/src/main/java/org/mage/card/arcane/SvgUtils.java index 838766f1d01..00447ca2cf0 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/SvgUtils.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/SvgUtils.java @@ -1,7 +1,7 @@ package org.mage.card.arcane; import mage.abilities.icon.CardIconColor; -import mage.abilities.icon.abilities.FlyingAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.utils.StreamUtils; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.transcoder.TranscoderInput; @@ -217,7 +217,8 @@ public class SvgUtils { public static boolean checkSvgSupport() { // usa sample icon for svg support testing // direct call, no needs in cache - BufferedImage sampleImage = ImageManagerImpl.instance.getCardIcon(FlyingAbilityIcon.instance.getIconType().getResourceName(), 32, CardIconColor.DEFAULT); + BufferedImage sampleImage = ImageManagerImpl.instance + .getCardIcon(CardIconImpl.ABILITY_FLYING.getIconType().getResourceName(), 32, CardIconColor.DEFAULT); haveSvgSupport = (sampleImage != null && sampleImage.getWidth() > 0); if (!haveSvgSupport) { logger.warn("WARNING, your system doesn't support svg images, so card icons will be disabled. Please, make a bug report in the github."); diff --git a/Mage.Client/src/main/resources/card/icons/original/fontawesome/child-reaching.svg b/Mage.Client/src/main/resources/card/icons/original/fontawesome/child-reaching.svg new file mode 100644 index 00000000000..ca1fae0a6b6 --- /dev/null +++ b/Mage.Client/src/main/resources/card/icons/original/fontawesome/child-reaching.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Mage.Client/src/main/resources/card/icons/prepared/child-reaching.svg b/Mage.Client/src/main/resources/card/icons/prepared/child-reaching.svg new file mode 100644 index 00000000000..ca1fae0a6b6 --- /dev/null +++ b/Mage.Client/src/main/resources/card/icons/prepared/child-reaching.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java index cfd1f144776..3d8ebb890eb 100644 --- a/Mage.Common/src/main/java/mage/view/CardView.java +++ b/Mage.Common/src/main/java/mage/view/CardView.java @@ -11,9 +11,7 @@ import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.icon.CardIcon; -import mage.abilities.icon.other.CommanderCardIcon; -import mage.abilities.icon.other.FaceDownCardIcon; -import mage.abilities.icon.other.VariableCostCardIcon; +import mage.abilities.icon.CardIconImpl; import mage.abilities.keyword.AftermathAbility; import mage.cards.*; import mage.cards.mock.MockCard; @@ -435,13 +433,13 @@ public class CardView extends SimpleCardView { }); // face down if (permanent.isFaceDown(game)) { - this.cardIcons.add(FaceDownCardIcon.instance); + this.cardIcons.add(CardIconImpl.FACE_DOWN); } // commander if (game != null) { Player owner = game.getPlayer(game.getOwnerId(permanent)); if (owner != null && game.isCommanderObject(owner, permanent)) { - this.cardIcons.add(CommanderCardIcon.instance); + this.cardIcons.add(CardIconImpl.COMMANDER); } } } else { @@ -475,7 +473,7 @@ public class CardView extends SimpleCardView { // other like Stack (can show x icon on stack only, so use normal source) costX = ManacostVariableValue.REGULAR.calculate(game, card.getSpellAbility(), null); } - this.cardIcons.add(new VariableCostCardIcon(costX)); + this.cardIcons.add(CardIconImpl.variableCost(costX)); } } diff --git a/Mage.Common/src/main/java/mage/view/StackAbilityView.java b/Mage.Common/src/main/java/mage/view/StackAbilityView.java index 9b1404c2ea4..77a6aa30313 100644 --- a/Mage.Common/src/main/java/mage/view/StackAbilityView.java +++ b/Mage.Common/src/main/java/mage/view/StackAbilityView.java @@ -7,7 +7,7 @@ import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.hint.Hint; import mage.abilities.hint.HintUtils; -import mage.abilities.icon.other.VariableCostCardIcon; +import mage.abilities.icon.CardIconImpl; import mage.cards.Card; import mage.constants.AbilityType; import mage.constants.CardType; @@ -83,7 +83,7 @@ public class StackAbilityView extends CardView { // cost x if (ability.getManaCostsToPay().containsX()) { int costX = ManacostVariableValue.END_GAME.calculate(game, ability, null); - this.cardIcons.add(new VariableCostCardIcon(costX)); + this.cardIcons.add(CardIconImpl.variableCost(costX)); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CrewsVehicleSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/effects/common/CrewsVehicleSourceTriggeredAbility.java index 57298950b86..fad84ced494 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CrewsVehicleSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CrewsVehicleSourceTriggeredAbility.java @@ -2,7 +2,7 @@ package mage.abilities.effects.common; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.abilities.icon.abilities.CrewAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -12,7 +12,7 @@ public class CrewsVehicleSourceTriggeredAbility extends TriggeredAbilityImpl { public CrewsVehicleSourceTriggeredAbility(Effect effect) { super(Zone.BATTLEFIELD, effect, false); - this.addIcon(CrewAbilityIcon.instance); + this.addIcon(CardIconImpl.ABILITY_CREW); setTriggerPhrase("Whenever {this} crews a Vehicle, "); } diff --git a/Mage/src/main/java/mage/abilities/icon/CardIcon.java b/Mage/src/main/java/mage/abilities/icon/CardIcon.java index 5278fcb4f57..280a8c765b8 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIcon.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIcon.java @@ -18,6 +18,13 @@ public interface CardIcon extends Copyable { */ String getHint(); + /** + * Whether or not this icon can be combined with others with the same icon type + */ + default boolean canBeCombined() { + return getText().isEmpty(); + } + /** * Combined info (text + hint) * diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java index 4ea64fc84a9..df045b630f7 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java @@ -11,6 +11,32 @@ public class CardIconImpl implements CardIcon, Serializable { private final String text; private final String hint; + // Utility Icons + public static final CardIconImpl FACE_DOWN = new CardIconImpl(CardIconType.OTHER_FACEDOWN, "Card is face down"); + public static final CardIconImpl COMMANDER = new CardIconImpl(CardIconType.COMMANDER, "Card is commander"); + + // Ability Icons + public static final CardIconImpl ABILITY_CREW = new CardIconImpl(CardIconType.ABILITY_CREW, + "Crew"); + public static final CardIconImpl ABILITY_DEATHTOUCH = new CardIconImpl(CardIconType.ABILITY_DEATHTOUCH, + "Deathtouch"); + public static final CardIconImpl ABILITY_DEFENDER = new CardIconImpl(CardIconType.ABILITY_DEFENDER, "Defender"); + public static final CardIconImpl ABILITY_DOUBLE_STRIKE = new CardIconImpl(CardIconType.ABILITY_DOUBLE_STRIKE, + "Double Strike"); + public static final CardIconImpl ABILITY_FIRST_STRIKE = new CardIconImpl(CardIconType.ABILITY_FIRST_STRIKE, + "First Strike"); + public static final CardIconImpl ABILITY_FLYING = new CardIconImpl(CardIconType.ABILITY_FLYING, "Flying"); + public static final CardIconImpl ABILITY_INDESTRUCTIBLE = new CardIconImpl(CardIconType.ABILITY_INDESTRUCTIBLE, + "Indestructible"); + public static final CardIconImpl ABILITY_INFECT = new CardIconImpl(CardIconType.ABILITY_INFECT, "Infect"); + public static final CardIconImpl ABILITY_LIFELINK = new CardIconImpl(CardIconType.ABILITY_LIFELINK, "Lifelink"); + public static final CardIconImpl ABILITY_TRAMPLE = new CardIconImpl(CardIconType.ABILITY_TRAMPLE, "Trample"); + public static final CardIconImpl ABILITY_VIGILANCE = new CardIconImpl(CardIconType.ABILITY_VIGILANCE, "Vigilance"); + + // "Target protection" abilities + public static final CardIconImpl ABILITY_HEXPROOF = new CardIconImpl(CardIconType.ABILITY_HEXPROOF, "Hexproof"); + public static final CardIconImpl ABILITY_SHROUD = new CardIconImpl(CardIconType.ABILITY_HEXPROOF, "Shroud"); + public CardIconImpl(CardIconType cardIconType, String hint) { this(cardIconType, hint, ""); } @@ -46,4 +72,8 @@ public class CardIconImpl implements CardIcon, Serializable { public CardIcon copy() { return new CardIconImpl(this); } + + public static CardIconImpl variableCost(int costX) { + return new CardIconImpl(CardIconType.OTHER_COST_X, "Announced X = " + costX, "x=" + costX); + } } diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconType.java b/Mage/src/main/java/mage/abilities/icon/CardIconType.java index b2b3981cb88..433dc6f8a17 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconType.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconType.java @@ -30,6 +30,7 @@ public enum CardIconType { ABILITY_INDESTRUCTIBLE("prepared/ankh.svg", CardIconCategory.ABILITY, 100), ABILITY_VIGILANCE("prepared/eye.svg", CardIconCategory.ABILITY, 100), ABILITY_CLASS_LEVEL("prepared/hexagon-fill.svg", CardIconCategory.ABILITY, 100), + ABILITY_REACH("prepared/child-reaching.svg", CardIconCategory.ABILITY, 100), // OTHER_FACEDOWN("prepared/reply-fill.svg", CardIconCategory.ABILITY, 100), OTHER_COST_X("prepared/square-fill.svg", CardIconCategory.ABILITY, 100), diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/CrewAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/CrewAbilityIcon.java deleted file mode 100644 index 0d9f21bb9d1..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/CrewAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum CrewAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_CREW; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Crew ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/DeathtouchAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/DeathtouchAbilityIcon.java deleted file mode 100644 index d87ec58c270..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/DeathtouchAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum DeathtouchAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_DEATHTOUCH; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Deathtouch ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/DefenderAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/DefenderAbilityIcon.java deleted file mode 100644 index 7a4a0fac32b..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/DefenderAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum DefenderAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_DEFENDER; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Defender ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/DoubleStrikeAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/DoubleStrikeAbilityIcon.java deleted file mode 100644 index 9fe7396bf6a..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/DoubleStrikeAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum DoubleStrikeAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_DOUBLE_STRIKE; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Double strike ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/FirstStrikeAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/FirstStrikeAbilityIcon.java deleted file mode 100644 index 10aca3c142b..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/FirstStrikeAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum FirstStrikeAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_FIRST_STRIKE; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "First strike ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/FlyingAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/FlyingAbilityIcon.java deleted file mode 100644 index 4642f813c1d..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/FlyingAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum FlyingAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_FLYING; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Flying ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/HexproofAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/HexproofAbilityIcon.java deleted file mode 100644 index 5f6c29e013f..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/HexproofAbilityIcon.java +++ /dev/null @@ -1,37 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconImpl; -import mage.abilities.icon.CardIconType; -import mage.util.CardUtil; - -/** - * @author JayDi85 - */ -public enum HexproofAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_HEXPROOF; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Hexproof ability"; - } - - @Override - public CardIcon copy() { - return instance; - } - - public static CardIconImpl createDynamicCardIcon(String hint) { - return new CardIconImpl(CardIconType.ABILITY_HEXPROOF, CardUtil.getTextWithFirstCharUpperCase(hint)); - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/IndestructibleAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/IndestructibleAbilityIcon.java deleted file mode 100644 index c99ff69183f..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/IndestructibleAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum IndestructibleAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_INDESTRUCTIBLE; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Indestructible ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/InfectAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/InfectAbilityIcon.java deleted file mode 100644 index 39faf5bd8b2..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/InfectAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum InfectAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_INFECT; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Infect ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/LifelinkAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/LifelinkAbilityIcon.java deleted file mode 100644 index 7367130899e..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/LifelinkAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum LifelinkAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_LIFELINK; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Lifelink ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/TrampleAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/TrampleAbilityIcon.java deleted file mode 100644 index c8811d1d766..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/TrampleAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum TrampleAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_TRAMPLE; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Trample ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/abilities/VigilanceAbilityIcon.java b/Mage/src/main/java/mage/abilities/icon/abilities/VigilanceAbilityIcon.java deleted file mode 100644 index b668d7a6b01..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/abilities/VigilanceAbilityIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.abilities; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum VigilanceAbilityIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.ABILITY_VIGILANCE; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Vigilance ability"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/other/CommanderCardIcon.java b/Mage/src/main/java/mage/abilities/icon/other/CommanderCardIcon.java deleted file mode 100644 index dae04a59cf5..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/other/CommanderCardIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.other; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum CommanderCardIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.COMMANDER; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Card is commander"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/other/FaceDownCardIcon.java b/Mage/src/main/java/mage/abilities/icon/other/FaceDownCardIcon.java deleted file mode 100644 index 07f59fe8636..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/other/FaceDownCardIcon.java +++ /dev/null @@ -1,31 +0,0 @@ -package mage.abilities.icon.other; - -import mage.abilities.icon.CardIcon; -import mage.abilities.icon.CardIconType; - -/** - * @author JayDi85 - */ -public enum FaceDownCardIcon implements CardIcon { - instance; - - @Override - public CardIconType getIconType() { - return CardIconType.OTHER_FACEDOWN; - } - - @Override - public String getText() { - return ""; - } - - @Override - public String getHint() { - return "Card is face down"; - } - - @Override - public CardIcon copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/abilities/icon/other/VariableCostCardIcon.java b/Mage/src/main/java/mage/abilities/icon/other/VariableCostCardIcon.java deleted file mode 100644 index 40b4f23e016..00000000000 --- a/Mage/src/main/java/mage/abilities/icon/other/VariableCostCardIcon.java +++ /dev/null @@ -1,16 +0,0 @@ -package mage.abilities.icon.other; - -import mage.abilities.icon.CardIconImpl; -import mage.abilities.icon.CardIconType; - -/** - * Showing x cost value - * - * @author JayDi85 - */ -public class VariableCostCardIcon extends CardIconImpl { - - public VariableCostCardIcon(int costX) { - super(CardIconType.OTHER_COST_X, "Announced X = " + costX, "x=" + costX); - } -} diff --git a/Mage/src/main/java/mage/abilities/keyword/CrewAbility.java b/Mage/src/main/java/mage/abilities/keyword/CrewAbility.java index c7793775541..a2b7c707405 100644 --- a/Mage/src/main/java/mage/abilities/keyword/CrewAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/CrewAbility.java @@ -11,7 +11,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect; import mage.abilities.hint.HintUtils; -import mage.abilities.icon.abilities.CrewAbilityIcon; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -47,7 +48,7 @@ public class CrewAbility extends SimpleActivatedAbility { Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE ), new CrewCost(value, altCost)); this.addEffect(new CrewEventEffect()); - this.addIcon(CrewAbilityIcon.instance); + this.addIcon(new CardIconImpl(CardIconType.ABILITY_CREW, "Crew " + value)); this.value = value; if (altCost != null) { this.addSubAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect( diff --git a/Mage/src/main/java/mage/abilities/keyword/DeathtouchAbility.java b/Mage/src/main/java/mage/abilities/keyword/DeathtouchAbility.java index 3392586663b..ce950792a6a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/DeathtouchAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/DeathtouchAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.DeathtouchAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class DeathtouchAbility extends StaticAbility implements MageSingleton { static { instance = new DeathtouchAbility(); - instance.addIcon(DeathtouchAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_DEATHTOUCH); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/DefenderAbility.java b/Mage/src/main/java/mage/abilities/keyword/DefenderAbility.java index 5da4dc094fd..7e81f8b93f8 100644 --- a/Mage/src/main/java/mage/abilities/keyword/DefenderAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/DefenderAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.DefenderAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class DefenderAbility extends StaticAbility implements MageSingleton { static { instance = new DefenderAbility(); - instance.addIcon(DefenderAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_DEFENDER); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/DoubleStrikeAbility.java b/Mage/src/main/java/mage/abilities/keyword/DoubleStrikeAbility.java index 71e3e3edcd7..54bd5d7529a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/DoubleStrikeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/DoubleStrikeAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.DoubleStrikeAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class DoubleStrikeAbility extends StaticAbility implements MageSingleton static { instance = new DoubleStrikeAbility(); - instance.addIcon(DoubleStrikeAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_DOUBLE_STRIKE); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/FirstStrikeAbility.java b/Mage/src/main/java/mage/abilities/keyword/FirstStrikeAbility.java index 67c9a52f148..d9ceaa62f2f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FirstStrikeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FirstStrikeAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.FirstStrikeAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class FirstStrikeAbility extends StaticAbility implements MageSingleton { static { instance = new FirstStrikeAbility(); - instance.addIcon(FirstStrikeAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_FIRST_STRIKE); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java index 9f1b1557b5a..36b727bec1d 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.EvasionAbility; import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; -import mage.abilities.icon.abilities.FlyingAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.AsThoughEffectType; import mage.constants.Duration; import mage.constants.SubType; @@ -22,7 +22,7 @@ public class FlyingAbility extends EvasionAbility implements MageSingleton { static { instance = new FlyingAbility(); - instance.addIcon(FlyingAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_FLYING); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/HexproofBaseAbility.java b/Mage/src/main/java/mage/abilities/keyword/HexproofBaseAbility.java index 94da34ba717..9a1ec91e121 100644 --- a/Mage/src/main/java/mage/abilities/keyword/HexproofBaseAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/HexproofBaseAbility.java @@ -7,10 +7,10 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.icon.CardIcon; import mage.abilities.icon.CardIconImpl; import mage.abilities.icon.CardIconType; -import mage.abilities.icon.abilities.HexproofAbilityIcon; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.*; @@ -68,14 +68,11 @@ public abstract class HexproofBaseAbility extends SimpleStaticAbility implements @Override public List getIcons(Game game) { if (game == null) { - return new ArrayList<>(Collections.singletonList( - HexproofAbilityIcon.instance - )); + return Collections.singletonList(CardIconImpl.ABILITY_HEXPROOF); } // dynamic icon (example: colored hexproof) - return new ArrayList<>(Collections.singletonList( - HexproofAbilityIcon.createDynamicCardIcon(getCardIconHint(game)) - )); + return Collections.singletonList(new CardIconImpl(CardIconType.ABILITY_HEXPROOF, + CardUtil.getTextWithFirstCharUpperCase(getCardIconHint(game)))); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/IndestructibleAbility.java b/Mage/src/main/java/mage/abilities/keyword/IndestructibleAbility.java index 09da61c1adb..5ad119edaea 100644 --- a/Mage/src/main/java/mage/abilities/keyword/IndestructibleAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/IndestructibleAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.IndestructibleAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -28,7 +28,7 @@ public class IndestructibleAbility extends StaticAbility implements MageSingleto static { instance = new IndestructibleAbility(); - instance.addIcon(IndestructibleAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_INDESTRUCTIBLE); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/InfectAbility.java b/Mage/src/main/java/mage/abilities/keyword/InfectAbility.java index 2cff24c0d69..e5df246d57f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/InfectAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/InfectAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.InfectAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -36,7 +36,7 @@ public class InfectAbility extends StaticAbility implements MageSingleton { static { instance = new InfectAbility(); - instance.addIcon(InfectAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_INFECT); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/LifelinkAbility.java b/Mage/src/main/java/mage/abilities/keyword/LifelinkAbility.java index d406593a10b..d4949750087 100644 --- a/Mage/src/main/java/mage/abilities/keyword/LifelinkAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/LifelinkAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.LifelinkAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class LifelinkAbility extends StaticAbility implements MageSingleton { static { instance = new LifelinkAbility(); - instance.addIcon(LifelinkAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_LIFELINK); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/ReachAbility.java b/Mage/src/main/java/mage/abilities/keyword/ReachAbility.java index ca8c01ac390..9627b5526f9 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ReachAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ReachAbility.java @@ -4,6 +4,8 @@ package mage.abilities.keyword; import mage.constants.Zone; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import java.io.ObjectStreamException; @@ -13,7 +15,13 @@ import java.io.ObjectStreamException; */ public class ReachAbility extends StaticAbility implements MageSingleton { - private static final ReachAbility instance = new ReachAbility(); + private static final ReachAbility instance; + + static { + instance = new ReachAbility(); + instance.addIcon( + new CardIconImpl(CardIconType.ABILITY_REACH, "Reach")); + } private Object readResolve() throws ObjectStreamException { return instance; diff --git a/Mage/src/main/java/mage/abilities/keyword/ShroudAbility.java b/Mage/src/main/java/mage/abilities/keyword/ShroudAbility.java index fb7f24fa88a..8c126469ebc 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ShroudAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ShroudAbility.java @@ -5,6 +5,8 @@ package mage.abilities.keyword; import mage.constants.Zone; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import java.io.ObjectStreamException; @@ -14,7 +16,13 @@ import java.io.ObjectStreamException; */ public class ShroudAbility extends StaticAbility implements MageSingleton { - private static final ShroudAbility instance = new ShroudAbility(); + private static final ShroudAbility instance; + + static { + instance = new ShroudAbility(); + instance.addIcon( + new CardIconImpl(CardIconType.ABILITY_HEXPROOF, "Shroud")); + } private Object readResolve() throws ObjectStreamException { return instance; diff --git a/Mage/src/main/java/mage/abilities/keyword/ToxicAbility.java b/Mage/src/main/java/mage/abilities/keyword/ToxicAbility.java index e90f227164b..7ef7b971cd4 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ToxicAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ToxicAbility.java @@ -1,13 +1,11 @@ package mage.abilities.keyword; -import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.InfectAbilityIcon; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import mage.constants.Zone; import mage.util.CardUtil; -import java.io.ObjectStreamException; - /** * @author TheElk801 */ @@ -18,6 +16,8 @@ public class ToxicAbility extends StaticAbility { public ToxicAbility(int amount) { super(Zone.BATTLEFIELD, null); this.amount = amount; + + this.addIcon(new CardIconImpl(CardIconType.ABILITY_INFECT, "Toxic " + amount)); } private ToxicAbility(final ToxicAbility ability) { diff --git a/Mage/src/main/java/mage/abilities/keyword/TrampleAbility.java b/Mage/src/main/java/mage/abilities/keyword/TrampleAbility.java index 6497f0a8e0a..f771a0452f6 100644 --- a/Mage/src/main/java/mage/abilities/keyword/TrampleAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/TrampleAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.TrampleAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class TrampleAbility extends StaticAbility implements MageSingleton { static { instance = new TrampleAbility(); - instance.addIcon(TrampleAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_TRAMPLE); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/TrampleOverPlaneswalkersAbility.java b/Mage/src/main/java/mage/abilities/keyword/TrampleOverPlaneswalkersAbility.java index bdeddea1ec6..4e6a939f920 100644 --- a/Mage/src/main/java/mage/abilities/keyword/TrampleOverPlaneswalkersAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/TrampleOverPlaneswalkersAbility.java @@ -2,7 +2,8 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.TrampleAbilityIcon; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,6 +17,7 @@ public class TrampleOverPlaneswalkersAbility extends StaticAbility implements Ma static { instance = new TrampleOverPlaneswalkersAbility(); + instance.addIcon(new CardIconImpl(CardIconType.ABILITY_TRAMPLE, "Trample over planeswalkers")); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/VigilanceAbility.java b/Mage/src/main/java/mage/abilities/keyword/VigilanceAbility.java index 2d873a0379f..7746a312086 100644 --- a/Mage/src/main/java/mage/abilities/keyword/VigilanceAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/VigilanceAbility.java @@ -2,7 +2,7 @@ package mage.abilities.keyword; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; -import mage.abilities.icon.abilities.VigilanceAbilityIcon; +import mage.abilities.icon.CardIconImpl; import mage.constants.Zone; import java.io.ObjectStreamException; @@ -16,7 +16,7 @@ public class VigilanceAbility extends StaticAbility implements MageSingleton { static { instance = new VigilanceAbility(); - instance.addIcon(VigilanceAbilityIcon.instance); + instance.addIcon(CardIconImpl.ABILITY_VIGILANCE); } private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/main/java/mage/abilities/keyword/WardAbility.java b/Mage/src/main/java/mage/abilities/keyword/WardAbility.java index e65401604bc..03a4c667362 100644 --- a/Mage/src/main/java/mage/abilities/keyword/WardAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/WardAbility.java @@ -5,6 +5,8 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.icon.CardIconImpl; +import mage.abilities.icon.CardIconType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -34,6 +36,9 @@ public class WardAbility extends TriggeredAbilityImpl { this.genericMana = null; this.showAbilityHint = showAbilityHint; this.whereXIs = null; + + this.addIcon(new CardIconImpl(CardIconType.ABILITY_HEXPROOF, + CardUtil.getTextWithFirstCharUpperCase(getRuleWithoutHint()))); } public WardAbility(DynamicValue genericMana) { @@ -46,6 +51,9 @@ public class WardAbility extends TriggeredAbilityImpl { this.whereXIs = whereXIs; this.cost = null; this.showAbilityHint = false; + + this.addIcon(new CardIconImpl(CardIconType.ABILITY_HEXPROOF, + CardUtil.getTextWithFirstCharUpperCase(getRuleWithoutHint()))); } private WardAbility(final WardAbility ability) { @@ -97,8 +105,7 @@ public class WardAbility extends TriggeredAbilityImpl { return new WardAbility(this); } - @Override - public String getRule() { + public String getRuleWithoutHint() { StringBuilder sb = new StringBuilder("ward"); if (cost != null) { if (cost instanceof ManaCost) { @@ -113,23 +120,33 @@ public class WardAbility extends TriggeredAbilityImpl { } } - if (showAbilityHint) { - sb.append(" (Whenever this creature becomes the target of a spell or ability an opponent controls, " + - "counter it unless that player "); - if (cost != null) { - if (cost instanceof ManaCost) { - sb.append("pays ").append(cost.getText()); - } else { - sb.append(cost.getText().replace("pay ", "pays ")); - } - sb.append(".)"); + return sb.toString(); + } + + @Override + public String getRule() { + String rule = getRuleWithoutHint(); + + if (!showAbilityHint) { + return rule; + } + + StringBuilder sb = new StringBuilder(rule); + sb.append(" (Whenever this creature becomes the target of a spell or ability an opponent controls, " + + "counter it unless that player "); + if (cost != null) { + if (cost instanceof ManaCost) { + sb.append("pays ").append(cost.getText()); } else { - sb.append("pays {X}"); - if (whereXIs != null) { - sb.append(whereXIs); - } - sb.append(".)"); + sb.append(cost.getText().replace("pay ", "pays ")); } + sb.append(".)"); + } else { + sb.append("pays {X}"); + if (whereXIs != null) { + sb.append(whereXIs); + } + sb.append(".)"); } return sb.toString();