diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index a1963f587c1..883df510da6 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -1259,10 +1259,10 @@ public class GameController implements GameCallback { .collect(Collectors.joining(", "))); StringBuilder sb = new StringBuilder(); - sb.append("FIX command called by " + user.getName() + ""); + sb.append("FIX command called by ").append(user.getName()).append(""); sb.append(""); // font resize start for all next logs - sb.append("
Game ID: " + game.getId()); - + sb.append("
Game ID: ").append(game.getId()); + sb.append("
Phase: ").append(game.getTurn().getPhaseType().toString()).append(" Step: ").append(game.getTurn().getStepType().toString()); // pings info sb.append("
"); sb.append(getPingsInfo()); @@ -1272,7 +1272,7 @@ public class GameController implements GameCallback { // fix active Player playerActive = game.getPlayer(state.getActivePlayerId()); - sb.append("
Fixing active player: " + getName(playerActive)); + sb.append("
Fixing active player: ").append(getName(playerActive)); if (playerActive != null && !playerActive.canRespond()) { fixActions.add("active player fix"); @@ -1280,16 +1280,16 @@ public class GameController implements GameCallback { sb.append("
Try to concede..."); playerActive.concede(game); playerActive.leave(); // abort any wait response actions - sb.append(" (" + asWarning("OK") + ", concede done)"); + sb.append(" (").append(asWarning("OK")).append(", concede done)"); sb.append("
Try to skip step..."); Phase currentPhase = game.getPhase(); if (currentPhase != null) { currentPhase.getStep().skipStep(game, state.getActivePlayerId()); fixedAlready = true; - sb.append(" (" + asWarning("OK") + ", skip step done)"); + sb.append(" (").append(asWarning("OK")).append(", skip step done)"); } else { - sb.append(" (" + asBad("FAIL") + ", step is null)"); + sb.append(" (").append(asBad("FAIL")).append(", step is null)"); } } else { sb.append(playerActive != null ? " (" + asGood("OK") + ", can respond)" : " (" + asGood("OK") + ", no player)"); @@ -1297,7 +1297,7 @@ public class GameController implements GameCallback { // fix lost choosing dialog Player choosingPlayer = game.getPlayer(state.getChoosingPlayerId()); - sb.append("
Fixing choosing player: " + getName(choosingPlayer)); + sb.append("
Fixing choosing player: ").append(getName(choosingPlayer)); if (choosingPlayer != null && !choosingPlayer.canRespond()) { fixActions.add("choosing player fix"); @@ -1305,7 +1305,7 @@ public class GameController implements GameCallback { sb.append("
Try to concede..."); choosingPlayer.concede(game); choosingPlayer.leave(); // abort any wait response actions - sb.append(" (" + asWarning("OK") + ", concede done)"); + sb.append(" (").append(asWarning("OK")).append(", concede done)"); sb.append("
Try to skip step..."); if (fixedAlready) { @@ -1315,9 +1315,9 @@ public class GameController implements GameCallback { if (currentPhase != null) { currentPhase.getStep().skipStep(game, state.getActivePlayerId()); fixedAlready = true; - sb.append(" (" + asWarning("OK") + ", skip step done)"); + sb.append(" (").append(asWarning("OK")).append(", skip step done)"); } else { - sb.append(" (" + asBad("FAIL") + ", step is null)"); + sb.append(" (").append(asBad("FAIL")).append(", step is null)"); } } } else { @@ -1326,7 +1326,7 @@ public class GameController implements GameCallback { // fix lost priority Player priorityPlayer = game.getPlayer(state.getPriorityPlayerId()); - sb.append("
Fixing priority player: " + getName(priorityPlayer)); + sb.append("
Fixing priority player: ").append(getName(priorityPlayer)); if (priorityPlayer != null && !priorityPlayer.canRespond()) { fixActions.add("priority player fix"); @@ -1334,19 +1334,19 @@ public class GameController implements GameCallback { sb.append("
Try to concede..."); priorityPlayer.concede(game); priorityPlayer.leave(); // abort any wait response actions - sb.append(" (" + asWarning("OK") + ", concede done)"); + sb.append(" (").append(asWarning("OK")).append(", concede done)"); sb.append("
Try to skip step..."); if (fixedAlready) { - sb.append(" (" + asWarning("OK") + ", already skipped before)"); + sb.append(" (").append(asWarning("OK")).append(", already skipped before)"); } else { Phase currentPhase = game.getPhase(); if (currentPhase != null) { currentPhase.getStep().skipStep(game, state.getActivePlayerId()); fixedAlready = true; - sb.append(" (" + asWarning("OK") + ", skip step done)"); + sb.append(" (").append(asWarning("OK")).append(", skip step done)"); } else { - sb.append(" (" + asBad("FAIL") + ", step is null)"); + sb.append(" (").append(asBad("FAIL")).append(", step is null)"); } } } else { @@ -1356,10 +1356,10 @@ public class GameController implements GameCallback { // fix timeout sb.append("
Fixing future timeout: "); if (futureTimeout != null) { - sb.append("cancelled?=" + futureTimeout.isCancelled()); - sb.append("...done?=" + futureTimeout.isDone()); + sb.append("cancelled?=").append(futureTimeout.isCancelled()); + sb.append("...done?=").append(futureTimeout.isDone()); int delay = (int) futureTimeout.getDelay(TimeUnit.SECONDS); - sb.append("...getDelay?=" + delay); + sb.append("...getDelay?=").append(delay); if (delay < 25) { fixActions.add("future timeout fix"); @@ -1367,12 +1367,12 @@ public class GameController implements GameCallback { sb.append("
Try to pass..."); PassAbility pass = new PassAbility(); game.endTurn(pass); - sb.append(" (" + asWarning("OK") + ", pass done)"); + sb.append(" (").append(asWarning("OK")).append(", pass done)"); } else { - sb.append(" (" + asGood("OK") + ", delay > 25)"); + sb.append(" (").append(asGood("OK")).append(", delay > 25)"); } } else { - sb.append(" (" + asGood("OK") + ", timeout is not using)"); + sb.append(" (").append(asGood("OK")).append(", timeout is not using)"); } // TODO: fix non started game (send game started event to user?) @@ -1382,7 +1382,7 @@ public class GameController implements GameCallback { fixActions.add("none"); } String appliedFixes = fixActions.stream().collect(Collectors.joining(", ")); - sb.append("
Applied fixes: " + appliedFixes); + sb.append("
Applied fixes: ").append(appliedFixes); sb.append("
"); // font resize end sb.append("
"); diff --git a/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java b/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java index e0503095188..76707204e81 100644 --- a/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java +++ b/Mage.Sets/src/mage/cards/a/AbzanBeastmaster.java @@ -21,7 +21,7 @@ public final class AbzanBeastmaster extends CardImpl { public AbzanBeastmaster(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/a/AerieBowmasters.java b/Mage.Sets/src/mage/cards/a/AerieBowmasters.java index 8d4f11ce502..baac41ba679 100644 --- a/Mage.Sets/src/mage/cards/a/AerieBowmasters.java +++ b/Mage.Sets/src/mage/cards/a/AerieBowmasters.java @@ -19,7 +19,7 @@ public final class AerieBowmasters extends CardImpl { public AerieBowmasters(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.ARCHER); this.power = new MageInt(3); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/a/AetherwindBasker.java b/Mage.Sets/src/mage/cards/a/AetherwindBasker.java index e2bc62492da..3ca50e87661 100644 --- a/Mage.Sets/src/mage/cards/a/AetherwindBasker.java +++ b/Mage.Sets/src/mage/cards/a/AetherwindBasker.java @@ -17,7 +17,6 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledCreaturePermanent; /** * diff --git a/Mage.Sets/src/mage/cards/a/AffaGuardHound.java b/Mage.Sets/src/mage/cards/a/AffaGuardHound.java index a5415096b09..419bf0c33ed 100644 --- a/Mage.Sets/src/mage/cards/a/AffaGuardHound.java +++ b/Mage.Sets/src/mage/cards/a/AffaGuardHound.java @@ -23,7 +23,7 @@ public final class AffaGuardHound extends CardImpl { public AffaGuardHound (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/a/AinokArtillerist.java b/Mage.Sets/src/mage/cards/a/AinokArtillerist.java index 589990f025b..ffb54011776 100644 --- a/Mage.Sets/src/mage/cards/a/AinokArtillerist.java +++ b/Mage.Sets/src/mage/cards/a/AinokArtillerist.java @@ -23,7 +23,7 @@ public final class AinokArtillerist extends CardImpl { public AinokArtillerist(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.ARCHER); this.power = new MageInt(4); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/a/AinokBondKin.java b/Mage.Sets/src/mage/cards/a/AinokBondKin.java index ccec3c06fcf..5c0aea14cf2 100644 --- a/Mage.Sets/src/mage/cards/a/AinokBondKin.java +++ b/Mage.Sets/src/mage/cards/a/AinokBondKin.java @@ -33,7 +33,7 @@ public final class AinokBondKin extends CardImpl { public AinokBondKin(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SOLDIER); this.power = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/a/AinokGuide.java b/Mage.Sets/src/mage/cards/a/AinokGuide.java index 2136d4f9769..b59cd42b1b7 100644 --- a/Mage.Sets/src/mage/cards/a/AinokGuide.java +++ b/Mage.Sets/src/mage/cards/a/AinokGuide.java @@ -25,7 +25,7 @@ public final class AinokGuide extends CardImpl { public AinokGuide(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SCOUT); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java b/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java index 0a406fc3434..aa812a835d7 100644 --- a/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java +++ b/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java @@ -31,7 +31,7 @@ public final class AinokSurvivalist extends CardImpl { public AinokSurvivalist(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/a/AinokTracker.java b/Mage.Sets/src/mage/cards/a/AinokTracker.java index 1c3d8b14754..c4909ef07ef 100644 --- a/Mage.Sets/src/mage/cards/a/AinokTracker.java +++ b/Mage.Sets/src/mage/cards/a/AinokTracker.java @@ -19,7 +19,7 @@ public final class AinokTracker extends CardImpl { public AinokTracker(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SCOUT); this.power = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/a/AkroanMastiff.java b/Mage.Sets/src/mage/cards/a/AkroanMastiff.java index f1e385cde98..7b61b400b2e 100644 --- a/Mage.Sets/src/mage/cards/a/AkroanMastiff.java +++ b/Mage.Sets/src/mage/cards/a/AkroanMastiff.java @@ -23,7 +23,7 @@ public final class AkroanMastiff extends CardImpl { public AkroanMastiff(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/a/ArmoredAscension.java b/Mage.Sets/src/mage/cards/a/ArmoredAscension.java index ad9a117331d..25b7a1516bb 100644 --- a/Mage.Sets/src/mage/cards/a/ArmoredAscension.java +++ b/Mage.Sets/src/mage/cards/a/ArmoredAscension.java @@ -34,11 +34,13 @@ public final class ArmoredAscension extends CardImpl { this.subtype.add(SubType.AURA); + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + // Enchanted creature gets +1/+1 for each Plains you control and has flying. PermanentsOnBattlefieldCount amount = new PermanentsOnBattlefieldCount(filter, 1); SimpleStaticAbility ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(amount, amount, Duration.WhileOnBattlefield)); ability.addEffect(new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)); diff --git a/Mage.Sets/src/mage/cards/a/AshmouthHound.java b/Mage.Sets/src/mage/cards/a/AshmouthHound.java index 15e10029c72..dda0221e81a 100644 --- a/Mage.Sets/src/mage/cards/a/AshmouthHound.java +++ b/Mage.Sets/src/mage/cards/a/AshmouthHound.java @@ -19,7 +19,7 @@ public final class AshmouthHound extends CardImpl { public AshmouthHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/b/BINGO.java b/Mage.Sets/src/mage/cards/b/BINGO.java index 185acbd19d8..d6d4b004a2e 100644 --- a/Mage.Sets/src/mage/cards/b/BINGO.java +++ b/Mage.Sets/src/mage/cards/b/BINGO.java @@ -39,7 +39,7 @@ public final class BINGO extends CardImpl { public BINGO(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/b/Banehound.java b/Mage.Sets/src/mage/cards/b/Banehound.java index 493e33caa61..20f196c29a9 100644 --- a/Mage.Sets/src/mage/cards/b/Banehound.java +++ b/Mage.Sets/src/mage/cards/b/Banehound.java @@ -19,7 +19,7 @@ public final class Banehound extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); this.subtype.add(SubType.NIGHTMARE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/b/BlazingHellhound.java b/Mage.Sets/src/mage/cards/b/BlazingHellhound.java index 65ed6aee7c0..61d0e0f67e6 100644 --- a/Mage.Sets/src/mage/cards/b/BlazingHellhound.java +++ b/Mage.Sets/src/mage/cards/b/BlazingHellhound.java @@ -25,7 +25,7 @@ public final class BlazingHellhound extends CardImpl { public BlazingHellhound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); - this.subtype.add(SubType.ELEMENTAL, SubType.HOUND); + this.subtype.add(SubType.ELEMENTAL, SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/b/BloodHound.java b/Mage.Sets/src/mage/cards/b/BloodHound.java index f182a4b5e3a..98e7ef6b120 100644 --- a/Mage.Sets/src/mage/cards/b/BloodHound.java +++ b/Mage.Sets/src/mage/cards/b/BloodHound.java @@ -26,7 +26,7 @@ public final class BloodHound extends CardImpl { public BloodHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/b/BorosMastiff.java b/Mage.Sets/src/mage/cards/b/BorosMastiff.java index 9d2e118ed86..35811ff7790 100644 --- a/Mage.Sets/src/mage/cards/b/BorosMastiff.java +++ b/Mage.Sets/src/mage/cards/b/BorosMastiff.java @@ -23,7 +23,7 @@ public final class BorosMastiff extends CardImpl { public BorosMastiff (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/c/CatharsCompanion.java b/Mage.Sets/src/mage/cards/c/CatharsCompanion.java index d26614f24ff..f42b71fd1e1 100644 --- a/Mage.Sets/src/mage/cards/c/CatharsCompanion.java +++ b/Mage.Sets/src/mage/cards/c/CatharsCompanion.java @@ -27,7 +27,7 @@ public final class CatharsCompanion extends CardImpl { public CatharsCompanion(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/c/CausticHound.java b/Mage.Sets/src/mage/cards/c/CausticHound.java index 021f30af70a..266d106cec3 100644 --- a/Mage.Sets/src/mage/cards/c/CausticHound.java +++ b/Mage.Sets/src/mage/cards/c/CausticHound.java @@ -19,7 +19,7 @@ public final class CausticHound extends CardImpl { public CausticHound (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/c/ChakramRetriever.java b/Mage.Sets/src/mage/cards/c/ChakramRetriever.java index 5f606092e5e..19fc2daf8e5 100644 --- a/Mage.Sets/src/mage/cards/c/ChakramRetriever.java +++ b/Mage.Sets/src/mage/cards/c/ChakramRetriever.java @@ -25,7 +25,7 @@ public final class ChakramRetriever extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfArashin.java b/Mage.Sets/src/mage/cards/c/ChampionOfArashin.java index 52d66a318cc..a9941dacae9 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfArashin.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfArashin.java @@ -17,7 +17,7 @@ public final class ChampionOfArashin extends CardImpl { public ChampionOfArashin(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(3); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/c/CorpseCur.java b/Mage.Sets/src/mage/cards/c/CorpseCur.java index 617c2602158..79144ef43c0 100644 --- a/Mage.Sets/src/mage/cards/c/CorpseCur.java +++ b/Mage.Sets/src/mage/cards/c/CorpseCur.java @@ -30,7 +30,7 @@ public final class CorpseCur extends CardImpl { public CorpseCur (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); this.addAbility(InfectAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/d/DecoyGambit.java b/Mage.Sets/src/mage/cards/d/DecoyGambit.java index 99c29db62cd..d2385583793 100644 --- a/Mage.Sets/src/mage/cards/d/DecoyGambit.java +++ b/Mage.Sets/src/mage/cards/d/DecoyGambit.java @@ -6,7 +6,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; @@ -16,12 +15,14 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.targetadjustment.TargetAdjuster; - import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; +import mage.abilities.condition.Condition; +import mage.constants.Zone; /** * @author TheElk801 @@ -31,7 +32,8 @@ public final class DecoyGambit extends CardImpl { public DecoyGambit(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); - // For each opponent, choose up to one target creature that player controls, then return that creature to its owner's hand unless its controller has you draw a card. + // For each opponent, choose up to one target creature that player controls, + // then return that creature to its owner's hand unless its controller has you draw a card. this.getSpellAbility().addEffect(new DecoyGambitEffect()); this.getSpellAbility().setTargetAdjuster(DecoyGambitAdjuster.instance); } @@ -70,8 +72,8 @@ class DecoyGambitEffect extends OneShotEffect { DecoyGambitEffect() { super(Outcome.Benefit); - staticText = "For each opponent, choose up to one target creature that player controls, " + - "then return that creature to its owner's hand unless its controller has you draw a card."; + staticText = "For each opponent, choose up to one target creature that player controls, " + + "then return that creature to its owner's hand unless its controller has you draw a card."; } private DecoyGambitEffect(final DecoyGambitEffect effect) { @@ -86,6 +88,8 @@ class DecoyGambitEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); + HashSet permanentToHand = new HashSet(); + int numberOfCardsToDraw = 0; if (controller == null) { return false; } @@ -98,16 +102,54 @@ class DecoyGambitEffect extends OneShotEffect { .filter(Objects::nonNull) .collect(Collectors.toList()); for (Permanent permanent : permanents) { + // If a creature targeted by Decoy Gambit changes controller, it’s no longer a legal target. + new DecoyGambitCondition(permanent).apply(game, source); // save current controller Player player = game.getPlayer(permanent.getControllerId()); if (player == null) { continue; } - if (player.chooseUse(outcome, "Have " + controller.getName() + " draw a card? If you don't, " + - permanent.getName() + " will be returned to its owner's hand.", source, game) - && controller.drawCards(1, source.getSourceId(), game) > 0) { - player.moveCards(permanent, Zone.HAND, source, game); + if (player.chooseUse(outcome, "Have " + controller.getName() + " draw a card? If you don't, " + + permanent.getName() + " will be returned to its owner's hand.", source, game)) { + game.informPlayers(player.getName() + " chose to have " + controller.getName() + " draw a card."); + numberOfCardsToDraw += 1; + } else { + game.informPlayers(player.getName() + " chose to have their creature returned to their hand."); + permanentToHand.add(permanent); + } + } + /* + As the Decoy Gambit resolves, first the next opponent in turn order (or, if it’s an opponent’s + turn, the opponent whose turn it is) chooses whether you’ll draw a card or return their creature + that was targeted to its owner’s hand, then each other opponent in turn order does so knowing + the choices made before them. After all choices are made, you draw the appropriate number of + cards. After you’ve drawn, the appropriate creatures are all simultaneously returned to their owners’ hands. + */ + controller.drawCards(numberOfCardsToDraw, source.getSourceId(), game); + for (Permanent creature : permanentToHand) { + if (creature != null + && new DecoyGambitCondition(creature).apply(game, source)) { // same controller required + creature.moveToZone(Zone.HAND, source.getSourceId(), game, false); } } return true; } } + +class DecoyGambitCondition implements Condition { + + private UUID controllerId; + private final Permanent permanent; + + DecoyGambitCondition(Permanent permanent) { + this.permanent = permanent; + } + + @Override + public boolean apply(Game game, Ability source) { + if (controllerId == null) { // is the original controller set + controllerId = permanent.getControllerId(); // original controller set + } + return (permanent != null + && Objects.equals(controllerId, permanent.getControllerId())); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DrossRipper.java b/Mage.Sets/src/mage/cards/d/DrossRipper.java index d9867e585fc..836f431631d 100644 --- a/Mage.Sets/src/mage/cards/d/DrossRipper.java +++ b/Mage.Sets/src/mage/cards/d/DrossRipper.java @@ -22,7 +22,7 @@ public final class DrossRipper extends CardImpl { public DrossRipper (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{2}{B}"))); diff --git a/Mage.Sets/src/mage/cards/e/ElvenWarhounds.java b/Mage.Sets/src/mage/cards/e/ElvenWarhounds.java index e34c1972140..6809e3f2321 100644 --- a/Mage.Sets/src/mage/cards/e/ElvenWarhounds.java +++ b/Mage.Sets/src/mage/cards/e/ElvenWarhounds.java @@ -19,7 +19,7 @@ public final class ElvenWarhounds extends CardImpl { public ElvenWarhounds(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/e/EncampmentKeeper.java b/Mage.Sets/src/mage/cards/e/EncampmentKeeper.java index 13fb82d3cb3..d2c401c54f9 100644 --- a/Mage.Sets/src/mage/cards/e/EncampmentKeeper.java +++ b/Mage.Sets/src/mage/cards/e/EncampmentKeeper.java @@ -26,7 +26,7 @@ public final class EncampmentKeeper extends CardImpl { public EncampmentKeeper(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/f/FieryHellhound.java b/Mage.Sets/src/mage/cards/f/FieryHellhound.java index 62815a4ed5e..8381f487ef1 100644 --- a/Mage.Sets/src/mage/cards/f/FieryHellhound.java +++ b/Mage.Sets/src/mage/cards/f/FieryHellhound.java @@ -23,7 +23,7 @@ public final class FieryHellhound extends CardImpl { public FieryHellhound(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/f/FilthyCur.java b/Mage.Sets/src/mage/cards/f/FilthyCur.java index 9864aec0122..e47525388a8 100644 --- a/Mage.Sets/src/mage/cards/f/FilthyCur.java +++ b/Mage.Sets/src/mage/cards/f/FilthyCur.java @@ -23,7 +23,7 @@ public final class FilthyCur extends CardImpl { public FilthyCur(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/g/GateHound.java b/Mage.Sets/src/mage/cards/g/GateHound.java index c25ebded1b1..357df06b8fb 100644 --- a/Mage.Sets/src/mage/cards/g/GateHound.java +++ b/Mage.Sets/src/mage/cards/g/GateHound.java @@ -24,7 +24,7 @@ public final class GateHound extends CardImpl { public GateHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/g/GhostHounds.java b/Mage.Sets/src/mage/cards/g/GhostHounds.java index 1dcdcad4650..cac1255c0a2 100644 --- a/Mage.Sets/src/mage/cards/g/GhostHounds.java +++ b/Mage.Sets/src/mage/cards/g/GhostHounds.java @@ -31,7 +31,7 @@ public final class GhostHounds extends CardImpl { public GhostHounds(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/g/GoreVassal.java b/Mage.Sets/src/mage/cards/g/GoreVassal.java index cdfbfbb0945..4435be0dac8 100644 --- a/Mage.Sets/src/mage/cards/g/GoreVassal.java +++ b/Mage.Sets/src/mage/cards/g/GoreVassal.java @@ -23,7 +23,7 @@ public final class GoreVassal extends CardImpl { public GoreVassal(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/g/GreaterMossdog.java b/Mage.Sets/src/mage/cards/g/GreaterMossdog.java index 605af0ca90a..13c03b91872 100644 --- a/Mage.Sets/src/mage/cards/g/GreaterMossdog.java +++ b/Mage.Sets/src/mage/cards/g/GreaterMossdog.java @@ -18,7 +18,7 @@ public final class GreaterMossdog extends CardImpl { public GreaterMossdog(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); this.subtype.add(SubType.PLANT); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/g/GuardDogs.java b/Mage.Sets/src/mage/cards/g/GuardDogs.java index 6101684b23b..30fe2c42ee9 100644 --- a/Mage.Sets/src/mage/cards/g/GuardDogs.java +++ b/Mage.Sets/src/mage/cards/g/GuardDogs.java @@ -30,7 +30,7 @@ public final class GuardDogs extends CardImpl { public GuardDogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/h/HellfireMongrel.java b/Mage.Sets/src/mage/cards/h/HellfireMongrel.java index 125442d401c..da1da307dd9 100644 --- a/Mage.Sets/src/mage/cards/h/HellfireMongrel.java +++ b/Mage.Sets/src/mage/cards/h/HellfireMongrel.java @@ -25,7 +25,7 @@ public final class HellfireMongrel extends CardImpl { public HellfireMongrel(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/h/HollowDogs.java b/Mage.Sets/src/mage/cards/h/HollowDogs.java index 16f4eaa5e77..b2daa9ed901 100644 --- a/Mage.Sets/src/mage/cards/h/HollowDogs.java +++ b/Mage.Sets/src/mage/cards/h/HollowDogs.java @@ -20,7 +20,7 @@ public final class HollowDogs extends CardImpl { public HollowDogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}"); this.subtype.add(SubType.ZOMBIE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/h/HollowbornBarghest.java b/Mage.Sets/src/mage/cards/h/HollowbornBarghest.java index 21a5fe789f7..3e8991c95ee 100644 --- a/Mage.Sets/src/mage/cards/h/HollowbornBarghest.java +++ b/Mage.Sets/src/mage/cards/h/HollowbornBarghest.java @@ -36,7 +36,7 @@ public final class HollowbornBarghest extends CardImpl { public HollowbornBarghest(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); this.subtype.add(SubType.DEMON); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(7); this.toughness = new MageInt(6); diff --git a/Mage.Sets/src/mage/cards/h/HoundOfGriselbrand.java b/Mage.Sets/src/mage/cards/h/HoundOfGriselbrand.java index 938d4821645..50a3b66a2a2 100644 --- a/Mage.Sets/src/mage/cards/h/HoundOfGriselbrand.java +++ b/Mage.Sets/src/mage/cards/h/HoundOfGriselbrand.java @@ -19,7 +19,7 @@ public final class HoundOfGriselbrand extends CardImpl { public HoundOfGriselbrand(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/h/HoundOfTheFarbogs.java b/Mage.Sets/src/mage/cards/h/HoundOfTheFarbogs.java index 9206adf00fc..3af2670f038 100644 --- a/Mage.Sets/src/mage/cards/h/HoundOfTheFarbogs.java +++ b/Mage.Sets/src/mage/cards/h/HoundOfTheFarbogs.java @@ -28,7 +28,7 @@ public final class HoundOfTheFarbogs extends CardImpl { public HoundOfTheFarbogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); this.subtype.add(SubType.ZOMBIE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(5); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/h/Hydradoodle.java b/Mage.Sets/src/mage/cards/h/Hydradoodle.java index 75fc85bff8c..9ab48ab269b 100644 --- a/Mage.Sets/src/mage/cards/h/Hydradoodle.java +++ b/Mage.Sets/src/mage/cards/h/Hydradoodle.java @@ -32,7 +32,7 @@ public final class Hydradoodle extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{X}{G}{G}"); this.subtype.add(SubType.HYDRA); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(0); this.toughness = new MageInt(0); diff --git a/Mage.Sets/src/mage/cards/i/ImmolatingSouleater.java b/Mage.Sets/src/mage/cards/i/ImmolatingSouleater.java index bbeb3026099..02445eb06b2 100644 --- a/Mage.Sets/src/mage/cards/i/ImmolatingSouleater.java +++ b/Mage.Sets/src/mage/cards/i/ImmolatingSouleater.java @@ -22,7 +22,7 @@ public final class ImmolatingSouleater extends CardImpl { public ImmolatingSouleater(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java b/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java index 35296f3e40e..4c7eb1b336d 100644 --- a/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java +++ b/Mage.Sets/src/mage/cards/i/IsamaruHoundOfKonda.java @@ -19,7 +19,7 @@ public final class IsamaruHoundOfKonda extends CardImpl { public IsamaruHoundOfKonda(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); this.addSuperType(SuperType.LEGENDARY); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/k/KarplusanHound.java b/Mage.Sets/src/mage/cards/k/KarplusanHound.java index 1d0077baa7b..62149c4f00b 100644 --- a/Mage.Sets/src/mage/cards/k/KarplusanHound.java +++ b/Mage.Sets/src/mage/cards/k/KarplusanHound.java @@ -24,7 +24,7 @@ public final class KarplusanHound extends CardImpl { public KarplusanHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a Chandra planeswalker"); diff --git a/Mage.Sets/src/mage/cards/k/KunorosHoundOfAthreos.java b/Mage.Sets/src/mage/cards/k/KunorosHoundOfAthreos.java index fe8e6d8b153..f6eddc8ae6f 100644 --- a/Mage.Sets/src/mage/cards/k/KunorosHoundOfAthreos.java +++ b/Mage.Sets/src/mage/cards/k/KunorosHoundOfAthreos.java @@ -26,7 +26,7 @@ public final class KunorosHoundOfAthreos extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}"); this.addSuperType(SuperType.LEGENDARY); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/l/LavaHounds.java b/Mage.Sets/src/mage/cards/l/LavaHounds.java index 6e62d95e671..b7b481c90fc 100644 --- a/Mage.Sets/src/mage/cards/l/LavaHounds.java +++ b/Mage.Sets/src/mage/cards/l/LavaHounds.java @@ -19,7 +19,7 @@ public final class LavaHounds extends CardImpl { public LavaHounds(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/l/Leashling.java b/Mage.Sets/src/mage/cards/l/Leashling.java index 41f20990423..c4dfc5cd1e2 100644 --- a/Mage.Sets/src/mage/cards/l/Leashling.java +++ b/Mage.Sets/src/mage/cards/l/Leashling.java @@ -28,7 +28,7 @@ public final class Leashling extends CardImpl { public Leashling(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{6}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/l/LightningHounds.java b/Mage.Sets/src/mage/cards/l/LightningHounds.java index 4aba0b130e4..36ed3340f59 100644 --- a/Mage.Sets/src/mage/cards/l/LightningHounds.java +++ b/Mage.Sets/src/mage/cards/l/LightningHounds.java @@ -17,7 +17,7 @@ public final class LightningHounds extends CardImpl { public LightningHounds(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/l/LongshotSquad.java b/Mage.Sets/src/mage/cards/l/LongshotSquad.java index 42676ccb5b4..21f05d8648b 100644 --- a/Mage.Sets/src/mage/cards/l/LongshotSquad.java +++ b/Mage.Sets/src/mage/cards/l/LongshotSquad.java @@ -35,7 +35,7 @@ public final class LongshotSquad extends CardImpl { public LongshotSquad(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.ARCHER); this.power = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/l/LurkingJackals.java b/Mage.Sets/src/mage/cards/l/LurkingJackals.java index 4e292aad812..b46ee2691ac 100644 --- a/Mage.Sets/src/mage/cards/l/LurkingJackals.java +++ b/Mage.Sets/src/mage/cards/l/LurkingJackals.java @@ -110,7 +110,7 @@ class LurkingJackalsToken extends TokenImpl { public LurkingJackalsToken() { super("Hound", "3/2 Hound creature"); cardType.add(CardType.CREATURE); - subtype.add(SubType.HOUND); + subtype.add(SubType.DOG); power = new MageInt(3); toughness = new MageInt(2); } diff --git a/Mage.Sets/src/mage/cards/m/MadDog.java b/Mage.Sets/src/mage/cards/m/MadDog.java index 17254366cdf..797f4cf6c3e 100644 --- a/Mage.Sets/src/mage/cards/m/MadDog.java +++ b/Mage.Sets/src/mage/cards/m/MadDog.java @@ -30,7 +30,7 @@ public final class MadDog extends CardImpl { public MadDog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/m/MangaraTheDiplomat.java b/Mage.Sets/src/mage/cards/m/MangaraTheDiplomat.java index 6414f41f759..6ecfbad160a 100644 --- a/Mage.Sets/src/mage/cards/m/MangaraTheDiplomat.java +++ b/Mage.Sets/src/mage/cards/m/MangaraTheDiplomat.java @@ -116,7 +116,7 @@ class MangaraTheDiplomatCastTriggeredAbility extends TriggeredAbilityImpl { return player != null && watcher != null && player.hasOpponent(event.getPlayerId(), game) - && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 3; + && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2; } @Override diff --git a/Mage.Sets/src/mage/cards/m/MarrowGnawer.java b/Mage.Sets/src/mage/cards/m/MarrowGnawer.java index cdf48890efc..598c47ec005 100644 --- a/Mage.Sets/src/mage/cards/m/MarrowGnawer.java +++ b/Mage.Sets/src/mage/cards/m/MarrowGnawer.java @@ -2,7 +2,6 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -21,6 +20,8 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.RatToken; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** * * @author LevelX @@ -50,9 +51,11 @@ public final class MarrowGnawer extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(FearAbility.getInstance(), Duration.WhileOnBattlefield, filterFear))); // {T}, Sacrifice a Rat: create X 1/1 black Rat creature tokens, where X is the number of Rats you control. - Ability ability; - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new RatToken(),new PermanentsOnBattlefieldCount(filter3)), new SacrificeTargetCost(new TargetControlledPermanent(filterSacrifice))); - ability.addCost(new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new CreateTokenEffect(new RatToken(), new PermanentsOnBattlefieldCount(filter3, null)) + /*.setText("create X 1/1 black Rat creature tokens, where X is the number of Rats you control")*/, + new TapSourceCost()); + ability.addCost( new SacrificeTargetCost(new TargetControlledPermanent(filterSacrifice))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MogissWarhound.java b/Mage.Sets/src/mage/cards/m/MogissWarhound.java index 3ac5c7cc259..76b79af5e0e 100644 --- a/Mage.Sets/src/mage/cards/m/MogissWarhound.java +++ b/Mage.Sets/src/mage/cards/m/MogissWarhound.java @@ -26,7 +26,7 @@ public final class MogissWarhound extends CardImpl { public MogissWarhound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/m/MongrelPack.java b/Mage.Sets/src/mage/cards/m/MongrelPack.java index e2a0f56e40a..732f0c97ac1 100644 --- a/Mage.Sets/src/mage/cards/m/MongrelPack.java +++ b/Mage.Sets/src/mage/cards/m/MongrelPack.java @@ -1,7 +1,5 @@ - package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -13,18 +11,18 @@ import mage.constants.TurnPhase; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.DogToken; + +import java.util.UUID; /** - * * @author North */ public final class MongrelPack extends CardImpl { public MongrelPack(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); - this.subtype.add(SubType.HOUND); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.subtype.add(SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(1); @@ -33,7 +31,7 @@ public final class MongrelPack extends CardImpl { this.addAbility(new MongrelPackAbility()); } - public MongrelPack(final MongrelPack card) { + private MongrelPack(final MongrelPack card) { super(card); } @@ -45,11 +43,11 @@ public final class MongrelPack extends CardImpl { class MongrelPackAbility extends ZoneChangeTriggeredAbility { - public MongrelPackAbility() { - super(Zone.BATTLEFIELD, Zone.GRAVEYARD, new CreateTokenEffect(new HoundToken(), 4), "When {this} dies during combat, ", false); + MongrelPackAbility() { + super(Zone.BATTLEFIELD, Zone.GRAVEYARD, new CreateTokenEffect(new DogToken(), 4), "When {this} dies during combat, ", false); } - public MongrelPackAbility(MongrelPackAbility ability) { + private MongrelPackAbility(MongrelPackAbility ability) { super(ability); } @@ -68,24 +66,3 @@ class MongrelPackAbility extends ZoneChangeTriggeredAbility { return false; } } - -class HoundToken extends TokenImpl { - - public HoundToken() { - super("Hound", "1/1 green Hound creature token"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.HOUND); - - color.setGreen(true); - power = new MageInt(1); - toughness = new MageInt(1); - } - - public HoundToken(final HoundToken token) { - super(token); - } - - public HoundToken copy() { - return new HoundToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MonstrousHound.java b/Mage.Sets/src/mage/cards/m/MonstrousHound.java index cdebb8caa74..1eba97be678 100644 --- a/Mage.Sets/src/mage/cards/m/MonstrousHound.java +++ b/Mage.Sets/src/mage/cards/m/MonstrousHound.java @@ -26,7 +26,7 @@ public final class MonstrousHound extends CardImpl { public MonstrousHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/m/MoonEatingDog.java b/Mage.Sets/src/mage/cards/m/MoonEatingDog.java index 1467030f595..d5d2a004f16 100644 --- a/Mage.Sets/src/mage/cards/m/MoonEatingDog.java +++ b/Mage.Sets/src/mage/cards/m/MoonEatingDog.java @@ -30,7 +30,7 @@ public final class MoonEatingDog extends CardImpl { public MoonEatingDog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/m/MortisDogs.java b/Mage.Sets/src/mage/cards/m/MortisDogs.java index 310a8b88676..2f138d7819d 100644 --- a/Mage.Sets/src/mage/cards/m/MortisDogs.java +++ b/Mage.Sets/src/mage/cards/m/MortisDogs.java @@ -24,7 +24,7 @@ public final class MortisDogs extends CardImpl { public MortisDogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/m/Mossdog.java b/Mage.Sets/src/mage/cards/m/Mossdog.java index 6f3bff28272..b052767d072 100644 --- a/Mage.Sets/src/mage/cards/m/Mossdog.java +++ b/Mage.Sets/src/mage/cards/m/Mossdog.java @@ -24,7 +24,7 @@ public final class Mossdog extends CardImpl { public Mossdog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); this.subtype.add(SubType.PLANT); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/m/MowuLoyalCompanion.java b/Mage.Sets/src/mage/cards/m/MowuLoyalCompanion.java index 946b515178e..03ec484dcc9 100644 --- a/Mage.Sets/src/mage/cards/m/MowuLoyalCompanion.java +++ b/Mage.Sets/src/mage/cards/m/MowuLoyalCompanion.java @@ -25,7 +25,7 @@ public final class MowuLoyalCompanion extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.addSuperType(SuperType.LEGENDARY); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/m/MysticSkyfish.java b/Mage.Sets/src/mage/cards/m/MysticSkyfish.java new file mode 100644 index 00000000000..9c75a23b5c6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MysticSkyfish.java @@ -0,0 +1,41 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MysticSkyfish extends CardImpl { + + public MysticSkyfish(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.FISH); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Whenever you draw your second card each turn, Mystic Skyfish gains flying until end of turn. + this.addAbility(new DrawSecondCardTriggeredAbility( + new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false) + ); + } + + private MysticSkyfish(final MysticSkyfish card) { + super(card); + } + + @Override + public MysticSkyfish copy() { + return new MysticSkyfish(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PackMastiff.java b/Mage.Sets/src/mage/cards/p/PackMastiff.java index 92a049678b4..92413d6e2c3 100644 --- a/Mage.Sets/src/mage/cards/p/PackMastiff.java +++ b/Mage.Sets/src/mage/cards/p/PackMastiff.java @@ -28,7 +28,7 @@ public final class PackMastiff extends CardImpl { public PackMastiff(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/p/PakoArcaneRetriever.java b/Mage.Sets/src/mage/cards/p/PakoArcaneRetriever.java index c0b8a7ce639..f7abe82234c 100644 --- a/Mage.Sets/src/mage/cards/p/PakoArcaneRetriever.java +++ b/Mage.Sets/src/mage/cards/p/PakoArcaneRetriever.java @@ -29,7 +29,7 @@ public final class PakoArcaneRetriever extends CardImpl { this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/p/PatrolHound.java b/Mage.Sets/src/mage/cards/p/PatrolHound.java index aa3c45f9eec..266ba9535a8 100644 --- a/Mage.Sets/src/mage/cards/p/PatrolHound.java +++ b/Mage.Sets/src/mage/cards/p/PatrolHound.java @@ -22,7 +22,7 @@ public final class PatrolHound extends CardImpl { public PatrolHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/p/PhantomWhelp.java b/Mage.Sets/src/mage/cards/p/PhantomWhelp.java index 33d2e7e760d..f397cf302ab 100644 --- a/Mage.Sets/src/mage/cards/p/PhantomWhelp.java +++ b/Mage.Sets/src/mage/cards/p/PhantomWhelp.java @@ -22,7 +22,7 @@ public final class PhantomWhelp extends CardImpl { public PhantomWhelp(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); this.subtype.add(SubType.ILLUSION); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/p/PlagueDogs.java b/Mage.Sets/src/mage/cards/p/PlagueDogs.java index 9eda0693bc6..4982b290551 100644 --- a/Mage.Sets/src/mage/cards/p/PlagueDogs.java +++ b/Mage.Sets/src/mage/cards/p/PlagueDogs.java @@ -26,7 +26,7 @@ public final class PlagueDogs extends CardImpl { public PlagueDogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}"); this.subtype.add(SubType.ZOMBIE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/p/PyreHound.java b/Mage.Sets/src/mage/cards/p/PyreHound.java index 6e42ee1b4c4..4a17383d6db 100644 --- a/Mage.Sets/src/mage/cards/p/PyreHound.java +++ b/Mage.Sets/src/mage/cards/p/PyreHound.java @@ -22,7 +22,7 @@ public final class PyreHound extends CardImpl { public PyreHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/r/RakdosRagemutt.java b/Mage.Sets/src/mage/cards/r/RakdosRagemutt.java index e4c1a606b29..90171b0a0c8 100644 --- a/Mage.Sets/src/mage/cards/r/RakdosRagemutt.java +++ b/Mage.Sets/src/mage/cards/r/RakdosRagemutt.java @@ -19,7 +19,7 @@ public final class RakdosRagemutt extends CardImpl { public RakdosRagemutt(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/r/ResoluteWatchdog.java b/Mage.Sets/src/mage/cards/r/ResoluteWatchdog.java index 80f127f7006..2376752bd1a 100644 --- a/Mage.Sets/src/mage/cards/r/ResoluteWatchdog.java +++ b/Mage.Sets/src/mage/cards/r/ResoluteWatchdog.java @@ -25,7 +25,7 @@ public final class ResoluteWatchdog extends CardImpl { public ResoluteWatchdog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java b/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java index 3329be28191..95f4f69c7e5 100644 --- a/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java +++ b/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java @@ -23,7 +23,7 @@ public final class SaltRoadAmbushers extends CardImpl { public SaltRoadAmbushers(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/SandsteppeScavenger.java b/Mage.Sets/src/mage/cards/s/SandsteppeScavenger.java index 770fa837680..d23385995da 100644 --- a/Mage.Sets/src/mage/cards/s/SandsteppeScavenger.java +++ b/Mage.Sets/src/mage/cards/s/SandsteppeScavenger.java @@ -18,7 +18,7 @@ public final class SandsteppeScavenger extends CardImpl { public SandsteppeScavenger(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.subtype.add(SubType.SCOUT); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/s/ScrapyardMongrel.java b/Mage.Sets/src/mage/cards/s/ScrapyardMongrel.java index dc4727c6409..412f2bf00fa 100644 --- a/Mage.Sets/src/mage/cards/s/ScrapyardMongrel.java +++ b/Mage.Sets/src/mage/cards/s/ScrapyardMongrel.java @@ -26,7 +26,7 @@ public final class ScrapyardMongrel extends CardImpl { public ScrapyardMongrel(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.color.setRed(true); this.power = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/ShipwreckDowser.java b/Mage.Sets/src/mage/cards/s/ShipwreckDowser.java new file mode 100644 index 00000000000..b68abcb0976 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShipwreckDowser.java @@ -0,0 +1,51 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterInstantOrSorceryCard; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ShipwreckDowser extends CardImpl { + + private static final FilterCard filter + = new FilterInstantOrSorceryCard("instant or sorcery card from your graveyard"); + + public ShipwreckDowser(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Prowess + this.addAbility(new ProwessAbility()); + + // When Shipwreck Dowser enters the battlefield, return target instant or sorcery card from your graveyard to your hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability); + } + + private ShipwreckDowser(final ShipwreckDowser card) { + super(card); + } + + @Override + public ShipwreckDowser copy() { + return new ShipwreckDowser(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SnowHound.java b/Mage.Sets/src/mage/cards/s/SnowHound.java index e671b458028..1b9e1212b58 100644 --- a/Mage.Sets/src/mage/cards/s/SnowHound.java +++ b/Mage.Sets/src/mage/cards/s/SnowHound.java @@ -35,7 +35,7 @@ public final class SnowHound extends CardImpl { public SnowHound(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/s/StormCaller.java b/Mage.Sets/src/mage/cards/s/StormCaller.java new file mode 100644 index 00000000000..0fbd4f64b15 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StormCaller.java @@ -0,0 +1,41 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class StormCaller extends CardImpl { + + public StormCaller(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.OGRE); + this.subtype.add(SubType.SHAMAN); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Storm Caller enters the battlefield, it deals 2 damage to each opponent. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DamagePlayersEffect(2, TargetController.OPPONENT, "it") + )); + } + + private StormCaller(final StormCaller card) { + super(card); + } + + @Override + public StormCaller copy() { + return new StormCaller(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TeferisProtege.java b/Mage.Sets/src/mage/cards/t/TeferisProtege.java new file mode 100644 index 00000000000..cf392d9350b --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TeferisProtege.java @@ -0,0 +1,45 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TeferisProtege extends CardImpl { + + public TeferisProtege(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {1}{U}, {T}: Draw a card, then discard a card. + Ability ability = new SimpleActivatedAbility( + new DrawDiscardControllerEffect(1, 1), new ManaCostsImpl("{1}{U}") + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private TeferisProtege(final TeferisProtege card) { + super(card); + } + + @Override + public TeferisProtege copy() { + return new TeferisProtege(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThassasOracle.java b/Mage.Sets/src/mage/cards/t/ThassasOracle.java index a7ee33cc0e2..49fca6d9b8f 100644 --- a/Mage.Sets/src/mage/cards/t/ThassasOracle.java +++ b/Mage.Sets/src/mage/cards/t/ThassasOracle.java @@ -29,7 +29,10 @@ public final class ThassasOracle extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(3); - // When Thassa's Oracle enters the battlefield, look at the top X cards of your library, where X is your devotion to blue. Put one of them on top of your library and the rest on the bottom of your library in a random order. If X is greater than or equal to the number of cards in your library, you win the game. + // When Thassa's Oracle enters the battlefield, look at the top X cards of your library, where X is your devotion to blue. + // Put up to one of them on top of your library and the rest on the bottom of your library in a random order. + // If X is greater than or equal to the number of cards in your library, you win the game. + // (Each Blue in the mana costs of permanents you control counts toward your devotion to blue.) this.addAbility(new EntersBattlefieldTriggeredAbility(new ThassasOracleEffect()) .addHint(DevotionCount.U.getHint())); } diff --git a/Mage.Sets/src/mage/cards/t/ThrabenFoulbloods.java b/Mage.Sets/src/mage/cards/t/ThrabenFoulbloods.java index 7460f5d5a27..a2a07b22830 100644 --- a/Mage.Sets/src/mage/cards/t/ThrabenFoulbloods.java +++ b/Mage.Sets/src/mage/cards/t/ThrabenFoulbloods.java @@ -26,7 +26,7 @@ public final class ThrabenFoulbloods extends CardImpl { public ThrabenFoulbloods(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add(SubType.ZOMBIE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/t/ThrabenPurebloods.java b/Mage.Sets/src/mage/cards/t/ThrabenPurebloods.java index ecc9344de72..e5c7d92fb62 100644 --- a/Mage.Sets/src/mage/cards/t/ThrabenPurebloods.java +++ b/Mage.Sets/src/mage/cards/t/ThrabenPurebloods.java @@ -16,7 +16,7 @@ public final class ThrabenPurebloods extends CardImpl { public ThrabenPurebloods(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(5); diff --git a/Mage.Sets/src/mage/cards/t/ThrashingMossdog.java b/Mage.Sets/src/mage/cards/t/ThrashingMossdog.java index d3a8501c73d..c107bab3a18 100644 --- a/Mage.Sets/src/mage/cards/t/ThrashingMossdog.java +++ b/Mage.Sets/src/mage/cards/t/ThrashingMossdog.java @@ -23,7 +23,7 @@ public final class ThrashingMossdog extends CardImpl { public ThrashingMossdog (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); this.subtype.add(SubType.PLANT); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/t/TwoHeadedCerberus.java b/Mage.Sets/src/mage/cards/t/TwoHeadedCerberus.java index 495ca8c029c..476abb0bce7 100644 --- a/Mage.Sets/src/mage/cards/t/TwoHeadedCerberus.java +++ b/Mage.Sets/src/mage/cards/t/TwoHeadedCerberus.java @@ -17,7 +17,7 @@ public final class TwoHeadedCerberus extends CardImpl { public TwoHeadedCerberus(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/u/UnderworldCerberus.java b/Mage.Sets/src/mage/cards/u/UnderworldCerberus.java index 85bed3bdbcc..85f0a72e52b 100644 --- a/Mage.Sets/src/mage/cards/u/UnderworldCerberus.java +++ b/Mage.Sets/src/mage/cards/u/UnderworldCerberus.java @@ -25,7 +25,7 @@ public final class UnderworldCerberus extends CardImpl { public UnderworldCerberus(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(6); this.toughness = new MageInt(6); diff --git a/Mage.Sets/src/mage/cards/u/UnderworldRageHound.java b/Mage.Sets/src/mage/cards/u/UnderworldRageHound.java index ee3ee87feb5..0040b794033 100644 --- a/Mage.Sets/src/mage/cards/u/UnderworldRageHound.java +++ b/Mage.Sets/src/mage/cards/u/UnderworldRageHound.java @@ -20,7 +20,7 @@ public final class UnderworldRageHound extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add(SubType.ELEMENTAL); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(3); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/v/VampireHounds.java b/Mage.Sets/src/mage/cards/v/VampireHounds.java index f231c28a653..7cfaeabfd47 100644 --- a/Mage.Sets/src/mage/cards/v/VampireHounds.java +++ b/Mage.Sets/src/mage/cards/v/VampireHounds.java @@ -23,7 +23,7 @@ public final class VampireHounds extends CardImpl { public VampireHounds(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add(SubType.VAMPIRE); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/w/WarclampMastiff.java b/Mage.Sets/src/mage/cards/w/WarclampMastiff.java index 80478a69b60..1235a7b5408 100644 --- a/Mage.Sets/src/mage/cards/w/WarclampMastiff.java +++ b/Mage.Sets/src/mage/cards/w/WarclampMastiff.java @@ -17,7 +17,7 @@ public final class WarclampMastiff extends CardImpl { public WarclampMastiff(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/w/Watchdog.java b/Mage.Sets/src/mage/cards/w/Watchdog.java index f2fe75c5813..e3abcaf92c3 100644 --- a/Mage.Sets/src/mage/cards/w/Watchdog.java +++ b/Mage.Sets/src/mage/cards/w/Watchdog.java @@ -28,7 +28,7 @@ public final class Watchdog extends CardImpl { public Watchdog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(1); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/w/WildDogs.java b/Mage.Sets/src/mage/cards/w/WildDogs.java index 6d5b91cd191..58202239c7c 100644 --- a/Mage.Sets/src/mage/cards/w/WildDogs.java +++ b/Mage.Sets/src/mage/cards/w/WildDogs.java @@ -30,7 +30,7 @@ public final class WildDogs extends CardImpl { public WildDogs(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/w/WildMongrel.java b/Mage.Sets/src/mage/cards/w/WildMongrel.java index 861fc78d4c2..004c7b44fa1 100644 --- a/Mage.Sets/src/mage/cards/w/WildMongrel.java +++ b/Mage.Sets/src/mage/cards/w/WildMongrel.java @@ -24,7 +24,7 @@ public final class WildMongrel extends CardImpl { public WildMongrel(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/w/WildfireCerberus.java b/Mage.Sets/src/mage/cards/w/WildfireCerberus.java index 33bedaa6ae9..109b94a19a2 100644 --- a/Mage.Sets/src/mage/cards/w/WildfireCerberus.java +++ b/Mage.Sets/src/mage/cards/w/WildfireCerberus.java @@ -30,7 +30,7 @@ public final class WildfireCerberus extends CardImpl { public WildfireCerberus(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(4); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/w/WildwoodPatrol.java b/Mage.Sets/src/mage/cards/w/WildwoodPatrol.java new file mode 100644 index 00000000000..e0ab07f65b4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WildwoodPatrol.java @@ -0,0 +1,37 @@ +package mage.cards.w; + +import mage.MageInt; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WildwoodPatrol extends CardImpl { + + public WildwoodPatrol(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.CENTAUR); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + } + + private WildwoodPatrol(final WildwoodPatrol card) { + super(card); + } + + @Override + public WildwoodPatrol copy() { + return new WildwoodPatrol(this); + } +} diff --git a/Mage.Sets/src/mage/cards/z/ZodiacDog.java b/Mage.Sets/src/mage/cards/z/ZodiacDog.java index 9fb27e6f9bf..d0e42b72b41 100644 --- a/Mage.Sets/src/mage/cards/z/ZodiacDog.java +++ b/Mage.Sets/src/mage/cards/z/ZodiacDog.java @@ -17,7 +17,7 @@ public final class ZodiacDog extends CardImpl { public ZodiacDog(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); - this.subtype.add(SubType.HOUND); + this.subtype.add(SubType.DOG); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/sets/CoreSet2021.java b/Mage.Sets/src/mage/sets/CoreSet2021.java index 92bf8711190..fe86ef65f49 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2021.java +++ b/Mage.Sets/src/mage/sets/CoreSet2021.java @@ -24,7 +24,7 @@ public final class CoreSet2021 extends ExpansionSet { private CoreSet2021() { super("Core Set 2021", "M21", ExpansionSet.buildDate(2020, 7, 3), SetType.CORE); this.hasBoosters = true; - this.hasBasicLands = false; // change when basics are available + this.hasBasicLands = true; this.numBoosterSpecial = 0; this.numBoosterLands = 1; this.numBoosterCommon = 10; @@ -34,6 +34,23 @@ public final class CoreSet2021 extends ExpansionSet { this.maxCardNumberInBooster = 274; cards.add(new SetCardInfo("Double Vision", 142, Rarity.RARE, mage.cards.d.DoubleVision.class)); + cards.add(new SetCardInfo("Azusa, Lost but Seeking", 173, Rarity.RARE, mage.cards.a.AzusaLostButSeeking.class)); + cards.add(new SetCardInfo("Baneslayer Angel", 4, Rarity.MYTHIC, mage.cards.b.BaneslayerAngel.class)); + cards.add(new SetCardInfo("Containment Priest", 314, Rarity.RARE, mage.cards.c.ContainmentPriest.class)); + cards.add(new SetCardInfo("Fierce Empath", 181, Rarity.UNCOMMON, mage.cards.f.FierceEmpath.class)); + cards.add(new SetCardInfo("Grim Tutor", 103, Rarity.MYTHIC, mage.cards.g.GrimTutor.class)); + cards.add(new SetCardInfo("Island", 310, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Jeskai Elder", 53, Rarity.UNCOMMON, mage.cards.j.JeskaiElder.class)); cards.add(new SetCardInfo("Mangara, the Diplomat", 27, Rarity.MYTHIC, mage.cards.m.MangaraTheDiplomat.class)); + cards.add(new SetCardInfo("Mystic Skyfish", 326, Rarity.COMMON, mage.cards.m.MysticSkyfish.class)); + cards.add(new SetCardInfo("Quirion Dryad", 198, Rarity.UNCOMMON, mage.cards.q.QuirionDryad.class)); + cards.add(new SetCardInfo("Rain of Revelation", 61, Rarity.UNCOMMON, mage.cards.r.RainOfRevelation.class)); + cards.add(new SetCardInfo("Runed Halo", 32, Rarity.RARE, mage.cards.r.RunedHalo.class)); + cards.add(new SetCardInfo("Shipwreck Dowser", 71, Rarity.UNCOMMON, mage.cards.s.ShipwreckDowser.class)); + cards.add(new SetCardInfo("Storm Caller", 335, Rarity.COMMON, mage.cards.s.StormCaller.class)); + cards.add(new SetCardInfo("Teferi's Protege", 77, Rarity.COMMON, mage.cards.t.TeferisProtege.class)); + cards.add(new SetCardInfo("Tormod's Crypt", 241, Rarity.UNCOMMON, mage.cards.t.TormodsCrypt.class)); + cards.add(new SetCardInfo("Ugin, the Spirit Dragon", 1, Rarity.MYTHIC, mage.cards.u.UginTheSpiritDragon.class)); + cards.add(new SetCardInfo("Wildwood Patrol", 339, Rarity.COMMON, mage.cards.w.WildwoodPatrol.class)); } } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 23adfada9fb..8e32f24aec5 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -117,6 +117,9 @@ public class VerifyCardDataTest { // subtype skipListCreate(SKIP_LIST_SUBTYPE); skipListAddName(SKIP_LIST_SUBTYPE, "UGL", "Miss Demeanor"); + // the following is temporary + subtypesToIgnore.add("Dog"); + subtypesToIgnore.add("Hound"); // number skipListCreate(SKIP_LIST_NUMBER); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java index 087f375dc0d..a9a85c54a34 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java @@ -24,6 +24,11 @@ public class PermanentsOnBattlefieldCount implements DynamicValue { this(filter, 1); } + /** + * + * @param filter + * @param multiplier + */ public PermanentsOnBattlefieldCount(FilterPermanent filter, Integer multiplier) { this.filter = filter; this.multiplier = multiplier; diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index d9a0ad83b06..7f0c89242fe 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -119,6 +119,7 @@ public enum SubType { DEVIL("Devil", SubTypeSet.CreatureType), DINOSAUR("Dinosaur", SubTypeSet.CreatureType), // With Ixalan now being spoiled, need this to be selectable DJINN("Djinn", SubTypeSet.CreatureType), + DOG("Dog", SubTypeSet.CreatureType), DRAGON("Dragon", SubTypeSet.CreatureType), DRAKE("Drake", SubTypeSet.CreatureType), DREADNOUGHT("Dreadnought", SubTypeSet.CreatureType), @@ -175,7 +176,6 @@ public enum SubType { HOMUNCULUS("Homunculus", SubTypeSet.CreatureType), HORROR("Horror", SubTypeSet.CreatureType), HORSE("Horse", SubTypeSet.CreatureType), - HOUND("Hound", SubTypeSet.CreatureType), HUMAN("Human", SubTypeSet.CreatureType), HUNTER("Hunter", SubTypeSet.CreatureType), HUTT("Hutt", SubTypeSet.CreatureType, true), // Star Wars diff --git a/Mage/src/main/java/mage/game/permanent/token/HoundToken.java b/Mage/src/main/java/mage/game/permanent/token/DogToken.java similarity index 53% rename from Mage/src/main/java/mage/game/permanent/token/HoundToken.java rename to Mage/src/main/java/mage/game/permanent/token/DogToken.java index a20c160fc10..a2293505131 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HoundToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DogToken.java @@ -1,31 +1,29 @@ - - package mage.game.permanent.token; + +import mage.MageInt; import mage.constants.CardType; import mage.constants.SubType; -import mage.MageInt; /** - * * @author spjspj */ -public final class HoundToken extends TokenImpl { +public final class DogToken extends TokenImpl { - public HoundToken() { - super("Hound", "1/1 green Hound creature token"); + public DogToken() { + super("Dog", "1/1 green Dog creature token"); cardType.add(CardType.CREATURE); - subtype.add(SubType.HOUND); + subtype.add(SubType.DOG); color.setGreen(true); power = new MageInt(1); toughness = new MageInt(1); } - public HoundToken(final HoundToken token) { + private DogToken(final DogToken token) { super(token); } - public HoundToken copy() { - return new HoundToken(this); + public DogToken copy() { + return new DogToken(this); } } diff --git a/Mage/src/main/java/mage/game/permanent/token/MowuToken.java b/Mage/src/main/java/mage/game/permanent/token/MowuToken.java index 7312106610d..5d38df4ce09 100644 --- a/Mage/src/main/java/mage/game/permanent/token/MowuToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/MowuToken.java @@ -1,4 +1,3 @@ - package mage.game.permanent.token; import mage.MageInt; @@ -13,11 +12,11 @@ import mage.constants.SuperType; public final class MowuToken extends TokenImpl { public MowuToken() { - super("Mowu", "legendary 3/3 green Hound creature token named Mowu"); + super("Mowu", "legendary 3/3 green Dog creature token named Mowu"); cardType.add(CardType.CREATURE); color.setGreen(true); this.addSuperType(SuperType.LEGENDARY); - subtype.add(SubType.HOUND); + subtype.add(SubType.DOG); power = new MageInt(3); toughness = new MageInt(3); } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 08865e4121d..79d88a93f98 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -37438,5 +37438,52 @@ Gyruda, Doom of Depths|Ikoria: Lair of Behemoths|384|R|{4}{U/B}{U/B}|Legendary C Mysterious Egg|Ikoria: Lair of Behemoths|385|C|{1}|Creature - Egg|0|2|Whenever this creature mutates, put a +1/+1 counter on it.| Dirge Bat|Ikoria: Lair of Behemoths|386|R|{2}{B}{B}|Creature - Bat|3|3|Mutate {4}{B}{B}$Flash$Flying$Whenever this creature mutates, destroy target creature or planeswalker an opponent controls.| Crystalline Giant|Ikoria: Lair of Behemoths|387|R|{3}|Artifact Creature - Giant|3|3|At the beginning of combat on your turn, choose a kind of counter at random that Crystalline Giant doesn't have on it from among flying, first strike, deathtouch, hexproof, lifelink, menace, reach, trample, vigilance, or +1/+1. Put a counter of that kind on Crystalline Giant.| +Ugin, the Spirit Dragon|Core Set 2021|1|M|{8}|Legendary Planeswalker - Ugin|7|+2: Ugin, the Spirit Dragon deals 3 damage to any target.$−X: Exile each permanent with converted mana cost X or less that's one or more colors.$−10: You gain 7 life, draw seven cards, then put up to seven permanent cards from your hand onto the battlefield.| +Baneslayer Angel|Core Set 2021|4|M|{3}{W}{W}|Creature - Angel|5|5|Flying, first strike, lifelink, protection from Demons and from Dragons| Mangara, the Diplomat|Core Set 2021|27|M|{3}{W}|Legendary Creature - Human Cleric|2|4|Lifelink$Whenever an opponent attacks with creatures, if two or more of those creatures are attacking you and/or a planeswalker you control, draw a card.$Whenever an opponent casts their second spell each turn, draw a card.| +Pack Leader|Core Set 2021|29|R|{1}{W}|Creature - Dog|2|2|Other Dogs you control get +1/+1.$Whenever Pack Leader attacks, prevent all combat damage that would be dealt this turn to Dogs you control.| +Runed Halo|Core Set 2021|32|R|{W}{W}|Enchantment|||As Runed Halo enters the battlefield, choose a card name.$You have protection from the chosen name.| +Jeskai Elder|Core Set 2021|53|U|{1}{U}|Creature - Human Monk|1|2|Prowess$Whenever Jeskai Elder deals combat damage to a player, you may draw a card. If you do, discard a card.| +Rain of Revelation|Core Set 2021|61|U|{3}{U}|Instant|||Draw three cards, then discard a card.| +Shipwreck Dowser|Core Set 2021|71|U|{3}{U}{U}|Creature - Merfolk Wizard|3|3|Prowess$When Shipwreck Dowser enters the battlefield, return target instant or sorcery card from your graveyard to your hand.| +Teferi, Master of Time|Core Set 2021|75|M|{2}{U}{U}|Legendary Planeswalker - Teferi|3|You may activate loyalty abilities of Teferi, Master of Time on any player's turn any time you could cast an instant.$+1: Draw a card, then discard a card.$−3: Target creature you don't control phases out.$−10: Take two extra turns after this one.| +Teferi's Ageless Insight|Core Set 2021|76|R|{2}{U}{U}|Legendary Enchantment|||If you would draw a card except the first one you draw in each of your draw steps, draw two cards instead.| +Teferi's Protege|Core Set 2021|77|C|{2}{U}|Creature - Human Wizard|2|3|{1}{U}, {T}: Draw a card, then discard a card.| +Teferi's Tutelage|Core Set 2021|78|U|{2}{U}|Enchantment|||When Teferi's Tutelage enters the battlefield, draw a card, then discard a card.$Whenever you draw a card, target opponent mills two cards.| +Grim Tutor|Core Set 2021|103|M|{1}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand, then shuffle your library. You lose 3 life.| +Liliana, Waker of the Dead|Core Set 2021|108|M|{2}{B}{B}|Legendary Planeswalker - Liliana|4|+1: Each player discards a card. Each opponent who can't loses 3 life.$−3: Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard.$−7: You get an emblem with "At the beginning of combat on your turn, put target creature card from a graveyard onto the battlefield under your control. It gains haste."| +Peer into the Abyss|Core Set 2021|117|R|{4}{B}{B}{B}|Sorcery|||Target player draws cards equal to half the number of cards in their library and loses half their life. Round up each time.| +Vito, Thorn of the Dusk Rose|Core Set 2021|127|R|{2}{B}|Legendary Creature - Vampire Cleric|1|3|Whenever you gain life, target opponent loses that much life.${3}{B}{B}: Creatures you control gain lifelink until end of turn.| Double Vision|Core Set 2021|142|R|{3}{R}{R}|Enchantment|||Whenever you cast your first instant or sorcery spell each turn, copy that spell. You may choose new targets for the copy.| +Gadrak, the Crown-Scourge|Core Set 2021|146|R|{2}{R}|Legendary Creature - Dragon|5|4|Flying$Gadrak, the Crown-Scourge can't attack unless you control four or more artifacts.$At the beginning of your end step, create a Treasure token for each nontoken creature that died this turn.| +Azusa, Lost but Seeking|Core Set 2021|173|R|{2}{G}|Legendary Creature - Human Monk|1|2|You may play two additional lands on each of your turns.| +Fierce Empath|Core Set 2021|181|U|{2}{G}|Creature - Elf|1|1|When Fierce Empath enters the battlefield, you may search your library for a creature card with converted mana cost 6 or greater, reveal it, put it into your hand, then shuffle your library.| +Primal Might|Core Set 2021|197|R|{X}{G}|Sorcery|||Target creature you control gets +X/+X until end of turn. Then it fights up to one target creature you don't control.| +Quirion Dryad|Core Set 2021|198|U|{1}{G}|Creature - Dryad|1|1|Whenever you cast a white, blue, black, or red spell, put a +1/+1 counter on Quirion Dryad.| +Indulging Patrician|Core Set 2021|219|U|{1}{W}{B}|Creature - Vampire Noble|1|4|Flying$Lifelink$At the beginning of your end step, if you gained 3 or more life this turn, each opponent loses 3 life.| +Chromatic Orrery|Core Set 2021|228|M|{7}|Legendary Artifact|||You may spend mana as though it were mana of any color.${T}, Add {C}{C}{C}{C}{C}.${5}, {T}: Draw a card for each color among permanents you control.| +Sparkhunter Masticore|Core Set 2021|240|R|{3}|Artifact Creature - Masticore|3|4|As an additional cost to cast this spell, discard a card.$Protection from planeswalkers${1}: Sparkhunter Masticore deals 1 damage to target planeswalker.${3}: Sparkhunter Masticore gains indestructible until end of turn.| +Tormod's Crypt|Core Set 2021|241|U|{0}|Artifact|||{T}, Sacrifice Tormod's Crypt: Exile all cards from target player's graveyard.| +Rin and Seri, Inseparable|Core Set 2021|278|M|{1}{R}{G}{W}|Legendary Creature - Dog Cat|4|4|Whenever you cast a Dog spell, create a 1/1 green Cat creature token.$Whenever you cast a Cat spell, create a 1/1 white Dog creature token.${R}{G}{W}: Rin and Seri, Inseparable deals damage to any target equal to the number of Dogs you control. You gain life equal to the number of Cats you control.| +Island|Core Set 2021|310|C||Basic Land - Island|||({T}: Add {U}.)| +Containment Priest|Core Set 2021|314|R|{1}{W}|Creature - Human Cleric|2|2|Flash$If a nontoken creature would enter the battlefield and it wasn't cast, exile it instead.| +Basri, Devoted Paladin|Core Set 2021|320|M|{4}{W}{W}|Legendary Planeswalker - Basri|4|+1: Put a +1/+1 counter on up to one target creature. It gains vigilance until end of turn.$−1: Whenever a creature attacks this turn, put a +1/+1 counter on it.$−6: Creatures you control get +2/+2 and gain flying until end of turn.| +Adherent of Hope|Core Set 2021|321|C|{1}{W}|Creature - Human Soldier|2|1|At the beginning of combat on your turn, if you control a Basri planeswalker, put a +1/+1 counter on Adherent of Hope.| +Basri's Aegis|Core Set 2021|322|R|{2}{W}{W}|Sorcery|||Put a +1/+1 counter on each of up to two target creatures. You may search your library and/or graveyard for a card named Basri, Devoted Paladin, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Sigiled Contender|Core Set 2021|323|U|{3}{W}|Creature - Human Warrior|3|3|Sigiled Contender has lifelink as long as it has a +1/+1 counter on it.| +Teferi, Timeless Voyager|Core Set 2021|324|M|{4}{U}{U}|Legendary Planeswalker - Teferi|4|+1: Draw a card.$−3: Put target creature on top of its owner's library.$−8: Each creature target opponent controls phases out. Until the end of your next turn, they can't phase in.| +Historian of Zhalfir|Core Set 2021|325|U|{2}{U}{U}|Creature - Human Wizard|3|3|Whenever Historian of Zhalfir attacks, if you control a Teferi planeswalker, draw a card.| +Mystic Skyfish|Core Set 2021|326|C|{2}{U}|Creature - Fish|3|1|Whenever you draw your second card each turn, Mystic Skyfish gains flying until end of turn.| +Teferi's Wavecaster|Core Set 2021|327|R|{3}{U}{U}|Creature - Merfolk Wizard|3|3|Flash$When Teferi's Wavecaster enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timeless Voyager, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Liliana, Death Mage|Core Set 2021|328|M|{4}{B}{B}|Legendary Planeswalker - Liliana|4|+1: Return up to one target creature card from your graveyard to your hand.$−3: Destroy target creature. Its controller loses 2 life.$−7: Target opponent loses 2 life for each creature card in their graveyard.| +Liliana's Scorn|Core Set 2021|329|R|{3}{B}{B}|Sorcery|||Destroy target creature. You may search your library and/or graveyard for a card named Liliana, Death Mage, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Liliana's Scrounger|Core Set 2021|330|U|{2}{B}|Creature - Human Wizard|3|2|At the beginning of each end step, if a creature died this turn, you may put a loyalty counter on a Liliana planeswalker you control.| +Spirit of Malevolence|Core Set 2021|331|C|{1}{B}|Creature - Spirit|2|1|When Spirit of Malevolence dies, each opponent loses 1 life and you gain 1 life.| +Chandra, Flame's Catalyst|Core Set 2021|332|M|{4}{R}{R}|Legendary Planeswalker - Chandra|5|+1: Chandra, Flame's Catalyst deals 3 damage to each opponent.$−2: You may cast target red instant or sorcery card from your graveyard. If that spell would be put into your graveyard this turn, exile it instead.$−8: Discard your hand, then draw seven cards. Until end of turn, you may cast spells from your hand without paying their mana costs.| +Chandra's Firemaw|Core Set 2021|333|R|{3}{R}{R}|Creature - Hellion|4|2|Haste$When Chandra's Firemaw enters the battlefield, you may search your library and/or graveyard for a card named Chandra, Flame's Catalyst, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Keral Keep Disciples|Core Set 2021|334|U|{2}{R}{R}|Creature - Human Monk|4|3|Whenever you activate a loyalty ability of a Chandra planeswalker, Keral Keep Disciples deals 1 damage to each opponent.| +Storm Caller|Core Set 2021|335|C|{2}{R}|Creature - Ogre Shaman|3|2|When Storm Caller enters the battlefield, it deals 2 damage to each opponent.| +Garruk, Savage Herald|Core Set 2021|336|M|{4}{G}{G}|Legendary Planeswalker - Garruk|5|+1: Reveal the top card of your library. If it's a creature card, put it into your hand. Otherwise, put it on the bottom of your library.$−2: Target creature you control deals damage equal to its power to another target creature.$−7: Until end of turn, creatures you control gain "You may have this creature assign its combat damage as though it weren't blocked."| +Garruk's Warsteed|Core Set 2021|337|R|{3}{G}{G}|Creature - Rhino|3|5|Vigilance$When Garruk's Warsteed enters the battlefield, you may search your library and/or graveyard for a card named Garruk, Savage Herald, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Predatory Wurm|Core Set 2021|338|U|{3}{G}|Creature - Wurm|4|4|Vigilance$Predatory Wurm gets +2/+2 as long as you control a Garruk planeswalker.| +Wildwood Patrol|Core Set 2021|339|C|{2}{G}|Creature - Centaur Scout|4|2|Trample|