diff --git a/Mage.Sets/src/mage/cards/a/AquitectsWill.java b/Mage.Sets/src/mage/cards/a/AquitectsWill.java index bfd1b62c984..bee6d447f36 100644 --- a/Mage.Sets/src/mage/cards/a/AquitectsWill.java +++ b/Mage.Sets/src/mage/cards/a/AquitectsWill.java @@ -27,7 +27,6 @@ */ package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalOneShotEffect; @@ -44,6 +43,8 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author ilcartographer @@ -65,7 +66,7 @@ public class AquitectsWill extends CardImpl { this.getSpellAbility().addTarget(new TargetLandPermanent()); // That land is an Island in addition to its other types for as long as it has a flood counter on it. - this.getSpellAbility().addEffect(new AquitectsWillEffect(Duration.Custom, false, false, "Island")); + this.getSpellAbility().addEffect(new AquitectsWillEffect(Duration.Custom, false, false, SubType.ISLAND)); // If you control a Merfolk, draw a card. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( @@ -86,7 +87,7 @@ public class AquitectsWill extends CardImpl { class AquitectsWillEffect extends BecomesBasicLandTargetEffect { - public AquitectsWillEffect(Duration duration, boolean chooseLandType, boolean loseType, String... landNames) { + public AquitectsWillEffect(Duration duration, boolean chooseLandType, boolean loseType, SubType... landNames) { super(duration, chooseLandType, loseType, landNames); staticText = "That land is an Island in addition to its other types for as long as it has a flood counter on it"; } diff --git a/Mage.Sets/src/mage/cards/b/BlanketOfNight.java b/Mage.Sets/src/mage/cards/b/BlanketOfNight.java index edf5eda307a..bc64cdb9908 100644 --- a/Mage.Sets/src/mage/cards/b/BlanketOfNight.java +++ b/Mage.Sets/src/mage/cards/b/BlanketOfNight.java @@ -27,7 +27,6 @@ */ package mage.cards.b; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.AddCardSubtypeAllEffect; @@ -35,13 +34,12 @@ import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.DependencyType; -import mage.constants.Duration; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** * * @author Galatolol @@ -55,7 +53,7 @@ public class BlanketOfNight extends CardImpl { // Each land is a Swamp in addition to its other land types. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(new BlackManaAbility(), Duration.WhileOnBattlefield, new FilterLandPermanent(), "Each land is a Swamp in addition to its other land types")); - ability.addEffect(new AddCardSubtypeAllEffect(StaticFilters.FILTER_LAND, "Swamp", DependencyType.BecomeSwamp)); + ability.addEffect(new AddCardSubtypeAllEffect(StaticFilters.FILTER_LAND, SubType.SWAMP, DependencyType.BecomeSwamp)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapy.java b/Mage.Sets/src/mage/cards/c/CabalTherapy.java index fc3fc9fb449..52f43ffae5d 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapy.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapy.java @@ -27,17 +27,13 @@ */ package mage.cards.c; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.NameACardEffect; import mage.abilities.keyword.FlashbackAbility; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TimingRule; @@ -47,6 +43,8 @@ import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** * * @author jonubuu @@ -98,6 +96,15 @@ class CabalTherapyEffect extends OneShotEffect { Cards hand = targetPlayer.getHand(); for (Card card : hand.getCards(game)) { + if(card.isSplitCard()){ + SplitCard splitCard = (SplitCard) card; + if(splitCard.getLeftHalfCard().getName().equals(cardName)){ + targetPlayer.discard(card, source, game); + } + else if(splitCard.getRightHalfCard().getName().equals(cardName)){ + targetPlayer.discard(card, source, game); + } + } if (card.getName().equals(cardName)) { targetPlayer.discard(card, source, game); } diff --git a/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java b/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java index ea6fc67b062..10097e67219 100644 --- a/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java +++ b/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java @@ -27,10 +27,6 @@ */ package mage.cards.c; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; @@ -61,6 +57,11 @@ import mage.target.common.TargetLandPermanent; import mage.target.targetpointer.FixedTarget; import mage.watchers.Watcher; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author MTGfan @@ -80,7 +81,7 @@ public class CyclopeanTomb extends CardImpl { Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.MIRE.createInstance()), new GenericManaCost(2), new IsStepCondition(PhaseStep.UPKEEP), "{2}, {T}: Put a mire counter on target non-Swamp land. That land is a Swamp for as long as it has a mire counter on it. Activate this ability only during your upkeep."); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetLandPermanent(filter)); - ability.addEffect(new BecomeSwampEffect(Duration.Custom, false, true, "Swamp")); + ability.addEffect(new BecomeSwampEffect(Duration.Custom, false, true, SubType.SWAMP)); this.addAbility(ability, new CyclopeanTombCounterWatcher()); // When Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb. this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CyclopeanTombCreateTriggeredEffect())); @@ -98,7 +99,7 @@ public class CyclopeanTomb extends CardImpl { class BecomeSwampEffect extends BecomesBasicLandTargetEffect { - public BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, String... landNames) { + public BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, SubType... landNames) { super(duration, chooseLandType, loseOther, landNames); staticText = "That land is a Swamp for as long as it has a mire counter on it"; } diff --git a/Mage.Sets/src/mage/cards/d/Dreamwinder.java b/Mage.Sets/src/mage/cards/d/Dreamwinder.java index 4192779d652..e1ea9198300 100644 --- a/Mage.Sets/src/mage/cards/d/Dreamwinder.java +++ b/Mage.Sets/src/mage/cards/d/Dreamwinder.java @@ -27,7 +27,6 @@ */ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -49,6 +48,8 @@ import mage.target.Target; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author cbt33, LevelX2 (Walk the Aeons), KholdFuzion (Dandan) @@ -65,7 +66,7 @@ public class Dreamwinder extends CardImpl { // Dreamwinder can't attack unless defending player controls an Island. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent(SubType.ISLAND,"an Island")))); // {U}, Sacrifice an Island: Target land becomes an Island until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new ManaCostsImpl("{U}")); Target target = new TargetLandPermanent(); ability.addTarget(target); FilterControlledLandPermanent filter = new FilterControlledLandPermanent("an Island"); diff --git a/Mage.Sets/src/mage/cards/f/Floodchaser.java b/Mage.Sets/src/mage/cards/f/Floodchaser.java index e518521d6dc..51c2f65e846 100644 --- a/Mage.Sets/src/mage/cards/f/Floodchaser.java +++ b/Mage.Sets/src/mage/cards/f/Floodchaser.java @@ -27,7 +27,6 @@ */ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -48,6 +47,8 @@ import mage.counters.CounterType; import mage.filter.common.FilterLandPermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -67,7 +68,7 @@ public class Floodchaser extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent(SubType.ISLAND,"an Island")))); // {U}, Remove a +1/+1 counter from Floodchaser: Target land becomes an Island until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new ManaCostsImpl("{U}")); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(1))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GaeasLiege.java b/Mage.Sets/src/mage/cards/g/GaeasLiege.java index a6779926b59..c4ef418b790 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasLiege.java +++ b/Mage.Sets/src/mage/cards/g/GaeasLiege.java @@ -27,7 +27,6 @@ */ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -55,6 +54,8 @@ import mage.game.combat.CombatGroup; import mage.game.permanent.Permanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author anonymous @@ -81,7 +82,7 @@ public class GaeasLiege extends CardImpl { new InvertCondition(SourceAttackingCondition.instance), "As long as {this} isn't attacking, its power and toughness are each equal to the number of Forests you control. As long as {this} is attacking, its power and toughness are each equal to the number of Forests defending player controls."))); // {tap}: Target land becomes a Forest until Gaea's Liege leaves the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, "Forest"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, SubType.FOREST), new TapSourceCost()); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GracefulAntelope.java b/Mage.Sets/src/mage/cards/g/GracefulAntelope.java index 2085787674a..31384ee670f 100644 --- a/Mage.Sets/src/mage/cards/g/GracefulAntelope.java +++ b/Mage.Sets/src/mage/cards/g/GracefulAntelope.java @@ -27,7 +27,6 @@ */ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; @@ -37,9 +36,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.target.Target; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author cbt33, Loki (Contaminated Ground), Plopman (Larceny) @@ -56,7 +58,7 @@ public class GracefulAntelope extends CardImpl { // Plainswalk this.addAbility(new PlainswalkAbility()); // Whenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield,"Plains"), true); + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, SubType.PLAINS), true); Target target = new TargetLandPermanent(); ability.addTarget(target); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/k/KavuRecluse.java b/Mage.Sets/src/mage/cards/k/KavuRecluse.java index a12195e47c7..91d2c9406f8 100644 --- a/Mage.Sets/src/mage/cards/k/KavuRecluse.java +++ b/Mage.Sets/src/mage/cards/k/KavuRecluse.java @@ -27,7 +27,6 @@ */ package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -37,9 +36,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LoneFox @@ -53,7 +55,7 @@ public class KavuRecluse extends CardImpl { this.toughness = new MageInt(2); // {T}: Target land becomes a Forest until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Forest"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.FOREST), new TapSourceCost()); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KukemssaSerpent.java b/Mage.Sets/src/mage/cards/k/KukemssaSerpent.java index 561b135d6f0..58a3669f2e3 100644 --- a/Mage.Sets/src/mage/cards/k/KukemssaSerpent.java +++ b/Mage.Sets/src/mage/cards/k/KukemssaSerpent.java @@ -27,7 +27,6 @@ */ package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; @@ -48,6 +47,8 @@ import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -72,7 +73,7 @@ public class KukemssaSerpent extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent(SubType.ISLAND, "an Island")))); // {U}, Sacrifice an Island: Target land an opponent controls becomes an Island until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new ManaCostsImpl("{U}")); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filterControlledLand, true))); ability.addTarget(new TargetLandPermanent(filterOpponentLand)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java index f0801b2df50..f9a62da0dc5 100644 --- a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java +++ b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java @@ -27,7 +27,6 @@ */ package mage.cards.q; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -52,6 +51,8 @@ import mage.target.Target; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -105,7 +106,7 @@ class QuicksilverFountainEffect extends OneShotEffect { if (player.choose(Outcome.Neutral, targetNonIslandLand, source.getId(), game)) { Permanent landChosen = game.getPermanent(targetNonIslandLand.getFirstTarget()); landChosen.addCounters(CounterType.FLOOD.createInstance(), source, game); - ContinuousEffect becomesBasicLandTargetEffect = new BecomesBasicLandTargetEffect(Duration.OneUse, "Island"); + ContinuousEffect becomesBasicLandTargetEffect = new BecomesBasicLandTargetEffect(Duration.OneUse, SubType.ISLAND); becomesBasicLandTargetEffect.addDependencyType(DependencyType.BecomeIsland); ConditionalContinuousEffect effect = new ConditionalContinuousEffect(becomesBasicLandTargetEffect, new LandHasFloodCounterCondition(this), staticText); this.setTargetPointer(new FixedTarget(landChosen, game)); diff --git a/Mage.Sets/src/mage/cards/s/SlimyKavu.java b/Mage.Sets/src/mage/cards/s/SlimyKavu.java index 46740344c29..58a212235f7 100644 --- a/Mage.Sets/src/mage/cards/s/SlimyKavu.java +++ b/Mage.Sets/src/mage/cards/s/SlimyKavu.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -37,9 +36,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LoneFox @@ -53,7 +55,7 @@ public class SlimyKavu extends CardImpl { this.toughness = new MageInt(2); // {T}: Target land becomes a Swamp until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Swamp"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.SWAMP), new TapSourceCost()); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/StreambedAquitects.java b/Mage.Sets/src/mage/cards/s/StreambedAquitects.java index d17fe78f7c0..36c41796d37 100644 --- a/Mage.Sets/src/mage/cards/s/StreambedAquitects.java +++ b/Mage.Sets/src/mage/cards/s/StreambedAquitects.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -48,6 +47,8 @@ import mage.target.Target; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -75,7 +76,7 @@ public class StreambedAquitects extends CardImpl { this.addAbility(ability); // {tap}: Target land becomes an Island until end of turn. - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new TapSourceCost()); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost()); target = new TargetLandPermanent(); ability.addTarget(target); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TheloniteMonk.java b/Mage.Sets/src/mage/cards/t/TheloniteMonk.java index c5d1be996e1..68d54206f89 100644 --- a/Mage.Sets/src/mage/cards/t/TheloniteMonk.java +++ b/Mage.Sets/src/mage/cards/t/TheloniteMonk.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -39,12 +38,15 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -66,7 +68,7 @@ public class TheloniteMonk extends CardImpl { this.toughness = new MageInt(2); // {tap}, Sacrifice a green creature: Target land becomes a Forest. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, "Forest"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, SubType.FOREST), new TapSourceCost()); ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TidalWarrior.java b/Mage.Sets/src/mage/cards/t/TidalWarrior.java index 0d86394f989..df631624317 100644 --- a/Mage.Sets/src/mage/cards/t/TidalWarrior.java +++ b/Mage.Sets/src/mage/cards/t/TidalWarrior.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -37,9 +36,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LoneFox @@ -55,7 +57,7 @@ public class TidalWarrior extends CardImpl { this.toughness = new MageInt(1); // {tap}: Target land becomes an Island until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost()); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TundraKavu.java b/Mage.Sets/src/mage/cards/t/TundraKavu.java index 868d36f9b18..c16924d507f 100644 --- a/Mage.Sets/src/mage/cards/t/TundraKavu.java +++ b/Mage.Sets/src/mage/cards/t/TundraKavu.java @@ -27,9 +27,6 @@ */ package mage.cards.t; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -40,11 +37,16 @@ import mage.cards.CardSetInfo; import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetLandPermanent; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author LoneFox @@ -76,7 +78,7 @@ public class TundraKavu extends CardImpl { class TundraKavuEffect extends BecomesBasicLandTargetEffect { public TundraKavuEffect() { - super(Duration.EndOfTurn, false, true, ""); + super(Duration.EndOfTurn, false, true); staticText = "Target land becomes a Plains or an Island until end of turn."; } @@ -105,7 +107,7 @@ class TundraKavuEffect extends BecomesBasicLandTargetEffect { return; } } - landTypes.add(choice.getChoice()); + landTypes.add(SubType.byDescription(choice.getChoice())); } else { this.discard(); } diff --git a/Mage.Sets/src/mage/cards/u/UrborgTombOfYawgmoth.java b/Mage.Sets/src/mage/cards/u/UrborgTombOfYawgmoth.java index 113d376d38c..8b0e0604135 100644 --- a/Mage.Sets/src/mage/cards/u/UrborgTombOfYawgmoth.java +++ b/Mage.Sets/src/mage/cards/u/UrborgTombOfYawgmoth.java @@ -27,7 +27,6 @@ */ package mage.cards.u; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.AddCardSubtypeAllEffect; @@ -38,6 +37,8 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** * * @author Plopman @@ -51,7 +52,7 @@ public class UrborgTombOfYawgmoth extends CardImpl { // Each land is a Swamp in addition to its other land types. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(new BlackManaAbility(), Duration.WhileOnBattlefield, new FilterLandPermanent(), "Each land is a Swamp in addition to its other land types")); - ability.addEffect(new AddCardSubtypeAllEffect(new FilterLandPermanent(), "Swamp", DependencyType.BecomeSwamp)); + ability.addEffect(new AddCardSubtypeAllEffect(new FilterLandPermanent(), SubType.SWAMP, DependencyType.BecomeSwamp)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/z/ZombieTrailblazer.java b/Mage.Sets/src/mage/cards/z/ZombieTrailblazer.java index 4f2924fec05..2a40ca527bf 100644 --- a/Mage.Sets/src/mage/cards/z/ZombieTrailblazer.java +++ b/Mage.Sets/src/mage/cards/z/ZombieTrailblazer.java @@ -27,7 +27,6 @@ */ package mage.cards.z; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -49,6 +48,8 @@ import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -70,7 +71,7 @@ public class ZombieTrailblazer extends CardImpl { // Tap an untapped Zombie you control: Target land becomes a Swamp until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Swamp"), new TapTargetCost(new TargetControlledPermanent(filter))); + new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.SWAMP), new TapTargetCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java index b1cd97178b2..795088dc07c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java @@ -131,4 +131,19 @@ public class DiscardTest extends CardTestPlayerBase { assertLife(playerB, 18); } + + @Test + public void testCabalTherapyAfterMathCard(){ + addCard(Zone.HAND, playerA, "Cabal Therapy", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10); + addCard(Zone.HAND, playerB, "Driven // Despair"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cabal Therapy", playerB); + + setChoice(playerA, "Driven"); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertHandCount(playerB, "Driven // Despair", 0); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/SpreadingSeasTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/SpreadingSeasTest.java index 78105fe4f1b..9711860d238 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/SpreadingSeasTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/SpreadingSeasTest.java @@ -84,4 +84,30 @@ public class SpreadingSeasTest extends CardTestPlayerBase { assertHandCount(playerA, 1); } + @Test + public void testUtopiaSprawlWithSpreadingSeas(){ + addCard(Zone.HAND, playerA, "Spreading Seas", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 10); + addCard(Zone.HAND, playerA, "Utopia Sprawl"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Utopia Sprawl","Forest"); + setChoice(playerA, "Green"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spreading Seas", "Forest"); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + assertNotSubtype("Forest", "Forest"); + } + + + @Test + public void testSpreadingSeasWithUrzaLand(){ + addCard(Zone.HAND, playerA, "Spreading Seas", 1); + addCard(Zone.BATTLEFIELD, playerA, "Urza's Tower", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 10); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spreading Seas", "Urza's Tower"); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + assertNotSubtype("Urza's Tower", "Urza's"); + assertNotSubtype("Urza's Tower", "Tower"); + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java index d47f92f5cc9..e4ca7328352 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java @@ -32,7 +32,6 @@ import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.*; import mage.filter.FilterPermanent; -import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -43,9 +42,9 @@ import mage.game.permanent.Permanent; public class AddCardSubtypeAllEffect extends ContinuousEffectImpl { private static FilterPermanent filter; - private static String addedSubtype; + private static SubType addedSubtype; - public AddCardSubtypeAllEffect(FilterPermanent _filter, String _addedSubtype, DependencyType _dependency) { + public AddCardSubtypeAllEffect(FilterPermanent _filter, SubType _addedSubtype, DependencyType _dependency) { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); filter = _filter; staticText = ""; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java index 5d57ecdb8d2..845dba88961 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java @@ -39,6 +39,7 @@ import mage.players.Player; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.UUID; /** @@ -49,38 +50,38 @@ import java.util.UUID; public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { protected boolean chooseLandType; - protected ArrayList landTypes = new ArrayList(); - protected ArrayList landTypesToAdd = new ArrayList(); + protected List landTypes = new ArrayList<>(); + protected List landTypesToAdd = new ArrayList<>(); protected boolean loseOther; // loses all other abilities, card types, and creature types public BecomesBasicLandTargetEffect(Duration duration) { - this(duration, true, new String[0]); + this(duration, true); } - public BecomesBasicLandTargetEffect(Duration duration, String... landNames) { + public BecomesBasicLandTargetEffect(Duration duration, SubType... landNames) { this(duration, false, landNames); } - public BecomesBasicLandTargetEffect(Duration duration, boolean chooseLandType, String... landNames) { + public BecomesBasicLandTargetEffect(Duration duration, boolean chooseLandType, SubType... landNames) { this(duration, chooseLandType, true, landNames); } - public BecomesBasicLandTargetEffect(Duration duration, boolean chooseLandType, boolean loseOther, String... landNames) { + public BecomesBasicLandTargetEffect(Duration duration, boolean chooseLandType, boolean loseOther, SubType... landNames) { super(duration, Outcome.Detriment); this.landTypes.addAll(Arrays.asList(landNames)); - if (landTypes.contains("Mountain")) { + if (landTypes.contains(SubType.MOUNTAIN)) { dependencyTypes.add(DependencyType.BecomeMountain); } - if (landTypes.contains("Forest")) { + if (landTypes.contains(SubType.FOREST)) { dependencyTypes.add(DependencyType.BecomeForest); } - if (landTypes.contains("Swamp")) { + if (landTypes.contains(SubType.SWAMP)) { dependencyTypes.add(DependencyType.BecomeSwamp); } - if (landTypes.contains("Island")) { + if (landTypes.contains(SubType.ISLAND)) { dependencyTypes.add(DependencyType.BecomeIsland); } - if (landTypes.contains("Plains")) { + if (landTypes.contains(SubType.PLAINS)) { dependencyTypes.add(DependencyType.BecomePlains); } this.chooseLandType = chooseLandType; @@ -116,7 +117,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { if (controller != null) { Choice choice = new ChoiceBasicLandType(); controller.choose(outcome, choice, game); - landTypes.add(choice.getChoice()); + landTypes.add(SubType.byDescription(choice.getChoice())); } else { this.discard(); } @@ -147,7 +148,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { land.getSubtype(game).addAll(landTypes); } else { landTypesToAdd.clear(); - for (String subtype : landTypes) { + for (SubType subtype : landTypes) { if (!land.getSubtype(game).contains(subtype)) { land.getSubtype(game).add(subtype); landTypesToAdd.add(subtype); @@ -156,21 +157,21 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { } break; case AbilityAddingRemovingEffects_6: - for (String landType : landTypesToAdd) { + for (SubType landType : landTypesToAdd) { switch (landType) { - case "Swamp": + case SWAMP: land.addAbility(new BlackManaAbility(), source.getSourceId(), game); break; - case "Mountain": + case MOUNTAIN: land.addAbility(new RedManaAbility(), source.getSourceId(), game); break; - case "Forest": + case FOREST: land.addAbility(new GreenManaAbility(), source.getSourceId(), game); break; - case "Island": + case ISLAND: land.addAbility(new BlueManaAbility(), source.getSourceId(), game); break; - case "Plains": + case PLAINS: land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); break; } @@ -194,7 +195,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { } else { sb.append("Target land becomes a "); int i = 1; - for (String landType : landTypes) { + for (SubType landType : landTypes) { if (i > 1) { if (i == landTypes.size()) { sb.append(" and "); diff --git a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java index 5818ddcf40e..c623bc59666 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java @@ -94,7 +94,7 @@ class AuraSwapEffect extends OneShotEffect { if (controller != null) { Permanent auraSourcePermanent = game.getPermanent(source.getSourceId()); if (auraSourcePermanent != null - && auraSourcePermanent.getSubtype(game).contains("Aura") + && auraSourcePermanent.getSubtype(game).contains(SubType.AURA) && auraSourcePermanent.getOwnerId().equals(source.getControllerId())) { Permanent enchantedPermanent = game.getPermanent(auraSourcePermanent.getAttachedTo()); filterCardToCheck.add(new AuraCardCanAttachToPermanentId(enchantedPermanent.getId())); diff --git a/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java b/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java index f075acca4a7..2e54362a8d1 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java @@ -110,8 +110,8 @@ class EmbalmEffect extends OneShotEffect { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer) token.getColor(game).setColor(ObjectColor.WHITE); - if (!token.getSubtype(game).contains("Zombie")) { - token.getSubtype(game).add(0, "Zombie"); + if (!token.getSubtype(game).contains(SubType.ZOMBIE)) { + token.getSubtype(game).add(0, SubType.ZOMBIE); } token.getManaCost().clear(); game.fireEvent(GameEvent.getEvent(GameEvent.EventType.EMBALMED_CREATURE, token.getId(), source.getSourceId(), controller.getId())); diff --git a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java index 998b12bd507..10260b59d66 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java @@ -115,13 +115,13 @@ class EternalizeEffect extends OneShotEffect { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer) token.getColor(game).setColor(ObjectColor.BLACK); - if (!token.getSubtype(game).contains("Zombie")) { - token.getSubtype(game).add(0, "Zombie"); + if (!token.getSubtype(game).contains(SubType.ZOMBIE)) { + token.getSubtype(game).add(0, SubType.ZOMBIE); } token.getManaCost().clear(); token.getPower().modifyBaseValue(4); token.getToughness().modifyBaseValue(4); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.EMBALMED_CREATURE, token.getId(), source.getSourceId(), controller.getId())); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ETERNALIZED_CREATURE, token.getId(), source.getSourceId(), controller.getId())); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId(), false, false, null); // Probably it makes sense to remove also the Eternalize ability (it's not shown on the token cards). // Also it can never get active or? But it's not mentioned in the reminder text. diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index bc10ea7d207..0e18ee927cd 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -292,6 +292,7 @@ public class GameEvent implements Serializable { EXPLOITED_CREATURE, EVOLVED_CREATURE, EMBALMED_CREATURE, + ETERNALIZED_CREATURE, ATTACH, ATTACHED, STAY_ATTACHED, UNATTACH, UNATTACHED, diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index f6c67594c07..e145144f62b 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -27,7 +27,6 @@ */ package mage.game.permanent; -import java.util.*; import mage.MageObject; import mage.MageObjectReference; import mage.ObjectColor; @@ -56,6 +55,8 @@ import mage.players.Player; import mage.util.GameLog; import mage.util.ThreadLocalStringBuilder; +import java.util.*; + /** * @author BetaSteward_at_googlemail.com */ @@ -925,7 +926,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { @Override public boolean cantBeAttachedBy(MageObject source, Game game) { for (ProtectionAbility ability : this.getAbilities(game).getProtectionAbilities()) { - if (!(source.getSubtype(game).contains("Aura") + if (!(source.getSubtype(game).contains(SubType.AURA) && !ability.removesAuras()) && !source.getId().equals(ability.getAuraIdNotToBeRemoved()) && !ability.canTarget(source, game)) { diff --git a/Mage/src/main/java/mage/util/SubTypeList.java b/Mage/src/main/java/mage/util/SubTypeList.java index e434b957159..71d920983df 100644 --- a/Mage/src/main/java/mage/util/SubTypeList.java +++ b/Mage/src/main/java/mage/util/SubTypeList.java @@ -9,15 +9,6 @@ import java.util.stream.Collectors; public class SubTypeList extends ArrayList { - - public void add(int index, String s) { - add(index, SubType.byDescription(s)); - } - - public void add(int index, SubType s) { - super.add(index, s); - } - public boolean addAll(List subtypes) { return addAll(subtypes.stream().map(SubType::byDescription).collect(Collectors.toList())); } @@ -26,9 +17,6 @@ public class SubTypeList extends ArrayList { return removeAll(subtypes.stream().map(SubType::byDescription).collect(Collectors.toList())); } - public boolean add(SubType s) { - return super.add(s); - } public boolean add(SubType... subTypes) { return Collections.addAll(this, subTypes);