mirror of
https://github.com/correl/mage.git
synced 2024-12-25 03:00:15 +00:00
Add common effect class for "Its controller searches..." (Path to Exile, etc) Fixes #9654
This commit is contained in:
parent
58c55bf08c
commit
76fcfafc8b
19 changed files with 243 additions and 653 deletions
|
@ -1,4 +1,3 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -6,19 +5,14 @@ import mage.MageInt;
|
|||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.abilities.effects.common.SacrificeTargetEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterArtifactCard;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterNoncreatureCard;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
|
@ -28,23 +22,23 @@ import mage.target.common.TargetCardInLibrary;
|
|||
*/
|
||||
public final class ArcumDagsson extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterArtifactPermanent("artifact creature");
|
||||
private static final FilterCard filter = new FilterNoncreatureCard("noncreature artifact card");
|
||||
|
||||
static {
|
||||
filter.add(CardType.CREATURE.getPredicate());
|
||||
filter.add(CardType.ARTIFACT.getPredicate());
|
||||
}
|
||||
|
||||
public ArcumDagsson(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}");
|
||||
addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ARTIFICER);
|
||||
this.subtype.add(SubType.HUMAN, SubType.ARTIFICER);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// {tap}: Target artifact creature's controller sacrifices it. That player may search their library for a noncreature artifact card, put it onto the battlefield, then shuffle their library.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ArcumDagssonEffect(), new TapSourceCost());
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
// {tap}: Target artifact creature's controller sacrifices it. That player may search their library for a noncreature artifact card, put it onto the battlefield, then shuffle.
|
||||
Ability ability = new SimpleActivatedAbility(new SacrificeTargetEffect(), new TapSourceCost());
|
||||
ability.addEffect(new SearchLibraryPutInPlayTargetControllerEffect(new TargetCardInLibrary(filter), false, Outcome.PutCardInPlay, "that player"));
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_CREATURE));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
@ -57,50 +51,3 @@ public final class ArcumDagsson extends CardImpl {
|
|||
return new ArcumDagsson(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArcumDagssonEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterCard filter = new FilterArtifactCard("noncreature artifact card");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
|
||||
}
|
||||
|
||||
ArcumDagssonEffect() {
|
||||
super(Outcome.Removal);
|
||||
this.staticText = "Target artifact creature's controller sacrifices it. That player may search their library for a noncreature artifact card, put it onto the battlefield, then shuffle";
|
||||
}
|
||||
|
||||
ArcumDagssonEffect(final ArcumDagssonEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArcumDagssonEffect copy() {
|
||||
return new ArcumDagssonEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent artifactCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source));
|
||||
if (artifactCreature != null) {
|
||||
Player player = game.getPlayer(artifactCreature.getControllerId());
|
||||
if (player != null) {
|
||||
artifactCreature.sacrifice(source, game);
|
||||
game.getState().processAction(game); // Workaround for https://github.com/magefree/mage/issues/8501
|
||||
if (player.chooseUse(Outcome.PutCardInPlay, "Search your library for a noncreature artifact card?", source, game)) {
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(filter);
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
Card card = game.getCard(target.getFirstTarget());
|
||||
if (card != null) {
|
||||
player.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,23 +2,14 @@ package mage.cards.a;
|
|||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.TargetController;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
|
@ -34,9 +25,10 @@ public final class AssassinsTrophy extends CardImpl {
|
|||
public AssassinsTrophy(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}{G}");
|
||||
|
||||
// Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.
|
||||
// Destroy target permanent an opponent controls. Its controller may search their
|
||||
// library for a basic land card, put it onto the battlefield, then shuffle.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
this.getSpellAbility().addEffect(new AssassinsTrophyEffect());
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayTargetControllerEffect(false));
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(filter));
|
||||
}
|
||||
|
||||
|
@ -49,44 +41,3 @@ public final class AssassinsTrophy extends CardImpl {
|
|||
return new AssassinsTrophy(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AssassinsTrophyEffect extends OneShotEffect {
|
||||
|
||||
public AssassinsTrophyEffect() {
|
||||
super(Outcome.PutLandInPlay);
|
||||
this.staticText = "Its controller may search their library "
|
||||
+ "for a basic land card, put it onto the battlefield, "
|
||||
+ "then shuffle";
|
||||
}
|
||||
|
||||
public AssassinsTrophyEffect(final AssassinsTrophyEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AssassinsTrophyEffect copy() {
|
||||
return new AssassinsTrophyEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent != null) {
|
||||
Player controller = game.getPlayer(permanent.getControllerId());
|
||||
if (controller != null) {
|
||||
if (controller.chooseUse(Outcome.PutLandInPlay, "Search for a basic land, put it onto the battlefield and then shuffle?", source, game)) {
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (controller.searchLibrary(target, source, game)) {
|
||||
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
controller.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
controller.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,11 @@ package mage.cards.b;
|
|||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.costs.costadjusters.LegendaryCreatureCostAdjuster;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.InfoEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.abilities.keyword.ChannelAbility;
|
||||
import mage.abilities.mana.GreenManaAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
|
@ -14,9 +14,6 @@ import mage.filter.FilterCard;
|
|||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterLandCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
|
@ -27,12 +24,13 @@ import java.util.UUID;
|
|||
*/
|
||||
public final class BoseijuWhoEndures extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter
|
||||
private static final FilterPermanent filterDestroy
|
||||
= new FilterPermanent("artifact, enchantment, or nonbasic land an opponent controls");
|
||||
private static final FilterCard filterSearch = new FilterLandCard("land card with a basic land type");
|
||||
|
||||
static {
|
||||
filter.add(TargetController.OPPONENT.getControllerPredicate());
|
||||
filter.add(Predicates.or(
|
||||
filterDestroy.add(TargetController.OPPONENT.getControllerPredicate());
|
||||
filterDestroy.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.ENCHANTMENT.getPredicate(),
|
||||
Predicates.and(
|
||||
|
@ -40,6 +38,13 @@ public final class BoseijuWhoEndures extends CardImpl {
|
|||
CardType.LAND.getPredicate()
|
||||
)
|
||||
));
|
||||
filterSearch.add(Predicates.or(
|
||||
SubType.PLAINS.getPredicate(),
|
||||
SubType.ISLAND.getPredicate(),
|
||||
SubType.SWAMP.getPredicate(),
|
||||
SubType.MOUNTAIN.getPredicate(),
|
||||
SubType.FOREST.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public BoseijuWhoEndures(UUID ownerId, CardSetInfo setInfo) {
|
||||
|
@ -50,10 +55,17 @@ public final class BoseijuWhoEndures extends CardImpl {
|
|||
// {T}: Add {G}.
|
||||
this.addAbility(new GreenManaAbility());
|
||||
|
||||
// Channel — {1}{G}, Discard Boseiju, Who Endures: Destroy target artifact, enchantment, or nonbasic land an opponent controls. That player may search their library for a land card with a basic land type, put it onto the battlefield, then shuffle. This ability costs {1} less to activate for each legendary creature you control.
|
||||
// Channel — {1}{G}, Discard Boseiju, Who Endures: Destroy target artifact, enchantment, or nonbasic land an opponent controls.
|
||||
// That player may search their library for a land card with a basic land type, put it onto the battlefield, then shuffle.
|
||||
// This ability costs {1} less to activate for each legendary creature you control.
|
||||
Ability ability = new ChannelAbility("{1}{G}", new DestroyTargetEffect());
|
||||
ability.addEffect(new BoseijuWhoEnduresEffect());
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
ability.addEffect(new SearchLibraryPutInPlayTargetControllerEffect(
|
||||
new TargetCardInLibrary(filterSearch), false, Outcome.PutLandInPlay, "that player"
|
||||
));
|
||||
ability.addEffect(new InfoEffect(
|
||||
"This ability costs {1} less to activate for each legendary creature you control"
|
||||
));
|
||||
ability.addTarget(new TargetPermanent(filterDestroy));
|
||||
ability.setCostAdjuster(LegendaryCreatureCostAdjuster.instance);
|
||||
this.addAbility(ability.addHint(LegendaryCreatureCostAdjuster.getHint()));
|
||||
}
|
||||
|
@ -67,54 +79,3 @@ public final class BoseijuWhoEndures extends CardImpl {
|
|||
return new BoseijuWhoEndures(this);
|
||||
}
|
||||
}
|
||||
|
||||
class BoseijuWhoEnduresEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterCard filter = new FilterLandCard("land card with a basic land type");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
SubType.PLAINS.getPredicate(),
|
||||
SubType.ISLAND.getPredicate(),
|
||||
SubType.SWAMP.getPredicate(),
|
||||
SubType.MOUNTAIN.getPredicate(),
|
||||
SubType.FOREST.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
BoseijuWhoEnduresEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "That player may search their library for a land card with a basic land type, " +
|
||||
"put it onto the battlefield, then shuffle. " +
|
||||
"This ability costs {1} less to activate for each legendary creature you control";
|
||||
}
|
||||
|
||||
private BoseijuWhoEnduresEffect(final BoseijuWhoEnduresEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BoseijuWhoEnduresEffect copy() {
|
||||
return new BoseijuWhoEnduresEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
Player player = game.getPlayer(permanent.getControllerId());
|
||||
if (!player.chooseUse(Outcome.PutCardInPlay, "Search your library for a land card?", source, game)) {
|
||||
return true;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(filter);
|
||||
player.searchLibrary(target, source, game);
|
||||
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
player.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -14,7 +13,6 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Zone;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
|
||||
/**
|
||||
|
@ -27,10 +25,13 @@ public final class CelestialSword extends CardImpl {
|
|||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{6}");
|
||||
|
||||
// {3}, {tap}: Target creature you control gets +3/+3 until end of turn. Its controller sacrifices it at the beginning of the next end step.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(3, 3, Duration.EndOfTurn), new GenericManaCost(3));
|
||||
Ability ability = new SimpleActivatedAbility(new BoostTargetEffect(3, 3, Duration.EndOfTurn), new GenericManaCost(3));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new SacrificeTargetEffect())));
|
||||
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
|
||||
new SacrificeTargetEffect("its controller sacrifices it")
|
||||
)
|
||||
).setText("its controller sacrifices it at the beginning of the next end step"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,20 +1,11 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.target.common.TargetLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -27,9 +18,9 @@ public final class CleansingWildfire extends CardImpl {
|
|||
public CleansingWildfire(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}");
|
||||
|
||||
// Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield tapped, then shuffle their library.
|
||||
// Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
this.getSpellAbility().addEffect(new CleansingWildfireEffect());
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayTargetControllerEffect(true));
|
||||
this.getSpellAbility().addTarget(new TargetLandPermanent());
|
||||
|
||||
// Draw a card.
|
||||
|
@ -45,45 +36,3 @@ public final class CleansingWildfire extends CardImpl {
|
|||
return new CleansingWildfire(this);
|
||||
}
|
||||
}
|
||||
|
||||
class CleansingWildfireEffect extends OneShotEffect {
|
||||
|
||||
CleansingWildfireEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "Its controller may search their library for a basic land card, " +
|
||||
"put it onto the battlefield tapped, then shuffle.";
|
||||
}
|
||||
|
||||
private CleansingWildfireEffect(final CleansingWildfireEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CleansingWildfireEffect copy() {
|
||||
return new CleansingWildfireEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
Player controller = game.getPlayer(permanent.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
if (!controller.chooseUse(Outcome.PutLandInPlay, "Search for a basic land and put it onto the battlefield tapped?", source, game)) {
|
||||
return true;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (controller.searchLibrary(target, source, game)) {
|
||||
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null);
|
||||
}
|
||||
}
|
||||
controller.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,26 +1,21 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.abilities.keyword.FlashbackAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.TimingRule;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
|
@ -87,43 +82,12 @@ class DireStrainRampageEffect extends OneShotEffect {
|
|||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
Player player = game.getPlayer(permanent.getControllerId());
|
||||
boolean landTargeted = permanent.isLand(game);
|
||||
boolean destroyed = permanent.destroy(source, game, false);
|
||||
boolean twoLands = false;
|
||||
if (landTargeted && destroyed) {
|
||||
// Check that no replacement happened (card actually went to the graveyard and "was destroyed this way")
|
||||
if (game.getState().getZone(permanent.getId()) == Zone.GRAVEYARD) {
|
||||
twoLands = true;
|
||||
}
|
||||
}
|
||||
String searchString;
|
||||
if (twoLands) {
|
||||
searchString = "Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle?";
|
||||
} else {
|
||||
searchString = "Search your library for a basic land card, put it onto the battlefield tapped, then shuffle?";
|
||||
}
|
||||
if (player != null && player.chooseUse(Outcome.PutLandInPlay, searchString, source, game)) {
|
||||
TargetCardInLibrary target;
|
||||
if (twoLands) {
|
||||
target = new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS);
|
||||
} else {
|
||||
target = new TargetCardInLibrary(1, 1, StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
}
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
Set<Card> lands = new HashSet<>();
|
||||
for (UUID cardId : target.getTargets()) {
|
||||
Card card = game.getCard(cardId);
|
||||
if (card != null) {
|
||||
lands.add(card);
|
||||
}
|
||||
}
|
||||
if (!lands.isEmpty()) {
|
||||
player.moveCards(lands, Zone.BATTLEFIELD, source, game, true, false, false, null);
|
||||
}
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
game.getState().processAction(game);
|
||||
TargetCardInLibrary target = landTargeted && destroyed ?
|
||||
new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS) :
|
||||
new TargetCardInLibrary(1, 1, StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
return new SearchLibraryPutInPlayTargetControllerEffect(target, true, Outcome.PutLandInPlay, "its controller").apply(game, source);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@ import mage.constants.CardType;
|
|||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterLandPermanent;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
|
@ -44,8 +43,6 @@ public final class FromTheAshes extends CardImpl {
|
|||
|
||||
class FromTheAshesEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterLandPermanent filter = FilterLandPermanent.nonbasicLands();
|
||||
|
||||
public FromTheAshesEffect() {
|
||||
super(Outcome.Benefit);
|
||||
this.staticText = "Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles";
|
||||
|
@ -63,42 +60,46 @@ class FromTheAshesEffect extends OneShotEffect {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller != null) {
|
||||
Map<UUID, Integer> playerAmount = new HashMap<>();
|
||||
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null) {
|
||||
int amount = 0;
|
||||
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, playerId, game)) {
|
||||
amount++;
|
||||
permanent.destroy(source, game, false);
|
||||
}
|
||||
playerAmount.put(playerId, amount);
|
||||
}
|
||||
}
|
||||
game.getState().processAction(game);
|
||||
for (Map.Entry<UUID, Integer> entry : playerAmount.entrySet()) {
|
||||
Player player = game.getPlayer(entry.getKey());
|
||||
if (player != null && player.chooseUse(outcome, "Search your library for up to " + entry.getValue() + " basic land card(s) to put it onto the battlefield?", source, game)) {
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, entry.getValue(), StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
if (!target.getTargets().isEmpty()) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
entry.setValue(0); // no search no shuffling
|
||||
}
|
||||
}
|
||||
game.getState().processAction(game);
|
||||
for (Map.Entry<UUID, Integer> entry : playerAmount.entrySet()) {
|
||||
Player player = game.getPlayer(entry.getKey());
|
||||
if (player != null && entry.getValue() > 0) {
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
// Destroy all nonbasic lands.
|
||||
Map<UUID, Integer> playerAmount = new HashMap<>();
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LANDS_NONBASIC, source.getControllerId(), source, game)) {
|
||||
UUID controllerId = permanent.getControllerId();
|
||||
if (permanent.destroy(source, game, false)) {
|
||||
playerAmount.merge(controllerId, 1, Integer::sum);
|
||||
}
|
||||
}
|
||||
game.getState().processAction(game);
|
||||
|
||||
// For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield.
|
||||
for (Map.Entry<UUID, Integer> entry : playerAmount.entrySet()) {
|
||||
Player player = game.getPlayer(entry.getKey());
|
||||
if (player == null) {
|
||||
continue;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, entry.getValue(),
|
||||
entry.getValue() > 1 ? StaticFilters.FILTER_CARD_BASIC_LANDS : StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.chooseUse(Outcome.PutLandInPlay, "Search your library for " + target.getDescription() + '?', source, game)) {
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
if (!target.getTargets().isEmpty()) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
entry.setValue(0); // no search no shuffling
|
||||
}
|
||||
}
|
||||
game.getState().processAction(game);
|
||||
|
||||
// Then each player who searched their library this way shuffles.
|
||||
for (Map.Entry<UUID, Integer> entry : playerAmount.entrySet()) {
|
||||
Player player = game.getPlayer(entry.getKey());
|
||||
if (player != null && entry.getValue() > 0) {
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,20 +1,11 @@
|
|||
package mage.cards.g;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.target.common.TargetLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -27,9 +18,9 @@ public final class GeomancersGambit extends CardImpl {
|
|||
public GeomancersGambit(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
|
||||
|
||||
// Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.
|
||||
// Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
this.getSpellAbility().addEffect(new GeomancersGambitEffect());
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayTargetControllerEffect(false));
|
||||
this.getSpellAbility().addTarget(new TargetLandPermanent());
|
||||
|
||||
// Draw a card.
|
||||
|
@ -45,46 +36,3 @@ public final class GeomancersGambit extends CardImpl {
|
|||
return new GeomancersGambit(this);
|
||||
}
|
||||
}
|
||||
|
||||
class GeomancersGambitEffect extends OneShotEffect {
|
||||
|
||||
GeomancersGambitEffect() {
|
||||
super(Outcome.PutLandInPlay);
|
||||
this.staticText = "Its controller may search their library "
|
||||
+ "for a basic land card, put it onto the battlefield, "
|
||||
+ "then shuffle";
|
||||
}
|
||||
|
||||
private GeomancersGambitEffect(final GeomancersGambitEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeomancersGambitEffect copy() {
|
||||
return new GeomancersGambitEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
Player controller = game.getPlayer(permanent.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
if (!controller.chooseUse(Outcome.PutLandInPlay, "Search for a basic land, put it onto the battlefield, and then shuffle?", source, game)) {
|
||||
return true;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (controller.searchLibrary(target, source, game)) {
|
||||
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
controller.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
controller.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,20 +5,12 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.abilities.mana.ColorlessManaAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.target.common.TargetLandPermanent;
|
||||
|
||||
/**
|
||||
|
@ -32,11 +24,13 @@ public final class GhostQuarter extends CardImpl {
|
|||
|
||||
// {T}: Add {C}.
|
||||
this.addAbility(new ColorlessManaAbility());
|
||||
// {T}, Sacrifice Ghost Quarter: Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.
|
||||
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new TapSourceCost());
|
||||
|
||||
// {T}, Sacrifice Ghost Quarter: Destroy target land. Its controller may search
|
||||
// their library for a basic land card, put it onto the battlefield, then shuffle.
|
||||
Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new TapSourceCost());
|
||||
ability.addEffect(new SearchLibraryPutInPlayTargetControllerEffect(false));
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
ability.addTarget(new TargetLandPermanent());
|
||||
ability.addEffect(new GhostQuarterEffect());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
@ -49,40 +43,3 @@ public final class GhostQuarter extends CardImpl {
|
|||
return new GhostQuarter(this);
|
||||
}
|
||||
}
|
||||
|
||||
class GhostQuarterEffect extends OneShotEffect {
|
||||
|
||||
public GhostQuarterEffect() {
|
||||
super(Outcome.PutLandInPlay);
|
||||
this.staticText = "Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle";
|
||||
}
|
||||
|
||||
public GhostQuarterEffect(final GhostQuarterEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GhostQuarterEffect copy() {
|
||||
return new GhostQuarterEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent != null) {
|
||||
Player controller = game.getPlayer(permanent.getControllerId());
|
||||
if (controller != null && controller.chooseUse(Outcome.PutLandInPlay, "Search for a basic land, put it onto the battlefield, and then shuffle?", source, game)) {
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (controller.searchLibrary(target, source, game)) {
|
||||
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
controller.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
controller.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +1,10 @@
|
|||
|
||||
package mage.cards.p;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -30,7 +21,10 @@ public final class PathToExile extends CardImpl {
|
|||
// Exile target creature. Its controller may search their library for a basic land card,
|
||||
// put that card onto the battlefield tapped, then shuffle their library.
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().addEffect(new PathToExileEffect());
|
||||
this.getSpellAbility().addEffect(new ExileTargetEffect());
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayTargetControllerEffect(true).setText(
|
||||
"its controller may search their library for a basic land card, put that card onto the battlefield tapped, then shuffle"
|
||||
));
|
||||
}
|
||||
|
||||
private PathToExile(final PathToExile card) {
|
||||
|
@ -42,44 +36,3 @@ public final class PathToExile extends CardImpl {
|
|||
return new PathToExile(this);
|
||||
}
|
||||
}
|
||||
|
||||
class PathToExileEffect extends OneShotEffect {
|
||||
|
||||
public PathToExileEffect() {
|
||||
super(Outcome.Exile);
|
||||
staticText = "Exile target creature. Its controller may search their library for a basic land card, put that card onto the battlefield tapped, then shuffle";
|
||||
}
|
||||
|
||||
public PathToExileEffect(final PathToExileEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PathToExileEffect copy() {
|
||||
return new PathToExileEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
Permanent permanent = game.getPermanent(source.getFirstTarget());
|
||||
if (controller != null && permanent != null) {
|
||||
Player player = game.getPlayer(permanent.getControllerId());
|
||||
// if the zone change to exile gets replaced does not prevent the target controller to be able to search
|
||||
controller.moveCardToExileWithInfo(permanent, null, "", source, game, Zone.BATTLEFIELD, true);
|
||||
if (player.chooseUse(Outcome.PutCardInPlay, "Search your library for a basic land card?", source, game)) {
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
if (card != null) {
|
||||
player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
|
||||
}
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
|
||||
package mage.cards.s;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -16,7 +14,6 @@ import mage.constants.Outcome;
|
|||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPlayer;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
@ -48,7 +45,7 @@ public final class SettleTheWreckage extends CardImpl {
|
|||
class SettleTheWreckageEffect extends OneShotEffect {
|
||||
|
||||
SettleTheWreckageEffect() {
|
||||
super(Outcome.Neutral);
|
||||
super(Outcome.Exile);
|
||||
this.staticText = "Exile all attacking creatures target player controls. That player may search their library for that many basic land cards, put those cards onto the battlefield tapped, then shuffle";
|
||||
}
|
||||
|
||||
|
@ -68,23 +65,25 @@ class SettleTheWreckageEffect extends OneShotEffect {
|
|||
if (controller == null || player == null) {
|
||||
return false;
|
||||
}
|
||||
int attackers = 0;
|
||||
Set<Card> toExile = new HashSet<>();
|
||||
Iterator<UUID> creatureIds = game.getCombat().getAttackers().iterator();
|
||||
while (creatureIds.hasNext()) {
|
||||
Permanent creature = game.getPermanent(creatureIds.next());
|
||||
if (creature != null && creature.isControlledBy(player.getId())) {
|
||||
toExile.add(creature);
|
||||
attackers++;
|
||||
}
|
||||
Set<Card> toExile = new HashSet<>(game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_ATTACKING_CREATURES, player.getId(), game));
|
||||
int attackers = toExile.size();
|
||||
if (attackers == 0) {
|
||||
return true;
|
||||
}
|
||||
controller.moveCards(toExile, Zone.EXILED, source, game);
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, attackers, StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.chooseUse(Outcome.Benefit, "Search for up to " + attackers + " basic land" + ((attackers == 1) ? "" : "s") + "?", source, game) && player.searchLibrary(target, source, game)) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()).getCards(game), Zone.BATTLEFIELD, source, game, true, false, false, null);
|
||||
player.shuffleLibrary(source, game);
|
||||
game.getState().processAction(game);
|
||||
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, attackers,
|
||||
attackers > 1 ? StaticFilters.FILTER_CARD_BASIC_LANDS : StaticFilters.FILTER_CARD_BASIC_LAND
|
||||
);
|
||||
if (player.chooseUse(Outcome.PutLandInPlay, "Search your library for " + target.getDescription() + '?', source, game)) {
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
if (!target.getTargets().isEmpty()) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()).getCards(game),
|
||||
Zone.BATTLEFIELD, source, game, true, false, false, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@ import mage.target.TargetPermanent;
|
|||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
|
@ -81,10 +80,7 @@ class WindsOfAbandonEffect extends OneShotEffect {
|
|||
if (!controller.moveCards(permanent, Zone.EXILED, source, game)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!player.chooseUse(Outcome.PutCardInPlay, "Search your library for a basic land card?", source, game)) {
|
||||
return true;
|
||||
}
|
||||
game.getState().processAction(game);
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
|
@ -121,39 +117,30 @@ class WindsOfAbandonOverloadEffect extends OneShotEffect {
|
|||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
Map<UUID, Integer> playerMap = new HashMap<>();
|
||||
Map<UUID, Integer> playerAmount = new HashMap<>();
|
||||
CardsImpl cards = new CardsImpl();
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, source.getControllerId(), source, game)) {
|
||||
int count = playerMap.getOrDefault(permanent.getControllerId(), 0);
|
||||
playerMap.put(permanent.getControllerId(), count + 1);
|
||||
playerAmount.merge(permanent.getControllerId(), 1, Integer::sum);
|
||||
cards.add(permanent);
|
||||
}
|
||||
if (!controller.moveCards(cards, Zone.EXILED, source, game)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (UUID playerId : game.getOpponents(source.getControllerId())) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
int count = playerMap.getOrDefault(playerId, 0);
|
||||
if (player == null || count == 0) {
|
||||
game.getState().processAction(game);
|
||||
for (Map.Entry<UUID, Integer> entry : playerAmount.entrySet()) {
|
||||
Player player = game.getPlayer(entry.getKey());
|
||||
if (player == null) {
|
||||
continue;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, count, StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
boolean moved = false;
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, entry.getValue(),
|
||||
entry.getValue() > 1 ? StaticFilters.FILTER_CARD_BASIC_LANDS : StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
List<UUID> targets = target.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
Card card = player.getLibrary().getCard(targetId, game);
|
||||
if (card != null) {
|
||||
if (player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null)) {
|
||||
moved = true;
|
||||
}
|
||||
}
|
||||
if (!target.getTargets().isEmpty()) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()).getCards(game),
|
||||
Zone.BATTLEFIELD, source, game, true, false, false, null);
|
||||
}
|
||||
}
|
||||
if (moved) {
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -62,14 +62,9 @@ public class SacrificeTargetEffect extends OneShotEffect {
|
|||
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
if (staticText.isEmpty() && !mode.getTargets().isEmpty()) {
|
||||
if (mode.getTargets().get(0).getNumberOfTargets() == 1) {
|
||||
return "The controller of target " + mode.getTargets().get(0).getTargetName() + " sacrifices it";
|
||||
} else {
|
||||
return "The controller of " + mode.getTargets().get(0).getNumberOfTargets() + " target " + mode.getTargets().get(0).getTargetName() + " sacrifices it";
|
||||
}
|
||||
if (staticText != null && !staticText.isEmpty()) {
|
||||
return staticText;
|
||||
}
|
||||
return staticText;
|
||||
return getTargetPointer().describeTargets(mode.getTargets(), "that permanent") + "'s controller sacrifices it";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package mage.abilities.effects.common.search;
|
|||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.SearchEffect;
|
||||
import mage.cards.Cards;
|
||||
import mage.cards.CardsImpl;
|
||||
import mage.constants.Outcome;
|
||||
|
@ -11,26 +11,18 @@ import mage.filter.StaticFilters;
|
|||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class SearchLibraryAndExileTargetEffect extends OneShotEffect {
|
||||
|
||||
private final int amount;
|
||||
private final boolean upTo;
|
||||
public class SearchLibraryAndExileTargetEffect extends SearchEffect {
|
||||
|
||||
public SearchLibraryAndExileTargetEffect(int amount, boolean upTo) {
|
||||
super(Outcome.Benefit);
|
||||
this.amount = amount;
|
||||
this.upTo = upTo;
|
||||
super(new TargetCardInLibrary(upTo ? 0 : amount, amount, amount > 1 ? StaticFilters.FILTER_CARD_CARDS : StaticFilters.FILTER_CARD), Outcome.Exile);
|
||||
}
|
||||
|
||||
private SearchLibraryAndExileTargetEffect(final SearchLibraryAndExileTargetEffect effect) {
|
||||
super(effect);
|
||||
this.amount = effect.amount;
|
||||
this.upTo = effect.upTo;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -45,16 +37,12 @@ public class SearchLibraryAndExileTargetEffect extends OneShotEffect {
|
|||
if (controller == null || player == null) {
|
||||
return false;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(upTo ? 0 : amount, amount, StaticFilters.FILTER_CARD);
|
||||
controller.searchLibrary(target, source, game, player.getId());
|
||||
Cards cards = new CardsImpl();
|
||||
target.getTargets()
|
||||
.stream()
|
||||
.map(uuid -> player.getLibrary().getCard(uuid, game))
|
||||
.forEach(cards::add);
|
||||
if (cards.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
controller.moveCards(cards, Zone.EXILED, source, game);
|
||||
player.shuffleLibrary(source, game);
|
||||
return true;
|
||||
|
@ -62,24 +50,14 @@ public class SearchLibraryAndExileTargetEffect extends OneShotEffect {
|
|||
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
StringBuilder sb = new StringBuilder("search ");
|
||||
if (mode.getTargets().isEmpty()) {
|
||||
sb.append("that player");
|
||||
} else {
|
||||
sb.append("target ");
|
||||
sb.append(mode.getTargets().get(0).getTargetName());
|
||||
if (staticText != null && !staticText.isEmpty()) {
|
||||
return staticText;
|
||||
}
|
||||
sb.append("'s library for ");
|
||||
if (amount > 1) {
|
||||
if (upTo) {
|
||||
sb.append("up to ");
|
||||
}
|
||||
sb.append(CardUtil.numberToText(amount));
|
||||
sb.append(" cards and exile them");
|
||||
} else {
|
||||
sb.append("a card and exile it");
|
||||
}
|
||||
sb.append(". Then that player shuffles");
|
||||
return sb.toString();
|
||||
return "search "
|
||||
+ getTargetPointer().describeTargets(mode.getTargets(), "that player")
|
||||
+ "'s library for "
|
||||
+ target.getDescription()
|
||||
+ (target.getMaxNumberOfTargets() > 1 ? " and exile them" : " and exile it")
|
||||
+ ". Then that player shuffles";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import mage.constants.Zone;
|
|||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
@ -41,7 +40,12 @@ public class SearchLibraryPutInPlayEffect extends SearchEffect {
|
|||
super(target, outcome);
|
||||
this.tapped = tapped;
|
||||
this.forceShuffle = forceShuffle;
|
||||
setText();
|
||||
staticText = "search your library for "
|
||||
+ target.getDescription()
|
||||
+ (forceShuffle ? ", " : " and ")
|
||||
+ (target.getMaxNumberOfTargets() > 1 ? "put them onto the battlefield" : "put it onto the battlefield")
|
||||
+ (tapped ? " tapped" : "")
|
||||
+ (forceShuffle ? ", then shuffle" : ". If you do, shuffle");
|
||||
}
|
||||
|
||||
public SearchLibraryPutInPlayEffect(final SearchLibraryPutInPlayEffect effect) {
|
||||
|
@ -72,39 +76,10 @@ public class SearchLibraryPutInPlayEffect extends SearchEffect {
|
|||
if (forceShuffle) {
|
||||
player.shuffleLibrary(source, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void setText() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("search your library for ");
|
||||
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
|
||||
if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE) {
|
||||
sb.append("any number of ");
|
||||
} else {
|
||||
sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' ');
|
||||
}
|
||||
sb.append(target.getTargetName());
|
||||
sb.append(forceShuffle ? ", " : " and ");
|
||||
sb.append("put them onto the battlefield");
|
||||
} else {
|
||||
sb.append(CardUtil.addArticle(target.getTargetName()));
|
||||
sb.append(forceShuffle ? ", " : " and ");
|
||||
sb.append("put it onto the battlefield");
|
||||
}
|
||||
if (tapped) {
|
||||
sb.append(" tapped");
|
||||
}
|
||||
if (forceShuffle) {
|
||||
sb.append(", then shuffle");
|
||||
} else {
|
||||
sb.append(". If you do, shuffle");
|
||||
}
|
||||
staticText = sb.toString();
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<UUID> getTargets() {
|
||||
return target.getTargets();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
package mage.abilities.effects.common.search;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.SearchEffect;
|
||||
import mage.cards.CardsImpl;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
/**
|
||||
* @author awjackson
|
||||
*/
|
||||
public class SearchLibraryPutInPlayTargetControllerEffect extends SearchEffect {
|
||||
|
||||
private boolean tapped;
|
||||
|
||||
public SearchLibraryPutInPlayTargetControllerEffect(boolean tapped) {
|
||||
this(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), tapped, Outcome.PutLandInPlay, "its controller");
|
||||
}
|
||||
|
||||
public SearchLibraryPutInPlayTargetControllerEffect(TargetCardInLibrary target, boolean tapped, Outcome outcome, String whoSearch) {
|
||||
super(target, outcome);
|
||||
this.tapped = tapped;
|
||||
staticText = whoSearch
|
||||
+ " may search their library for "
|
||||
+ target.getDescription()
|
||||
+ (target.getMaxNumberOfTargets() > 1 ? ", put them onto the battlefield" : ", put it onto the battlefield")
|
||||
+ (tapped ? " tapped" : "")
|
||||
+ ", then shuffle";
|
||||
}
|
||||
|
||||
public SearchLibraryPutInPlayTargetControllerEffect(final SearchLibraryPutInPlayTargetControllerEffect effect) {
|
||||
super(effect);
|
||||
this.tapped = effect.tapped;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SearchLibraryPutInPlayTargetControllerEffect copy() {
|
||||
return new SearchLibraryPutInPlayTargetControllerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
Player player = game.getPlayer(permanent.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
if (!player.chooseUse(outcome, "Search your library for " + target.getDescription() + '?', source, game)) {
|
||||
return true;
|
||||
}
|
||||
if (player.searchLibrary(target, source, game)) {
|
||||
if (!target.getTargets().isEmpty()) {
|
||||
player.moveCards(new CardsImpl(target.getTargets()).getCards(game),
|
||||
Zone.BATTLEFIELD, source, game, tapped, false, false, null);
|
||||
}
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package mage.abilities.effects.common.search;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.SearchEffect;
|
||||
import mage.cards.CardsImpl;
|
||||
import mage.constants.Outcome;
|
||||
|
@ -9,9 +10,6 @@ import mage.game.Game;
|
|||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author LevelX2
|
||||
*/
|
||||
|
@ -46,7 +44,6 @@ public class SearchLibraryPutInPlayTargetPlayerEffect extends SearchEffect {
|
|||
this.tapped = tapped;
|
||||
this.forceShuffle = forceShuffle;
|
||||
this.ownerIsController = ownerIsController;
|
||||
setText();
|
||||
}
|
||||
|
||||
public SearchLibraryPutInPlayTargetPlayerEffect(final SearchLibraryPutInPlayTargetPlayerEffect effect) {
|
||||
|
@ -82,32 +79,17 @@ public class SearchLibraryPutInPlayTargetPlayerEffect extends SearchEffect {
|
|||
return false;
|
||||
}
|
||||
|
||||
private void setText() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("target player searches their library for ");
|
||||
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
|
||||
if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE) {
|
||||
sb.append("any number of ").append(' ');
|
||||
} else {
|
||||
sb.append("up to ").append(target.getMaxNumberOfTargets()).append(' ');
|
||||
}
|
||||
sb.append(target.getTargetName()).append(", puts them onto the battlefield");
|
||||
} else {
|
||||
sb.append("a ").append(target.getTargetName()).append(", puts it onto the battlefield");
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
if (staticText != null && !staticText.isEmpty()) {
|
||||
return staticText;
|
||||
}
|
||||
if (tapped) {
|
||||
sb.append(" tapped");
|
||||
}
|
||||
if (forceShuffle) {
|
||||
sb.append(", then shuffles");
|
||||
} else {
|
||||
sb.append(". If that player does, they shuffle");
|
||||
}
|
||||
staticText = sb.toString();
|
||||
return getTargetPointer().describeTargets(mode.getTargets(), "that player")
|
||||
+ " searches their library for "
|
||||
+ target.getDescription()
|
||||
+ (forceShuffle ? ", " : " and ")
|
||||
+ (target.getMaxNumberOfTargets() > 1 ? "puts them onto the battlefield" : "puts it onto the battlefield")
|
||||
+ (tapped ? " tapped" : "")
|
||||
+ (forceShuffle ? ", then shuffles" : ". If that player does, they shuffle");
|
||||
}
|
||||
|
||||
public List<UUID> getTargets() {
|
||||
return target.getTargets();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -119,7 +119,11 @@ public abstract class TargetImpl implements Target {
|
|||
if (!isNotTarget() && !getTargetName().contains("target")) {
|
||||
sb.append("target ");
|
||||
}
|
||||
sb.append(getTargetName());
|
||||
if (isNotTarget() && min == 1 && max == 1) {
|
||||
sb.append(CardUtil.addArticle(getTargetName()));
|
||||
} else {
|
||||
sb.append(getTargetName());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
|
||||
|
||||
package mage.target.common;
|
||||
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.target.TargetCard;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
*/
|
||||
public class TargetBasicLandCard extends TargetCard {
|
||||
|
||||
public TargetBasicLandCard(Zone zone) {
|
||||
super(zone);
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(CardType.LAND.getPredicate());
|
||||
}
|
||||
|
||||
public TargetBasicLandCard(final TargetBasicLandCard target) {
|
||||
super(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetBasicLandCard copy() {
|
||||
return new TargetBasicLandCard(this);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue