add otherwise effect to LookLibraryAndPickControllerEffect

This commit is contained in:
theelk801 2025-07-23 10:55:32 -04:00
parent cdf23ac18a
commit 76e1b60c32
6 changed files with 71 additions and 231 deletions

View file

@ -1,16 +1,12 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.cards.Cards;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
@ -24,7 +20,9 @@ public final class AdventureAwaits extends CardImpl {
// Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order. If you don't put a card into your hand this way, draw a card.
this.getSpellAbility().addEffect(new AdventureAwaitsEffect());
this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(
5, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM
).withOtherwiseEffect(new DrawCardSourceControllerEffect(1)));
}
private AdventureAwaits(final AdventureAwaits card) {
@ -36,33 +34,3 @@ public final class AdventureAwaits extends CardImpl {
return new AdventureAwaits(this);
}
}
class AdventureAwaitsEffect extends LookLibraryAndPickControllerEffect {
AdventureAwaitsEffect() {
super(5, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM);
}
private AdventureAwaitsEffect(final AdventureAwaitsEffect effect) {
super(effect);
}
@Override
public AdventureAwaitsEffect copy() {
return new AdventureAwaitsEffect(this);
}
@Override
public boolean actionWithPickedCards(Game game, Ability source, Player player, Cards pickedCards, Cards otherCards) {
super.actionWithPickedCards(game, source, player, pickedCards, otherCards);
if (pickedCards.isEmpty()) {
player.drawCards(1, source, game);
}
return true;
}
@Override
public String getText(Mode mode) {
return super.getText(mode).concat(". If you didn't put a card into your hand this way, draw a card");
}
}

View file

@ -1,12 +1,10 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.keyword.ReachAbility;
import mage.cards.Cards;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -14,8 +12,6 @@ import mage.constants.PutCards;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
@ -24,6 +20,15 @@ import java.util.UUID;
*/
public final class BlossomPrancer extends CardImpl {
private static final FilterCard filter = new FilterCard("creature or enchantment card");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
CardType.ENCHANTMENT.getPredicate()
));
}
public BlossomPrancer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
@ -38,7 +43,9 @@ public final class BlossomPrancer extends CardImpl {
// You may reveal a creature or enchantment card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
// If you didn't put a card into your hand this way, you gain 4 life.
this.addAbility(new EntersBattlefieldTriggeredAbility(new BlossomPrancerEffect()));
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
5, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM
).withOtherwiseEffect(new GainLifeEffect(4))));
}
private BlossomPrancer(final BlossomPrancer card) {
@ -50,42 +57,3 @@ public final class BlossomPrancer extends CardImpl {
return new BlossomPrancer(this);
}
}
class BlossomPrancerEffect extends LookLibraryAndPickControllerEffect {
private static final FilterCard filter = new FilterCard("creature or enchantment card");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
CardType.ENCHANTMENT.getPredicate()
));
}
BlossomPrancerEffect() {
super(5, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM);
}
private BlossomPrancerEffect(final BlossomPrancerEffect effect) {
super(effect);
}
@Override
public BlossomPrancerEffect copy() {
return new BlossomPrancerEffect(this);
}
@Override
public boolean actionWithPickedCards(Game game, Ability source, Player player, Cards pickedCards, Cards otherCards) {
super.actionWithPickedCards(game, source, player, pickedCards, otherCards);
if (pickedCards.isEmpty()) {
player.gainLife(4, game, source);
}
return true;
}
@Override
public String getText(Mode mode) {
return super.getText(mode).concat(". If you didn't put a card into your hand this way, you gain 4 life");
}
}

View file

