[WHO] Implement The Curse of Fenric (#13718)

---------

Co-authored-by: xenohedron <12538125+xenohedron@users.noreply.github.com>
This commit is contained in:
padfoothelix 2025-06-08 05:10:34 +02:00 committed by GitHub
parent f94e570f6d
commit 4bc30b4b8e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 200 additions and 2 deletions

View file

@ -2201,6 +2201,7 @@ public class ScryfallImageSupportTokens {
put("WHO/Human/2", "https://api.scryfall.com/cards/twho/5/en?format=image"); 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/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/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/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/1", "https://api.scryfall.com/cards/twho/28?format=image");
put("WHO/Treasure/2", "https://api.scryfall.com/cards/twho/29?format=image"); put("WHO/Treasure/2", "https://api.scryfall.com/cards/twho/29?format=image");

View file

@ -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<UUID> 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);
}
}

View file

@ -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", 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 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 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", 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", 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", 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", 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)); //cards.add(new SetCardInfo("The Cyber-Controller", 724, Rarity.RARE, mage.cards.t.TheCyberController.class, NON_FULL_USE_VARIOUS));

View file

@ -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);
}
}

View file

@ -2253,6 +2253,7 @@
|Generate|TOK:WHO|Human|2||TheEleventhHourToken| |Generate|TOK:WHO|Human|2||TheEleventhHourToken|
|Generate|TOK:WHO|Human Noble|||TheGirlInTheFireplaceHumanNobleToken| |Generate|TOK:WHO|Human Noble|||TheGirlInTheFireplaceHumanNobleToken|
|Generate|TOK:WHO|Mark of the Rani|||MarkOfTheRaniToken| |Generate|TOK:WHO|Mark of the Rani|||MarkOfTheRaniToken|
|Generate|TOK:WHO|Mutant|||Mutant33DeathtouchToken|
|Generate|TOK:WHO|Soldier|||SoldierToken| |Generate|TOK:WHO|Soldier|||SoldierToken|
|Generate|TOK:WHO|Treasure|1||TreasureToken| |Generate|TOK:WHO|Treasure|1||TreasureToken|
|Generate|TOK:WHO|Treasure|2||TreasureToken| |Generate|TOK:WHO|Treasure|2||TreasureToken|