[EMN] refactor some TDFCs

This commit is contained in:
theelk801 2025-07-29 09:25:43 -04:00
parent 668e2bfe22
commit f024e3b092
9 changed files with 102 additions and 213 deletions

View file

@ -1,28 +1,26 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class ConduitOfEmrakul extends CardImpl {
public ConduitOfEmrakul(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(5);
@ -32,11 +30,12 @@ public final class ConduitOfEmrakul extends CardImpl {
this.nightCard = true;
// Whenever Conduit of Emrakul attacks, add {C}{C} at the beginning of your next main phase this turn.
Effect effect = new CreateDelayedTriggeredAbilityEffect(
this.addAbility(new AttacksTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfMainPhaseDelayedTriggeredAbility(
new AddManaToManaPoolSourceControllerEffect(Mana.GenericMana(2)), false, TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN_THIS_TURN));
effect.setText("add {C}{C} at the beginning of your next main phase this turn");
this.addAbility(new AttacksTriggeredAbility(effect, false));
new AddManaToManaPoolSourceControllerEffect(Mana.GenericMana(2)), false,
TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN_THIS_TURN
)
).setText("add {C}{C} at the beginning of your next main phase this turn"), false));
}
private ConduitOfEmrakul(final ConduitOfEmrakul card) {

View file

@ -1,33 +1,30 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class ConduitOfStorms extends CardImpl {
public ConduitOfStorms(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(2);
@ -36,11 +33,13 @@ public final class ConduitOfStorms extends CardImpl {
this.secondSideCardClazz = mage.cards.c.ConduitOfEmrakul.class;
// Whenever Conduit of Storms attacks, add {R} at the beginning of your next main phase this turn.
Effect effect = new CreateDelayedTriggeredAbilityEffect(
this.addAbility(new AttacksTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfMainPhaseDelayedTriggeredAbility(
new AddManaToManaPoolSourceControllerEffect(Mana.RedMana(1)), false, TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN_THIS_TURN));
effect.setText("add {R} at the beginning of your next main phase this turn");
this.addAbility(new AttacksTriggeredAbility(effect, false));
new AddManaToManaPoolSourceControllerEffect(Mana.RedMana(1)), false,
TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN_THIS_TURN
)
).setText("add {R} at the beginning of your next main phase this turn"), false));
// {3}{R}{R}: Transform Conduit of Storms.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{R}{R}")));

View file

@ -1,42 +1,40 @@
package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
import mage.filter.FilterSpell;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.HumanWizardToken;
import mage.players.Player;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class DocentOfPerfection extends CardImpl {
private static final FilterSpell filterSpell = new FilterSpell("an instant or sorcery spell");
static {
filterSpell.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()));
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledPermanent(SubType.WIZARD), ComparisonType.MORE_THAN, 2
);
private static final Hint hint = new ValueHint(
"Wizards you control", new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.WIZARD))
);
public DocentOfPerfection(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
@ -53,10 +51,15 @@ public final class DocentOfPerfection extends CardImpl {
// Whenever you cast an instant or sorcery spell, create a 1/1 blue Human Wizard creature token.
// Then if you control three or more Wizards, transform Docent of Perfection.
this.addAbility(new TransformAbility());
Effect effect = new DocentOfPerfectionEffect();
Ability ability = new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new HumanWizardToken()), filterSpell, false);
ability.addEffect(effect);
this.addAbility(ability);
Ability ability = new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new HumanWizardToken()),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
);
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), condition,
"Then if you control three or more Wizards, transform {this}"
));
this.addAbility(ability.addHint(hint));
}
private DocentOfPerfection(final DocentOfPerfection card) {
@ -68,38 +71,3 @@ public final class DocentOfPerfection extends CardImpl {
return new DocentOfPerfection(this);
}
}
class DocentOfPerfectionEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterPermanent("Wizards");
static {
filter.add(SubType.WIZARD.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
}
public DocentOfPerfectionEffect() {
super(Outcome.Benefit);
staticText = "Then if you control three or more Wizards, transform {this}";
}
private DocentOfPerfectionEffect(final DocentOfPerfectionEffect effect) {
super(effect);
}
@Override
public DocentOfPerfectionEffect copy() {
return new DocentOfPerfectionEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
if (game.getBattlefield().count(filter, source.getControllerId(), source, game) >= 3) {
return new TransformSourceEffect().apply(game, source);
}
}
return false;
}
}

View file

