mirror of
https://github.com/magefree/mage.git
synced 2026-01-19 09:49:54 -08:00
some more changes
This commit is contained in:
parent
388fb0b8fd
commit
1814467bcd
20 changed files with 156 additions and 233 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue