diff --git a/Mage.Sets/src/mage/cards/a/ArchwayOfInnovation.java b/Mage.Sets/src/mage/cards/a/ArchwayOfInnovation.java index c504b296708..6c55ea98b1b 100644 --- a/Mage.Sets/src/mage/cards/a/ArchwayOfInnovation.java +++ b/Mage.Sets/src/mage/cards/a/ArchwayOfInnovation.java @@ -1,23 +1,18 @@ package mage.cards.a; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.continuous.NextSpellCastHasAbilityEffect; import mage.abilities.keyword.ImproviseAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; -import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import java.util.UUID; @@ -27,17 +22,14 @@ import java.util.UUID; */ public final class ArchwayOfInnovation extends CardImpl { - private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ISLAND); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.ISLAND); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public ArchwayOfInnovation(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Archway of Innovation enters the battlefield tapped unless you control an Island. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control an Island")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {U}. this.addAbility(new BlueManaAbility()); diff --git a/Mage.Sets/src/mage/cards/a/ArenaOfGlory.java b/Mage.Sets/src/mage/cards/a/ArenaOfGlory.java index 7ce4f040f68..36dbfdf759d 100644 --- a/Mage.Sets/src/mage/cards/a/ArenaOfGlory.java +++ b/Mage.Sets/src/mage/cards/a/ArenaOfGlory.java @@ -1,17 +1,14 @@ package mage.cards.a; import mage.Mana; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.delayed.ManaSpentDelayedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.ExertSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.AddContinuousEffectToGame; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.HasteAbility; @@ -20,7 +17,6 @@ import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.SubType; import mage.filter.FilterPermanent; @@ -39,16 +35,13 @@ import java.util.UUID; public final class ArenaOfGlory extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.MOUNTAIN); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public ArenaOfGlory(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Arena of Glory enters the battlefield tapped unless you control a Mountain. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Mountain")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {R}. this.addAbility(new RedManaAbility()); diff --git a/Mage.Sets/src/mage/cards/a/ArgothSanctumOfNature.java b/Mage.Sets/src/mage/cards/a/ArgothSanctumOfNature.java index 2509a881611..dba7c8b7e5e 100644 --- a/Mage.Sets/src/mage/cards/a/ArgothSanctumOfNature.java +++ b/Mage.Sets/src/mage/cards/a/ArgothSanctumOfNature.java @@ -3,24 +3,18 @@ package mage.cards.a; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.MillCardsControllerEffect; -import mage.abilities.effects.common.TapSourceEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterPermanent; @@ -35,16 +29,14 @@ import java.util.UUID; */ public final class ArgothSanctumOfNature extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary green creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); filter.add(new ColorPredicate(ObjectColor.GREEN)); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Hint hint = new ConditionHint(condition, "You control a legendary green creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public ArgothSanctumOfNature(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -53,10 +45,7 @@ public final class ArgothSanctumOfNature extends CardImpl { this.meldsToClazz = mage.cards.h.HanweirTheWrithingTownship.class; // Argoth, Sanctum of Nature enters the battlefield tapped unless you control a legendary green creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary green creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {G}. this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/b/BaradDur.java b/Mage.Sets/src/mage/cards/b/BaradDur.java index 3433f8438a1..de281b8f23c 100644 --- a/Mage.Sets/src/mage/cards/b/BaradDur.java +++ b/Mage.Sets/src/mage/cards/b/BaradDur.java @@ -2,23 +2,20 @@ package mage.cards.b; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.condition.common.MorbidCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.ManacostVariableValue; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.keyword.AmassEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; @@ -29,15 +26,13 @@ import java.util.UUID; */ public final class BaradDur extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Hint hint = new ConditionHint( new InvertCondition(condition), "You control a legendary creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public BaradDur(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -45,10 +40,7 @@ public final class BaradDur extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // Barad-dur enters the battlefield tapped unless you control a legendary creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {B}. this.addAbility(new BlackManaAbility()); diff --git a/Mage.Sets/src/mage/cards/b/BlackcleaveCliffs.java b/Mage.Sets/src/mage/cards/b/BlackcleaveCliffs.java index 6deabd29d61..ff2abfe9f97 100644 --- a/Mage.Sets/src/mage/cards/b/BlackcleaveCliffs.java +++ b/Mage.Sets/src/mage/cards/b/BlackcleaveCliffs.java @@ -1,13 +1,8 @@ package mage.cards.b; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; @@ -15,22 +10,34 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author maurer.it_at_gmail.com */ public final class BlackcleaveCliffs extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); public BlackcleaveCliffs(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/b/BloomingMarsh.java b/Mage.Sets/src/mage/cards/b/BloomingMarsh.java index 4fb31a66838..886de558b14 100644 --- a/Mage.Sets/src/mage/cards/b/BloomingMarsh.java +++ b/Mage.Sets/src/mage/cards/b/BloomingMarsh.java @@ -1,13 +1,8 @@ package mage.cards.b; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -15,23 +10,33 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author fireshoes */ public final class BloomingMarsh extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public BloomingMarsh(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Blooming Marsh enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {B} or {G}. + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/b/BotanicalSanctum.java b/Mage.Sets/src/mage/cards/b/BotanicalSanctum.java index c7caa3e1b5c..5deb4cc550a 100644 --- a/Mage.Sets/src/mage/cards/b/BotanicalSanctum.java +++ b/Mage.Sets/src/mage/cards/b/BotanicalSanctum.java @@ -1,13 +1,8 @@ package mage.cards.b; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -15,23 +10,34 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author fireshoes */ public final class BotanicalSanctum extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public BotanicalSanctum(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Botanical Sanctum enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {G} or {U}. + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/b/BountifulPromenade.java b/Mage.Sets/src/mage/cards/b/BountifulPromenade.java index adf210b09a7..4b1d886867f 100644 --- a/Mage.Sets/src/mage/cards/b/BountifulPromenade.java +++ b/Mage.Sets/src/mage/cards/b/BountifulPromenade.java @@ -1,19 +1,17 @@ package mage.cards.b; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class BountifulPromenade extends CardImpl { @@ -22,16 +20,12 @@ public final class BountifulPromenade extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Bountiful Promenade enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {G} or {W}. + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/CanopyVista.java b/Mage.Sets/src/mage/cards/c/CanopyVista.java index 98a2937a403..f9f576f1215 100644 --- a/Mage.Sets/src/mage/cards/c/CanopyVista.java +++ b/Mage.Sets/src/mage/cards/c/CanopyVista.java @@ -1,44 +1,46 @@ package mage.cards.c; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** * @author fireshoes */ public final class CanopyVista extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("basic lands"); static { filter.add(SuperType.BASIC.getPredicate()); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); + public CanopyVista(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.FOREST); this.subtype.add(SubType.PLAINS); // Canopy Vista enters the battlefield tapped unless you control two or more basic lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); - String abilityText = "tapped unless you control two or more basic lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/CastleArdenvale.java b/Mage.Sets/src/mage/cards/c/CastleArdenvale.java index 54359630fba..ccd5e57a935 100644 --- a/Mage.Sets/src/mage/cards/c/CastleArdenvale.java +++ b/Mage.Sets/src/mage/cards/c/CastleArdenvale.java @@ -1,20 +1,16 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -28,17 +24,14 @@ import java.util.UUID; public final class CastleArdenvale extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.PLAINS); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public CastleArdenvale(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Castle Ardenvale enters the battlefield tapped unless you control a Plains. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Plains")); - + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CastleEmbereth.java b/Mage.Sets/src/mage/cards/c/CastleEmbereth.java index d7e927ee716..1d731f110d6 100644 --- a/Mage.Sets/src/mage/cards/c/CastleEmbereth.java +++ b/Mage.Sets/src/mage/cards/c/CastleEmbereth.java @@ -1,20 +1,16 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.SubType; import mage.filter.FilterPermanent; @@ -28,16 +24,13 @@ import java.util.UUID; public final class CastleEmbereth extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.MOUNTAIN); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public CastleEmbereth(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Castle Embereth enters the battlefield tapped unless you control a Mountain. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Mountain")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {R}. this.addAbility(new RedManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CastleGarenbrig.java b/Mage.Sets/src/mage/cards/c/CastleGarenbrig.java index 958eacacfce..97372f11458 100644 --- a/Mage.Sets/src/mage/cards/c/CastleGarenbrig.java +++ b/Mage.Sets/src/mage/cards/c/CastleGarenbrig.java @@ -4,20 +4,17 @@ import mage.ConditionalMana; import mage.MageObject; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.ConditionalColoredManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -31,16 +28,13 @@ import java.util.UUID; public final class CastleGarenbrig extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.FOREST); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public CastleGarenbrig(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Castle Garenbrig enters the battlefield tapped unless you control a Forest. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Forest")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {G}. this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CastleLocthwain.java b/Mage.Sets/src/mage/cards/c/CastleLocthwain.java index 2ad1959b854..4f11e611bba 100644 --- a/Mage.Sets/src/mage/cards/c/CastleLocthwain.java +++ b/Mage.Sets/src/mage/cards/c/CastleLocthwain.java @@ -1,22 +1,18 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -29,16 +25,13 @@ import java.util.UUID; public final class CastleLocthwain extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SWAMP); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public CastleLocthwain(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Castle Locthwain enters the battlefield tapped unless you control a Swamp. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Swamp")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {B}. this.addAbility(new BlackManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CastleVantress.java b/Mage.Sets/src/mage/cards/c/CastleVantress.java index fd28dfb896c..50ae26d8385 100644 --- a/Mage.Sets/src/mage/cards/c/CastleVantress.java +++ b/Mage.Sets/src/mage/cards/c/CastleVantress.java @@ -1,20 +1,16 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -27,16 +23,13 @@ import java.util.UUID; public final class CastleVantress extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ISLAND); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public CastleVantress(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Castle Vantress enters the battlefield tapped unless you control an Island. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control an Island")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {U}. this.addAbility(new BlueManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/CinderGlade.java b/Mage.Sets/src/mage/cards/c/CinderGlade.java index f351962bfdd..b7b992b8ca6 100644 --- a/Mage.Sets/src/mage/cards/c/CinderGlade.java +++ b/Mage.Sets/src/mage/cards/c/CinderGlade.java @@ -1,45 +1,46 @@ package mage.cards.c; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class CinderGlade extends CardImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); - + + private static final FilterLandPermanent filter = new FilterLandPermanent("basic lands"); + static { filter.add(SuperType.BASIC.getPredicate()); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); + public CinderGlade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.MOUNTAIN); this.subtype.add(SubType.FOREST); // Cinder Glade enters the battlefield tapped unless you control two or more basic lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); - String abilityText = "tapped unless you control two or more basic lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/ClifftopRetreat.java b/Mage.Sets/src/mage/cards/c/ClifftopRetreat.java index 447694a2727..8b1b7d78497 100644 --- a/Mage.Sets/src/mage/cards/c/ClifftopRetreat.java +++ b/Mage.Sets/src/mage/cards/c/ClifftopRetreat.java @@ -2,12 +2,8 @@ package mage.cards.c; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -24,19 +20,24 @@ import java.util.UUID; */ public final class ClifftopRetreat extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Mountain or a Plains"); static { filter.add(Predicates.or(SubType.MOUNTAIN.getPredicate(), SubType.PLAINS.getPredicate())); } - public ClifftopRetreat(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},null); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Mountain or a Plains"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + public ClifftopRetreat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); + + // Clifftop Retreat enters the battlefield tapped unless you control a Mountain or a Plains. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java b/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java index c3e5e334efe..a2f2f9438b9 100644 --- a/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java +++ b/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java @@ -1,37 +1,43 @@ package mage.cards.c; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author fireshoes */ public final class ConcealedCourtyard extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public ConcealedCourtyard(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Concealed Courtyard enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {W}. - // {T}: Add {W} or {B}.this.addAbility(new BlackManaAbility()); this.addAbility(new WhiteManaAbility()); + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/CopperlineGorge.java b/Mage.Sets/src/mage/cards/c/CopperlineGorge.java index 61d2bb442d1..f11c8f502a6 100644 --- a/Mage.Sets/src/mage/cards/c/CopperlineGorge.java +++ b/Mage.Sets/src/mage/cards/c/CopperlineGorge.java @@ -1,35 +1,43 @@ package mage.cards.c; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author maurer.it_at_gmail.com */ public final class CopperlineGorge extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public CopperlineGorge(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); // Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DarkslickShores.java b/Mage.Sets/src/mage/cards/d/DarkslickShores.java index 0c828b10faa..5b7ca200d1e 100644 --- a/Mage.Sets/src/mage/cards/d/DarkslickShores.java +++ b/Mage.Sets/src/mage/cards/d/DarkslickShores.java @@ -1,13 +1,8 @@ package mage.cards.d; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; @@ -17,27 +12,32 @@ import mage.constants.ComparisonType; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; +import java.util.UUID; + /** - * * @author maurer.it_at_gmail.com */ public final class DarkslickShores extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); static { filter.add(AnotherPredicate.instance); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public DarkslickShores(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); // Darkslick Shores enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DeathcapGlade.java b/Mage.Sets/src/mage/cards/d/DeathcapGlade.java index 14e82f3f650..c3acdd94e6f 100644 --- a/Mage.Sets/src/mage/cards/d/DeathcapGlade.java +++ b/Mage.Sets/src/mage/cards/d/DeathcapGlade.java @@ -1,17 +1,15 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class DeathcapGlade extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public DeathcapGlade(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Deathcap Glade enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {B} or {G}. + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DesertedBeach.java b/Mage.Sets/src/mage/cards/d/DesertedBeach.java index f3e350b124c..27cc959bd03 100644 --- a/Mage.Sets/src/mage/cards/d/DesertedBeach.java +++ b/Mage.Sets/src/mage/cards/d/DesertedBeach.java @@ -1,17 +1,15 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class DesertedBeach extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public DesertedBeach(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Deserted Beach enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {W} or {U}. + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DragonskullSummit.java b/Mage.Sets/src/mage/cards/d/DragonskullSummit.java index e6e7b07d8b9..103b4a34195 100644 --- a/Mage.Sets/src/mage/cards/d/DragonskullSummit.java +++ b/Mage.Sets/src/mage/cards/d/DragonskullSummit.java @@ -1,12 +1,8 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; @@ -19,24 +15,28 @@ import mage.filter.predicate.Predicates; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class DragonskullSummit extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Swamp or a Mountain"); static { filter.add(Predicates.or(SubType.SWAMP.getPredicate(), SubType.MOUNTAIN.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public DragonskullSummit(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Swamp or a Mountain"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Dragonskull Summit enters the battlefield tapped unless you control a Swamp or a Mountain. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DreamrootCascade.java b/Mage.Sets/src/mage/cards/d/DreamrootCascade.java index a6aa9df2986..631997cfb6a 100644 --- a/Mage.Sets/src/mage/cards/d/DreamrootCascade.java +++ b/Mage.Sets/src/mage/cards/d/DreamrootCascade.java @@ -1,17 +1,15 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class DreamrootCascade extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public DreamrootCascade(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Dreamroot Cascade enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {G} or {U}. + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/d/DrownedCatacomb.java b/Mage.Sets/src/mage/cards/d/DrownedCatacomb.java index 0557adf0aea..b7b0ba92498 100644 --- a/Mage.Sets/src/mage/cards/d/DrownedCatacomb.java +++ b/Mage.Sets/src/mage/cards/d/DrownedCatacomb.java @@ -1,15 +1,12 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; @@ -21,27 +18,25 @@ import java.util.UUID; */ public final class DrownedCatacomb extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent(); + private static final FilterPermanent filter = new FilterPermanent("an Island or a Swamp"); static { - filter.add(Predicates.or( - SubType.SWAMP.getPredicate(), - SubType.ISLAND.getPredicate() - )); + filter.add(Predicates.or(SubType.ISLAND.getPredicate(), SubType.SWAMP.getPredicate())); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public DrownedCatacomb(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - this.addAbility(new EntersBattlefieldAbility( - new TapSourceEffect(), condition, null, - "tapped unless you control an Island or a Swamp" - )); - this.addAbility(new BlackManaAbility()); + // Drowned Catacomb enters the battlefield tapped unless you control an Island or a Swamp. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {B}. + this.addAbility(new BlackManaAbility()); } private DrownedCatacomb(final DrownedCatacomb card) { diff --git a/Mage.Sets/src/mage/cards/d/DwarvenMine.java b/Mage.Sets/src/mage/cards/d/DwarvenMine.java index 3bf540dc3fe..0b6375d23c0 100644 --- a/Mage.Sets/src/mage/cards/d/DwarvenMine.java +++ b/Mage.Sets/src/mage/cards/d/DwarvenMine.java @@ -1,12 +1,9 @@ package mage.cards.d; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.EntersBattlefieldUntappedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -26,14 +23,14 @@ import java.util.UUID; public final class DwarvenMine extends CardImpl { private static final FilterPermanent filter - = new FilterControlledPermanent(SubType.MOUNTAIN); + = new FilterControlledPermanent(SubType.MOUNTAIN, "other Mountains"); static { filter.add(AnotherPredicate.instance); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3); + private static final YouControlPermanentCondition condition + = new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 3); public DwarvenMine(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -44,10 +41,7 @@ public final class DwarvenMine extends CardImpl { this.addAbility(new RedManaAbility()); // Dwarven Mine enters the battlefield tapped unless you control three or more other Mountains. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control three or more other Mountains" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // When Dwarven Mine enters the battlefield untapped, create a 1/1 red Dwarf creature token. this.addAbility(new EntersBattlefieldUntappedTriggeredAbility(new CreateTokenEffect(new DwarfToken()), false)); diff --git a/Mage.Sets/src/mage/cards/f/FortifiedBeachhead.java b/Mage.Sets/src/mage/cards/f/FortifiedBeachhead.java index c932d27dcc8..8a100125cd9 100644 --- a/Mage.Sets/src/mage/cards/f/FortifiedBeachhead.java +++ b/Mage.Sets/src/mage/cards/f/FortifiedBeachhead.java @@ -1,7 +1,5 @@ package mage.cards.f; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -26,8 +24,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class FortifiedBeachhead extends CardImpl { @@ -99,6 +98,7 @@ class FortifiedBeachheadEffect extends OneShotEffect { return true; } } + // Intentional use of Permanent::setTapped, to not cause any trigger land.setTapped(true); return true; } diff --git a/Mage.Sets/src/mage/cards/g/GingerbreadCabin.java b/Mage.Sets/src/mage/cards/g/GingerbreadCabin.java index 0a9d37c861a..f219273dcf8 100644 --- a/Mage.Sets/src/mage/cards/g/GingerbreadCabin.java +++ b/Mage.Sets/src/mage/cards/g/GingerbreadCabin.java @@ -1,12 +1,9 @@ package mage.cards.g; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.EntersBattlefieldUntappedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -26,14 +23,14 @@ import java.util.UUID; public final class GingerbreadCabin extends CardImpl { private static final FilterPermanent filter - = new FilterControlledPermanent(SubType.FOREST); + = new FilterControlledPermanent(SubType.FOREST, "other Forests"); static { filter.add(AnotherPredicate.instance); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3); + private static final YouControlPermanentCondition condition + = new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 3); public GingerbreadCabin(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -44,10 +41,7 @@ public final class GingerbreadCabin extends CardImpl { this.addAbility(new GreenManaAbility()); // Gingerbread Cabin enters the battlefield tapped unless you control three or more other Forests. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control three or more other Forests" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // When Gingerbread Cabin enters the battlefield untapped, create a Food token. this.addAbility(new EntersBattlefieldUntappedTriggeredAbility(new CreateTokenEffect(new FoodToken()), false)); diff --git a/Mage.Sets/src/mage/cards/g/GlacialFortress.java b/Mage.Sets/src/mage/cards/g/GlacialFortress.java index 14accd0ee59..c920cbe8bac 100644 --- a/Mage.Sets/src/mage/cards/g/GlacialFortress.java +++ b/Mage.Sets/src/mage/cards/g/GlacialFortress.java @@ -1,12 +1,8 @@ package mage.cards.g; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -19,24 +15,28 @@ import mage.filter.predicate.Predicates; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class GlacialFortress extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Plains or an Island"); static { filter.add(Predicates.or(SubType.PLAINS.getPredicate(), SubType.ISLAND.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public GlacialFortress(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Plains or an Island"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Glacial Fortress enters the battlefield tapped unless you control a Plains or an Island. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/h/HauntedRidge.java b/Mage.Sets/src/mage/cards/h/HauntedRidge.java index d11393543c3..382579bed1a 100644 --- a/Mage.Sets/src/mage/cards/h/HauntedRidge.java +++ b/Mage.Sets/src/mage/cards/h/HauntedRidge.java @@ -1,17 +1,15 @@ package mage.cards.h; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class HauntedRidge extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public HauntedRidge(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Haunted Ridge enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {B} or {R}. + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/h/HinterlandHarbor.java b/Mage.Sets/src/mage/cards/h/HinterlandHarbor.java index 2004b02851c..f01d025f61a 100644 --- a/Mage.Sets/src/mage/cards/h/HinterlandHarbor.java +++ b/Mage.Sets/src/mage/cards/h/HinterlandHarbor.java @@ -1,12 +1,8 @@ package mage.cards.h; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -23,19 +19,24 @@ import java.util.UUID; */ public final class HinterlandHarbor extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Forest or an Island"); static { filter.add(Predicates.or(SubType.FOREST.getPredicate(), SubType.ISLAND.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public HinterlandHarbor(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Forest or an Island"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Hinterland Harbor enters the battlefield tapped unless you control a Forest or an Island. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/h/HornedLochWhale.java b/Mage.Sets/src/mage/cards/h/HornedLochWhale.java index 7d1b39df152..0a7adb68eb1 100644 --- a/Mage.Sets/src/mage/cards/h/HornedLochWhale.java +++ b/Mage.Sets/src/mage/cards/h/HornedLochWhale.java @@ -1,12 +1,10 @@ package mage.cards.h; import mage.MageInt; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.NotMyTurnCondition; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.PutOnTopOrBottomLibraryTargetEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.WardAbility; import mage.cards.AdventureCard; @@ -45,10 +43,7 @@ public final class HornedLochWhale extends AdventureCard { this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false)); // Horned Loch-Whale enters the battlefield tapped unless it's your turn. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(true), NotMyTurnCondition.instance, - "tapped unless it's your turn" - ))); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(MyTurnCondition.instance, "it's your turn")); // Lagoon Breach // The owner of target attacking creature you don't control puts it on the top or bottom of their library. diff --git a/Mage.Sets/src/mage/cards/i/IdyllicGrange.java b/Mage.Sets/src/mage/cards/i/IdyllicGrange.java index 30c1312b362..2c26e308c66 100644 --- a/Mage.Sets/src/mage/cards/i/IdyllicGrange.java +++ b/Mage.Sets/src/mage/cards/i/IdyllicGrange.java @@ -1,12 +1,9 @@ package mage.cards.i; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.EntersBattlefieldUntappedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -28,13 +25,14 @@ import java.util.UUID; public final class IdyllicGrange extends CardImpl { private static final FilterPermanent filter - = new FilterControlledPermanent(SubType.PLAINS); + = new FilterControlledPermanent(SubType.PLAINS, "other Plains"); static { filter.add(AnotherPredicate.instance); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3); + + private static final YouControlPermanentCondition condition + = new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 3); public IdyllicGrange(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -45,10 +43,7 @@ public final class IdyllicGrange extends CardImpl { this.addAbility(new WhiteManaAbility()); // Idyllic Grange enters the battlefield tapped unless you control three or more other Plains. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control three or more other Plains" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // When Idyllic Grange enters the battlefield untapped, put a +1/+1 counter on target creature you control. Ability ability = new EntersBattlefieldUntappedTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/i/InspiringVantage.java b/Mage.Sets/src/mage/cards/i/InspiringVantage.java index c566e9d532f..44cd6910b5a 100644 --- a/Mage.Sets/src/mage/cards/i/InspiringVantage.java +++ b/Mage.Sets/src/mage/cards/i/InspiringVantage.java @@ -1,36 +1,43 @@ package mage.cards.i; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** * @author fireshoes */ public final class InspiringVantage extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public InspiringVantage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Inspiring Vantage enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {R} or {W}. + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/i/IsolatedChapel.java b/Mage.Sets/src/mage/cards/i/IsolatedChapel.java index 8c903ee717f..80fd4694499 100644 --- a/Mage.Sets/src/mage/cards/i/IsolatedChapel.java +++ b/Mage.Sets/src/mage/cards/i/IsolatedChapel.java @@ -2,12 +2,8 @@ package mage.cards.i; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -24,19 +20,24 @@ import java.util.UUID; */ public final class IsolatedChapel extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Plains or a Swamp"); static { filter.add(Predicates.or(SubType.PLAINS.getPredicate(), SubType.SWAMP.getPredicate())); } - public IsolatedChapel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},null); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Plains or a Swamp"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + public IsolatedChapel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); + + // Isolated Chapel enters the battlefield tapped unless you control a Plains or a Swamp. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/l/LuxurySuite.java b/Mage.Sets/src/mage/cards/l/LuxurySuite.java index 96749daa2ff..5b30deb7d3f 100644 --- a/Mage.Sets/src/mage/cards/l/LuxurySuite.java +++ b/Mage.Sets/src/mage/cards/l/LuxurySuite.java @@ -1,19 +1,17 @@ package mage.cards.l; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class LuxurySuite extends CardImpl { @@ -22,16 +20,12 @@ public final class LuxurySuite extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Luxury Suite enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {B} or {R}. + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/m/MinasTirith.java b/Mage.Sets/src/mage/cards/m/MinasTirith.java index a8753551450..a7ef0249a44 100644 --- a/Mage.Sets/src/mage/cards/m/MinasTirith.java +++ b/Mage.Sets/src/mage/cards/m/MinasTirith.java @@ -2,21 +2,21 @@ package mage.cards.m; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.hint.ConditionHint; import mage.abilities.hint.Hint; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SuperType; +import mage.constants.WatcherScope; +import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.Game; @@ -33,15 +33,13 @@ import java.util.UUID; */ public final class MinasTirith extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Hint hint = new ConditionHint( new InvertCondition(condition), "You control a legendary creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public MinasTirith(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -49,10 +47,7 @@ public final class MinasTirith extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // Minas Tirith enters the battlefield tapped unless you control a legendary creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); diff --git a/Mage.Sets/src/mage/cards/m/MinesOfMoria.java b/Mage.Sets/src/mage/cards/m/MinesOfMoria.java index 80560aacd34..6738cdaceda 100644 --- a/Mage.Sets/src/mage/cards/m/MinesOfMoria.java +++ b/Mage.Sets/src/mage/cards/m/MinesOfMoria.java @@ -1,24 +1,17 @@ package mage.cards.m; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.TapSourceEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; @@ -32,15 +25,13 @@ import java.util.UUID; */ public final class MinesOfMoria extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Hint hint = new ConditionHint( new InvertCondition(condition), "You control a legendary creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public MinesOfMoria(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -48,10 +39,7 @@ public final class MinesOfMoria extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // Mines of Moria enters the battlefield tapped unless you control a legendary creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {R}. this.addAbility(new RedManaAbility()); diff --git a/Mage.Sets/src/mage/cards/m/MonumentalHenge.java b/Mage.Sets/src/mage/cards/m/MonumentalHenge.java index 06e305430ce..6cac84696d3 100644 --- a/Mage.Sets/src/mage/cards/m/MonumentalHenge.java +++ b/Mage.Sets/src/mage/cards/m/MonumentalHenge.java @@ -1,24 +1,19 @@ package mage.cards.m; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.PutCards; import mage.constants.SubType; import mage.filter.FilterCard; -import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.HistoricPredicate; @@ -29,9 +24,8 @@ import java.util.UUID; */ public final class MonumentalHenge extends CardImpl { - private static final FilterPermanent filter = new FilterControlledPermanent(SubType.PLAINS); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.PLAINS); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); private static final FilterCard filterCard = new FilterCard("a historic card"); @@ -43,9 +37,7 @@ public final class MonumentalHenge extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Monumental Henge enters the battlefield tapped unless you control a Plains. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Plains")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); diff --git a/Mage.Sets/src/mage/cards/m/MorphicPool.java b/Mage.Sets/src/mage/cards/m/MorphicPool.java index bbbb3edcf9a..841fb42c6e5 100644 --- a/Mage.Sets/src/mage/cards/m/MorphicPool.java +++ b/Mage.Sets/src/mage/cards/m/MorphicPool.java @@ -1,19 +1,17 @@ package mage.cards.m; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class MorphicPool extends CardImpl { @@ -22,16 +20,12 @@ public final class MorphicPool extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Morphic Pool enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {U} or {B}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/m/MysticSanctuary.java b/Mage.Sets/src/mage/cards/m/MysticSanctuary.java index 1a161a6a49a..05f31d56e8c 100644 --- a/Mage.Sets/src/mage/cards/m/MysticSanctuary.java +++ b/Mage.Sets/src/mage/cards/m/MysticSanctuary.java @@ -1,13 +1,10 @@ package mage.cards.m; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.EntersBattlefieldUntappedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.effects.common.PutOnLibraryTargetEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -29,7 +26,7 @@ import java.util.UUID; public final class MysticSanctuary extends CardImpl { private static final FilterPermanent filter - = new FilterControlledPermanent(SubType.ISLAND); + = new FilterControlledPermanent(SubType.ISLAND, "other Islands"); private static final FilterCard filter2 = new FilterInstantOrSorceryCard("instant or sorcery card from your graveyard"); @@ -37,8 +34,8 @@ public final class MysticSanctuary extends CardImpl { filter.add(AnotherPredicate.instance); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3); + private static final YouControlPermanentCondition condition + = new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 3); public MysticSanctuary(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -49,10 +46,7 @@ public final class MysticSanctuary extends CardImpl { this.addAbility(new BlueManaAbility()); // Mystic Sanctuary enters the battlefield tapped unless you control three or more other Islands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control three or more other Islands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // When Mystic Sanctuary enters the battlefield untapped, you may put target instant or sorcery card from your graveyard on top of your library. Ability ability = new EntersBattlefieldUntappedTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/o/OvergrownFarmland.java b/Mage.Sets/src/mage/cards/o/OvergrownFarmland.java index be758898dc0..18ae5607248 100644 --- a/Mage.Sets/src/mage/cards/o/OvergrownFarmland.java +++ b/Mage.Sets/src/mage/cards/o/OvergrownFarmland.java @@ -1,17 +1,15 @@ package mage.cards.o; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class OvergrownFarmland extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public OvergrownFarmland(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Overgrown Farmland enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {G} or {W}. + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/p/PrairieStream.java b/Mage.Sets/src/mage/cards/p/PrairieStream.java index f6e5d02c1b1..1e13c15cbfd 100644 --- a/Mage.Sets/src/mage/cards/p/PrairieStream.java +++ b/Mage.Sets/src/mage/cards/p/PrairieStream.java @@ -1,45 +1,46 @@ package mage.cards.p; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class PrairieStream extends CardImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); - + + private static final FilterLandPermanent filter = new FilterLandPermanent("basic lands"); + static { filter.add(SuperType.BASIC.getPredicate()); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); + public PrairieStream(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.PLAINS); this.subtype.add(SubType.ISLAND); // Prairie Stream enters the battlefield tapped unless you control two or more basic lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); - String abilityText = "tapped unless you control two or more basic lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java b/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java index 365c0429266..ae7f3b803f7 100644 --- a/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java +++ b/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java @@ -1,35 +1,43 @@ package mage.cards.r; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author maurer.it_at_gmail.com */ public final class RazorvergeThicket extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public RazorvergeThicket(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Razorverge Thicket enters the battlefield tapped unless you control two or fewer other lands. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/r/RejuvenatingSprings.java b/Mage.Sets/src/mage/cards/r/RejuvenatingSprings.java index 33d248f025a..6bd0b836254 100644 --- a/Mage.Sets/src/mage/cards/r/RejuvenatingSprings.java +++ b/Mage.Sets/src/mage/cards/r/RejuvenatingSprings.java @@ -1,9 +1,7 @@ package mage.cards.r; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -21,16 +19,12 @@ public final class RejuvenatingSprings extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Rejuvenating Springs enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {G} or {U}. + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/r/Rivendell.java b/Mage.Sets/src/mage/cards/r/Rivendell.java index 1b9fd0b7ef0..4a797a90182 100644 --- a/Mage.Sets/src/mage/cards/r/Rivendell.java +++ b/Mage.Sets/src/mage/cards/r/Rivendell.java @@ -2,22 +2,15 @@ package mage.cards.r; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.keyword.ScryEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterPermanent; @@ -30,18 +23,13 @@ import java.util.UUID; */ public final class Rivendell extends CardImpl { - private static final FilterPermanent filter - = new FilterControlledCreaturePermanent("you control a legendary creature"); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Condition condition2 - = new PermanentsOnTheBattlefieldCondition(filter); - private static final Hint hint = new ConditionHint( new InvertCondition(condition), "You control a legendary creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public Rivendell(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -49,10 +37,7 @@ public final class Rivendell extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // Rivendell enters the battlefield tapped unless you control a legendary creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {U}. this.addAbility(new BlueManaAbility()); @@ -61,7 +46,7 @@ public final class Rivendell extends CardImpl { Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new ScryEffect(2, false), - new ManaCostsImpl<>("{1}{U}"), condition2 + new ManaCostsImpl<>("{1}{U}"), condition ); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/r/RockfallVale.java b/Mage.Sets/src/mage/cards/r/RockfallVale.java index 2ec03b9ef8a..5efe48968c6 100644 --- a/Mage.Sets/src/mage/cards/r/RockfallVale.java +++ b/Mage.Sets/src/mage/cards/r/RockfallVale.java @@ -1,17 +1,15 @@ package mage.cards.r; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class RockfallVale extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public RockfallVale(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Rockfall Vale enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {R} or {G}. + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/r/RootboundCrag.java b/Mage.Sets/src/mage/cards/r/RootboundCrag.java index b6cb41b9948..0a66d2d9f0f 100644 --- a/Mage.Sets/src/mage/cards/r/RootboundCrag.java +++ b/Mage.Sets/src/mage/cards/r/RootboundCrag.java @@ -1,12 +1,8 @@ package mage.cards.r; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; @@ -19,24 +15,28 @@ import mage.filter.predicate.Predicates; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class RootboundCrag extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Mountain or a Forest"); static { filter.add(Predicates.or(SubType.MOUNTAIN.getPredicate(), SubType.FOREST.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public RootboundCrag(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Mountain or a Forest"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Rootbound Crag enters the battlefield tapped unless you control a Mountain or a Forest. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SeaOfClouds.java b/Mage.Sets/src/mage/cards/s/SeaOfClouds.java index 1ecb0927aa3..be596cde5a8 100644 --- a/Mage.Sets/src/mage/cards/s/SeaOfClouds.java +++ b/Mage.Sets/src/mage/cards/s/SeaOfClouds.java @@ -1,19 +1,17 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class SeaOfClouds extends CardImpl { @@ -22,16 +20,12 @@ public final class SeaOfClouds extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Sea of Clouds enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {U} or {W}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SeachromeCoast.java b/Mage.Sets/src/mage/cards/s/SeachromeCoast.java index d5c6642693c..4e60187e344 100644 --- a/Mage.Sets/src/mage/cards/s/SeachromeCoast.java +++ b/Mage.Sets/src/mage/cards/s/SeachromeCoast.java @@ -1,37 +1,43 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author maurer.it_at_gmail.com */ public final class SeachromeCoast extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public SeachromeCoast(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); // Seachrome Coast enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {W} or {U}. + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/ShatteredSanctum.java b/Mage.Sets/src/mage/cards/s/ShatteredSanctum.java index 6cf6dc1d8e6..da361533103 100644 --- a/Mage.Sets/src/mage/cards/s/ShatteredSanctum.java +++ b/Mage.Sets/src/mage/cards/s/ShatteredSanctum.java @@ -1,17 +1,15 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class ShatteredSanctum extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public ShatteredSanctum(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Shattered Sanctum enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {W} or {B}. + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java b/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java index 1f7bb8c4c16..3f4edcdcdda 100644 --- a/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java +++ b/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java @@ -1,15 +1,12 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.condition.common.DeliriumCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.hint.common.CardTypesInGraveyardHint; import mage.abilities.mana.GreenManaAbility; import mage.cards.Card; @@ -34,8 +31,7 @@ import java.util.UUID; public final class ShiftingWoodland extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.FOREST); - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); private static final FilterCard filterCard = new FilterPermanentCard("permanent card in your graveyard"); @@ -43,9 +39,7 @@ public final class ShiftingWoodland extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Shifting Woodland enters the battlefield tapped unless you control a Forest. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition - ), "tapped unless you control a Forest")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {G}. this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/s/ShipwreckMarsh.java b/Mage.Sets/src/mage/cards/s/ShipwreckMarsh.java index 3c1f228e9ff..6825bc9b5c2 100644 --- a/Mage.Sets/src/mage/cards/s/ShipwreckMarsh.java +++ b/Mage.Sets/src/mage/cards/s/ShipwreckMarsh.java @@ -1,17 +1,15 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class ShipwreckMarsh extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public ShipwreckMarsh(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Shipwreck Marsh enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {U} or {B}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SmolderingMarsh.java b/Mage.Sets/src/mage/cards/s/SmolderingMarsh.java index 28b6f9b632e..058d53c5f20 100644 --- a/Mage.Sets/src/mage/cards/s/SmolderingMarsh.java +++ b/Mage.Sets/src/mage/cards/s/SmolderingMarsh.java @@ -1,45 +1,46 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class SmolderingMarsh extends CardImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); - + + private static final FilterLandPermanent filter = new FilterLandPermanent("basic lands"); + static { filter.add(SuperType.BASIC.getPredicate()); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); + public SmolderingMarsh(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.SWAMP); this.subtype.add(SubType.MOUNTAIN); // Smoldering Marsh enters the battlefield tapped unless you control two or more basic lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); - String abilityText = "tapped unless you control two or more basic lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SpectatorSeating.java b/Mage.Sets/src/mage/cards/s/SpectatorSeating.java index d65086c117e..282b5836149 100644 --- a/Mage.Sets/src/mage/cards/s/SpectatorSeating.java +++ b/Mage.Sets/src/mage/cards/s/SpectatorSeating.java @@ -1,9 +1,7 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -21,16 +19,12 @@ public final class SpectatorSeating extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Spectator Seating enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {R} or {W}. + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SpireGarden.java b/Mage.Sets/src/mage/cards/s/SpireGarden.java index 488f4b71f56..5e3523f2f9a 100644 --- a/Mage.Sets/src/mage/cards/s/SpireGarden.java +++ b/Mage.Sets/src/mage/cards/s/SpireGarden.java @@ -1,19 +1,17 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class SpireGarden extends CardImpl { @@ -22,16 +20,12 @@ public final class SpireGarden extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Spire Garden enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {R} or {G}. + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java b/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java index cccf37ac21c..030ccae6299 100644 --- a/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java +++ b/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java @@ -1,37 +1,43 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author fireshoes */ public final class SpirebluffCanal extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public SpirebluffCanal(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Spirebluff Canal enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {U} or {R}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SpymastersVault.java b/Mage.Sets/src/mage/cards/s/SpymastersVault.java index b3ea8ded696..6a29ec7d8c1 100644 --- a/Mage.Sets/src/mage/cards/s/SpymastersVault.java +++ b/Mage.Sets/src/mage/cards/s/SpymastersVault.java @@ -1,23 +1,18 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CreaturesDiedThisTurnCount; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.keyword.ConniveSourceEffect; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterPermanent; @@ -26,22 +21,21 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** - * * @author grimreap124 */ public final class SpymastersVault extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SWAMP); - private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, - 0); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public SpymastersVault(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[] { CardType.LAND }, ""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Spymaster's Vault enters the battlefield tapped unless you control a Swamp. - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( - new TapSourceEffect(), condition), "tapped unless you control a Swamp")); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {B}. this.addAbility(new BlackManaAbility()); diff --git a/Mage.Sets/src/mage/cards/s/StormcarvedCoast.java b/Mage.Sets/src/mage/cards/s/StormcarvedCoast.java index 2e26994b334..02c3a90bf61 100644 --- a/Mage.Sets/src/mage/cards/s/StormcarvedCoast.java +++ b/Mage.Sets/src/mage/cards/s/StormcarvedCoast.java @@ -1,17 +1,15 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class StormcarvedCoast extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public StormcarvedCoast(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Stormcarved Coast enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {U} or {R}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SulfurFalls.java b/Mage.Sets/src/mage/cards/s/SulfurFalls.java index 228678d7360..87c84f44bac 100644 --- a/Mage.Sets/src/mage/cards/s/SulfurFalls.java +++ b/Mage.Sets/src/mage/cards/s/SulfurFalls.java @@ -2,12 +2,8 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; @@ -24,19 +20,24 @@ import java.util.UUID; */ public final class SulfurFalls extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("an Island or a Mountain"); static { filter.add(Predicates.or(SubType.ISLAND.getPredicate(), SubType.MOUNTAIN.getPredicate())); } - public SulfurFalls(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},null); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control an Island or a Mountain"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + public SulfurFalls(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); + + // Sulfur Falls enters the battlefield tapped unless you control an Island or a Mountain. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SundownPass.java b/Mage.Sets/src/mage/cards/s/SundownPass.java index 33325cd81a4..e14b746718e 100644 --- a/Mage.Sets/src/mage/cards/s/SundownPass.java +++ b/Mage.Sets/src/mage/cards/s/SundownPass.java @@ -1,17 +1,15 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; @@ -20,21 +18,25 @@ import java.util.UUID; */ public final class SundownPass extends CardImpl { - private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 2 - ); + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); public SundownPass(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Sundown Pass enters the battlefield tapped unless you control two or more other lands. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control two or more other lands" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); - // {T}: Add {R} or {W}. + // {T}: Add {R}. this.addAbility(new RedManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SunkenHollow.java b/Mage.Sets/src/mage/cards/s/SunkenHollow.java index eeae5ef4c25..b408187ccf2 100644 --- a/Mage.Sets/src/mage/cards/s/SunkenHollow.java +++ b/Mage.Sets/src/mage/cards/s/SunkenHollow.java @@ -1,45 +1,46 @@ package mage.cards.s; -import java.util.UUID; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class SunkenHollow extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("basic lands"); static { filter.add(SuperType.BASIC.getPredicate()); } + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 2); + public SunkenHollow(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); this.subtype.add(SubType.ISLAND); this.subtype.add(SubType.SWAMP); // Sunken Hollow enters the battlefield tapped unless you control two or more basic lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1)); - String abilityText = "tapped unless you control two or more basic lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SunpetalGrove.java b/Mage.Sets/src/mage/cards/s/SunpetalGrove.java index 32d8a6c18e6..58000dfe4b1 100644 --- a/Mage.Sets/src/mage/cards/s/SunpetalGrove.java +++ b/Mage.Sets/src/mage/cards/s/SunpetalGrove.java @@ -1,12 +1,8 @@ package mage.cards.s; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -19,24 +15,28 @@ import mage.filter.predicate.Predicates; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class SunpetalGrove extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Forest or a Plains"); static { filter.add(Predicates.or(SubType.FOREST.getPredicate(), SubType.PLAINS.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public SunpetalGrove(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Forest or a Plains"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); + + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/t/TempleOfTheDragonQueen.java b/Mage.Sets/src/mage/cards/t/TempleOfTheDragonQueen.java index f4ae5f7425c..4ecc2fd640b 100644 --- a/Mage.Sets/src/mage/cards/t/TempleOfTheDragonQueen.java +++ b/Mage.Sets/src/mage/cards/t/TempleOfTheDragonQueen.java @@ -1,7 +1,5 @@ package mage.cards.t; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; @@ -23,8 +21,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class TempleOfTheDragonQueen extends CardImpl { @@ -110,6 +109,7 @@ class TempleOfTheDragonQueenEffect extends OneShotEffect { } } if (entersTapped) { + // Intentional use of Permanent::setTapped, to not cause any trigger land.setTapped(true); return true; } diff --git a/Mage.Sets/src/mage/cards/t/TheShire.java b/Mage.Sets/src/mage/cards/t/TheShire.java index b145b5287b5..1bfbc46d91b 100644 --- a/Mage.Sets/src/mage/cards/t/TheShire.java +++ b/Mage.Sets/src/mage/cards/t/TheShire.java @@ -1,24 +1,17 @@ package mage.cards.t; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.TapSourceEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; @@ -33,15 +26,13 @@ import java.util.UUID; */ public final class TheShire extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a legendary creature"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); - private static final Hint hint = new ConditionHint( new InvertCondition(condition), "You control a legendary creature"); + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); public TheShire(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -49,10 +40,7 @@ public final class TheShire extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // The Shire enters the battlefield tapped unless you control a legendary creature. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition, ""), - "tapped unless you control a legendary creature" - ).addHint(hint)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // {T}: Add {G}. this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/t/ThranPortal.java b/Mage.Sets/src/mage/cards/t/ThranPortal.java index e901ca3a132..8366d5963bd 100644 --- a/Mage.Sets/src/mage/cards/t/ThranPortal.java +++ b/Mage.Sets/src/mage/cards/t/ThranPortal.java @@ -2,16 +2,12 @@ package mage.cards.t; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.PayLifeCost; -import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.ChooseBasicLandTypeEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.continuous.AddChosenSubtypeEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.enterAttribute.EnterAttributeAddChosenSubtypeEffect; @@ -20,6 +16,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -32,15 +29,22 @@ import java.util.UUID; */ public class ThranPortal extends CardImpl { + private static final FilterLandPermanent filter = new FilterLandPermanent("other lands"); + + static { + filter.add(AnotherPredicate.instance); + } + + private static final YouControlPermanentCondition condition = + new YouControlPermanentCondition(filter, ComparisonType.OR_LESS, 2); + public ThranPortal(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); addSubType(SubType.GATE); // Thran Portal enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); - String abilityText = " tapped unless you control two or fewer other lands"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // As Thran Portal enters the battlefield, choose a basic land type. // Thran Portal is the chosen type in addition to its other types. diff --git a/Mage.Sets/src/mage/cards/t/TrainingCenter.java b/Mage.Sets/src/mage/cards/t/TrainingCenter.java index 3c56c20187d..b08d55c631a 100644 --- a/Mage.Sets/src/mage/cards/t/TrainingCenter.java +++ b/Mage.Sets/src/mage/cards/t/TrainingCenter.java @@ -1,9 +1,7 @@ package mage.cards.t; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; @@ -21,16 +19,12 @@ public final class TrainingCenter extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Training Center enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {U} or {R}. + // {T}: Add {U}. this.addAbility(new BlueManaAbility()); + + // {T}: Add {R}. this.addAbility(new RedManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/u/UndergrowthStadium.java b/Mage.Sets/src/mage/cards/u/UndergrowthStadium.java index e59b7dab110..141c9f3d8db 100644 --- a/Mage.Sets/src/mage/cards/u/UndergrowthStadium.java +++ b/Mage.Sets/src/mage/cards/u/UndergrowthStadium.java @@ -1,9 +1,7 @@ package mage.cards.u; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -21,16 +19,12 @@ public final class UndergrowthStadium extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Undergrowth Stadium enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {B} or {G}. + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/v/VaultOfChampions.java b/Mage.Sets/src/mage/cards/v/VaultOfChampions.java index e94a4fd13ab..2775056a820 100644 --- a/Mage.Sets/src/mage/cards/v/VaultOfChampions.java +++ b/Mage.Sets/src/mage/cards/v/VaultOfChampions.java @@ -1,9 +1,7 @@ package mage.cards.v; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.common.OneOpponentCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.TwoOrMoreOpponentsCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; @@ -21,16 +19,12 @@ public final class VaultOfChampions extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Vault of Champions enters the battlefield tapped unless you have two or more opponents. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect( - new TapSourceEffect(), - OneOpponentCondition.instance, - "tapped unless you have two or more opponents" - ), "tapped unless you have two or more opponents" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(TwoOrMoreOpponentsCondition.instance)); - // {T}: Add {W} or {B}. + // {T}: Add {W}. this.addAbility(new WhiteManaAbility()); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/w/WitchsCottage.java b/Mage.Sets/src/mage/cards/w/WitchsCottage.java index 797d8eb2743..877a0c70bd5 100644 --- a/Mage.Sets/src/mage/cards/w/WitchsCottage.java +++ b/Mage.Sets/src/mage/cards/w/WitchsCottage.java @@ -1,13 +1,10 @@ package mage.cards.w; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; import mage.abilities.common.EntersBattlefieldUntappedTriggeredAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.effects.common.PutOnLibraryTargetEffect; -import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,14 +25,14 @@ import java.util.UUID; public final class WitchsCottage extends CardImpl { private static final FilterPermanent filter - = new FilterControlledPermanent(SubType.SWAMP); + = new FilterControlledPermanent(SubType.SWAMP, "other Swamps"); static { filter.add(AnotherPredicate.instance); } - private static final Condition condition - = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3); + private static final YouControlPermanentCondition condition + = new YouControlPermanentCondition(filter, ComparisonType.OR_GREATER, 3); public WitchsCottage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); @@ -46,10 +43,7 @@ public final class WitchsCottage extends CardImpl { this.addAbility(new BlackManaAbility()); // Witch's Cottage enters the battlefield tapped unless you control three or more other Swamps. - this.addAbility(new EntersBattlefieldAbility( - new ConditionalOneShotEffect(new TapSourceEffect(), condition), - "tapped unless you control three or more other Swamps" - )); + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); // When Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. Ability ability = new EntersBattlefieldUntappedTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/w/WoodlandCemetery.java b/Mage.Sets/src/mage/cards/w/WoodlandCemetery.java index 9c753c2c775..d36a7ac8bb9 100644 --- a/Mage.Sets/src/mage/cards/w/WoodlandCemetery.java +++ b/Mage.Sets/src/mage/cards/w/WoodlandCemetery.java @@ -1,12 +1,8 @@ package mage.cards.w; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -23,19 +19,24 @@ import java.util.UUID; */ public final class WoodlandCemetery extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterLandPermanent filter = new FilterLandPermanent("a Swamp or a Forest"); static { - filter.add(Predicates.or(SubType.FOREST.getPredicate(), SubType.SWAMP.getPredicate())); + filter.add(Predicates.or(SubType.SWAMP.getPredicate(), SubType.FOREST.getPredicate())); } + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + public WoodlandCemetery(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)); - String abilityText = " tapped unless you control a Swamp or a Forest"; - this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); + // Woodland Cemetery enters the battlefield tapped unless you control a Swamp or a Forest. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {B}. this.addAbility(new BlackManaAbility()); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/EntersTheBattlefieldTappedUnlessTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/EntersTheBattlefieldTappedUnlessTest.java new file mode 100644 index 00000000000..468accef45b --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/EntersTheBattlefieldTappedUnlessTest.java @@ -0,0 +1,258 @@ +package org.mage.test.cards.replacement.entersBattlefield; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author Susucr + */ +public class EntersTheBattlefieldTappedUnlessTest extends CardTestPlayerBase { + + /** + * Deathcap Glade enters the battlefield tapped unless you control two or more other lands. + */ + private static final String glade = "Deathcap Glade"; + + @Test + public void test_SlowLand_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, glade); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, glade); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(glade, true); + } + + @Test + public void test_SlowLand_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, glade); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, glade); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(glade, false); + } + + /** + * Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands. + */ + private static final String cliffs = "Blackcleave Cliffs"; + + @Test + public void test_FastLand_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, cliffs); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, cliffs); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(cliffs, true); + } + + @Test + public void test_FastLand_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, cliffs); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, cliffs); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(cliffs, false); + } + + /** + * Castle Ardenvale enters the battlefield tapped unless you control a Plains. + */ + private static final String castle = "Castle Ardenvale"; + + @Test + public void test_Castle_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, castle); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, castle); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(castle, true); + } + + @Test + public void test_Castle_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, castle); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, castle); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(castle, false); + } + + /** + * Canopy Vista enters the battlefield tapped unless you control two or more basic lands. + */ + private static final String vista = "Canopy Vista"; + + @Test + public void test_Tango_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, vista); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + addCard(Zone.BATTLEFIELD, playerA, "Tropical Island", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, vista); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(vista, true); + } + + @Test + public void test_Tango_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, vista); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, vista); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(vista, false); + } + + /** + * Clifftop Retreat enters the battlefield tapped unless you control a Mountain or a Plains. + */ + private static final String retreat = "Clifftop Retreat"; + + @Test + public void test_CheckLand_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, retreat); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, retreat); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(retreat, true); + } + + @Test + public void test_CheckLand_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, retreat); + addCard(Zone.BATTLEFIELD, playerA, "Scrubland", 1); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, retreat); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(retreat, false); + } + + /** + * Dwarven Mine enters the battlefield tapped unless you control three or more other Mountains. + */ + private static final String mine = "Dwarven Mine"; + + @Test + public void test_EldraineAdamantLands_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, mine); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, mine); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(mine, true); + } + + @Test + public void test_EldraineAdamantLands_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, mine); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, mine); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(mine, false); + } + + /** + * Barad-dûr enters the battlefield tapped unless you control a legendary creature. + */ + private static final String barad = "Barad-dur"; + + @Test + public void test_LTRLegendary_NotMet() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, barad); + addCard(Zone.BATTLEFIELD, playerA, "Memnite"); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, barad); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(barad, true); + } + + @Test + public void test_LTRLegendary_Met() { + setStrictChooseMode(true); + + addCard(Zone.HAND, playerA, barad); + addCard(Zone.BATTLEFIELD, playerA, "Six"); + + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, barad); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(barad, false); + } +} diff --git a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedUnlessAbility.java b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedUnlessAbility.java new file mode 100644 index 00000000000..317d0504f73 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldTappedUnlessAbility.java @@ -0,0 +1,32 @@ + +package mage.abilities.common; + +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.TapSourceEffect; + +/** + * @author Susucr + */ +public class EntersBattlefieldTappedUnlessAbility extends EntersBattlefieldAbility { + + public EntersBattlefieldTappedUnlessAbility(Condition condition) { + this(condition, condition.toString()); + } + + public EntersBattlefieldTappedUnlessAbility(Condition condition, String conditionText) { + super( + new ConditionalOneShotEffect(null, new TapSourceEffect(true), condition, null), + "tapped unless " + conditionText + ); + } + + private EntersBattlefieldTappedUnlessAbility(final EntersBattlefieldTappedUnlessAbility ability) { + super(ability); + } + + @Override + public EntersBattlefieldTappedUnlessAbility copy() { + return new EntersBattlefieldTappedUnlessAbility(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/MyTurnCondition.java b/Mage/src/main/java/mage/abilities/condition/common/MyTurnCondition.java index 70309455a54..f1c0dfea7f7 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/MyTurnCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/MyTurnCondition.java @@ -6,15 +6,15 @@ import mage.abilities.condition.Condition; import mage.game.Game; public enum MyTurnCondition implements Condition { - instance; + instance; @Override public boolean apply(Game game, Ability source) { return game.isActivePlayer(source.getControllerId()); } - + @Override public String toString() { - return "during your turn"; + return "during your turn"; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/PermanentsOnTheBattlefieldCondition.java b/Mage/src/main/java/mage/abilities/condition/common/PermanentsOnTheBattlefieldCondition.java index d0cfc543586..1b6452e49ae 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/PermanentsOnTheBattlefieldCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/PermanentsOnTheBattlefieldCondition.java @@ -17,9 +17,9 @@ import mage.game.Game; */ public class PermanentsOnTheBattlefieldCondition implements Condition { - private final FilterPermanent filter; - private final ComparisonType type; - private final int count; + protected final FilterPermanent filter; + protected final ComparisonType type; + protected final int count; private final boolean onlyControlled; /** diff --git a/Mage/src/main/java/mage/abilities/condition/common/OneOpponentCondition.java b/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreOpponentsCondition.java similarity index 77% rename from Mage/src/main/java/mage/abilities/condition/common/OneOpponentCondition.java rename to Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreOpponentsCondition.java index 103b657b5b5..02227c60042 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/OneOpponentCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreOpponentsCondition.java @@ -9,21 +9,20 @@ import java.util.Objects; /** * @author TheElk801 */ -public enum OneOpponentCondition implements Condition { - +public enum TwoOrMoreOpponentsCondition implements Condition { instance; - + @Override public boolean apply(Game game, Ability source) { return game.getOpponents(source.getControllerId(), true) .stream() .map(game::getPlayer) .filter(Objects::nonNull) - .count() <= 1; + .count() >= 2; } @Override public String toString() { - return "you have one opponent"; + return "you have two or more opponents"; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/YouControlPermanentCondition.java b/Mage/src/main/java/mage/abilities/condition/common/YouControlPermanentCondition.java new file mode 100644 index 00000000000..68fcc4fba66 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/YouControlPermanentCondition.java @@ -0,0 +1,59 @@ +package mage.abilities.condition.common; + +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.util.CardUtil; + +/** + * PermanentsOnTheBattlefieldCondition with onlyControlled parameter at true + * Separate as it has a name closer to card's text, so easier to find. + * + * @author Susucr + */ +public class YouControlPermanentCondition extends PermanentsOnTheBattlefieldCondition { + + public Hint getHint() { + return new ConditionHint(this); + } + + public YouControlPermanentCondition(FilterPermanent filter) { + this(filter, ComparisonType.OR_GREATER, 1); + } + + public YouControlPermanentCondition(FilterPermanent filter, ComparisonType comparisonType, int count) { + super(filter, comparisonType, count, true); + } + + @Override + public String toString() { + String text = "you control "; + String filterText = filter.getMessage(); + if (filterText.endsWith(" you control")) { + filterText = filterText.substring(0, filterText.length() - " you control".length()); + } + switch (type) { + case OR_LESS: + text += CardUtil.numberToText(count) + " or fewer " + filterText; + break; + case OR_GREATER: + if (count == 1) { + text += CardUtil.addArticle(filterText); + } else { + text += CardUtil.numberToText(count) + " or more " + filterText; + } + break; + case EQUAL_TO: + if (count == 0) { + text += "no " + filterText; + } else { + text += "exactly " + CardUtil.numberToText(count) + " " + filterText; + } + break; + default: + throw new IllegalArgumentException("Wrong code usage: ComparisonType not handled in text generation: " + type); + } + return text; + } +} diff --git a/Mage/src/main/java/mage/abilities/decorator/ConditionalOneShotEffect.java b/Mage/src/main/java/mage/abilities/decorator/ConditionalOneShotEffect.java index d07a6f08526..e52e05da640 100644 --- a/Mage/src/main/java/mage/abilities/decorator/ConditionalOneShotEffect.java +++ b/Mage/src/main/java/mage/abilities/decorator/ConditionalOneShotEffect.java @@ -5,6 +5,7 @@ import mage.abilities.Mode; import mage.abilities.condition.Condition; import mage.abilities.effects.Effects; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.util.CardUtil; @@ -27,8 +28,18 @@ public class ConditionalOneShotEffect extends OneShotEffect { this(effect, null, condition, text); } + private static Outcome generateOutcome(OneShotEffect effect, OneShotEffect otherwiseEffect) { + if (effect != null) { + return effect.getOutcome(); + } + if (otherwiseEffect != null) { + return Outcome.inverse(otherwiseEffect.getOutcome()); + } + throw new IllegalArgumentException("Wrong code usage: ConditionalOneShot should start with an effect to generate Outcome."); + } + public ConditionalOneShotEffect(OneShotEffect effect, OneShotEffect otherwiseEffect, Condition condition, String text) { - super(effect.getOutcome()); + super(generateOutcome(effect, otherwiseEffect)); if (effect != null) { this.effects.add(effect); }