@ -1,43 +1,37 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.game.permanent.token.HumanWizardToken;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class FinalIteration extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Wizards");
private static final FilterSpell filterSpell = new FilterSpell("an instant or sorcery spell");
private static final FilterPermanent filter = new FilterPermanent("Wizards");
static {
filter.add(SubType.WIZARD.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
filterSpell.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()));
}
public FinalIteration(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.INSECT);
this.power = new MageInt(6);
@ -50,14 +44,19 @@ public final class FinalIteration extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Wizards you control get +2/+1 and have flying.
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(2, 1, Duration.WhileOnBattlefield, filter, false));
Effect effect = new GainAbilityAllEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield, filter, false);
effect.setText("and have flying");
ability.addEffect(effect);
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
2, 1, Duration.WhileOnBattlefield, filter, false
));
ability.addEffect(new GainAbilityControlledEffect(
FlyingAbility.getInstance(), Duration.WhileOnBattlefield, filter
).setText("and have flying"));
this.addAbility(ability);
// Whenever you cast an instant or sorcery spell, create a 1/1 blue Human Wizard creature token.
this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new HumanWizardToken()), filterSpell, false));
this.addAbility(new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new HumanWizardToken()),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
}
private FinalIteration(final FinalIteration card) {

View file

@ -1,29 +1,25 @@
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.RequirementEffect;
import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class GrislyAnglerfish extends CardImpl {
public GrislyAnglerfish(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.FISH);
this.power = new MageInt(4);
@ -33,7 +29,9 @@ public final class GrislyAnglerfish extends CardImpl {
this.nightCard = true;
// {6}: Creatures your opponents control attack this turn if able.
this.addAbility(new SimpleActivatedAbility(new GrislyAnglerfishMustAttackEffect(), new ManaCostsImpl<>("{6}")));
this.addAbility(new SimpleActivatedAbility(new AttacksIfAbleAllEffect(
StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, Duration.EndOfTurn
), new ManaCostsImpl<>("{6}")));
}
private GrislyAnglerfish(final GrislyAnglerfish card) {
@ -45,39 +43,3 @@ public final class GrislyAnglerfish extends CardImpl {
return new GrislyAnglerfish(this);
}
}
class GrislyAnglerfishMustAttackEffect extends RequirementEffect {
GrislyAnglerfishMustAttackEffect() {
super(Duration.EndOfTurn);
staticText = "Creatures your opponents control attack this turn if able";
}
private GrislyAnglerfishMustAttackEffect(final GrislyAnglerfishMustAttackEffect effect) {
super(effect);
}
@Override
public GrislyAnglerfishMustAttackEffect copy() {
return new GrislyAnglerfishMustAttackEffect(this);
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
if (game.getOpponents(source.getControllerId()).contains(permanent.getControllerId())) {
return true;
}
return false;
}
@Override
public boolean mustAttack(Game game) {
return true;
}
@Override
public boolean mustBlock(Game game) {
return false;
}
}

View file

@ -1,23 +1,22 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.ColorlessPredicate;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
@ -26,6 +25,14 @@ import java.util.UUID;
*/
public final class GrizzledAngler extends CardImpl {
private static final FilterCard filter = new FilterCreatureCard();
static {
filter.add(ColorlessPredicate.instance);
}
private static final Condition condition = new CardsInControllerGraveyardCondition(1, filter);
public GrizzledAngler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.HUMAN);
@ -36,7 +43,11 @@ public final class GrizzledAngler extends CardImpl {
// {T}: Put the top two cards of your library into your graveyard. Then if there is a colorless creature card in your graveyard, transform Grizzled Angler.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new GrizzledAnglerEffect(), new TapSourceCost()));
Ability ability = new SimpleActivatedAbility(new MillCardsControllerEffect(2), new TapSourceCost());
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), condition,
"Then if there is a colorless creature card in your graveyard, transform {this}"
));
}
private GrizzledAngler(final GrizzledAngler card) {
@ -48,38 +59,3 @@ public final class GrizzledAngler extends CardImpl {
return new GrizzledAngler(this);
}
}
class GrizzledAnglerEffect extends OneShotEffect {
private static final FilterCreatureCard filter = new FilterCreatureCard("a colorless creature card in your graveyard");
static {
filter.add(ColorlessPredicate.instance);
}
public GrizzledAnglerEffect() {
super(Outcome.Benefit);
staticText = "Mill two cards. Then if there is a colorless creature card in your graveyard, transform {this}";
}
private GrizzledAnglerEffect(final GrizzledAnglerEffect effect) {
super(effect);
}
@Override
public GrizzledAnglerEffect copy() {
return new GrizzledAnglerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
controller.millCards(2, source, game);
if (controller.getGraveyard().count(filter, source.getControllerId(), source, game) >= 1) {
return new TransformSourceEffect().apply(game, source);
}
}
return false;
}
}

View file

@ -3,9 +3,8 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TransformAbility;
@ -26,7 +25,6 @@ import java.util.UUID;
public final class LoneRider extends CardImpl {
private static final Condition condition = new YouGainedLifeCondition(ComparisonType.MORE_THAN, 2);
private static final Hint hint = new ConditionHint(condition);
public LoneRider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@ -47,7 +45,7 @@ public final class LoneRider extends CardImpl {
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new TransformSourceEffect(), false
).withInterveningIf(condition).addHint(hint), new PlayerGainedLifeWatcher());
).withInterveningIf(condition).addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher());
}
private LoneRider(final LoneRider card) {

View file

@ -1,14 +1,10 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
@ -16,9 +12,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author fireshoes
*/
@ -34,9 +31,7 @@ public final class SmolderingWerewolf extends CardImpl {
this.secondSideCardClazz = mage.cards.e.EruptingDreadwolf.class;
// When Smoldering Werewolf enters the battlefield, it deals 1 damage to each of up to two target creatures.
Effect effect = new DamageTargetEffect(1);
effect.setText("it deals 1 damage to each of up to two target creatures");
Ability ability = new EntersBattlefieldTriggeredAbility(effect, false);
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(1, "it"));
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.addAbility(ability);

View file

@ -1,7 +1,6 @@
package mage.cards.v;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
@ -10,26 +9,20 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.common.FilterInstantOrSorceryCard;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class VoraciousReader extends CardImpl {
private static final FilterCard filter = new FilterCard("Instant and sorcery spells");
static {
filter.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()
));
}
private static final FilterCard filter = new FilterInstantOrSorceryCard("Instant and sorcery spells");
public VoraciousReader(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.HOMUNCULUS);
this.power = new MageInt(3);