From 29acaa423b6b71babd58d4751329fa8d47f9d721 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Mon, 23 Jun 2025 16:39:45 -0400 Subject: [PATCH] add hasName method --- Mage/src/main/java/mage/MageObject.java | 2 ++ Mage/src/main/java/mage/MageObjectImpl.java | 5 +++ Mage/src/main/java/mage/cards/SplitCard.java | 5 +++ .../predicate/mageobject/NamePredicate.java | 34 ++----------------- .../mage/game/command/CommandObjectImpl.java | 7 +++- .../java/mage/game/command/Commander.java | 5 +++ .../mage/game/permanent/PermanentImpl.java | 5 +++ Mage/src/main/java/mage/game/stack/Spell.java | 13 +++++++ .../java/mage/game/stack/StackAbility.java | 6 ++++ 9 files changed, 49 insertions(+), 33 deletions(-) diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 4fdc1aa7fcd..90ea9f27f1b 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 51a2dd48d67..bd1bd08f192 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -119,6 +119,11 @@ public abstract class MageObjectImpl implements MageObject { 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 7595febd85b..cde6b9d3275 100644 --- a/Mage/src/main/java/mage/cards/SplitCard.java +++ b/Mage/src/main/java/mage/cards/SplitCard.java @@ -235,4 +235,9 @@ public abstract class SplitCard extends CardImpl implements CardWithHalves { // 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 4160a68397c..3f43f1b50d5 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 class NamePredicate implements Predicate { @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 class NamePredicate implements Predicate { // 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 a06b6f4e594..4d02b02ea67 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 abstract class CommandObjectImpl implements CommandObject { 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 7ff69e6101d..c68f16872b4 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 class Commander extends CommandObjectImpl { 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 6a74a11ad23..f28d1a4240b 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 abstract class PermanentImpl extends CardImpl implements Permanent { } } + @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 7cc905df6b6..e3e57a200ed 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 class Spell extends StackObjectImpl implements Card { 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 f83a90a5697..138acd48afb 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 class StackAbility extends StackObjectImpl implements Ability { 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 class StackAbility extends StackObjectImpl implements Ability { public void initSourceObjectZoneChangeCounter(Game game, boolean force) { ability.initSourceObjectZoneChangeCounter(game, force); } + @Override public int getSourceObjectZoneChangeCounter() { return ability.getSourceObjectZoneChangeCounter();