diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java index a6479a6c40a..19aecedcf0e 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java @@ -2201,6 +2201,7 @@ public class ScryfallImageSupportTokens { put("WHO/Human/2", "https://api.scryfall.com/cards/twho/5/en?format=image"); put("WHO/Human Noble", "https://api.scryfall.com/cards/twho/7/en?format=image"); put("WHO/Mark of the Rani", "https://api.scryfall.com/cards/twho/15?format=image"); + put("WHO/Mutant", "https://api.scryfall.com/cards/twho/18?format=image"); put("WHO/Soldier", "https://api.scryfall.com/cards/twho/8?format=image"); put("WHO/Treasure/1", "https://api.scryfall.com/cards/twho/28?format=image"); put("WHO/Treasure/2", "https://api.scryfall.com/cards/twho/29?format=image"); diff --git a/Mage.Sets/src/mage/cards/t/TheCurseOfFenric.java b/Mage.Sets/src/mage/cards/t/TheCurseOfFenric.java new file mode 100644 index 00000000000..e17de685187 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheCurseOfFenric.java @@ -0,0 +1,162 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SagaAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.FightTargetsEffect; +import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.other.AnotherTargetPredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.Mutant33DeathtouchToken; +import mage.game.permanent.token.Token; +import mage.game.permanent.token.TokenImpl; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster; +import mage.target.targetpointer.EachTargetPointer; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * @author padfoothelix + */ +public final class TheCurseOfFenric extends CardImpl { + + private static final FilterCreaturePermanent nontokenFilter = new FilterCreaturePermanent("nontoken creature"); + private static final FilterPermanent mutantFilter = new FilterPermanent(SubType.MUTANT, "mutant"); + private static final FilterCreaturePermanent fenricFilter = new FilterCreaturePermanent("another target creature named Fenric"); + + static { + nontokenFilter.add(TokenPredicate.FALSE); + fenricFilter.add(new NamePredicate("Fenric")); + fenricFilter.add(new AnotherTargetPredicate(2)); + } + + public TheCurseOfFenric(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{W}"); + + this.subtype.add(SubType.SAGA); + + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) + SagaAbility sagaAbility = new SagaAbility(this); + + // I -- For each player, destroy up to one target creature that player controls. For each creature destroyed this way, its controller creates a 3/3 green Mutant creature token with deathtouch. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_I, + ability -> { + ability.addEffect(new TheCurseOfFenricDestroyEffect() + .setText("for each player, destroy up to one target creature " + + "that player controls. For each creature destroyed " + + "this way, its controller creates a 3/3 green Mutant " + + "creature with deathtouch") + .setTargetPointer(new EachTargetPointer()) + ); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_CREATURE)); + ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false)); + } + ); + + + // II -- Target nontoken creature becomes a 6/6 legendary Horror creature named Fenric and loses all abilities. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_II, + new BecomesCreatureTargetEffect( + new TheCurseOfFenricHorrorToken(), + true, false, Duration.EndOfGame, true + ), + new TargetCreaturePermanent(nontokenFilter) + ); + + // III -- Target Mutant fights another target creature named Fenric. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_III, + ability -> { + ability.addEffect(new FightTargetsEffect().setText( + "Target Mutant fights another target creature named Fenric" + )); + ability.addTarget(new TargetPermanent(mutantFilter).setTargetTag(1)); + ability.addTarget(new TargetCreaturePermanent(fenricFilter).setTargetTag(2)); + } + ); + + this.addAbility(sagaAbility); + } + + private TheCurseOfFenric(final TheCurseOfFenric card) { + super(card); + } + + @Override + public TheCurseOfFenric copy() { + return new TheCurseOfFenric(this); + } +} + +class TheCurseOfFenricDestroyEffect extends OneShotEffect { + + TheCurseOfFenricDestroyEffect() { + super(Outcome.DestroyPermanent); + } + + private TheCurseOfFenricDestroyEffect(final TheCurseOfFenricDestroyEffect effect) { + super(effect); + } + + @Override + public TheCurseOfFenricDestroyEffect copy() { + return new TheCurseOfFenricDestroyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Token mutantToken = new Mutant33DeathtouchToken(); + List playersToCreateToken = new ArrayList<>(); + for (Target target : source.getTargets()) { + Permanent targetCreature = game.getPermanent(target.getFirstTarget()); + if (targetCreature != null) { + UUID controllerId = targetCreature.getControllerId(); + if (targetCreature.destroy(source, game, false)) { + playersToCreateToken.add(controllerId); + } + } + } + game.processAction(); + for (UUID controllerId : playersToCreateToken) { + mutantToken.putOntoBattlefield(1, game, source, controllerId); + } + return true; + } +} + +class TheCurseOfFenricHorrorToken extends TokenImpl { + + TheCurseOfFenricHorrorToken() { + super("Fenric", "6/6 legendary Horror creature named Fenric"); + this.supertype.add(SuperType.LEGENDARY); + this.cardType.add(CardType.CREATURE); + this.subtype.add(SubType.HORROR); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + } + + private TheCurseOfFenricHorrorToken(final TheCurseOfFenricHorrorToken token) { + super(token); + } + + public TheCurseOfFenricHorrorToken copy() { + return new TheCurseOfFenricHorrorToken(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index 355a2dcda6c..e90aca9d94d 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -877,8 +877,8 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("The Caves of Androzani", 15, Rarity.RARE, mage.cards.t.TheCavesOfAndrozani.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("The Caves of Androzani", 620, Rarity.RARE, mage.cards.t.TheCavesOfAndrozani.class, NON_FULL_USE_VARIOUS)); //cards.add(new SetCardInfo("The Cheetah Planet", 574, Rarity.COMMON, mage.cards.t.TheCheetahPlanet.class)); - //cards.add(new SetCardInfo("The Curse of Fenric", 118, Rarity.RARE, mage.cards.t.TheCurseOfFenric.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("The Curse of Fenric", 723, Rarity.RARE, mage.cards.t.TheCurseOfFenric.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Curse of Fenric", 118, Rarity.RARE, mage.cards.t.TheCurseOfFenric.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Curse of Fenric", 723, Rarity.RARE, mage.cards.t.TheCurseOfFenric.class, NON_FULL_USE_VARIOUS)); //cards.add(new SetCardInfo("The Cyber-Controller", 119, Rarity.RARE, mage.cards.t.TheCyberController.class, NON_FULL_USE_VARIOUS)); //cards.add(new SetCardInfo("The Cyber-Controller", 405, Rarity.RARE, mage.cards.t.TheCyberController.class, NON_FULL_USE_VARIOUS)); //cards.add(new SetCardInfo("The Cyber-Controller", 724, Rarity.RARE, mage.cards.t.TheCyberController.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/game/permanent/token/Mutant33DeathtouchToken.java b/Mage/src/main/java/mage/game/permanent/token/Mutant33DeathtouchToken.java new file mode 100644 index 00000000000..bfd77473771 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/Mutant33DeathtouchToken.java @@ -0,0 +1,34 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.DeathtouchAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author padfoothelix + */ + + +public final class Mutant33DeathtouchToken extends TokenImpl { + + public Mutant33DeathtouchToken() { + super("Mutant Token", "3/3 green mutant creature token with deathtouch"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.MUTANT); + color.setGreen(true); + power = new MageInt(3); + toughness = new MageInt(3); + + addAbility(DeathtouchAbility.getInstance()); + } + + private Mutant33DeathtouchToken(final Mutant33DeathtouchToken token) { + super(token); + } + + public Mutant33DeathtouchToken copy() { + return new Mutant33DeathtouchToken(this); + } +} + diff --git a/Mage/src/main/resources/tokens-database.txt b/Mage/src/main/resources/tokens-database.txt index 696ad31ba28..d7858933b16 100644 --- a/Mage/src/main/resources/tokens-database.txt +++ b/Mage/src/main/resources/tokens-database.txt @@ -2253,6 +2253,7 @@ |Generate|TOK:WHO|Human|2||TheEleventhHourToken| |Generate|TOK:WHO|Human Noble|||TheGirlInTheFireplaceHumanNobleToken| |Generate|TOK:WHO|Mark of the Rani|||MarkOfTheRaniToken| +|Generate|TOK:WHO|Mutant|||Mutant33DeathtouchToken| |Generate|TOK:WHO|Soldier|||SoldierToken| |Generate|TOK:WHO|Treasure|1||TreasureToken| |Generate|TOK:WHO|Treasure|2||TreasureToken|