@ -1,20 +1,15 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.counter.ProliferateEffect;
import mage.cards.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
@ -33,7 +28,9 @@ public final class ContagiousVorrac extends CardImpl {
this.toughness = new MageInt(3);
// When Contagious Vorrac enters the battlefield, look at the top four cards of your library. You may reveal a land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. If you didn't put a card into your hand this way, proliferate.
this.addAbility(new EntersBattlefieldTriggeredAbility(new ContagiousVorracEffect()));
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
4, 1, StaticFilters.FILTER_CARD_LAND_A, PutCards.HAND, PutCards.BOTTOM_RANDOM
).withOtherwiseEffect(new ProliferateEffect())));
}
private ContagiousVorrac(final ContagiousVorrac card) {
@ -45,42 +42,3 @@ public final class ContagiousVorrac extends CardImpl {
return new ContagiousVorrac(this);
}
}
class ContagiousVorracEffect extends OneShotEffect {
ContagiousVorracEffect() {
super(Outcome.Benefit);
staticText = "look at the top four cards of your library. You may reveal a land card from among them " +
"and put it into your hand. Put the rest on the bottom of your library in a random order. " +
"If you didn't put a card into your hand this way, proliferate. " +
"<i>(Choose any number of permanents and/or players, then give each another counter of each kind already there.)</i>";
}
private ContagiousVorracEffect(final ContagiousVorracEffect effect) {
super(effect);
}
@Override
public ContagiousVorracEffect copy() {
return new ContagiousVorracEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 4));
TargetCard target = new TargetCardInLibrary(0, 1, StaticFilters.FILTER_CARD_LAND);
player.choose(Outcome.DrawCard, cards, target, source, game);
Card card = game.getCard(target.getFirstTarget());
if (card != null) {
player.revealCards(source, new CardsImpl(card), game);
player.moveCards(card, Zone.HAND, source, game);
}
cards.retainZone(Zone.LIBRARY, game);
player.putCardsOnBottomOfLibrary(cards, game, source, false);
return card != null || new ProliferateEffect().apply(game, source);
}
}

View file

@ -1,23 +1,18 @@
package mage.cards.p;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.*;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
import java.util.Optional;
import java.util.UUID;
/**
@ -25,6 +20,8 @@ import java.util.UUID;
*/
public final class PulsarSquadronAce extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.SPACECRAFT);
public PulsarSquadronAce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@ -34,7 +31,9 @@ public final class PulsarSquadronAce extends CardImpl {
this.toughness = new MageInt(2);
// When this creature enters, look at the top five cards of your library. You may reveal a Spacecraft card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. If you didn't put a card into your hand this way, put a +1/+1 counter on this creature.
this.addAbility(new EntersBattlefieldTriggeredAbility(new PulsarSquadronAceEffect()));
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
5, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM
).withOtherwiseEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))));
}
private PulsarSquadronAce(final PulsarSquadronAce card) {
@ -46,48 +45,3 @@ public final class PulsarSquadronAce extends CardImpl {
return new PulsarSquadronAce(this);
}
}
class PulsarSquadronAceEffect extends OneShotEffect {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.SPACECRAFT);
PulsarSquadronAceEffect() {
super(Outcome.Benefit);
staticText = "look at the top five cards of your library. You may reveal a Spacecraft card from among them " +
"and put it into your hand. Put the rest on the bottom of your library in a random order. " +
"If you didn't put a card into your hand this way, put a +1/+1 counter on {this}";
}
private PulsarSquadronAceEffect(final PulsarSquadronAceEffect effect) {
super(effect);
}
@Override
public PulsarSquadronAceEffect copy() {
return new PulsarSquadronAceEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 5));
TargetCard target = new TargetCardInLibrary(0, 1, filter);
player.choose(outcome, cards, target, source, game);
Card card = game.getCard(target.getFirstTarget());
if (card == null) {
player.putCardsOnBottomOfLibrary(cards, game, source, false);
Optional.ofNullable(source.getSourcePermanentIfItStillExists(game))
.filter(permanent -> permanent.addCounters(CounterType.P1P1.createInstance(), source, game))
.isPresent();
return true;
}
player.revealCards(source, new CardsImpl(card), game);
player.moveCards(card, Zone.HAND, source, game);
cards.retainZone(Zone.LIBRARY, game);
player.putCardsOnBottomOfLibrary(cards, game, source, false);
return true;
}
}

View file

@ -1,24 +1,18 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
@ -27,6 +21,15 @@ import java.util.UUID;
*/
public final class RosecotKnight extends CardImpl {
private static final FilterCard filter = new FilterCard("artifact or enchantment card");
static {
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.ENCHANTMENT.getPredicate()
));
}
public RosecotKnight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
@ -39,7 +42,9 @@ public final class RosecotKnight extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// When Rosecot Knight enters the battlefield, look at the top six cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. If you didn't put a card into your hand this way, put a +1/+1 counter on Rosecot Knight.
this.addAbility(new EntersBattlefieldTriggeredAbility(new RosecotKnightEffect()));
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM
).withOtherwiseEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))));
}
private RosecotKnight(final RosecotKnight card) {
@ -51,41 +56,3 @@ public final class RosecotKnight extends CardImpl {
return new RosecotKnight(this);
}
}
class RosecotKnightEffect extends LookLibraryAndPickControllerEffect {
private static final FilterCard filter = new FilterCard("artifact or enchantment card");
static {
filter.add(Predicates.or(CardType.ARTIFACT.getPredicate(), CardType.ENCHANTMENT.getPredicate()));
}
RosecotKnightEffect() {
super(6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM);
}
private RosecotKnightEffect(final RosecotKnightEffect effect) {
super(effect);
}
@Override
public RosecotKnightEffect copy() {
return new RosecotKnightEffect(this);
}
@Override
protected boolean actionWithPickedCards(Game game, Ability source, Player player, Cards pickedCards, Cards otherCards) {
super.actionWithPickedCards(game, source, player, pickedCards, otherCards);
game.processAction();
pickedCards.retainZone(Zone.HAND, game);
if (pickedCards.isEmpty()) {
new AddCountersSourceEffect(CounterType.P1P1.createInstance()).apply(game, source);
}
return true;
}
@Override
public String getText(Mode mode) {
return super.getText(mode).concat(". If you didn't put a card into your hand this way, put a +1/+1 counter on {this}");
}
}

View file

@ -4,6 +4,9 @@ import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.PutCards;
@ -26,6 +29,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
protected boolean revealPickedCards;
protected boolean optional;
protected boolean upTo;
protected Effect otherwiseEffect = null;
public LookLibraryAndPickControllerEffect(int numberOfCards, int numberToPick,
PutCards putPickedCards, PutCards putLookedCards) {
@ -87,6 +91,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
this.revealPickedCards = effect.revealPickedCards;
this.optional = effect.optional;
this.upTo = effect.upTo;
this.otherwiseEffect = effect.otherwiseEffect != null ? effect.otherwiseEffect.copy() : null;
}
@Override
@ -94,6 +99,11 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
return new LookLibraryAndPickControllerEffect(this);
}
public LookLibraryAndPickControllerEffect withOtherwiseEffect(Effect otherwiseEffect) {
this.otherwiseEffect = otherwiseEffect;
return this;
}
@Override
protected boolean actionWithLookedCards(Game game, Ability source, Player player, Cards cards) {
int number = Math.min(numberToPick, cards.count(filter, source.getControllerId(), source, game));
@ -120,6 +130,15 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
protected boolean actionWithPickedCards(Game game, Ability source, Player player, Cards pickedCards, Cards otherCards) {
boolean result = putPickedCards.moveCards(player, pickedCards, source, game);
result |= putLookedCards.moveCards(player, otherCards, source, game);
if (!pickedCards.isEmpty() || otherwiseEffect == null) {
return result;
}
game.processAction();
if (otherwiseEffect instanceof OneShotEffect) {
otherwiseEffect.apply(game, source);
} else if (otherwiseEffect instanceof ContinuousEffect) {
game.addEffect((ContinuousEffect) otherwiseEffect, source);
}
return result;
}
@ -196,6 +215,12 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff
sb.append("back ");
}
sb.append(putLookedCards.getMessage(false, plural));
if (otherwiseEffect != null) {
sb.append(". If you didn't put a card ");
sb.append(putPickedCards.getMessage(false, false));
sb.append(" this way, ");
sb.append(otherwiseEffect.getText(mode));
}
// get text frame from super class and inject action text
return setText(mode, sb.toString());