diff --git a/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java b/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java index 2b00903531f..59a967ba7ce 100644 --- a/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java +++ b/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java @@ -3,20 +3,19 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.MayCastTargetThenExileEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.card.OwnerIdPredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInOpponentsGraveyard; @@ -24,7 +23,6 @@ import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetpointer.FixedTarget; import java.util.UUID; -import mage.ApprovingObject; /** * @author LevelX2 @@ -108,17 +106,7 @@ class DiluvianPrimordialEffect extends OneShotEffect { if (target instanceof TargetCardInOpponentsGraveyard) { Card targetCard = game.getCard(target.getFirstTarget()); if (targetCard != null) { - if (controller.chooseUse(Outcome.PlayForFree, "Cast " + targetCard.getLogName() + '?', source, game)) { - game.getState().setValue("PlayFromNotOwnHandZone" + targetCard.getId(), Boolean.TRUE); - Boolean cardWasCast = controller.cast(controller.chooseAbilityForCast(targetCard, game, true), - game, true, new ApprovingObject(source, game)); - game.getState().setValue("PlayFromNotOwnHandZone" + targetCard.getId(), null); - if (cardWasCast) { - ContinuousEffect effect = new DiluvianPrimordialReplacementEffect(); - effect.setTargetPointer(new FixedTarget(targetCard.getId(), game.getState().getZoneChangeCounter(targetCard.getId()))); - game.addEffect(effect, source); - } - } + new MayCastTargetThenExileEffect(true).setTargetPointer(new FixedTarget(targetCard, game)).apply(game, source); } } } @@ -127,43 +115,3 @@ class DiluvianPrimordialEffect extends OneShotEffect { return false; } } - -class DiluvianPrimordialReplacementEffect extends ReplacementEffectImpl { - - public DiluvianPrimordialReplacementEffect() { - super(Duration.EndOfTurn, Outcome.Exile); - staticText = "If a card cast this way would be put into a graveyard this turn, exile it instead"; - } - - private DiluvianPrimordialReplacementEffect(final DiluvianPrimordialReplacementEffect effect) { - super(effect); - } - - @Override - public DiluvianPrimordialReplacementEffect copy() { - return new DiluvianPrimordialReplacementEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - ((ZoneChangeEvent) event).setToZone(Zone.EXILED); - return false; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - return zEvent.getToZone() == Zone.GRAVEYARD - && event.getTargetId().equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java b/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java index 457e1ac0583..ed028df7754 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java @@ -1,20 +1,18 @@ package mage.cards.f; -import mage.ApprovingObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.MayCastTargetThenExileEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Outcome; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.Target; @@ -118,7 +116,7 @@ class FinaleOfPromiseEffect extends OneShotEffect { } // ask to cast order - if (!cardsToCast.isEmpty()) { + if (cardsToCast.size() > 1) { String cardsOrder = cardsToCast.stream() .map(game::getCard) .filter(Objects::nonNull) @@ -135,13 +133,7 @@ class FinaleOfPromiseEffect extends OneShotEffect { for (UUID id : cardsToCast) { Card card = game.getCard(id); if (card != null) { - game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), Boolean.TRUE); - controller.cast(controller.chooseAbilityForCast(card, game, true), - game, true, new ApprovingObject(source, game)); - game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), null); - ContinuousEffect effect = new FinaleOfPromiseReplacementEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId()))); - game.addEffect(effect, source); + new MayCastTargetThenExileEffect(true).setTargetPointer(new FixedTarget(card, game)).apply(game, source); } } @@ -162,49 +154,3 @@ class FinaleOfPromiseEffect extends OneShotEffect { return true; } } - -class FinaleOfPromiseReplacementEffect extends ReplacementEffectImpl { - - public FinaleOfPromiseReplacementEffect() { - super(Duration.EndOfTurn, Outcome.Exile); - staticText = "If a card cast this way would be put into your graveyard this turn, exile it instead"; - } - - private FinaleOfPromiseReplacementEffect(final FinaleOfPromiseReplacementEffect effect) { - super(effect); - } - - @Override - public FinaleOfPromiseReplacementEffect copy() { - return new FinaleOfPromiseReplacementEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { - return controller.moveCards(card, Zone.EXILED, source, game); - } - } - return false; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - return zEvent.getToZone() == Zone.GRAVEYARD - && event.getTargetId().equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HaloForager.java b/Mage.Sets/src/mage/cards/h/HaloForager.java index f6712fec2a4..5f6caabba64 100644 --- a/Mage.Sets/src/mage/cards/h/HaloForager.java +++ b/Mage.Sets/src/mage/cards/h/HaloForager.java @@ -7,22 +7,22 @@ import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.MayCastTargetThenExileEffect; import mage.abilities.effects.common.replacement.ThatSpellGraveyardExileReplacementEffect; import mage.abilities.keyword.FlyingAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.common.FilterInstantOrSorceryCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetpointer.FixedTarget; -import mage.util.CardUtil; import java.util.UUID; @@ -90,40 +90,9 @@ class HaloForagerPayEffect extends OneShotEffect { "instant or sorcery card with mana value " + costX + " from a graveyard" ); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, costX)); - ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new HaloForagerCastEffect(costX), false); + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new MayCastTargetThenExileEffect(true), false); ability.addTarget(new TargetCardInGraveyard(filter)); game.fireReflexiveTriggeredAbility(ability, source); return true; } } - -class HaloForagerCastEffect extends OneShotEffect { - - HaloForagerCastEffect(int costX) { - super(Outcome.Benefit); - staticText = "You may cast target instant or sorcery card with mana value " + costX + " from a graveyard " + - "without paying its mana cost. " + ThatSpellGraveyardExileReplacementEffect.RULE_A; - } - - private HaloForagerCastEffect(final HaloForagerCastEffect effect) { - super(effect); - } - - @Override - public HaloForagerCastEffect copy() { - return new HaloForagerCastEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (player == null || card == null) { - return false; - } - ContinuousEffect effect = new ThatSpellGraveyardExileReplacementEffect(false); - effect.setTargetPointer(new FixedTarget(card, game)); - game.addEffect(effect, source); - return CardUtil.castSpellWithAttributesForFree(player, source, game, card); - } -} diff --git a/Mage.Sets/src/mage/cards/s/ScholarOfTheLostTrove.java b/Mage.Sets/src/mage/cards/s/ScholarOfTheLostTrove.java index d8f0f9e6327..73b873f8759 100644 --- a/Mage.Sets/src/mage/cards/s/ScholarOfTheLostTrove.java +++ b/Mage.Sets/src/mage/cards/s/ScholarOfTheLostTrove.java @@ -1,27 +1,27 @@ package mage.cards.s; +import mage.ApprovingObject; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.ThatSpellGraveyardExileReplacementEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetpointer.FixedTarget; import java.util.UUID; -import mage.ApprovingObject; /** * @author TheElk801 @@ -96,59 +96,16 @@ class ScholarOfTheLostTroveEffect extends OneShotEffect { return true; } game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), Boolean.TRUE); - Boolean cardWasCast = controller.cast(controller.chooseAbilityForCast(card, game, true), + boolean cardWasCast = controller.cast(controller.chooseAbilityForCast(card, game, true), game, true, new ApprovingObject(source, game)); game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), null); if (!cardWasCast || !card.isInstantOrSorcery(game)) { return true; } - ContinuousEffect effect = new ScholarOfTheLostTroveReplacementEffect(card.getId()); + ContinuousEffect effect = new ThatSpellGraveyardExileReplacementEffect(true); effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId()))); + effect.setText("If an instant or sorcery spell cast this way would be put into your graveyard this turn, exile it instead"); game.addEffect(effect, source); return true; } } - -class ScholarOfTheLostTroveReplacementEffect extends ReplacementEffectImpl { - - private final UUID cardId; - - ScholarOfTheLostTroveReplacementEffect(UUID cardId) { - super(Duration.EndOfTurn, Outcome.Exile); - this.cardId = cardId; - staticText = "If an instant or sorcery spell cast this way would be put into your graveyard this turn, exile it instead"; - } - - private ScholarOfTheLostTroveReplacementEffect(final ScholarOfTheLostTroveReplacementEffect effect) { - super(effect); - this.cardId = effect.cardId; - } - - @Override - public ScholarOfTheLostTroveReplacementEffect copy() { - return new ScholarOfTheLostTroveReplacementEffect(this); - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player controller = game.getPlayer(source.getControllerId()); - Card card = game.getCard(this.cardId); - if (controller == null || card == null) { - return false; - } - controller.moveCards(card, Zone.EXILED, source, game); - return true; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - return zEvent.getToZone() == Zone.GRAVEYARD - && zEvent.getTargetId().equals(this.cardId); - } -}