diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java index b07e82734ebe..ecf061f81524 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java @@ -97,7 +97,7 @@ public void prepareCompatibleData() { // broken adventure/omen card (scryfall changed it for some reason) // Scavenger Regent // Exude Toxin // https://scryfall.com/card/tdm/90/scavenger-regent-exude-toxin - if (this.name.contains("//")) { + if (this.name.contains(" // ")) { throw new IllegalArgumentException("Scryfall: unsupported data type, broken reversible_card must have same simple name" + this.set + " - " + this.collector_number + " - " + this.name); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index 0f294434a0b7..1af4b98bf7a7 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -640,7 +640,7 @@ private Map getlocalizedMultiverseIds(Integer englishMultiverse private String normalizeName(String name) { //Split card - if (name.contains("//")) { + if (name.contains(" // ")) { if (name.indexOf('(') > 0) { name = name.substring(0, name.indexOf('(') - 1); } diff --git a/Mage.Sets/src/mage/cards/s/SPDrPilotedByPeni.java b/Mage.Sets/src/mage/cards/s/SPDrPilotedByPeni.java new file mode 100644 index 000000000000..e21dd19f2f87 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SPDrPilotedByPeni.java @@ -0,0 +1,68 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SetTargetPointer; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.ModifiedPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SPDrPilotedByPeni extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a modified creature you control"); + + static { + filter.add(ModifiedPredicate.instance); + } + + public SPDrPilotedByPeni(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{W}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.SPIDER); + this.subtype.add(SubType.HERO); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When SP//dr enters, put a +1/+1 counter on target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Whenever a modified creature you control deals combat damage to a player, draw a card. + this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility( + new DrawCardSourceControllerEffect(1), filter, + false, SetTargetPointer.NONE, true + )); + } + + private SPDrPilotedByPeni(final SPDrPilotedByPeni card) { + super(card); + } + + @Override + public SPDrPilotedByPeni copy() { + return new SPDrPilotedByPeni(this); + } +} diff --git a/Mage.Sets/src/mage/sets/MarvelsSpiderMan.java b/Mage.Sets/src/mage/sets/MarvelsSpiderMan.java index 6479f72823e5..d4d03eff0c64 100644 --- a/Mage.Sets/src/mage/sets/MarvelsSpiderMan.java +++ b/Mage.Sets/src/mage/sets/MarvelsSpiderMan.java @@ -185,6 +185,8 @@ private MarvelsSpiderMan() { cards.add(new SetCardInfo("Rocket-Powered Goblin Glider", 172, Rarity.RARE, mage.cards.r.RocketPoweredGoblinGlider.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rocket-Powered Goblin Glider", 281, Rarity.RARE, mage.cards.r.RocketPoweredGoblinGlider.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Romantic Rendezvous", 86, Rarity.COMMON, mage.cards.r.RomanticRendezvous.class)); + cards.add(new SetCardInfo("SP//dr, Piloted by Peni", 147, Rarity.UNCOMMON, mage.cards.s.SPDrPilotedByPeni.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("SP//dr, Piloted by Peni", 199, Rarity.UNCOMMON, mage.cards.s.SPDrPilotedByPeni.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sandman's Quicksand", 63, Rarity.UNCOMMON, mage.cards.s.SandmansQuicksand.class)); cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 112, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sandman, Shifting Scoundrel", 266, Rarity.RARE, mage.cards.s.SandmanShiftingScoundrel.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index be58f93c5981..bb1b5f5da398 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -1471,7 +1471,7 @@ public void assertHandCount(Player player, String cardName, int count) throws As cardName = EmptyNames.replaceTestCommandByObjectName(cardName); int actual; - if (cardName.contains("//")) { // special logic for checked split cards, because in game logic of card name filtering is different from in test + if (cardName.contains(" // ")) { // special logic for checked split cards, because in game logic of card name filtering is different from in test actual = 0; for (Card card : currentGame.getPlayer(player.getId()).getHand().getCards(currentGame)) { if (CardUtil.haveSameNames(card.getName(), cardName, true)) {