Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Mage/src/main/java/mage/MageObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public interface MageObject extends MageItem, Serializable, Copyable<MageObject>

void setName(String name);

boolean hasName(String name);

default List<CardType> getCardType() {
return getCardType(null);
}
Expand Down
5 changes: 5 additions & 0 deletions Mage/src/main/java/mage/MageObjectImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<CardType> getCardType(Game game) {
if (game != null) {
Expand Down
5 changes: 5 additions & 0 deletions Mage/src/main/java/mage/cards/SplitCard.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -39,40 +34,15 @@ 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

// Test of Talents ruling:
// 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
Expand Down
7 changes: 6 additions & 1 deletion Mage/src/main/java/mage/game/command/CommandObjectImpl.java
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand Down Expand Up @@ -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);
}
}
5 changes: 5 additions & 0 deletions Mage/src/main/java/mage/game/command/Commander.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<CardType> getCardType(Game game) {
return sourceObject.getCardType(game);
Expand Down
5 changes: 5 additions & 0 deletions Mage/src/main/java/mage/game/permanent/PermanentImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
13 changes: 13 additions & 0 deletions Mage/src/main/java/mage/game/stack/Spell.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
6 changes: 6 additions & 0 deletions Mage/src/main/java/mage/game/stack/StackAbility.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<CardType> getCardType(Game game) {
return emptyCardType;
Expand Down Expand Up @@ -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();
Expand Down