From 1814467bcda47791483b702797d2a171064243d6 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Wed, 11 Sep 2024 16:42:20 -0400 Subject: [PATCH] some more changes --- .../src/mage/cards/a/AgencyOutfitter.java | 9 +- .../mage/cards/a/AlhammarretHighArbiter.java | 3 +- .../src/mage/cards/a/AnointedPeacekeeper.java | 2 +- Mage.Sets/src/mage/cards/b/BileBlight.java | 4 +- Mage.Sets/src/mage/cards/b/BrainPry.java | 3 +- .../src/mage/cards/c/CabalTherapist.java | 4 +- Mage.Sets/src/mage/cards/c/CabalTherapy.java | 4 +- Mage.Sets/src/mage/cards/c/ConjurersBan.java | 3 +- .../src/mage/cards/c/ConundrumSphinx.java | 3 +- .../src/mage/cards/c/CorneredMarket.java | 50 ++++---- .../src/mage/cards/c/CrownOfEmpires.java | 108 +++++------------ .../src/mage/cards/d/DemonicConsultation.java | 3 +- Mage.Sets/src/mage/cards/e/EchoingReturn.java | 2 +- .../org/mage/test/testapi/AliasesApiTest.java | 114 +++++++++--------- Mage/src/main/java/mage/MageObject.java | 8 +- ...entsCantCastChosenUntilNextTurnEffect.java | 3 +- .../mageobject/ChosenNamePredicate.java | 3 +- .../predicate/mageobject/NamePredicate.java | 45 +++---- .../java/mage/game/GameTinyLeadersImpl.java | 3 +- Mage/src/main/java/mage/util/CardUtil.java | 15 +-- 20 files changed, 156 insertions(+), 233 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AgencyOutfitter.java b/Mage.Sets/src/mage/cards/a/AgencyOutfitter.java index dfaf1ddcdde..b096730f723 100644 --- a/Mage.Sets/src/mage/cards/a/AgencyOutfitter.java +++ b/Mage.Sets/src/mage/cards/a/AgencyOutfitter.java @@ -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; } } diff --git a/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java b/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java index 978fef081f4..34d8873ca03 100644 --- a/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java +++ b/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java @@ -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; } diff --git a/Mage.Sets/src/mage/cards/a/AnointedPeacekeeper.java b/Mage.Sets/src/mage/cards/a/AnointedPeacekeeper.java index ce530b96374..dbbb8d79955 100644 --- a/Mage.Sets/src/mage/cards/a/AnointedPeacekeeper.java +++ b/Mage.Sets/src/mage/cards/a/AnointedPeacekeeper.java @@ -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); } } diff --git a/Mage.Sets/src/mage/cards/b/BileBlight.java b/Mage.Sets/src/mage/cards/b/BileBlight.java index caa3e4dbf1b..abcf5dc5df3 100644 --- a/Mage.Sets/src/mage/cards/b/BileBlight.java +++ b/Mage.Sets/src/mage/cards/b/BileBlight.java @@ -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)); } } diff --git a/Mage.Sets/src/mage/cards/b/BrainPry.java b/Mage.Sets/src/mage/cards/b/BrainPry.java index 430185d877a..a6eef4588c8 100644 --- a/Mage.Sets/src/mage/cards/b/BrainPry.java +++ b/Mage.Sets/src/mage/cards/b/BrainPry.java @@ -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; diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapist.java b/Mage.Sets/src/mage/cards/c/CabalTherapist.java index c0d567885ec..e44887b4dc0 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapist.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapist.java @@ -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; diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapy.java b/Mage.Sets/src/mage/cards/c/CabalTherapy.java index 8a270324294..3ed180c43d7 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapy.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapy.java @@ -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; diff --git a/Mage.Sets/src/mage/cards/c/ConjurersBan.java b/Mage.Sets/src/mage/cards/c/ConjurersBan.java index 6e09f380966..8d1e4c96561 100644 --- a/Mage.Sets/src/mage/cards/c/ConjurersBan.java +++ b/Mage.Sets/src/mage/cards/c/ConjurersBan.java @@ -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 diff --git a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java index 7a5fcd6a341..0e4533c25ff 100644 --- a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java +++ b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java @@ -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); diff --git a/Mage.Sets/src/mage/cards/c/CorneredMarket.java b/Mage.Sets/src/mage/cards/c/CorneredMarket.java index 5f1f66791fc..5f046136f24 100644 --- a/Mage.Sets/src/mage/cards/c/CorneredMarket.java +++ b/Mage.Sets/src/mage/cards/c/CorneredMarket.java @@ -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; diff --git a/Mage.Sets/src/mage/cards/c/CrownOfEmpires.java b/Mage.Sets/src/mage/cards/c/CrownOfEmpires.java index 08e928f2c3a..714bc6b66ae 100644 --- a/Mage.Sets/src/mage/cards/c/CrownOfEmpires.java +++ b/Mage.Sets/src/mage/cards/c/CrownOfEmpires.java @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java index 92d6fca243b..4527c2e93cb 100644 --- a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java +++ b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java @@ -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; } diff --git a/Mage.Sets/src/mage/cards/e/EchoingReturn.java b/Mage.Sets/src/mage/cards/e/EchoingReturn.java index 3b70cf1ae35..a4171e5c074 100644 --- a/Mage.Sets/src/mage/cards/e/EchoingReturn.java +++ b/Mage.Sets/src/mage/cards/e/EchoingReturn.java @@ -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); } diff --git a/Mage.Tests/src/test/java/org/mage/test/testapi/AliasesApiTest.java b/Mage.Tests/src/test/java/org/mage/test/testapi/AliasesApiTest.java index 4de1ffeba24..bd4f1c06f19 100644 --- a/Mage.Tests/src/test/java/org/mage/test/testapi/AliasesApiTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/testapi/AliasesApiTest.java @@ -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 diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 6b54aceebde..e3d35a3aa8a 100644 --- a/Mage/src/main/java/mage/MageObject.java +++ b/Mage/src/main/java/mage/MageObject.java @@ -622,11 +622,11 @@ public interface MageObject extends MageItem, Serializable, Copyable */ 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(); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java b/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java index bc0d906f593..ee68c17ffae 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java @@ -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); } } diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenNamePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenNamePredicate.java index 7d56a6e86f5..dc10b98b2a3 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenNamePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenNamePredicate.java @@ -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 { 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 { // 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 diff --git a/Mage/src/main/java/mage/game/GameTinyLeadersImpl.java b/Mage/src/main/java/mage/game/GameTinyLeadersImpl.java index 1e76c1986d6..7ecb7ff3f76 100644 --- a/Mage/src/main/java/mage/game/GameTinyLeadersImpl.java +++ b/Mage/src/main/java/mage/game/GameTinyLeadersImpl.java @@ -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); } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 49742ab086d..1bb40313225 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -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 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);