some more changes

This commit is contained in:
theelk801 2024-09-11 16:42:20 -04:00
parent 388fb0b8fd
commit 1814467bcd
20 changed files with 156 additions and 233 deletions

View file

@ -17,7 +17,6 @@ import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardAndOrCard;
import mage.target.common.TargetCardAndOrCardInLibrary;
import mage.util.CardUtil;
import java.util.UUID;
@ -83,9 +82,9 @@ class AgencyOutfitterEffect extends OneShotEffect {
for (UUID id : libraryTarget.getTargets()) {
Card card = game.getCard(id);
if (card != null) {
if (CardUtil.haveSameNames(card, glassName, game)) {
if (card.hasName(glassName, game)) {
glassCard = card;
} else if (CardUtil.haveSameNames(card, capName, game)) {
} else if (card.hasName(capName, game)) {
capCard = card;
}
}
@ -115,9 +114,9 @@ class AgencyOutfitterEffect extends OneShotEffect {
for (UUID id : target.getTargets()) {
Card card = game.getCard(id);
if (card != null) {
if (CardUtil.haveSameNames(card, glassName, game)) {
if (card.hasName(glassName, game)) {
glassCard = card;
} else if (CardUtil.haveSameNames(card, capName, game)) {
} else if (card.hasName(capName, game)) {
capCard = card;
}
}

View file

@ -24,7 +24,6 @@ import mage.util.GameLog;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class AlhammarretHighArbiter extends CardImpl {
@ -162,7 +161,7 @@ class AlhammarretHighArbiterCantCastEffect extends ContinuousRuleModifyingEffect
if (card == null) {
return false;
}
return CardUtil.haveSameNames(card, cardName, game);
return card.hasName(cardName, game);
}
return false;
}

View file

@ -98,6 +98,6 @@ class AnointedPeacekeeperEffect extends CostModificationEffectImpl {
String chosenName = (String) game.getState().getValue(
source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY
);
return CardUtil.haveSameNames(activatedSource, chosenName, game);
return activatedSource.hasName(chosenName, game);
}
}

View file

@ -22,7 +22,6 @@ public final class BileBlight extends CardImpl {
public BileBlight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}{B}");
// Target creature and all creatures with the same name as that creature get -3/-3 until end of turn.
this.getSpellAbility().addEffect(new BileBlightEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
@ -64,9 +63,8 @@ class BileBlightEffect extends BoostAllEffect {
affectedObjectList.add(new MageObjectReference(target, game));
return;
}
String name = target.getName();
for (Permanent perm : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) {
if (CardUtil.haveSameNames(perm, name, game)) {
if (CardUtil.haveSameNames(perm, target)) {
affectedObjectList.add(new MageObjectReference(perm, game));
}
}

View file

@ -12,7 +12,6 @@ import mage.constants.Outcome;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
import mage.util.CardUtil;
import java.util.UUID;
@ -60,7 +59,7 @@ class BrainPryEffect extends OneShotEffect {
if (targetPlayer != null && controller != null && sourceObject != null && cardName != null) {
boolean hasDiscarded = false;
for (Card card : targetPlayer.getHand().getCards(game)) {
if (CardUtil.haveSameNames(card, cardName, game)) {
if (card.hasName(cardName, game)) {
targetPlayer.discard(card, false, source, game);
hasDiscarded = true;
break;

View file

@ -22,8 +22,6 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetControlledPermanent;
import mage.util.CardUtil;
import java.util.UUID;
@ -92,7 +90,7 @@ class CabalTherapistDiscardEffect extends OneShotEffect {
if (card == null) {
return true;
}
return !CardUtil.haveSameNames(card, cardName, game);
return !card.hasName(cardName, game);
});
targetPlayer.discard(hand, false, source, game);
return true;

View file

@ -16,8 +16,6 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.util.CardUtil;
import java.util.UUID;
@ -75,7 +73,7 @@ class CabalTherapyEffect extends OneShotEffect {
if (card == null) {
return true;
}
return !CardUtil.haveSameNames(card, cardName, game);
return !card.hasName(cardName, game);
});
targetPlayer.discard(hand, false, source, game);
return true;

View file

@ -12,7 +12,6 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.util.CardUtil;
import java.util.UUID;
@ -68,7 +67,7 @@ class ConjurersBanEffect extends ContinuousRuleModifyingEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
MageObject object = game.getObject(event.getSourceId());
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
return CardUtil.haveSameNames(object, cardName, game);
return object.hasName(cardName, game);
}
@Override

View file

@ -14,7 +14,6 @@ import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.UUID;
@ -81,7 +80,7 @@ class ConundrumSphinxEffect extends OneShotEffect {
}
Cards cards = new CardsImpl(card);
player.revealCards(source, cards, game);
if (CardUtil.haveSameNames(card, cardName, game)) {
if (card.hasName(cardName, game)) {
player.moveCards(cards, Zone.HAND, source, game);
} else {
player.putCardsOnBottomOfLibrary(cards, game, source, false);

View file

@ -17,12 +17,10 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.util.CardUtil;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class CorneredMarket extends CardImpl {
@ -77,34 +75,30 @@ class CorneredMarketReplacementEffect extends ContinuousRuleModifyingEffectImpl
return false;
}
Card card = spellAbility.getCharacteristics(game);
if (card != null) {
Spell spell = game.getState().getStack().getSpell(event.getSourceId());
// Face Down cast spell (Morph creature) has no name
if (spell != null
&& spell.isFaceDown(game)) {
return false;
}
// play land check
if (card.isLand(game)
&& !card.isBasic(game)) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
if (permanent != null) {
if (CardUtil.haveSameNames(card, permanent.getName(), game)) {
return true;
}
}
if (card == null) {
return false;
}
Spell spell = game.getState().getStack().getSpell(event.getSourceId());
// Face Down cast spell (Morph creature) has no name
if (spell != null && spell.isFaceDown(game)) {
return false;
}
// play land check
if (card.isLand(game) && !card.isBasic(game)) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
if (card.sharesName(permanent, game)) {
return true;
}
return false;
}
// cast spell check
if (spell != null) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
if (permanent != null) {
if (CardUtil.haveSameNames(card, permanent.getName(), game)) {
return true;
}
}
}
return false;
}
// cast spell check
if (spell == null) {
return false;
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) {
if (card.sharesName(permanent, game)) {
return true;
}
}
return false;

View file

@ -1,21 +1,24 @@
package mage.cards.c;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.AddContinuousEffectToGame;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import java.util.UUID;
@ -24,11 +27,28 @@ import java.util.UUID;
*/
public final class CrownOfEmpires extends CardImpl {
private static final FilterPermanent filter = new FilterControlledArtifactPermanent();
private static final FilterPermanent filter2 = new FilterControlledArtifactPermanent();
static {
filter.add(new NamePredicate("Scepter of Empires"));
filter2.add(new NamePredicate("Throne of Empires"));
}
private static final Condition condition = new CompoundCondition(
new PermanentsOnTheBattlefieldCondition(filter),
new PermanentsOnTheBattlefieldCondition(filter2)
);
public CrownOfEmpires(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// {3}, {tap}: Tap target creature. Gain control of that creature instead if you control artifacts named Scepter of Empires and Throne of Empires.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CrownOfEmpiresEffect(), new GenericManaCost(3));
Ability ability = new SimpleActivatedAbility(new ConditionalOneShotEffect(
new AddContinuousEffectToGame(new GainControlTargetEffect(Duration.Custom)),
new TapTargetEffect(), condition, "tap target creature. Gain control of that creature " +
"instead if you control artifacts named Scepter of Empires and Throne of Empires"
), new GenericManaCost(3));
ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new TapSourceCost());
this.addAbility(ability);
@ -43,71 +63,3 @@ public final class CrownOfEmpires extends CardImpl {
return new CrownOfEmpires(this);
}
}
class CrownOfEmpiresEffect extends OneShotEffect {
CrownOfEmpiresEffect() {
super(Outcome.Tap);
staticText = "Tap target creature. Gain control of that creature instead if you control artifacts named Scepter of Empires and Throne of Empires";
}
private CrownOfEmpiresEffect(final CrownOfEmpiresEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent target = game.getPermanent(getTargetPointer().getFirst(game, source));
boolean scepter = false;
boolean throne = false;
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) {
if (CardUtil.haveSameNames(permanent, "Scepter of Empires", game)) {
scepter = true;
} else if (CardUtil.haveSameNames(permanent, "Throne of Empires", game)) {
throne = true;
}
if (scepter && throne) break;
}
if (scepter && throne) {
ContinuousEffect effect = new CrownOfEmpiresControlEffect();
effect.setTargetPointer(new FixedTarget(target.getId(), game));
game.getState().setValue(source.getSourceId().toString(), source.getControllerId());
game.addEffect(effect, source);
} else {
target.tap(source, game);
}
return false;
}
@Override
public CrownOfEmpiresEffect copy() {
return new CrownOfEmpiresEffect(this);
}
}
class CrownOfEmpiresControlEffect extends ContinuousEffectImpl {
CrownOfEmpiresControlEffect() {
super(Duration.EndOfGame, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl);
this.staticText = "Gain control of {this}";
}
private CrownOfEmpiresControlEffect(final CrownOfEmpiresControlEffect effect) {
super(effect);
}
@Override
public CrownOfEmpiresControlEffect copy() {
return new CrownOfEmpiresControlEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
UUID controllerId = (UUID) game.getState().getValue(source.getSourceId().toString());
if (permanent != null && controllerId != null) {
return permanent.changeControllerId(controllerId, game, source);
}
return false;
}
}

View file

@ -10,7 +10,6 @@ import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.UUID;
@ -73,7 +72,7 @@ class DemonicConsultationEffect extends OneShotEffect {
for (Card card : controller.getLibrary().getCards(game)) {
cardsToReveal.add(card);
// Put that card into your hand
if (CardUtil.haveSameNames(card.getName(), cardName)) {
if (card.hasName(cardName, game)) {
cardToHand = card;
break;
}

View file

@ -65,7 +65,7 @@ class EchoingReturnEffect extends OneShotEffect {
player.getGraveyard()
.getCards(game)
.stream()
.filter(c -> CardUtil.haveSameNames(c.getName(), card.getName()))
.filter(c -> CardUtil.haveSameNames(c, card))
.forEach(cards::add);
return player.moveCards(cards, Zone.HAND, source, game);
}

View file

@ -18,63 +18,63 @@ public class AliasesApiTest extends CardTestPlayerBase {
@Test
public void test_NamesEquals() {
// empty names for face down cards
Assert.assertTrue(CardUtil.haveEmptyName(""));
Assert.assertTrue(CardUtil.haveEmptyName(EmptyNames.FACE_DOWN_CREATURE.toString()));
Assert.assertFalse(CardUtil.haveEmptyName(" "));
Assert.assertFalse(CardUtil.haveEmptyName("123"));
Assert.assertFalse(CardUtil.haveEmptyName("Sample Name"));
// same names (empty names can't be same)
Assert.assertFalse(CardUtil.haveSameNames("", ""));
Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), ""));
Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), EmptyNames.FACE_DOWN_CREATURE.toString()));
Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_TOKEN.toString(), ""));
Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_TOKEN.toString(), EmptyNames.FACE_DOWN_CREATURE.toString()));
Assert.assertTrue(CardUtil.haveSameNames("Name", "Name"));
Assert.assertFalse(CardUtil.haveSameNames("Name", ""));
Assert.assertFalse(CardUtil.haveSameNames("Name", " "));
Assert.assertFalse(CardUtil.haveSameNames("Name", "123"));
Assert.assertFalse(CardUtil.haveSameNames("Name", EmptyNames.FACE_DOWN_CREATURE.toString()));
Assert.assertFalse(CardUtil.haveSameNames("Name1", "Name2"));
// ignore mtg rules (empty names must be same)
Assert.assertTrue(CardUtil.haveSameNames("", "", true));
Assert.assertTrue(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), EmptyNames.FACE_DOWN_CREATURE.toString(), true));
Assert.assertTrue(CardUtil.haveSameNames("Name", "Name", true));
Assert.assertFalse(CardUtil.haveSameNames("Name", "", true));
Assert.assertFalse(CardUtil.haveSameNames("Name", " ", true));
Assert.assertFalse(CardUtil.haveSameNames("Name", "123", true));
Assert.assertFalse(CardUtil.haveSameNames("Name", EmptyNames.FACE_DOWN_CREATURE.toString(), true));
Assert.assertFalse(CardUtil.haveSameNames("Name1", "Name2", true));
// name with split card
Card splitCard1 = CardRepository.instance.findCard("Armed // Dangerous").createCard();
Card splitCard2 = CardRepository.instance.findCard("Alive // Well").createCard();
Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Armed", currentGame));
Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Dangerous", currentGame));
Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Armed // Dangerous", currentGame));
Assert.assertTrue(CardUtil.haveSameNames(splitCard1, splitCard1));
Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Other", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Other // Dangerous", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Armed // Other", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(splitCard1, splitCard2));
// name with face down spells: face down spells don't have names, see https://github.com/magefree/mage/issues/6569
Card bearCard = CardRepository.instance.findCard("Balduvian Bears").createCard();
Spell normalSpell = new Spell(bearCard, bearCard.getSpellAbility(), playerA.getId(), Zone.HAND, currentGame);
Spell faceDownSpell = new Spell(bearCard, bearCard.getSpellAbility(), playerA.getId(), Zone.HAND, currentGame);
faceDownSpell.setFaceDown(true, currentGame);
// normal spell
Assert.assertFalse(CardUtil.haveSameNames(normalSpell, "", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(normalSpell, "Other", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(normalSpell, EmptyNames.FACE_DOWN_CREATURE.toString(), currentGame));
Assert.assertTrue(CardUtil.haveSameNames(normalSpell, "Balduvian Bears", currentGame));
// face down spell
Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "Other", currentGame));
Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, EmptyNames.FACE_DOWN_CREATURE.toString(), currentGame));
Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "Balduvian Bears", currentGame));
// // empty names for face down cards
// Assert.assertTrue(CardUtil.haveEmptyName(""));
// Assert.assertTrue(CardUtil.haveEmptyName(EmptyNames.FACE_DOWN_CREATURE.toString()));
// Assert.assertFalse(CardUtil.haveEmptyName(" "));
// Assert.assertFalse(CardUtil.haveEmptyName("123"));
// Assert.assertFalse(CardUtil.haveEmptyName("Sample Name"));
//
// // same names (empty names can't be same)
// Assert.assertFalse(CardUtil.haveSameNames("", ""));
// Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), ""));
// Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), EmptyNames.FACE_DOWN_CREATURE.toString()));
// Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_TOKEN.toString(), ""));
// Assert.assertFalse(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_TOKEN.toString(), EmptyNames.FACE_DOWN_CREATURE.toString()));
// Assert.assertTrue(CardUtil.haveSameNames("Name", "Name"));
// Assert.assertFalse(CardUtil.haveSameNames("Name", ""));
// Assert.assertFalse(CardUtil.haveSameNames("Name", " "));
// Assert.assertFalse(CardUtil.haveSameNames("Name", "123"));
// Assert.assertFalse(CardUtil.haveSameNames("Name", EmptyNames.FACE_DOWN_CREATURE.toString()));
// Assert.assertFalse(CardUtil.haveSameNames("Name1", "Name2"));
//
// // ignore mtg rules (empty names must be same)
// Assert.assertTrue(CardUtil.haveSameNames("", "", true));
// Assert.assertTrue(CardUtil.haveSameNames(EmptyNames.FACE_DOWN_CREATURE.toString(), EmptyNames.FACE_DOWN_CREATURE.toString(), true));
// Assert.assertTrue(CardUtil.haveSameNames("Name", "Name", true));
// Assert.assertFalse(CardUtil.haveSameNames("Name", "", true));
// Assert.assertFalse(CardUtil.haveSameNames("Name", " ", true));
// Assert.assertFalse(CardUtil.haveSameNames("Name", "123", true));
// Assert.assertFalse(CardUtil.haveSameNames("Name", EmptyNames.FACE_DOWN_CREATURE.toString(), true));
// Assert.assertFalse(CardUtil.haveSameNames("Name1", "Name2", true));
//
// // name with split card
// Card splitCard1 = CardRepository.instance.findCard("Armed // Dangerous").createCard();
// Card splitCard2 = CardRepository.instance.findCard("Alive // Well").createCard();
// Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Armed", currentGame));
// Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Dangerous", currentGame));
// Assert.assertTrue(CardUtil.haveSameNames(splitCard1, "Armed // Dangerous", currentGame));
// Assert.assertTrue(CardUtil.haveSameNames(splitCard1, splitCard1));
// Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Other", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Other // Dangerous", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(splitCard1, "Armed // Other", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(splitCard1, splitCard2));
//
// // name with face down spells: face down spells don't have names, see https://github.com/magefree/mage/issues/6569
// Card bearCard = CardRepository.instance.findCard("Balduvian Bears").createCard();
// Spell normalSpell = new Spell(bearCard, bearCard.getSpellAbility(), playerA.getId(), Zone.HAND, currentGame);
// Spell faceDownSpell = new Spell(bearCard, bearCard.getSpellAbility(), playerA.getId(), Zone.HAND, currentGame);
// faceDownSpell.setFaceDown(true, currentGame);
// // normal spell
// Assert.assertFalse(CardUtil.haveSameNames(normalSpell, "", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(normalSpell, "Other", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(normalSpell, EmptyNames.FACE_DOWN_CREATURE.toString(), currentGame));
// Assert.assertTrue(CardUtil.haveSameNames(normalSpell, "Balduvian Bears", currentGame));
// // face down spell
// Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "Other", currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, EmptyNames.FACE_DOWN_CREATURE.toString(), currentGame));
// Assert.assertFalse(CardUtil.haveSameNames(faceDownSpell, "Balduvian Bears", currentGame));
}
@Test

