From bada02544c6a898283740f31bf58515fef8db894 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Fri, 17 May 2024 18:44:20 +0200 Subject: [PATCH] implement [MH3] Bountiful Landscape 10 land cycle --- .../src/mage/cards/b/BountifulLandscape.java | 64 +++++++++++++++++++ .../mage/cards/c/ContaminatedLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/d/DeceptiveLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/f/ForebodingLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/p/PerilousLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/s/SeethingLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/s/ShatteredLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/s/ShelteringLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/t/TranquilLandscape.java | 64 +++++++++++++++++++ .../src/mage/cards/t/TwistedLandscape.java | 64 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons3.java | 10 +++ 11 files changed, 650 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BountifulLandscape.java create mode 100644 Mage.Sets/src/mage/cards/c/ContaminatedLandscape.java create mode 100644 Mage.Sets/src/mage/cards/d/DeceptiveLandscape.java create mode 100644 Mage.Sets/src/mage/cards/f/ForebodingLandscape.java create mode 100644 Mage.Sets/src/mage/cards/p/PerilousLandscape.java create mode 100644 Mage.Sets/src/mage/cards/s/SeethingLandscape.java create mode 100644 Mage.Sets/src/mage/cards/s/ShatteredLandscape.java create mode 100644 Mage.Sets/src/mage/cards/s/ShelteringLandscape.java create mode 100644 Mage.Sets/src/mage/cards/t/TranquilLandscape.java create mode 100644 Mage.Sets/src/mage/cards/t/TwistedLandscape.java diff --git a/Mage.Sets/src/mage/cards/b/BountifulLandscape.java b/Mage.Sets/src/mage/cards/b/BountifulLandscape.java new file mode 100644 index 00000000000..fd792e43046 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BountifulLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class BountifulLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Forest, Island, or Mountain card"); + + static { + filter.add(Predicates.or( + SubType.FOREST.getPredicate(), + SubType.ISLAND.getPredicate(), + SubType.MOUNTAIN.getPredicate() + )); + } + + public BountifulLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Bountiful Landscape: Search your library for a basic Forest, Island, or Mountain card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {G}{U}{R} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{G}{U}{R}"))); + } + + private BountifulLandscape(final BountifulLandscape card) { + super(card); + } + + @Override + public BountifulLandscape copy() { + return new BountifulLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ContaminatedLandscape.java b/Mage.Sets/src/mage/cards/c/ContaminatedLandscape.java new file mode 100644 index 00000000000..33befbbf714 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ContaminatedLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ContaminatedLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Plains, Island, or Swamp card"); + + static { + filter.add(Predicates.or( + SubType.PLAINS.getPredicate(), + SubType.ISLAND.getPredicate(), + SubType.SWAMP.getPredicate() + )); + } + + public ContaminatedLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Contaminated Landscape: Search your library for a basic Plains, Island, or Swamp card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {W}{U}{B} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{W}{U}{B}"))); + } + + private ContaminatedLandscape(final ContaminatedLandscape card) { + super(card); + } + + @Override + public ContaminatedLandscape copy() { + return new ContaminatedLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DeceptiveLandscape.java b/Mage.Sets/src/mage/cards/d/DeceptiveLandscape.java new file mode 100644 index 00000000000..a795b780bd0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeceptiveLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class DeceptiveLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Plains, Swamp, or Forest card"); + + static { + filter.add(Predicates.or( + SubType.PLAINS.getPredicate(), + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate() + )); + } + + public DeceptiveLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Deceptive Landscape: Search your library for a basic Plains, Swamp, or Forest card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {W}{B}{G} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{W}{B}{G}"))); + } + + private DeceptiveLandscape(final DeceptiveLandscape card) { + super(card); + } + + @Override + public DeceptiveLandscape copy() { + return new DeceptiveLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/ForebodingLandscape.java b/Mage.Sets/src/mage/cards/f/ForebodingLandscape.java new file mode 100644 index 00000000000..fad15d154d7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/ForebodingLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.f; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ForebodingLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Swamp, Forest, or Island card"); + + static { + filter.add(Predicates.or( + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate(), + SubType.ISLAND.getPredicate() + )); + } + + public ForebodingLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Foreboding Landscape: Search your library for a basic Swamp, Forest, or Island card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {B}{G}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{B}{G}{U}"))); + } + + private ForebodingLandscape(final ForebodingLandscape card) { + super(card); + } + + @Override + public ForebodingLandscape copy() { + return new ForebodingLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PerilousLandscape.java b/Mage.Sets/src/mage/cards/p/PerilousLandscape.java new file mode 100644 index 00000000000..bddc03dd3ac --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PerilousLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.p; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class PerilousLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Island, Mountain, or Plains card"); + + static { + filter.add(Predicates.or( + SubType.ISLAND.getPredicate(), + SubType.MOUNTAIN.getPredicate(), + SubType.PLAINS.getPredicate() + )); + } + + public PerilousLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Perilous Landscape: Search your library for a basic Island, Mountain, or Plains card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {U}{R}{W} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{U}{R}{W}"))); + } + + private PerilousLandscape(final PerilousLandscape card) { + super(card); + } + + @Override + public PerilousLandscape copy() { + return new PerilousLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SeethingLandscape.java b/Mage.Sets/src/mage/cards/s/SeethingLandscape.java new file mode 100644 index 00000000000..7f300662195 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SeethingLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class SeethingLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Island, Swamp, or Mountain card"); + + static { + filter.add(Predicates.or( + SubType.ISLAND.getPredicate(), + SubType.SWAMP.getPredicate(), + SubType.MOUNTAIN.getPredicate() + )); + } + + public SeethingLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Seething Landscape: Search your library for a basic Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {U}{B}{R} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{U}{B}{R}"))); + } + + private SeethingLandscape(final SeethingLandscape card) { + super(card); + } + + @Override + public SeethingLandscape copy() { + return new SeethingLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShatteredLandscape.java b/Mage.Sets/src/mage/cards/s/ShatteredLandscape.java new file mode 100644 index 00000000000..e4f4e1cbce3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShatteredLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ShatteredLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Mountain, Plains, or Swamp card"); + + static { + filter.add(Predicates.or( + SubType.MOUNTAIN.getPredicate(), + SubType.PLAINS.getPredicate(), + SubType.SWAMP.getPredicate() + )); + } + + public ShatteredLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Shattered Landscape: Search your library for a basic Mountain, Plains, or Swamp card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {R}{W}{B} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{R}{W}{B}"))); + } + + private ShatteredLandscape(final ShatteredLandscape card) { + super(card); + } + + @Override + public ShatteredLandscape copy() { + return new ShatteredLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShelteringLandscape.java b/Mage.Sets/src/mage/cards/s/ShelteringLandscape.java new file mode 100644 index 00000000000..b649e9d2abb --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShelteringLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ShelteringLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Mountain, Forest, or Plains card"); + + static { + filter.add(Predicates.or( + SubType.MOUNTAIN.getPredicate(), + SubType.FOREST.getPredicate(), + SubType.PLAINS.getPredicate() + )); + } + + public ShelteringLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Sheltering Landscape: Search your library for a basic Mountain, Forest, or Plains card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {R}{G}{W} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{R}{G}{W}"))); + } + + private ShelteringLandscape(final ShelteringLandscape card) { + super(card); + } + + @Override + public ShelteringLandscape copy() { + return new ShelteringLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TranquilLandscape.java b/Mage.Sets/src/mage/cards/t/TranquilLandscape.java new file mode 100644 index 00000000000..89b06c627ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TranquilLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.t; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class TranquilLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Forest, Plains, or Island card"); + + static { + filter.add(Predicates.or( + SubType.FOREST.getPredicate(), + SubType.PLAINS.getPredicate(), + SubType.ISLAND.getPredicate() + )); + } + + public TranquilLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Tranquil Landscape: Search your library for a basic Forest, Plains, or Island card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {G}{W}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{G}{W}{U}"))); + } + + private TranquilLandscape(final TranquilLandscape card) { + super(card); + } + + @Override + public TranquilLandscape copy() { + return new TranquilLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TwistedLandscape.java b/Mage.Sets/src/mage/cards/t/TwistedLandscape.java new file mode 100644 index 00000000000..39c79522389 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TwistedLandscape.java @@ -0,0 +1,64 @@ + +package mage.cards.t; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class TwistedLandscape extends CardImpl { + + private static final FilterCard filter = new FilterBasicLandCard("a basic Swamp, Mountain, or Forest card"); + + static { + filter.add(Predicates.or( + SubType.SWAMP.getPredicate(), + SubType.MOUNTAIN.getPredicate(), + SubType.FOREST.getPredicate() + )); + } + + public TwistedLandscape(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Sacrifice Twisted Landscape: Search your library for a basic Swamp, Mountain, or Forest card, put it onto the battlefield tapped, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), + new TapSourceCost() + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + + // Cycling {B}{R}{G} + this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{B}{R}{G}"))); + } + + private TwistedLandscape(final TwistedLandscape card) { + super(card); + } + + @Override + public TwistedLandscape copy() { + return new TwistedLandscape(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index 0a385ba376c..6bdae524566 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -30,6 +30,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Bloodsoaked Insight", 252, Rarity.UNCOMMON, mage.cards.b.BloodsoakedInsight.class)); cards.add(new SetCardInfo("Bloodstained Mire", 216, Rarity.RARE, mage.cards.b.BloodstainedMire.class)); cards.add(new SetCardInfo("Boggart Trawler", 243, Rarity.UNCOMMON, mage.cards.b.BoggartTrawler.class)); + cards.add(new SetCardInfo("Bountiful Landscape", 217, Rarity.COMMON, mage.cards.b.BountifulLandscape.class)); cards.add(new SetCardInfo("Brainsurge", 53, Rarity.UNCOMMON, mage.cards.b.Brainsurge.class)); cards.add(new SetCardInfo("Breaker of Creation", 1, Rarity.UNCOMMON, mage.cards.b.BreakerOfCreation.class)); cards.add(new SetCardInfo("Breya, Etherium Shaper", 289, Rarity.MYTHIC, mage.cards.b.BreyaEtheriumShaper.class)); @@ -41,9 +42,11 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Colossal Dreadmask", 148, Rarity.COMMON, mage.cards.c.ColossalDreadmask.class)); cards.add(new SetCardInfo("Conduit Goblin", 179, Rarity.COMMON, mage.cards.c.ConduitGoblin.class)); cards.add(new SetCardInfo("Consuming Corruption", 84, Rarity.UNCOMMON, mage.cards.c.ConsumingCorruption.class)); + cards.add(new SetCardInfo("Contaminated Landscape", 218, Rarity.COMMON, mage.cards.c.ContaminatedLandscape.class)); cards.add(new SetCardInfo("Copycrook", 55, Rarity.UNCOMMON, mage.cards.c.Copycrook.class)); cards.add(new SetCardInfo("Cranial Ram", 180, Rarity.COMMON, mage.cards.c.CranialRam.class)); cards.add(new SetCardInfo("Cursed Mirror", 279, Rarity.RARE, mage.cards.c.CursedMirror.class)); + cards.add(new SetCardInfo("Deceptive Landscape", 219, Rarity.COMMON, mage.cards.d.DeceptiveLandscape.class)); cards.add(new SetCardInfo("Decree of Justice", 263, Rarity.UNCOMMON, mage.cards.d.DecreeOfJustice.class)); cards.add(new SetCardInfo("Deep Analysis", 268, Rarity.UNCOMMON, mage.cards.d.DeepAnalysis.class)); cards.add(new SetCardInfo("Deserted Temple", 301, Rarity.RARE, mage.cards.d.DesertedTemple.class)); @@ -74,6 +77,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Flare of Malice", 95, Rarity.RARE, mage.cards.f.FlareOfMalice.class)); cards.add(new SetCardInfo("Flooded Strand", 220, Rarity.RARE, mage.cards.f.FloodedStrand.class)); cards.add(new SetCardInfo("Flusterstorm", 496, Rarity.RARE, mage.cards.f.Flusterstorm.class)); + cards.add(new SetCardInfo("Foreboding Landscape", 221, Rarity.COMMON, mage.cards.f.ForebodingLandscape.class)); cards.add(new SetCardInfo("Forest", 308, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Frogmyr Enforcer", 120, Rarity.UNCOMMON, mage.cards.f.FrogmyrEnforcer.class)); cards.add(new SetCardInfo("Furnace Hellkite", 121, Rarity.UNCOMMON, mage.cards.f.FurnaceHellkite.class)); @@ -116,6 +120,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Orim's Chant", 265, Rarity.RARE, mage.cards.o.OrimsChant.class)); cards.add(new SetCardInfo("Path of Annihilation", 165, Rarity.UNCOMMON, mage.cards.p.PathOfAnnihilation.class)); cards.add(new SetCardInfo("Pearl Medallion", 294, Rarity.RARE, mage.cards.p.PearlMedallion.class)); + cards.add(new SetCardInfo("Perilous Landscape", 223, Rarity.COMMON, mage.cards.p.PerilousLandscape.class)); cards.add(new SetCardInfo("Petrifying Meddler", 66, Rarity.COMMON, mage.cards.p.PetrifyingMeddler.class)); cards.add(new SetCardInfo("Phelia, Exuberant Shepherd", 40, Rarity.RARE, mage.cards.p.PheliaExuberantShepherd.class)); cards.add(new SetCardInfo("Phlage, Titan of Fire's Fury", 197, Rarity.MYTHIC, mage.cards.p.PhlageTitanOfFiresFury.class)); @@ -140,8 +145,11 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Sapphire Medallion", 296, Rarity.RARE, mage.cards.s.SapphireMedallion.class)); cards.add(new SetCardInfo("Scurrilous Sentry", 108, Rarity.COMMON, mage.cards.s.ScurrilousSentry.class)); cards.add(new SetCardInfo("Scurry of Gremlins", 203, Rarity.UNCOMMON, mage.cards.s.ScurryOfGremlins.class)); + cards.add(new SetCardInfo("Seething Landscape", 225, Rarity.COMMON, mage.cards.s.SeethingLandscape.class)); cards.add(new SetCardInfo("Serum Visionary", 69, Rarity.COMMON, mage.cards.s.SerumVisionary.class)); cards.add(new SetCardInfo("Sevinne's Reclamation", 267, Rarity.RARE, mage.cards.s.SevinnesReclamation.class)); + cards.add(new SetCardInfo("Shattered Landscape", 226, Rarity.COMMON, mage.cards.s.ShatteredLandscape.class)); + cards.add(new SetCardInfo("Sheltering Landscape", 227, Rarity.COMMON, mage.cards.s.ShelteringLandscape.class)); cards.add(new SetCardInfo("Shifting Woodland", 228, Rarity.RARE, mage.cards.s.ShiftingWoodland.class)); cards.add(new SetCardInfo("Sink into Stupor", 241, Rarity.UNCOMMON, mage.cards.s.SinkIntoStupor.class)); cards.add(new SetCardInfo("Six", 169, Rarity.RARE, mage.cards.s.Six.class)); @@ -167,9 +175,11 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("The Necrobloom", 194, Rarity.RARE, mage.cards.t.TheNecrobloom.class)); cards.add(new SetCardInfo("Thraben Charm", 45, Rarity.COMMON, mage.cards.t.ThrabenCharm.class)); cards.add(new SetCardInfo("Toxic Deluge", 277, Rarity.RARE, mage.cards.t.ToxicDeluge.class)); + cards.add(new SetCardInfo("Tranquil Landscape", 231, Rarity.COMMON, mage.cards.t.TranquilLandscape.class)); cards.add(new SetCardInfo("Trickster's Elk", 175, Rarity.UNCOMMON, mage.cards.t.TrickstersElk.class)); cards.add(new SetCardInfo("Triton Wavebreaker", 74, Rarity.UNCOMMON, mage.cards.t.TritonWavebreaker.class)); cards.add(new SetCardInfo("Tune the Narrative", 75, Rarity.COMMON, mage.cards.t.TuneTheNarrative.class)); + cards.add(new SetCardInfo("Twisted Landscape", 232, Rarity.COMMON, mage.cards.t.TwistedLandscape.class)); cards.add(new SetCardInfo("Ugin's Labyrinth", 233, Rarity.MYTHIC, mage.cards.u.UginsLabyrinth.class)); cards.add(new SetCardInfo("Ulamog, the Defiler", 15, Rarity.MYTHIC, mage.cards.u.UlamogTheDefiler.class)); cards.add(new SetCardInfo("Urza's Cave", 234, Rarity.UNCOMMON, mage.cards.u.UrzasCave.class));