diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 4fdc1aa7fcd4..90ea9f27f1bc 100644 --- a/Mage/src/main/java/mage/MageObject.java +++ b/Mage/src/main/java/mage/MageObject.java @@ -63,6 +63,8 @@ public interface MageObject extends MageItem, Serializable, Copyable void setName(String name); + boolean hasName(String name); + default List getCardType() { return getCardType(null); } diff --git a/Mage/src/main/java/mage/MageObjectImpl.java b/Mage/src/main/java/mage/MageObjectImpl.java index 51a2dd48d674..bd1bd08f1926 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -119,6 +119,11 @@ public void setName(String name) { this.name = name; } + @Override + public boolean hasName(String name) { + return Objects.equals(name, this.name); + } + @Override public List getCardType(Game game) { if (game != null) { diff --git a/Mage/src/main/java/mage/cards/SplitCard.java b/Mage/src/main/java/mage/cards/SplitCard.java index 7595febd85b6..cde6b9d32753 100644 --- a/Mage/src/main/java/mage/cards/SplitCard.java +++ b/Mage/src/main/java/mage/cards/SplitCard.java @@ -235,4 +235,9 @@ public int getManaValue() { // split card and it's halfes contains own mana costs, so no need to rewrite logic return super.getManaValue(); } + + @Override + public boolean hasName(String name) { + return super.hasName(name) || this.getLeftHalfCard().hasName(name) || this.getRightHalfCard().hasName(name); + } } diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java index 4160a68397c4..3f43f1b50d53 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java @@ -1,13 +1,8 @@ package mage.filter.predicate.mageobject; import mage.MageObject; -import mage.cards.CardWithHalves; -import mage.cards.SplitCard; -import mage.constants.SpellAbilityType; import mage.filter.predicate.Predicate; import mage.game.Game; -import mage.game.stack.Spell; -import mage.util.CardUtil; /** * @author North @@ -39,10 +34,7 @@ public NamePredicate(String name, Boolean ignoreMtgRuleForEmptyNames) { @Override public boolean apply(MageObject input, Game game) { - if (name == null) { - return false; - } - // If a player names a card, the player may name either half of a split card, but not both. + // If a player names a card, the player may name either half of a split card, but not both. // A split card has the chosen name if one of its two names matches the chosen name. // This is NOT the same for double faced cards, where only the front side matches @@ -50,29 +42,7 @@ public boolean apply(MageObject input, Game game) { // If the back face of a modal double-faced card is countered, you will not be able to exile any cards, // including the one that you countered, because those cards have only their front-face characteristics // (including name) in the graveyard, hand, and library. (2021-04-16) - - if (input instanceof SplitCard) { - return CardUtil.haveSameNames(name, ((CardWithHalves) input).getLeftHalfCard().getName(), this.ignoreMtgRuleForEmptyNames) || - CardUtil.haveSameNames(name, ((CardWithHalves) input).getRightHalfCard().getName(), this.ignoreMtgRuleForEmptyNames) || - CardUtil.haveSameNames(name, input.getName(), this.ignoreMtgRuleForEmptyNames); - } else if (input instanceof Spell && ((Spell) input).getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED) { - SplitCard card = (SplitCard) ((Spell) input).getCard(); - return CardUtil.haveSameNames(name, card.getLeftHalfCard().getName(), this.ignoreMtgRuleForEmptyNames) || - CardUtil.haveSameNames(name, card.getRightHalfCard().getName(), this.ignoreMtgRuleForEmptyNames) || - CardUtil.haveSameNames(name, card.getName(), this.ignoreMtgRuleForEmptyNames); - } else if (input instanceof Spell && ((Spell) input).isFaceDown(game)) { - // face down spells don't have names, so it's not equal, see https://github.com/magefree/mage/issues/6569 - return false; - } else { - if (name.contains(" // ")) { - String leftName = name.substring(0, name.indexOf(" // ")); - String rightName = name.substring(name.indexOf(" // ") + 4); - return CardUtil.haveSameNames(leftName, input.getName(), this.ignoreMtgRuleForEmptyNames) || - CardUtil.haveSameNames(rightName, input.getName(), this.ignoreMtgRuleForEmptyNames); - } else { - return CardUtil.haveSameNames(name, input.getName(), this.ignoreMtgRuleForEmptyNames); - } - } + return name != null && input.hasName(name); } @Override diff --git a/Mage/src/main/java/mage/game/command/CommandObjectImpl.java b/Mage/src/main/java/mage/game/command/CommandObjectImpl.java index a06b6f4e5941..4d02b02ea672 100644 --- a/Mage/src/main/java/mage/game/command/CommandObjectImpl.java +++ b/Mage/src/main/java/mage/game/command/CommandObjectImpl.java @@ -1,8 +1,8 @@ package mage.game.command; -import mage.game.permanent.token.TokenImpl; import mage.util.GameLog; +import java.util.Objects; import java.util.UUID; /** @@ -113,4 +113,9 @@ public String getIdName() { public String getLogName() { return GameLog.getColoredObjectIdName(this); } + + @Override + public boolean hasName(String name) { + return Objects.equals(name, this.name); + } } diff --git a/Mage/src/main/java/mage/game/command/Commander.java b/Mage/src/main/java/mage/game/command/Commander.java index 7ff69e6101de..c68f16872b42 100644 --- a/Mage/src/main/java/mage/game/command/Commander.java +++ b/Mage/src/main/java/mage/game/command/Commander.java @@ -163,6 +163,11 @@ public String getIdName() { return sourceObject.getName() + " [" + sourceObject.getId().toString().substring(0, 3) + ']'; } + @Override + public boolean hasName(String name) { + return sourceObject.hasName(name); + } + @Override public List getCardType(Game game) { return sourceObject.getCardType(game); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 6a74a11ad232..f28d1a4240b8 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -260,6 +260,11 @@ public String getName() { } } + @Override + public boolean hasName(String name) { + return !faceDown && super.hasName(name); + } + @Override public String getValue(GameState state) { StringBuilder sb = threadLocalBuilder.get(); diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 7cc905df6b60..e3e57a200edd 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -563,6 +563,19 @@ public String getLogName() { public void setName(String name) { } + @Override + public boolean hasName(String name) { + if (this.faceDown) { + return false; + } + if (this.getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED + && (((SplitCard) this.card).getLeftHalfCard().hasName(name) + || ((SplitCard) this.card).getRightHalfCard().hasName(name))) { + return true; + } + return this.card.hasName(name); + } + @Override public Rarity getRarity() { return card.getRarity(); diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index f83a90a56971..138acd48afb3 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -198,6 +198,11 @@ public void setName(String name) { this.name = name; } + @Override + public boolean hasName(String name) { + return Objects.equals(name, this.name); + } + @Override public List getCardType(Game game) { return emptyCardType; @@ -677,6 +682,7 @@ public void setSourceObjectZoneChangeCounter(int zoneChangeCounter) { public void initSourceObjectZoneChangeCounter(Game game, boolean force) { ability.initSourceObjectZoneChangeCounter(game, force); } + @Override public int getSourceObjectZoneChangeCounter() { return ability.getSourceObjectZoneChangeCounter();