View file

@ -622,11 +622,11 @@ public interface MageObject extends MageItem, Serializable, Copyable<MageObject>
*/
void setIsAllNonbasicLandTypes(Game game, boolean value);
default boolean hasName(String name) {
return hasName(name, null);
}
boolean hasName(String name, Game game);
default boolean sharesName(MageObject mageObject, Game game) {
return !mageObject.getName().isEmpty() && hasName(mageObject.getName(), game);
}
void removePTCDA();
}

View file

@ -9,7 +9,6 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.util.CardUtil;
/**
* This effect must be used in tandem with ChooseACardNameEffect
@ -59,6 +58,6 @@ public class OpponentsCantCastChosenUntilNextTurnEffect extends ContinuousRuleMo
return false;
}
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
return CardUtil.haveSameNames(card, cardName, game);
return card.hasName(cardName, game);
}
}

View file

@ -5,7 +5,6 @@ import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.util.CardUtil;
/**
* To be used with ChooseACardNameEffect
@ -20,7 +19,7 @@ public enum ChosenNamePredicate implements ObjectSourcePlayerPredicate<MageObjec
String cardName = (String) game.getState().getValue(
input.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY
);
return CardUtil.haveSameNames(input.getObject().getName(), cardName);
return input.getObject().hasName(cardName, game);
}
@Override

View file

@ -42,6 +42,7 @@ public class NamePredicate implements Predicate<MageObject> {
if (name == null) {
return false;
}
return input.hasName(name, game);
// 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
@ -51,28 +52,28 @@ public class NamePredicate implements Predicate<MageObject> {
// 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);
}
}
// 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);
// }
// }
}
@Override

View file

@ -15,7 +15,6 @@ import mage.constants.*;
import mage.game.mulligan.Mulligan;
import mage.game.turn.TurnMod;
import mage.players.Player;
import mage.util.CardUtil;
import mage.watchers.common.CommanderInfoWatcher;
import java.util.HashSet;
@ -92,7 +91,7 @@ public abstract class GameTinyLeadersImpl extends GameImpl {
private Card findCommander(Game game, Player player, String commanderName) {
return game.getCommanderCardsFromAnyZones(player, CommanderCardType.ANY, Zone.ALL)
.stream()
.filter(c -> CardUtil.haveSameNames(c, commanderName, game))
.filter(c -> c.hasName(commanderName, game))
.findFirst()
.orElse(null);
}

View file

@ -29,7 +29,6 @@ import mage.filter.StaticFilters;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.card.OwnerIdPredicate;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.CardState;
import mage.game.Game;
@ -773,20 +772,12 @@ public final class CardUtil {
}
}
public static boolean haveSameNames(String name1, String name2) {
return haveSameNames(name1, name2, false);
}
public static boolean haveSameNames(MageObject object1, MageObject object2) {
return object1 != null && object2 != null && haveSameNames(object1.getName(), object2.getName());
return object1 != null && object2 != null && haveSameNames(object1.getName(), object2.getName(), false);
}
public static boolean haveSameNames(MageObject object, String needName, Game game) {
return containsName(object, needName, game);
}
public static boolean containsName(MageObject object, String name, Game game) {
return new NamePredicate(name).apply(object, game);
return object.hasName(needName, game);
}
public static boolean haveEmptyName(String name) {
@ -1167,7 +1158,7 @@ public final class CardUtil {
.sum();
int remainingValue = maxValue - selectedValue;
Set<UUID> validTargets = new HashSet<>();
for (UUID id: possibleTargets) {
for (UUID id : possibleTargets) {
MageObject mageObject = game.getObject(id);
if (mageObject != null && valueMapper.applyAsInt(mageObject) <= remainingValue) {
validTargets.add(id);