mirror of
https://github.com/correl/mage.git
synced 2024-12-26 11:09:27 +00:00
Merge origin/master
This commit is contained in:
commit
8b2a428cb1
72 changed files with 1192 additions and 232 deletions
|
@ -721,13 +721,13 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
|
||||||
|
|
||||||
private BufferedImage getFaceDownImage() {
|
private BufferedImage getFaceDownImage() {
|
||||||
if (isPermanent) {
|
if (isPermanent) {
|
||||||
if (gameCard.isMorphCard() && ((PermanentView) gameCard).isMorphed()) {
|
if (((PermanentView) gameCard).isMorphed()) {
|
||||||
return ImageCache.getMorphImage();
|
return ImageCache.getMorphImage();
|
||||||
} else {
|
} else {
|
||||||
return ImageCache.getManifestImage();
|
return ImageCache.getManifestImage();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (gameCard.isMorphCard() && this.gameCard instanceof StackAbilityView) {
|
if (this.gameCard instanceof StackAbilityView) {
|
||||||
return ImageCache.getMorphImage();
|
return ImageCache.getMorphImage();
|
||||||
} else {
|
} else {
|
||||||
return ImageCache.loadImage(new TFile(DirectLinksForDownload.outDir + File.separator + DirectLinksForDownload.cardbackFilename));
|
return ImageCache.loadImage(new TFile(DirectLinksForDownload.outDir + File.separator + DirectLinksForDownload.cardbackFilename));
|
||||||
|
|
|
@ -87,7 +87,7 @@ public class CardView extends SimpleCardView {
|
||||||
protected boolean transformed;
|
protected boolean transformed;
|
||||||
|
|
||||||
protected boolean flipCard;
|
protected boolean flipCard;
|
||||||
protected boolean morphCard;
|
protected boolean faceDown;
|
||||||
|
|
||||||
protected String alternateName;
|
protected String alternateName;
|
||||||
protected String originalName;
|
protected String originalName;
|
||||||
|
@ -138,13 +138,12 @@ public class CardView extends SimpleCardView {
|
||||||
* @param controlled is the card view created for the card controller - used for morph / face down cards to know which player may see information for the card
|
* @param controlled is the card view created for the card controller - used for morph / face down cards to know which player may see information for the card
|
||||||
*/
|
*/
|
||||||
public CardView(Card card, Game game, UUID cardId, boolean controlled) {
|
public CardView(Card card, Game game, UUID cardId, boolean controlled) {
|
||||||
super(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.isFaceDown(), card.getUsesVariousArt(), card.getTokenSetCode());
|
super(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode());
|
||||||
this.morphCard = card.isMorphCard();
|
|
||||||
// no information available for face down cards as long it's not a controlled face down morph card
|
// no information available for face down cards as long it's not a controlled face down morph card
|
||||||
// TODO: Better handle this in Framework (but currently I'm not sure how to do it there) LevelX2
|
// TODO: Better handle this in Framework (but currently I'm not sure how to do it there) LevelX2
|
||||||
if (card.isFaceDown()) {
|
if (card.isFaceDown(game)) {
|
||||||
this.fillEmpty(card, controlled);
|
this.fillEmpty(card, controlled);
|
||||||
if (card.isMorphCard() && card instanceof Spell) {
|
if (card instanceof Spell) {
|
||||||
// special handling for casting of Morph cards
|
// special handling for casting of Morph cards
|
||||||
if (controlled) {
|
if (controlled) {
|
||||||
this.name = card.getName();
|
this.name = card.getName();
|
||||||
|
@ -242,7 +241,7 @@ public class CardView extends SimpleCardView {
|
||||||
this.color = card.getColor();
|
this.color = card.getColor();
|
||||||
this.canTransform = card.canTransform();
|
this.canTransform = card.canTransform();
|
||||||
this.flipCard = card.isFlipCard();
|
this.flipCard = card.isFlipCard();
|
||||||
|
this.faceDown = game != null ? card.isFaceDown(game) : false;
|
||||||
|
|
||||||
if (card instanceof PermanentToken) {
|
if (card instanceof PermanentToken) {
|
||||||
this.isToken = true;
|
this.isToken = true;
|
||||||
|
@ -299,7 +298,7 @@ public class CardView extends SimpleCardView {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CardView(MageObject object) {
|
public CardView(MageObject object) {
|
||||||
super(object.getId(), "", 0, false, false, "");
|
super(object.getId(), "", 0, false, "");
|
||||||
this.name = object.getName();
|
this.name = object.getName();
|
||||||
this.displayName = object.getName();
|
this.displayName = object.getName();
|
||||||
if (object instanceof Permanent) {
|
if (object instanceof Permanent) {
|
||||||
|
@ -343,7 +342,7 @@ public class CardView extends SimpleCardView {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CardView() {
|
protected CardView() {
|
||||||
super(null, "", 0, false, false, "");
|
super(null, "", 0, false, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public CardView(EmblemView emblem) {
|
public CardView(EmblemView emblem) {
|
||||||
|
@ -359,7 +358,7 @@ public class CardView extends SimpleCardView {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CardView(boolean empty) {
|
public CardView(boolean empty) {
|
||||||
super(null, "", 0, false, false, "");
|
super(null, "", 0, false, "");
|
||||||
if (!empty) {
|
if (!empty) {
|
||||||
throw new IllegalArgumentException("Not supported.");
|
throw new IllegalArgumentException("Not supported.");
|
||||||
}
|
}
|
||||||
|
@ -417,7 +416,7 @@ public class CardView extends SimpleCardView {
|
||||||
}
|
}
|
||||||
|
|
||||||
CardView(Token token) {
|
CardView(Token token) {
|
||||||
super(token.getId(), "", 0, false, false, "");
|
super(token.getId(), "", 0, false, "");
|
||||||
this.isToken = true;
|
this.isToken = true;
|
||||||
this.id = token.getId();
|
this.id = token.getId();
|
||||||
this.name = token.getName();
|
this.name = token.getName();
|
||||||
|
@ -581,7 +580,6 @@ public class CardView extends SimpleCardView {
|
||||||
return getName() + " [" + getId() + "]";
|
return getName() + " [" + getId() + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isFaceDown() {
|
public boolean isFaceDown() {
|
||||||
return faceDown;
|
return faceDown;
|
||||||
}
|
}
|
||||||
|
@ -696,10 +694,6 @@ public class CardView extends SimpleCardView {
|
||||||
return flipCard;
|
return flipCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMorphCard() {
|
|
||||||
return morphCard;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isToRotate() {
|
public boolean isToRotate() {
|
||||||
return rotate;
|
return rotate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class LookedAtView implements Serializable {
|
||||||
public LookedAtView(String name, Cards cards, Game game) {
|
public LookedAtView(String name, Cards cards, Game game) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
for (Card card: cards.getCards(game)) {
|
for (Card card: cards.getCards(game)) {
|
||||||
this.cards.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode()));
|
this.cards.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,10 +84,7 @@ public class PermanentView extends CardView {
|
||||||
} else {
|
} else {
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
// original may not be face down
|
// original may not be face down
|
||||||
boolean wasfaceDown = card.isFaceDown();
|
|
||||||
card.setFaceDown(false);
|
|
||||||
original = new CardView(card);
|
original = new CardView(card);
|
||||||
card.setFaceDown(wasfaceDown);
|
|
||||||
} else {
|
} else {
|
||||||
original = null;
|
original = null;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +116,7 @@ public class PermanentView extends CardView {
|
||||||
this.nameOwner = "";
|
this.nameOwner = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (permanent.isFaceDown() && card != null) {
|
if (permanent.isFaceDown(game) && card != null) {
|
||||||
if (controlled){
|
if (controlled){
|
||||||
// must be a morphed or manifested card
|
// must be a morphed or manifested card
|
||||||
for (Ability permanentAbility : permanent.getAbilities()) {
|
for (Ability permanentAbility : permanent.getAbilities()) {
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class RevealedView implements Serializable {
|
||||||
public RevealedView(String name, Cards cards, Game game) {
|
public RevealedView(String name, Cards cards, Game game) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
for (Card card: cards.getCards(game)) {
|
for (Card card: cards.getCards(game)) {
|
||||||
this.cards.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode()));
|
this.cards.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,14 +40,12 @@ public class SimpleCardView implements Serializable {
|
||||||
protected String expansionSetCode;
|
protected String expansionSetCode;
|
||||||
protected String tokenSetCode;
|
protected String tokenSetCode;
|
||||||
protected int cardNumber;
|
protected int cardNumber;
|
||||||
protected boolean faceDown;
|
|
||||||
protected boolean usesVariousArt;
|
protected boolean usesVariousArt;
|
||||||
|
|
||||||
public SimpleCardView(UUID id, String expansionSetCode, int cardNumber, boolean faceDown, boolean usesVariousArt, String tokenSetCode) {
|
public SimpleCardView(UUID id, String expansionSetCode, int cardNumber, boolean usesVariousArt, String tokenSetCode) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.expansionSetCode = expansionSetCode;
|
this.expansionSetCode = expansionSetCode;
|
||||||
this.cardNumber = cardNumber;
|
this.cardNumber = cardNumber;
|
||||||
this.faceDown = faceDown;
|
|
||||||
this.usesVariousArt = usesVariousArt;
|
this.usesVariousArt = usesVariousArt;
|
||||||
this.tokenSetCode = tokenSetCode;
|
this.tokenSetCode = tokenSetCode;
|
||||||
}
|
}
|
||||||
|
@ -64,10 +62,6 @@ public class SimpleCardView implements Serializable {
|
||||||
return cardNumber;
|
return cardNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFaceDown() {
|
|
||||||
return faceDown;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getUsesVariousArt() {
|
public boolean getUsesVariousArt() {
|
||||||
return usesVariousArt;
|
return usesVariousArt;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class SimpleCardsView extends LinkedHashMap<UUID, SimpleCardView> {
|
||||||
|
|
||||||
public SimpleCardsView(Collection<Card> cards) {
|
public SimpleCardsView(Collection<Card> cards) {
|
||||||
for (Card card: cards) {
|
for (Card card: cards) {
|
||||||
this.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.isFaceDown(), card.getUsesVariousArt(), card.getTokenSetCode()));
|
this.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ public class StackAbilityView extends CardView {
|
||||||
this.power = ability.getPower().toString();
|
this.power = ability.getPower().toString();
|
||||||
this.toughness = ability.getToughness().toString();
|
this.toughness = ability.getToughness().toString();
|
||||||
String nameToShow;
|
String nameToShow;
|
||||||
if (sourceCard.isMorphCard() && sourceCard.isFaceDown()) {
|
if (sourceCard.isFaceDown()) {
|
||||||
CardView tmpSourceCard = this.getSourceCard();
|
CardView tmpSourceCard = this.getSourceCard();
|
||||||
tmpSourceCard.displayName = "Face Down";
|
tmpSourceCard.displayName = "Face Down";
|
||||||
tmpSourceCard.superTypes.clear();
|
tmpSourceCard.superTypes.clear();
|
||||||
|
|
|
@ -575,7 +575,7 @@ public class HumanPlayer extends PlayerImpl {
|
||||||
if (object != null) {
|
if (object != null) {
|
||||||
Zone zone = game.getState().getZone(object.getId());
|
Zone zone = game.getState().getZone(object.getId());
|
||||||
if (zone != null) {
|
if (zone != null) {
|
||||||
if (object instanceof Card && ((Card) object).isFaceDown()) {
|
if (object instanceof Card && ((Card) object).isFaceDown(game)) {
|
||||||
revealFaceDownCard((Card) object, game);
|
revealFaceDownCard((Card) object, game);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ class LifebloodHydraComesIntoPlayEffect extends OneShotEffect {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||||
if (permanent != null && !permanent.isFaceDown()) {
|
if (permanent != null && !permanent.isFaceDown(game)) {
|
||||||
Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
|
Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
|
||||||
if (obj != null && obj instanceof SpellAbility) {
|
if (obj != null && obj instanceof SpellAbility) {
|
||||||
int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
|
int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.Effect;
|
||||||
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
|
import mage.abilities.keyword.MorphAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.constants.TargetController;
|
||||||
|
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
|
||||||
|
import mage.filter.predicate.permanent.ControllerPredicate;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author fireshoes
|
||||||
|
*/
|
||||||
|
public class AinokSurvivalist extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterArtifactOrEnchantmentPermanent filter = new FilterArtifactOrEnchantmentPermanent("artifact or enchantment an opponent controls");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(new ControllerPredicate(TargetController.OPPONENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
public AinokSurvivalist(UUID ownerId) {
|
||||||
|
super(ownerId, 172, "Ainok Survivalist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
this.subtype.add("Hound");
|
||||||
|
this.subtype.add("Shaman");
|
||||||
|
this.power = new MageInt(2);
|
||||||
|
this.toughness = new MageInt(1);
|
||||||
|
|
||||||
|
// Megamorph {1}{G}
|
||||||
|
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{1}{G}"), true));
|
||||||
|
|
||||||
|
// When Ainok Survivalist is turned face up, destroy target artifact or enchantment an opponent controls.
|
||||||
|
Effect effect = new DestroyTargetEffect();
|
||||||
|
effect.setText("destroy target artifact or enchantment an opponent controls");
|
||||||
|
Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect, false);
|
||||||
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AinokSurvivalist(final AinokSurvivalist card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AinokSurvivalist copy() {
|
||||||
|
return new AinokSurvivalist(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.EntersBattlefieldAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
|
import mage.abilities.keyword.ReachAbility;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
|
import mage.filter.predicate.permanent.AnotherPredicate;
|
||||||
|
import mage.filter.predicate.permanent.CounterPredicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeffwadsworth
|
||||||
|
*/
|
||||||
|
public class AvatarOfTheResolute extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creature you control with a +1/+1 counter on it");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(new CounterPredicate(CounterType.P1P1));
|
||||||
|
filter.add(new AnotherPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public AvatarOfTheResolute(UUID ownerId) {
|
||||||
|
super(ownerId, 175, "Avatar of the Resolute", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{G}{G}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
this.subtype.add("Avatar");
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
|
// Reach
|
||||||
|
this.addAbility(ReachAbility.getInstance());
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// Avatar of the Resolute enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.
|
||||||
|
DynamicValue numberCounters = new PermanentsOnBattlefieldCount(filter);
|
||||||
|
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), numberCounters, true)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AvatarOfTheResolute(final AvatarOfTheResolute card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AvatarOfTheResolute copy() {
|
||||||
|
return new AvatarOfTheResolute(this);
|
||||||
|
}
|
||||||
|
}
|
102
Mage.Sets/src/mage/sets/dragonsoftarkir/CloneLegion.java
Normal file
102
Mage.Sets/src/mage/sets/dragonsoftarkir/CloneLegion.java
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.game.permanent.token.EmptyToken;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeffwadsworth
|
||||||
|
*/
|
||||||
|
public class CloneLegion extends CardImpl {
|
||||||
|
|
||||||
|
public CloneLegion(UUID ownerId) {
|
||||||
|
super(ownerId, 48, "Clone Legion", Rarity.MYTHIC, new CardType[]{CardType.SORCERY}, "{7}{U}{U}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
|
||||||
|
// For each creature target player controls, put a token onto the the battlefield that's a copy of that creature.
|
||||||
|
this.getSpellAbility().addEffect(new CloneLegionEffect());
|
||||||
|
this.getSpellAbility().addTarget(new TargetPlayer());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CloneLegion(final CloneLegion card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CloneLegion copy() {
|
||||||
|
return new CloneLegion(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CloneLegionEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
public CloneLegionEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
this.staticText = "For each creature target player controls, put a token onto the the battlefield that's a copy of that creature";
|
||||||
|
}
|
||||||
|
|
||||||
|
public CloneLegionEffect(final CloneLegionEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CloneLegionEffect copy() {
|
||||||
|
return new CloneLegionEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
|
||||||
|
if (targetPlayer != null) {
|
||||||
|
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), targetPlayer.getId(), game)) {
|
||||||
|
if (permanent != null) {
|
||||||
|
EmptyToken token = new EmptyToken();
|
||||||
|
CardUtil.copyTo(token).from(permanent);
|
||||||
|
token.putOntoBattlefield(1, game, source.getSourceId(), targetPlayer.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
152
Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java
Normal file
152
Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
|
import mage.abilities.effects.ContinuousEffect;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.AsThoughEffectType;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.PhaseStep;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeffwadsworth
|
||||||
|
*/
|
||||||
|
public class CommuneWithLava extends CardImpl {
|
||||||
|
|
||||||
|
public CommuneWithLava(UUID ownerId) {
|
||||||
|
super(ownerId, 131, "Commune with Lava", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{X}{R}{R}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
|
||||||
|
// Exile the top X cards of your library. Until the end of your next turn, you may play those cards.
|
||||||
|
this.getSpellAbility().addEffect(new CommuneWithLavaEffect());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommuneWithLava(final CommuneWithLava card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommuneWithLava copy() {
|
||||||
|
return new CommuneWithLava(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CommuneWithLavaEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
public CommuneWithLavaEffect() {
|
||||||
|
super(Outcome.PlayForFree);
|
||||||
|
this.staticText = "Exile the top X cards of your library. Until the end of your next turn, you may play those cards";
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommuneWithLavaEffect(final CommuneWithLavaEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommuneWithLavaEffect copy() {
|
||||||
|
return new CommuneWithLavaEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
|
Card sourceCard = game.getCard(source.getSourceId());
|
||||||
|
if (controller != null) {
|
||||||
|
int amount = source.getManaCostsToPay().getX();
|
||||||
|
List<Card> cards = controller.getLibrary().getTopCards(game, amount);
|
||||||
|
for (Card card : cards) {
|
||||||
|
if (card != null) {
|
||||||
|
controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourceCard.getName(), source.getSourceId(), game, Zone.LIBRARY);
|
||||||
|
ContinuousEffect effect = new CommuneWithLavaMayPlayEffect();
|
||||||
|
effect.setTargetPointer(new FixedTarget(card.getId()));
|
||||||
|
game.addEffect(effect, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CommuneWithLavaMayPlayEffect extends AsThoughEffectImpl {
|
||||||
|
|
||||||
|
public CommuneWithLavaMayPlayEffect() {
|
||||||
|
super(AsThoughEffectType.PLAY_FROM_NON_HAND_ZONE, Duration.Custom, Outcome.Benefit);
|
||||||
|
this.staticText = "Until the end of your next turn, you may play that card.";
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommuneWithLavaMayPlayEffect(final CommuneWithLavaMayPlayEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommuneWithLavaMayPlayEffect copy() {
|
||||||
|
return new CommuneWithLavaMayPlayEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInactive(Ability source, Game game) {
|
||||||
|
if (game.getPhase().getStep().getType() == PhaseStep.END_TURN) {
|
||||||
|
if (game.getActivePlayerId().equals(source.getControllerId())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
|
||||||
|
if (targetPointer.getTargets(game, source).contains(sourceId)) {
|
||||||
|
return game.getState().getZone(sourceId).equals(Zone.EXILED);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
114
Mage.Sets/src/mage/sets/dragonsoftarkir/DromokasCommand.java
Normal file
114
Mage.Sets/src/mage/sets/dragonsoftarkir/DromokasCommand.java
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.abilities.Mode;
|
||||||
|
import mage.abilities.effects.Effect;
|
||||||
|
import mage.abilities.effects.common.FightTargetsEffect;
|
||||||
|
import mage.abilities.effects.common.PreventDamageByTargetEffect;
|
||||||
|
import mage.abilities.effects.common.SacrificeEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.constants.TargetController;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.FilterStackObject;
|
||||||
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.filter.predicate.mageobject.CardTypePredicate;
|
||||||
|
import mage.filter.predicate.permanent.ControllerPredicate;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
import mage.target.TargetStackObject;
|
||||||
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeffwadsworth
|
||||||
|
*/
|
||||||
|
public class DromokasCommand extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterStackObject filterInstantOrSorcery = new FilterStackObject("instant or sorcery spell");
|
||||||
|
private static final FilterPermanent filterEnchantment = new FilterPermanent("enchantment");
|
||||||
|
private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("creature to put the +1/+1 counter on");
|
||||||
|
private static final FilterCreaturePermanent filterUncontrolledCreature = new FilterCreaturePermanent("creature you don't control");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filterInstantOrSorcery.add(Predicates.or(new CardTypePredicate(CardType.INSTANT),
|
||||||
|
new CardTypePredicate(CardType.SORCERY)));
|
||||||
|
filterUncontrolledCreature.add(new ControllerPredicate(TargetController.NOT_YOU));
|
||||||
|
}
|
||||||
|
|
||||||
|
public DromokasCommand(UUID ownerId) {
|
||||||
|
super(ownerId, 221, "Dromoka's Command", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{G}{W}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
|
||||||
|
// Choose two - Prevent all damage target instant or sorcery spell would deal this turn; Target player sacrifices an enchantment; Put a +1/+1 counter on target creature; or Target creature you control fights target creature you don't control.
|
||||||
|
this.getSpellAbility().getModes().setMinModes(2);
|
||||||
|
this.getSpellAbility().getModes().setMaxModes(2);
|
||||||
|
|
||||||
|
// Prevent all damage target instant or sorcery spell would deal this turn;
|
||||||
|
this.getSpellAbility().getEffects().add(new PreventDamageByTargetEffect(Duration.EndOfTurn));
|
||||||
|
this.getSpellAbility().getTargets().add(new TargetStackObject(filterInstantOrSorcery));
|
||||||
|
|
||||||
|
// or Target player sacrifices an enchantment;
|
||||||
|
Mode mode = new Mode();
|
||||||
|
mode.getEffects().add(new SacrificeEffect(filterEnchantment, 1, "target player"));
|
||||||
|
mode.getTargets().add(new TargetPlayer());
|
||||||
|
this.getSpellAbility().getModes().addMode(mode);
|
||||||
|
|
||||||
|
// Put a +1/+1 counter on target creature;
|
||||||
|
mode = new Mode();
|
||||||
|
mode.getEffects().add(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
|
||||||
|
mode.getTargets().add(new TargetCreaturePermanent(filterCreature));
|
||||||
|
this.getSpellAbility().getModes().addMode(mode);
|
||||||
|
|
||||||
|
// or Target creature you control fights target creature you don't control.
|
||||||
|
mode = new Mode();
|
||||||
|
Effect effect = new FightTargetsEffect();
|
||||||
|
effect.setText("Target creature you control fights target creature you don't control");
|
||||||
|
mode.getEffects().add(effect);
|
||||||
|
mode.getTargets().add(new TargetControlledCreaturePermanent());
|
||||||
|
mode.getTargets().add(new TargetCreaturePermanent(filterUncontrolledCreature));
|
||||||
|
this.getSpellAbility().getModes().addMode(mode);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public DromokasCommand(final DromokasCommand card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DromokasCommand copy() {
|
||||||
|
return new DromokasCommand(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,167 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.ConditionalMana;
|
||||||
|
import mage.MageObject;
|
||||||
|
import mage.Mana;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
|
import mage.abilities.mana.ColorlessManaAbility;
|
||||||
|
import mage.abilities.mana.ConditionalAnyColorManaAbility;
|
||||||
|
import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||||
|
import mage.abilities.mana.conditional.CreatureCastManaCondition;
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.predicate.Predicate;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author jeffwadsworth
|
||||||
|
*/
|
||||||
|
public class HavenOfTheSpiritDragon extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterCard filter = new FilterCard("Dragon creature card or Ugin planeswalker card from your graveyard");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(Predicates.or(new DragonCreatureCardPredicate(),
|
||||||
|
new UginPlaneswalkerCardPredicate()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public HavenOfTheSpiritDragon(UUID ownerId) {
|
||||||
|
super(ownerId, 249, "Haven of the Spirit Dragon", Rarity.RARE, new CardType[]{CardType.LAND}, "");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
|
||||||
|
// {T}: Add {1} to your mana pool.
|
||||||
|
this.addAbility(new ColorlessManaAbility());
|
||||||
|
|
||||||
|
// {T}: add one mana of any color to your mana pool. Spend this mana only to cast a Dragon creature spell.
|
||||||
|
this.addAbility(new ConditionalAnyColorManaAbility(new TapSourceCost(), 1, new HavenOfTheSpiritManaBuilder(), true));
|
||||||
|
|
||||||
|
// {2}, {T}, Sacrifice Haven of the Spirit Dragon: Return target Dragon creature card or Ugin planeswalker card from your graveyard to your hand.
|
||||||
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), new ManaCostsImpl("{2}"));
|
||||||
|
ability.addCost(new TapSourceCost());
|
||||||
|
ability.addCost(new SacrificeSourceCost());
|
||||||
|
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public HavenOfTheSpiritDragon(final HavenOfTheSpiritDragon card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HavenOfTheSpiritDragon copy() {
|
||||||
|
return new HavenOfTheSpiritDragon(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class HavenOfTheSpiritManaBuilder extends ConditionalManaBuilder {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionalMana build(Object... options) {
|
||||||
|
this.mana.setFlag(true); // indicates that the mana is from second ability
|
||||||
|
return new HavenOfTheSpiritConditionalMana(this.mana);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRule() {
|
||||||
|
return "Spend this mana only to cast a Dragon creature spell.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class HavenOfTheSpiritConditionalMana extends ConditionalMana {
|
||||||
|
|
||||||
|
HavenOfTheSpiritConditionalMana(Mana mana) {
|
||||||
|
super(mana);
|
||||||
|
staticText = "Spend this mana only to cast a Dragon creature spell.";
|
||||||
|
addCondition(new HavenOfTheSpiritManaCondition());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class HavenOfTheSpiritManaCondition extends CreatureCastManaCondition {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source, UUID manaProducer) {
|
||||||
|
if (super.apply(game, source)) {
|
||||||
|
MageObject object = game.getObject(source.getSourceId());
|
||||||
|
if (object.hasSubtype("Dragon")
|
||||||
|
&& object.getCardType().contains(CardType.CREATURE)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DragonCreatureCardPredicate implements Predicate<Card> {
|
||||||
|
|
||||||
|
public DragonCreatureCardPredicate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Card input, Game game) {
|
||||||
|
return input.getCardType().contains(CardType.CREATURE)
|
||||||
|
&& input.getSubtype().contains("Dragon");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UginPlaneswalkerCardPredicate implements Predicate<Card> {
|
||||||
|
|
||||||
|
public UginPlaneswalkerCardPredicate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Card input, Game game) {
|
||||||
|
return input.getCardType().contains(CardType.PLANESWALKER)
|
||||||
|
&& input.getName().contains("Ugin, the Spirit Dragon");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
100
Mage.Sets/src/mage/sets/dragonsoftarkir/SaltRoadAmbushers.java
Normal file
100
Mage.Sets/src/mage/sets/dragonsoftarkir/SaltRoadAmbushers.java
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
* permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those of the
|
||||||
|
* authors and should not be interpreted as representing official policies, either expressed
|
||||||
|
* or implied, of BetaSteward_at_googlemail.com.
|
||||||
|
*/
|
||||||
|
package mage.sets.dragonsoftarkir;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.TurnedFaceUpAllTriggeredAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.abilities.keyword.MorphAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Rarity;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
|
import mage.filter.predicate.permanent.AnotherPredicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author fireshoes
|
||||||
|
*/
|
||||||
|
public class SaltRoadAmbushers extends CardImpl {
|
||||||
|
|
||||||
|
public SaltRoadAmbushers(UUID ownerId) {
|
||||||
|
super(ownerId, 198, "Salt Road Ambushers", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
|
||||||
|
this.expansionSetCode = "DTK";
|
||||||
|
this.subtype.add("Hound");
|
||||||
|
this.subtype.add("Warrior");
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Whenever another permanent you control is turned face up, if it's a creature, put two +1/+1 counters on it.
|
||||||
|
this.addAbility(new SaltRoadAmbushersTriggeredAbility());
|
||||||
|
|
||||||
|
// Megamorph {3}{G}{G}
|
||||||
|
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{3}{G}{G}"), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public SaltRoadAmbushers(final SaltRoadAmbushers card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SaltRoadAmbushers copy() {
|
||||||
|
return new SaltRoadAmbushers(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SaltRoadAmbushersTriggeredAbility extends TurnedFaceUpAllTriggeredAbility {
|
||||||
|
|
||||||
|
|
||||||
|
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another permanent you control");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(new AnotherPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public SaltRoadAmbushersTriggeredAbility() {
|
||||||
|
super(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)), filter, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SaltRoadAmbushersTriggeredAbility(final SaltRoadAmbushersTriggeredAbility ability) {
|
||||||
|
super(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SaltRoadAmbushersTriggeredAbility copy() {
|
||||||
|
return new SaltRoadAmbushersTriggeredAbility(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRule() {
|
||||||
|
return "Whenever another permanent you control is turned face up, if it's a creature, put two +1/+1 counters on it.";
|
||||||
|
}
|
||||||
|
}
|
|
@ -107,8 +107,7 @@ class ShorecrasherElementalEffect extends OneShotEffect {
|
||||||
if (shorecrasherElemental.moveToExile(source.getSourceId(), "Shorecrasher Elemental", source.getSourceId(), game)) {
|
if (shorecrasherElemental.moveToExile(source.getSourceId(), "Shorecrasher Elemental", source.getSourceId(), game)) {
|
||||||
Card card = game.getExile().getCard(source.getSourceId(), game);
|
Card card = game.getExile().getCard(source.getSourceId(), game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
card.setFaceDown(true);
|
return card.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), card.getOwnerId(), false, true);
|
||||||
return card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,14 +99,12 @@ class GhastlyConscriptionEffect extends OneShotEffect {
|
||||||
for(Card card: targetPlayer.getGraveyard().getCards(new FilterCreatureCard(), game)) {
|
for(Card card: targetPlayer.getGraveyard().getCards(new FilterCreatureCard(), game)) {
|
||||||
cardsToManifest.add(card);
|
cardsToManifest.add(card);
|
||||||
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.GRAVEYARD);
|
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.GRAVEYARD);
|
||||||
card.setFaceDown(true);
|
|
||||||
}
|
}
|
||||||
Collections.shuffle(cardsToManifest);
|
Collections.shuffle(cardsToManifest);
|
||||||
game.informPlayers(controller.getName() + " shuffles the face-down pile");
|
game.informPlayers(controller.getName() + " shuffles the face-down pile");
|
||||||
Ability newSource = source.copy();
|
Ability newSource = source.copy();
|
||||||
newSource.setWorksFaceDown(true);
|
newSource.setWorksFaceDown(true);
|
||||||
for (Card card: cardsToManifest) {
|
for (Card card: cardsToManifest) {
|
||||||
card.setFaceDown(true);
|
|
||||||
ManaCosts manaCosts = null;
|
ManaCosts manaCosts = null;
|
||||||
if (card.getCardType().contains(CardType.CREATURE)) {
|
if (card.getCardType().contains(CardType.CREATURE)) {
|
||||||
manaCosts = card.getSpellAbility().getManaCosts();
|
manaCosts = card.getSpellAbility().getManaCosts();
|
||||||
|
@ -116,7 +114,7 @@ class GhastlyConscriptionEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
||||||
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
||||||
if (controller.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId())) {
|
if (controller.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId(), false, true)) {
|
||||||
game.informPlayers(new StringBuilder(controller.getName())
|
game.informPlayers(new StringBuilder(controller.getName())
|
||||||
.append(" puts facedown card from exile onto the battlefield").toString());
|
.append(" puts facedown card from exile onto the battlefield").toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,12 +114,10 @@ class JeskaiInfiltratorEffect extends OneShotEffect {
|
||||||
Card sourceCard = game.getCard(source.getSourceId());
|
Card sourceCard = game.getCard(source.getSourceId());
|
||||||
if (sourcePermanent != null && sourceCard != null) {
|
if (sourcePermanent != null && sourceCard != null) {
|
||||||
player.moveCardToExileWithInfo(sourcePermanent, sourcePermanent.getId(), sourcePermanent.getName(), source.getSourceId(), game, Zone.BATTLEFIELD);
|
player.moveCardToExileWithInfo(sourcePermanent, sourcePermanent.getId(), sourcePermanent.getName(), source.getSourceId(), game, Zone.BATTLEFIELD);
|
||||||
sourceCard.setFaceDown(true);
|
|
||||||
cardsToManifest.add(sourceCard);
|
cardsToManifest.add(sourceCard);
|
||||||
}
|
}
|
||||||
if (sourcePermanent!= null && player.getLibrary().size() > 0) {
|
if (sourcePermanent!= null && player.getLibrary().size() > 0) {
|
||||||
Card cardFromLibrary = player.getLibrary().removeFromTop(game);
|
Card cardFromLibrary = player.getLibrary().removeFromTop(game);
|
||||||
cardFromLibrary.setFaceDown(true);
|
|
||||||
player.moveCardToExileWithInfo(cardFromLibrary, sourcePermanent.getId(), sourcePermanent.getName(), source.getSourceId(), game, Zone.LIBRARY);
|
player.moveCardToExileWithInfo(cardFromLibrary, sourcePermanent.getId(), sourcePermanent.getName(), source.getSourceId(), game, Zone.LIBRARY);
|
||||||
cardsToManifest.add(cardFromLibrary);
|
cardsToManifest.add(cardFromLibrary);
|
||||||
}
|
}
|
||||||
|
@ -128,7 +126,6 @@ class JeskaiInfiltratorEffect extends OneShotEffect {
|
||||||
Ability newSource = source.copy();
|
Ability newSource = source.copy();
|
||||||
newSource.setWorksFaceDown(true);
|
newSource.setWorksFaceDown(true);
|
||||||
for (Card card : cardsToManifest) {
|
for (Card card : cardsToManifest) {
|
||||||
card.setFaceDown(true);
|
|
||||||
ManaCosts manaCosts = null;
|
ManaCosts manaCosts = null;
|
||||||
if (card.getCardType().contains(CardType.CREATURE)) {
|
if (card.getCardType().contains(CardType.CREATURE)) {
|
||||||
manaCosts = card.getSpellAbility().getManaCosts();
|
manaCosts = card.getSpellAbility().getManaCosts();
|
||||||
|
@ -138,7 +135,7 @@ class JeskaiInfiltratorEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
||||||
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
||||||
if (card.moveToZone(Zone.BATTLEFIELD, newSource.getSourceId(), game, false)) {
|
if (player.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId(), false, true)) {
|
||||||
game.informPlayers(new StringBuilder(player.getName())
|
game.informPlayers(new StringBuilder(player.getName())
|
||||||
.append(" puts facedown card from exile onto the battlefield").toString());
|
.append(" puts facedown card from exile onto the battlefield").toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,8 +97,8 @@ class SummonersEggImprintEffect extends OneShotEffect {
|
||||||
&& controller.choose(Outcome.Benefit, controller.getHand(), target, game)) {
|
&& controller.choose(Outcome.Benefit, controller.getHand(), target, game)) {
|
||||||
Card card = controller.getHand().get(target.getFirstTarget(), game);
|
Card card = controller.getHand().get(target.getFirstTarget(), game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
card.setFaceDown(true);
|
|
||||||
controller.moveCardToExileWithInfo(card, source.getSourceId(), sourcePermanent.getLogName() +" (Imprint)", source.getSourceId(), game, Zone.HAND);
|
controller.moveCardToExileWithInfo(card, source.getSourceId(), sourcePermanent.getLogName() +" (Imprint)", source.getSourceId(), game, Zone.HAND);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
permanent.imprint(card.getId(), game);
|
permanent.imprint(card.getId(), game);
|
||||||
|
|
|
@ -105,7 +105,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl {
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
if (event.getTargetId().equals(source.getSourceId())) {
|
if (event.getTargetId().equals(source.getSourceId())) {
|
||||||
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
||||||
if (sourcePermanent != null && !sourcePermanent.isFaceDown()) {
|
if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,8 +146,10 @@ class BaneAlleyBrokerDrawExileEffect extends OneShotEffect {
|
||||||
Card card = game.getCard(target.getFirstTarget());
|
Card card = game.getCard(target.getFirstTarget());
|
||||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||||
if (card != null && sourceObject != null) {
|
if (card != null && sourceObject != null) {
|
||||||
card.setFaceDown(true);
|
if (card.moveToExile(CardUtil.getCardExileZoneId(game, source), new StringBuilder(sourceObject.getLogName()).toString(), source.getSourceId(), game)) {
|
||||||
return card.moveToExile(CardUtil.getCardExileZoneId(game, source), new StringBuilder(sourceObject.getLogName()).toString(), source.getSourceId(), game);
|
card.setFaceDown(true, game);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,8 +136,8 @@ class NecropotenceEffect extends OneShotEffect {
|
||||||
if (controller != null) {
|
if (controller != null) {
|
||||||
if (controller.getLibrary().size() > 0) {
|
if (controller.getLibrary().size() > 0) {
|
||||||
Card card = controller.getLibrary().removeFromTop(game);
|
Card card = controller.getLibrary().removeFromTop(game);
|
||||||
card.setFaceDown(true);
|
|
||||||
if (controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY)) {
|
if (controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY)) {
|
||||||
|
card.setFaceDown(true, game);
|
||||||
Effect returnToHandeffect = new ReturnToHandTargetEffect();
|
Effect returnToHandeffect = new ReturnToHandTargetEffect();
|
||||||
returnToHandeffect.setText("put that face down card into your hand");
|
returnToHandeffect.setText("put that face down card into your hand");
|
||||||
returnToHandeffect.setTargetPointer(new FixedTarget(card.getId()));
|
returnToHandeffect.setTargetPointer(new FixedTarget(card.getId()));
|
||||||
|
|
|
@ -29,6 +29,7 @@ package mage.sets.invasion;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
||||||
|
@ -64,10 +65,9 @@ public class CursedFlesh extends CardImpl {
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// Enchanted creature gets -1/-1 and has fear.
|
// Enchanted creature gets -1/-1 and has fear.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(-1, -1, Duration.WhileOnBattlefield)));
|
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(-1, -1, Duration.WhileOnBattlefield));
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FearAbility.getInstance(), AttachmentType.AURA)));
|
ability.addEffect(new GainAbilityAttachedEffect(FearAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield, "and has fear"));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CursedFlesh(final CursedFlesh card) {
|
public CursedFlesh(final CursedFlesh card) {
|
||||||
|
|
|
@ -59,7 +59,7 @@ public class SunscapeMaster extends CardImpl {
|
||||||
|
|
||||||
// {G}{G}, {tap}: Creatures you control get +2/+2 until end of turn.
|
// {G}{G}, {tap}: Creatures you control get +2/+2 until end of turn.
|
||||||
Effect effect1 = new BoostControlledEffect(2, 2, Duration.EndOfTurn);
|
Effect effect1 = new BoostControlledEffect(2, 2, Duration.EndOfTurn);
|
||||||
effect1.setText("Creatures you control get +2/+2");
|
effect1.setText("Creatures you control get +2/+2 until end of turn");
|
||||||
Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect1, new ManaCostsImpl("{G}{G}"));
|
Ability ability1 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect1, new ManaCostsImpl("{G}{G}"));
|
||||||
ability1.addCost(new TapSourceCost());
|
ability1.addCost(new TapSourceCost());
|
||||||
this.addAbility(ability1);
|
this.addAbility(ability1);
|
||||||
|
|
|
@ -48,8 +48,8 @@ import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
*/
|
*/
|
||||||
public class YavimayaKavu extends CardImpl {
|
public class YavimayaKavu extends CardImpl {
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filterGreenCreature = new FilterCreaturePermanent("Green");
|
private static final FilterCreaturePermanent filterGreenCreature = new FilterCreaturePermanent("green creatures on the battlefield");
|
||||||
private static final FilterCreaturePermanent filterRedCreature = new FilterCreaturePermanent("Red");
|
private static final FilterCreaturePermanent filterRedCreature = new FilterCreaturePermanent("red creatures on the battlefield");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filterGreenCreature.add(new ColorPredicate(ObjectColor.GREEN));
|
filterGreenCreature.add(new ColorPredicate(ObjectColor.GREEN));
|
||||||
|
|
|
@ -112,8 +112,7 @@ class AshcloudPhoenixEffect extends OneShotEffect {
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
Player owner = game.getPlayer(card.getOwnerId());
|
Player owner = game.getPlayer(card.getOwnerId());
|
||||||
if (owner != null && owner.getGraveyard().contains(card.getId())) {
|
if (owner != null && owner.getGraveyard().contains(card.getId())) {
|
||||||
card.setFaceDown(true);
|
player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId(), false, true);
|
||||||
player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -120,7 +120,7 @@ class EfreetWeaponmasterAbility extends TriggeredAbilityImpl {
|
||||||
}
|
}
|
||||||
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) {
|
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) {
|
||||||
Permanent sourcePermanent = game.getPermanent(getSourceId());
|
Permanent sourcePermanent = game.getPermanent(getSourceId());
|
||||||
if (sourcePermanent != null && !sourcePermanent.isFaceDown()) {
|
if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ class HoodedHydraEffect1 extends OneShotEffect {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||||
if (permanent != null && !permanent.isFaceDown()) {
|
if (permanent != null && !permanent.isFaceDown(game)) {
|
||||||
Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
|
Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
|
||||||
if (obj != null && obj instanceof SpellAbility) {
|
if (obj != null && obj instanceof SpellAbility) {
|
||||||
int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
|
int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
|
||||||
|
|
|
@ -184,7 +184,7 @@ class LensOfClarityLookFaceDownEffect extends OneShotEffect {
|
||||||
Permanent faceDownCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
|
Permanent faceDownCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||||
if (faceDownCreature != null) {
|
if (faceDownCreature != null) {
|
||||||
Permanent copyFaceDown = faceDownCreature.copy();
|
Permanent copyFaceDown = faceDownCreature.copy();
|
||||||
copyFaceDown.setFaceDown(false);
|
copyFaceDown.setFaceDown(false, game);
|
||||||
Cards cards = new CardsImpl();
|
Cards cards = new CardsImpl();
|
||||||
cards.add(copyFaceDown);
|
cards.add(copyFaceDown);
|
||||||
Player player = game.getPlayer(faceDownCreature.getControllerId());
|
Player player = game.getPlayer(faceDownCreature.getControllerId());
|
||||||
|
|
|
@ -107,7 +107,7 @@ class PonybackBrigadeAbility extends TriggeredAbilityImpl {
|
||||||
}
|
}
|
||||||
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) {
|
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) {
|
||||||
Permanent sourcePermanent = game.getPermanent(getSourceId());
|
Permanent sourcePermanent = game.getPermanent(getSourceId());
|
||||||
if (sourcePermanent != null && !sourcePermanent.isFaceDown()) {
|
if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ class SmokeTellerLookFaceDownEffect extends OneShotEffect {
|
||||||
Permanent faceDownCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
|
Permanent faceDownCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||||
if (faceDownCreature != null) {
|
if (faceDownCreature != null) {
|
||||||
Permanent copyFaceDown = faceDownCreature.copy();
|
Permanent copyFaceDown = faceDownCreature.copy();
|
||||||
copyFaceDown.setFaceDown(false);
|
copyFaceDown.setFaceDown(false, game);
|
||||||
Cards cards = new CardsImpl();
|
Cards cards = new CardsImpl();
|
||||||
cards.add(copyFaceDown);
|
cards.add(copyFaceDown);
|
||||||
player.lookAtCards("face down card - " + mageObject.getLogName(), cards, game);
|
player.lookAtCards("face down card - " + mageObject.getLogName(), cards, game);
|
||||||
|
|
|
@ -136,7 +136,7 @@ class FaceUpPredicate implements Predicate<Card> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Card input, Game game) {
|
public boolean apply(Card input, Game game) {
|
||||||
return !input.isFaceDown();
|
return !input.isFaceDown(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -105,9 +105,9 @@ class PraetorsGraspEffect extends OneShotEffect {
|
||||||
Card card = opponent.getLibrary().getCard(targetId, game);
|
Card card = opponent.getLibrary().getCard(targetId, game);
|
||||||
UUID exileId = CardUtil.getObjectExileZoneId(game, sourceObject);
|
UUID exileId = CardUtil.getObjectExileZoneId(game, sourceObject);
|
||||||
if (card != null && exileId != null) {
|
if (card != null && exileId != null) {
|
||||||
card.setFaceDown(true);
|
|
||||||
game.informPlayers(controller.getName() + " moves the searched card face down to exile");
|
game.informPlayers(controller.getName() + " moves the searched card face down to exile");
|
||||||
card.moveToExile(exileId, sourceObject.getName(), source.getSourceId(), game);
|
card.moveToExile(exileId, sourceObject.getName(), source.getSourceId(), game);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
game.addEffect(new PraetorsGraspPlayEffect(card.getId()), source);
|
game.addEffect(new PraetorsGraspPlayEffect(card.getId()), source);
|
||||||
game.addEffect(new PraetorsGraspRevealEffect(card.getId()), source);
|
game.addEffect(new PraetorsGraspRevealEffect(card.getId()), source);
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl {
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
if (event.getTargetId().equals(source.getSourceId())) {
|
if (event.getTargetId().equals(source.getSourceId())) {
|
||||||
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
||||||
if (sourcePermanent != null && !sourcePermanent.isFaceDown()) {
|
if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,8 +101,8 @@ class BottledCloisterExileEffect extends OneShotEffect {
|
||||||
if (numberOfCards > 0) {
|
if (numberOfCards > 0) {
|
||||||
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
UUID exileId = CardUtil.getCardExileZoneId(game, source);
|
||||||
for (Card card: controller.getHand().getCards(game)) {
|
for (Card card: controller.getHand().getCards(game)) {
|
||||||
card.setFaceDown(true);
|
|
||||||
card.moveToExile(exileId, sourcePermanent.getName(), source.getSourceId(), game);
|
card.moveToExile(exileId, sourcePermanent.getName(), source.getSourceId(), game);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
}
|
}
|
||||||
game.informPlayers(sourcePermanent.getName() + ": " + controller.getName() + " exiles his or her hand face down (" + numberOfCards + "card" + (numberOfCards > 1 ?"s":"") +")");
|
game.informPlayers(sourcePermanent.getName() + ": " + controller.getName() + " exiles his or her hand face down (" + numberOfCards + "card" + (numberOfCards > 1 ?"s":"") +")");
|
||||||
}
|
}
|
||||||
|
@ -140,8 +140,8 @@ class BottledCloisterReturnEffect extends OneShotEffect {
|
||||||
for (Card card: exileZone.getCards(game)) {
|
for (Card card: exileZone.getCards(game)) {
|
||||||
if (card.getOwnerId().equals(controller.getId())) {
|
if (card.getOwnerId().equals(controller.getId())) {
|
||||||
numberOfCards++;
|
numberOfCards++;
|
||||||
card.setFaceDown(false);
|
|
||||||
card.moveToZone(Zone.HAND, source.getSourceId(), game, true);
|
card.moveToZone(Zone.HAND, source.getSourceId(), game, true);
|
||||||
|
card.setFaceDown(false, game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,8 +113,8 @@ class CloneShellEffect extends OneShotEffect {
|
||||||
Card card = cards.get(target1.getFirstTarget(), game);
|
Card card = cards.get(target1.getFirstTarget(), game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
cards.remove(card);
|
cards.remove(card);
|
||||||
card.setFaceDown(true);
|
|
||||||
card.moveToExile(getId(), "Clone Shell (Imprint)", source.getSourceId(), game);
|
card.moveToExile(getId(), "Clone Shell (Imprint)", source.getSourceId(), game);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
permanent.imprint(card.getId(), game);
|
permanent.imprint(card.getId(), game);
|
||||||
|
@ -166,7 +166,7 @@ class CloneShellDiesEffect extends OneShotEffect {
|
||||||
List<UUID> imprinted = permanent.getImprinted();
|
List<UUID> imprinted = permanent.getImprinted();
|
||||||
if (imprinted.size() > 0) {
|
if (imprinted.size() > 0) {
|
||||||
Card imprintedCard = game.getCard(imprinted.get(0));
|
Card imprintedCard = game.getCard(imprinted.get(0));
|
||||||
imprintedCard.setFaceDown(false);
|
imprintedCard.setFaceDown(false, game);
|
||||||
if (imprintedCard.getCardType().contains(CardType.CREATURE)) {
|
if (imprintedCard.getCardType().contains(CardType.CREATURE)) {
|
||||||
imprintedCard.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), source.getControllerId());
|
imprintedCard.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), source.getControllerId());
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ class AquamorphEntityReplacementEffect extends ReplacementEffectImpl {
|
||||||
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
|
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
|
||||||
if (event.getTargetId().equals(source.getSourceId())) {
|
if (event.getTargetId().equals(source.getSourceId())) {
|
||||||
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
|
||||||
if (sourcePermanent != null && !sourcePermanent.isFaceDown()) {
|
if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,8 +101,8 @@ class ScrollRackEffect extends OneShotEffect {
|
||||||
for (UUID targetId : targets) {
|
for (UUID targetId : targets) {
|
||||||
Card card = game.getCard(targetId);
|
Card card = game.getCard(targetId);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
card.setFaceDown(true);
|
|
||||||
if (card.moveToExile(source.getSourceId(), sourceObject.getLogName(), source.getSourceId(), game)) {
|
if (card.moveToExile(source.getSourceId(), sourceObject.getLogName(), source.getSourceId(), game)) {
|
||||||
|
card.setFaceDown(true, game);
|
||||||
amountExiled++;
|
amountExiled++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,10 +122,10 @@ class PyxisOfPandemoniumExileEffect extends OneShotEffect {
|
||||||
exileId = UUID.randomUUID();
|
exileId = UUID.randomUUID();
|
||||||
exileIds.put(exileKey, exileId);
|
exileIds.put(exileKey, exileId);
|
||||||
}
|
}
|
||||||
card.setFaceDown(true);
|
|
||||||
player.moveCardToExileWithInfo(card, exileId,
|
player.moveCardToExileWithInfo(card, exileId,
|
||||||
new StringBuilder(sourceObject.getLogName() +" (").append(player.getName()).append(")").toString(),
|
new StringBuilder(sourceObject.getLogName() +" (").append(player.getName()).append(")").toString(),
|
||||||
source.getSourceId(), game, Zone.LIBRARY);
|
source.getSourceId(), game, Zone.LIBRARY);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ class PyxisOfPandemoniumPutOntoBattlefieldEffect extends OneShotEffect {
|
||||||
ExileZone exileZone = game.getState().getExile().getExileZone(exileId);
|
ExileZone exileZone = game.getState().getExile().getExileZone(exileId);
|
||||||
if (exileZone != null) {
|
if (exileZone != null) {
|
||||||
for(Card card: exileZone.getCards(game)) {
|
for(Card card: exileZone.getCards(game)) {
|
||||||
card.setFaceDown(false);
|
// card.setFaceDown(false, game);
|
||||||
if (CardUtil.isPermanentCard(card)) {
|
if (CardUtil.isPermanentCard(card)) {
|
||||||
player.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId());
|
player.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId());
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ class RescueFromTheUnderworldReturnEffect extends OneShotEffect {
|
||||||
if (source.getTargets().get(1) != null) {
|
if (source.getTargets().get(1) != null) {
|
||||||
for (UUID targetId: ((Target) source.getTargets().get(1)).getTargets()) {
|
for (UUID targetId: ((Target) source.getTargets().get(1)).getTargets()) {
|
||||||
Card card = game.getCard(targetId);
|
Card card = game.getCard(targetId);
|
||||||
if (card != null && !card.isFaceDown()) {
|
if (card != null && !card.isFaceDown(game)) {
|
||||||
Player player = game.getPlayer(card.getOwnerId());
|
Player player = game.getPlayer(card.getOwnerId());
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
Zone currentZone = game.getState().getZone(card.getId());
|
Zone currentZone = game.getState().getZone(card.getId());
|
||||||
|
|
|
@ -107,8 +107,8 @@ class MemoryJarEffect extends OneShotEffect {
|
||||||
Card card = hand.get(hand.iterator().next(), game);
|
Card card = hand.get(hand.iterator().next(), game);
|
||||||
if(card != null)
|
if(card != null)
|
||||||
{
|
{
|
||||||
card.setFaceDown(true);
|
|
||||||
card.moveToExile(getId(), "Memory Jar", source.getSourceId(), game);
|
card.moveToExile(getId(), "Memory Jar", source.getSourceId(), game);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
cards.add(card);
|
cards.add(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,7 +247,7 @@ public class ManifestTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
||||||
if (card.getName().equals("Gore Swine")) {
|
if (card.getName().equals("Gore Swine")) {
|
||||||
Assert.assertTrue("Gore Swine may not be face down in exile", !card.isFaceDown());
|
Assert.assertTrue("Gore Swine may not be face down in exile", !card.isFaceDown(currentGame));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package org.mage.test.cards.facedown;
|
||||||
|
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.constants.PhaseStep;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.game.ExileZone;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author BetaSteward
|
||||||
|
*/
|
||||||
|
public class BaneAlleyBrokerTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bane Alley Broker
|
||||||
|
* Creature — Human Rogue 0/3, 1UB (3)
|
||||||
|
* {T}: Draw a card, then exile a card from your hand face down.
|
||||||
|
* You may look at cards exiled with Bane Alley Broker.
|
||||||
|
* {U}{B}, {T}: Return a card exiled with Bane Alley Broker to its owner's hand.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// test that cards exiled using Bane Alley Broker are face down
|
||||||
|
@Test
|
||||||
|
public void testBaneAlleyBroker() {
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Bane Alley Broker");
|
||||||
|
addCard(Zone.HAND, playerA, "Goblin Roughrider");
|
||||||
|
addCard(Zone.HAND, playerA, "Sejiri Merfolk");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Island");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Swamp");
|
||||||
|
|
||||||
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Draw a card, then exile a card from your hand face down.");
|
||||||
|
addTarget(playerA, "Goblin Roughrider");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertHandCount(playerA, 2);
|
||||||
|
assertHandCount(playerA, "Sejiri Merfolk", 1);
|
||||||
|
assertHandCount(playerA, "Goblin Roughrider", 0);
|
||||||
|
|
||||||
|
assertExileCount("Goblin Roughrider", 1);
|
||||||
|
|
||||||
|
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
||||||
|
if (card.getName().equals("Goblin Roughrider")) {
|
||||||
|
Assert.assertTrue("Exiled card is not face down", card.isFaceDown(currentGame));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package org.mage.test.cards.facedown;
|
||||||
|
|
||||||
|
import mage.constants.PhaseStep;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author BetaSteward
|
||||||
|
*/
|
||||||
|
public class GhastlyConscriptionTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ghastly Conscription
|
||||||
|
* Sorcery, 5BB (7)
|
||||||
|
* Exile all creature cards from target player's graveyard in a face-down pile,
|
||||||
|
* shuffle that pile, then manifest those cards. (To manifest a card, put it
|
||||||
|
* onto the battlefield face down as a 2/2 creature. Turn it face up any time
|
||||||
|
* for its mana cost if it's a creature card.)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// test that cards exiled using Ghastly Conscription return face down
|
||||||
|
@Test
|
||||||
|
public void testGhastlyConscription() {
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
|
||||||
|
addCard(Zone.HAND, playerA, "Ghastly Conscription");
|
||||||
|
addCard(Zone.GRAVEYARD, playerA, "Ashcloud Phoenix");
|
||||||
|
addCard(Zone.GRAVEYARD, playerA, "Goblin Roughrider");
|
||||||
|
addCard(Zone.GRAVEYARD, playerA, "Island");
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ghastly Conscription", playerA);
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertLife(playerA, 20);
|
||||||
|
assertLife(playerB, 20);
|
||||||
|
|
||||||
|
assertGraveyardCount(playerA, 2);
|
||||||
|
assertPermanentCount(playerA, "face down creature", 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
package org.mage.test.cards.facedown;
|
||||||
|
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.constants.PhaseStep;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.game.ExileZone;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author BetaSteward
|
||||||
|
*/
|
||||||
|
public class SummonersEggTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summoner's Egg
|
||||||
|
* Artifact Creature — Construct 0/4, 4 (4)
|
||||||
|
* Imprint — When Summoner's Egg enters the battlefield, you may exile a
|
||||||
|
* card from your hand face down.
|
||||||
|
* When Summoner's Egg dies, turn the exiled card face up. If it's a creature
|
||||||
|
* card, put it onto the battlefield under your control.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// test that cards imprinted using Summoner's Egg are face down
|
||||||
|
@Test
|
||||||
|
public void testSummonersEggImprint() {
|
||||||
|
addCard(Zone.HAND, playerA, "Summoner's Egg");
|
||||||
|
addCard(Zone.HAND, playerA, "Sejiri Merfolk");
|
||||||
|
addCard(Zone.HAND, playerA, "Goblin Roughrider");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Summoner's Egg");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertHandCount(playerA, 1);
|
||||||
|
assertHandCount(playerA, "Sejiri Merfolk", 1);
|
||||||
|
assertHandCount(playerA, "Goblin Roughrider", 0);
|
||||||
|
|
||||||
|
assertExileCount("Goblin Roughrider", 1);
|
||||||
|
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
||||||
|
if (card.getName().equals("Goblin Roughrider")) {
|
||||||
|
Assert.assertTrue("Exiled card is not face down", card.isFaceDown(currentGame));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// test that creature cards imprinted using Summoner's Egg are put in play face up
|
||||||
|
@Test
|
||||||
|
public void testSummonersEggDies() {
|
||||||
|
addCard(Zone.HAND, playerA, "Summoner's Egg");
|
||||||
|
addCard(Zone.HAND, playerA, "Sejiri Merfolk");
|
||||||
|
addCard(Zone.HAND, playerA, "Goblin Roughrider");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
|
||||||
|
addCard(Zone.HAND, playerB, "Char");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3);
|
||||||
|
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Summoner's Egg");
|
||||||
|
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Char", "Summoner's Egg");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertHandCount(playerA, 1);
|
||||||
|
assertHandCount(playerA, "Sejiri Merfolk", 1);
|
||||||
|
assertHandCount(playerA, "Goblin Roughrider", 0);
|
||||||
|
|
||||||
|
assertGraveyardCount(playerA, "Summoner's Egg", 1);
|
||||||
|
|
||||||
|
assertExileCount("Goblin Roughrider", 0);
|
||||||
|
assertPermanentCount(playerA, "Goblin Roughrider", 1);
|
||||||
|
for (Permanent p :currentGame.getBattlefield().getAllActivePermanents()){
|
||||||
|
if (p.getName().equals("Goblin Roughrider")) {
|
||||||
|
Assert.assertTrue("Permanent is not face up", !p.isFaceDown(currentGame));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// test that non-creature cards imprinted using Summoner's Egg are left in exile face up
|
||||||
|
@Test
|
||||||
|
public void testSummonersEggDies2() {
|
||||||
|
addCard(Zone.HAND, playerA, "Summoner's Egg");
|
||||||
|
addCard(Zone.HAND, playerA, "Forest", 2);
|
||||||
|
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
|
||||||
|
addCard(Zone.HAND, playerB, "Char");
|
||||||
|
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3);
|
||||||
|
|
||||||
|
|
||||||
|
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Summoner's Egg");
|
||||||
|
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Char", "Summoner's Egg");
|
||||||
|
|
||||||
|
setStopAt(1, PhaseStep.END_TURN);
|
||||||
|
execute();
|
||||||
|
|
||||||
|
assertHandCount(playerA, 1);
|
||||||
|
assertHandCount(playerA, "Forest", 1);
|
||||||
|
|
||||||
|
assertGraveyardCount(playerA, "Summoner's Egg", 1);
|
||||||
|
|
||||||
|
assertExileCount("Forest", 1);
|
||||||
|
for (Card card :currentGame.getExile().getAllCards(currentGame)){
|
||||||
|
if (card.getName().equals("Forest")) {
|
||||||
|
Assert.assertTrue("Exiled card is not face up", !card.isFaceDown(currentGame));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -860,7 +860,7 @@ public abstract class AbilityImpl implements Ability {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (object instanceof PermanentCard) {
|
} else if (object instanceof PermanentCard) {
|
||||||
if (((PermanentCard)object).isFaceDown()&& !this.getWorksFaceDown()) {
|
if (((PermanentCard)object).isFaceDown(game)&& !this.getWorksFaceDown()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,28 +96,6 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkAbilityStillExists(TriggeredAbility ability, GameEvent event, MageObject object) {
|
|
||||||
boolean exists = true;
|
|
||||||
|
|
||||||
if (!object.getAbilities().contains(ability)) {
|
|
||||||
exists = false;
|
|
||||||
if (object instanceof PermanentCard) {
|
|
||||||
PermanentCard permanent = (PermanentCard)object;
|
|
||||||
if (permanent.canTransform() && event.getType() == GameEvent.EventType.TRANSFORMED) {
|
|
||||||
exists = permanent.getCard().getAbilities().contains(ability);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (object instanceof PermanentCard) {
|
|
||||||
PermanentCard permanent = (PermanentCard)object;
|
|
||||||
if (permanent.isFaceDown()) {
|
|
||||||
exists = ability.getWorksFaceDown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return exists;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MageObject getMageObject(GameEvent event, Game game, TriggeredAbility ability) {
|
private MageObject getMageObject(GameEvent event, Game game, TriggeredAbility ability) {
|
||||||
MageObject object = game.getPermanent(ability.getSourceId());
|
MageObject object = game.getPermanent(ability.getSourceId());
|
||||||
if (object == null) {
|
if (object == null) {
|
||||||
|
|
|
@ -82,7 +82,7 @@ public class TurnedFaceUpAllTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
if (!event.getTargetId().equals(getSourceId())) {
|
if (!event.getTargetId().equals(getSourceId())) {
|
||||||
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId());
|
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId());
|
||||||
if (sourcePermanent != null) {
|
if (sourcePermanent != null) {
|
||||||
if (sourcePermanent.isFaceDown()) {
|
if (sourcePermanent.isFaceDown(game)) {
|
||||||
// if face down and it's not itself that is turned face up, it does not trigger
|
// if face down and it's not itself that is turned face up, it does not trigger
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,10 +52,10 @@ public class FaceDownSourceCondition implements Condition {
|
||||||
MageObject mageObject = game.getObject(source.getSourceId());
|
MageObject mageObject = game.getObject(source.getSourceId());
|
||||||
if (mageObject != null) {
|
if (mageObject != null) {
|
||||||
if (mageObject instanceof Permanent) {
|
if (mageObject instanceof Permanent) {
|
||||||
return ((Permanent)mageObject).isFaceDown();
|
return ((Permanent)mageObject).isFaceDown(game);
|
||||||
}
|
}
|
||||||
if (mageObject instanceof Card) {
|
if (mageObject instanceof Card) {
|
||||||
return ((Card)mageObject).isFaceDown();
|
return ((Card)mageObject).isFaceDown(game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl {
|
||||||
UUID controllerId = event.getPlayerId();
|
UUID controllerId = event.getPlayerId();
|
||||||
|
|
||||||
// Aura cards that go to battlefield face down (Manifest) don't have to select targets
|
// Aura cards that go to battlefield face down (Manifest) don't have to select targets
|
||||||
if (card.isFaceDown()) {
|
if (card.isFaceDown(game)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Aura enters the battlefield attached
|
// Aura enters the battlefield attached
|
||||||
|
|
|
@ -416,12 +416,12 @@ public class ContinuousEffects implements Serializable {
|
||||||
} else {
|
} else {
|
||||||
if (object instanceof PermanentCard) {
|
if (object instanceof PermanentCard) {
|
||||||
PermanentCard permanent = (PermanentCard)object;
|
PermanentCard permanent = (PermanentCard)object;
|
||||||
if (permanent.isFaceDown() && !ability.getWorksFaceDown()) {
|
if (permanent.isFaceDown(game) && !ability.getWorksFaceDown()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (object instanceof Spell) {
|
} else if (object instanceof Spell) {
|
||||||
Spell spell = (Spell)object;
|
Spell spell = (Spell)object;
|
||||||
if (spell.isFaceDown() && !ability.getWorksFaceDown()) {
|
if (spell.isFaceDown(game) && !ability.getWorksFaceDown()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class HideawayPlayEffect extends OneShotEffect {
|
||||||
// If the revealed card is a land, you can play it only if it's your turn and you haven't yet played a land this turn.
|
// If the revealed card is a land, you can play it only if it's your turn and you haven't yet played a land this turn.
|
||||||
if (game.getActivePlayerId().equals(source.getControllerId()) && controller.canPlayLand()) {
|
if (game.getActivePlayerId().equals(source.getControllerId()) && controller.canPlayLand()) {
|
||||||
if (controller.chooseUse(Outcome.Benefit, new StringBuilder("Play ").append(card.getName()).append(" from Exile?").toString(), game)) {
|
if (controller.chooseUse(Outcome.Benefit, new StringBuilder("Play ").append(card.getName()).append(" from Exile?").toString(), game)) {
|
||||||
card.setFaceDown(false);
|
card.setFaceDown(false, game);
|
||||||
return controller.playLand(card, game);
|
return controller.playLand(card, game);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,7 +83,7 @@ public class HideawayPlayEffect extends OneShotEffect {
|
||||||
// Timing restrictions based on the card's type are ignored (for instance, if it's a creature or sorcery).
|
// Timing restrictions based on the card's type are ignored (for instance, if it's a creature or sorcery).
|
||||||
// Other play restrictions are not (such as "Play [this card] only during combat").
|
// Other play restrictions are not (such as "Play [this card] only during combat").
|
||||||
if (controller.chooseUse(Outcome.Benefit, new StringBuilder("Cast ").append(card.getName()).append(" without paying it's mana cost?").toString(), game)) {
|
if (controller.chooseUse(Outcome.Benefit, new StringBuilder("Cast ").append(card.getName()).append(" without paying it's mana cost?").toString(), game)) {
|
||||||
card.setFaceDown(false);
|
card.setFaceDown(false, game);
|
||||||
return controller.cast(card.getSpellAbility(), game, true);
|
return controller.cast(card.getSpellAbility(), game, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -85,9 +85,9 @@ public class BecomesFaceDownCreatureAllEffect extends ContinuousEffectImpl imple
|
||||||
public void init(Ability source, Game game) {
|
public void init(Ability source, Game game) {
|
||||||
super.init(source, game);
|
super.init(source, game);
|
||||||
for (Permanent perm: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
|
for (Permanent perm: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
|
||||||
if (!perm.isFaceDown() && !perm.canTransform()) {
|
if (!perm.isFaceDown(game) && !perm.canTransform()) {
|
||||||
affectedObjectList.add(new MageObjectReference(perm));
|
affectedObjectList.add(new MageObjectReference(perm));
|
||||||
perm.setFaceDown(true);
|
perm.setFaceDown(true, game);
|
||||||
// check for Morph
|
// check for Morph
|
||||||
Card card = game.getCard(perm.getId());
|
Card card = game.getCard(perm.getId());
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
|
@ -106,7 +106,7 @@ public class BecomesFaceDownCreatureAllEffect extends ContinuousEffectImpl imple
|
||||||
boolean targetExists = false;
|
boolean targetExists = false;
|
||||||
for (MageObjectReference mor: affectedObjectList) {
|
for (MageObjectReference mor: affectedObjectList) {
|
||||||
Permanent permanent = mor.getPermanent(game);
|
Permanent permanent = mor.getPermanent(game);
|
||||||
if (permanent != null && permanent.isFaceDown()) {
|
if (permanent != null && permanent.isFaceDown(game)) {
|
||||||
targetExists = true;
|
targetExists = true;
|
||||||
switch (layer) {
|
switch (layer) {
|
||||||
case TypeChangingEffects_4:
|
case TypeChangingEffects_4:
|
||||||
|
|
|
@ -132,7 +132,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen
|
||||||
permanent = game.getPermanent(source.getSourceId());
|
permanent = game.getPermanent(source.getSourceId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (permanent != null && permanent.isFaceDown()) {
|
if (permanent != null && permanent.isFaceDown(game)) {
|
||||||
if (!foundPermanent) {
|
if (!foundPermanent) {
|
||||||
foundPermanent = true;
|
foundPermanent = true;
|
||||||
switch(faceDownType) {
|
switch(faceDownType) {
|
||||||
|
|
|
@ -79,7 +79,6 @@ public class ManifestEffect extends OneShotEffect {
|
||||||
newSource.setWorksFaceDown(true);
|
newSource.setWorksFaceDown(true);
|
||||||
List<Card> cards = controller.getLibrary().getTopCards(game, amount);
|
List<Card> cards = controller.getLibrary().getTopCards(game, amount);
|
||||||
for (Card card: cards) {
|
for (Card card: cards) {
|
||||||
card.setFaceDown(true);
|
|
||||||
ManaCosts manaCosts = null;
|
ManaCosts manaCosts = null;
|
||||||
if (card.getCardType().contains(CardType.CREATURE)) {
|
if (card.getCardType().contains(CardType.CREATURE)) {
|
||||||
manaCosts = card.getSpellAbility().getManaCosts();
|
manaCosts = card.getSpellAbility().getManaCosts();
|
||||||
|
@ -89,7 +88,7 @@ public class ManifestEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
||||||
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
||||||
controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId());
|
controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId(), false, true);
|
||||||
Permanent permanent = game.getPermanent(card.getId());
|
Permanent permanent = game.getPermanent(card.getId());
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
permanent.setManifested(true);
|
permanent.setManifested(true);
|
||||||
|
|
|
@ -83,7 +83,6 @@ public class ManifestTargetPlayerEffect extends OneShotEffect {
|
||||||
newSource.setWorksFaceDown(true);
|
newSource.setWorksFaceDown(true);
|
||||||
List<Card> cards = targetPlayer.getLibrary().getTopCards(game, amount);
|
List<Card> cards = targetPlayer.getLibrary().getTopCards(game, amount);
|
||||||
for (Card card: cards) {
|
for (Card card: cards) {
|
||||||
card.setFaceDown(true);
|
|
||||||
ManaCosts manaCosts = null;
|
ManaCosts manaCosts = null;
|
||||||
if (card.getCardType().contains(CardType.CREATURE)) {
|
if (card.getCardType().contains(CardType.CREATURE)) {
|
||||||
manaCosts = card.getSpellAbility().getManaCosts();
|
manaCosts = card.getSpellAbility().getManaCosts();
|
||||||
|
@ -93,7 +92,7 @@ public class ManifestTargetPlayerEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter() +1, game);
|
||||||
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource);
|
||||||
targetPlayer.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId());
|
targetPlayer.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId(), false, true);
|
||||||
Permanent permanent = game.getPermanent(card.getId());
|
Permanent permanent = game.getPermanent(card.getId());
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
permanent.setManifested(true);
|
permanent.setManifested(true);
|
||||||
|
|
|
@ -130,10 +130,10 @@ class HideawayExileEffect extends OneShotEffect {
|
||||||
Card card = cards.get(target1.getFirstTarget(), game);
|
Card card = cards.get(target1.getFirstTarget(), game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
cards.remove(card);
|
cards.remove(card);
|
||||||
card.setFaceDown(true);
|
|
||||||
card.moveToExile(CardUtil.getCardExileZoneId(game, source),
|
card.moveToExile(CardUtil.getCardExileZoneId(game, source),
|
||||||
new StringBuilder("Hideaway (").append(hideawaySource.getName()).append(")").toString(),
|
new StringBuilder("Hideaway (").append(hideawaySource.getName()).append(")").toString(),
|
||||||
source.getSourceId(), game);
|
source.getSourceId(), game);
|
||||||
|
card.setFaceDown(true, game);
|
||||||
}
|
}
|
||||||
target1.clearChosen();
|
target1.clearChosen();
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,6 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost
|
||||||
super(Zone.HAND, null);
|
super(Zone.HAND, null);
|
||||||
this.morphCosts = morphCosts;
|
this.morphCosts = morphCosts;
|
||||||
this.megamorph = megamorph;
|
this.megamorph = megamorph;
|
||||||
card.setMorphCard(true);
|
|
||||||
this.setWorksFaceDown(true);
|
this.setWorksFaceDown(true);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
if (megamorph) {
|
if (megamorph) {
|
||||||
|
@ -203,7 +202,7 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost
|
||||||
Spell spell = game.getStack().getSpell(ability.getId());
|
Spell spell = game.getStack().getSpell(ability.getId());
|
||||||
if (player != null && spell != null) {
|
if (player != null && spell != null) {
|
||||||
this.resetMorph();
|
this.resetMorph();
|
||||||
spell.setFaceDown(true); // so only the back is visible
|
spell.setFaceDown(true, game); // so only the back is visible
|
||||||
if (alternateCosts.canPay(ability, sourceId, controllerId, game)) {
|
if (alternateCosts.canPay(ability, sourceId, controllerId, game)) {
|
||||||
if (player.chooseUse(Outcome.Benefit, new StringBuilder("Cast this card as a 2/2 face-down creature for ").append(getCosts().getText()).append(" ?").toString(), game)) {
|
if (player.chooseUse(Outcome.Benefit, new StringBuilder("Cast this card as a 2/2 face-down creature for ").append(getCosts().getText()).append(" ?").toString(), game)) {
|
||||||
activateMorph(game);
|
activateMorph(game);
|
||||||
|
@ -226,7 +225,7 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost
|
||||||
spellColor.setWhite(false);
|
spellColor.setWhite(false);
|
||||||
spellColor.setBlue(false);
|
spellColor.setBlue(false);
|
||||||
} else {
|
} else {
|
||||||
spell.setFaceDown(false);
|
spell.setFaceDown(false, game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,8 +54,8 @@ public interface Card extends MageObject {
|
||||||
List<String> getRules(Game game); // gets card rules + in game modifications
|
List<String> getRules(Game game); // gets card rules + in game modifications
|
||||||
String getExpansionSetCode();
|
String getExpansionSetCode();
|
||||||
String getTokenSetCode();
|
String getTokenSetCode();
|
||||||
void setFaceDown(boolean value);
|
void setFaceDown(boolean value, Game game);
|
||||||
boolean isFaceDown();
|
boolean isFaceDown(Game game);
|
||||||
boolean turnFaceUp(Game game, UUID playerId);
|
boolean turnFaceUp(Game game, UUID playerId);
|
||||||
boolean turnFaceDown(Game game, UUID playerId);
|
boolean turnFaceDown(Game game, UUID playerId);
|
||||||
boolean isFlipCard();
|
boolean isFlipCard();
|
||||||
|
@ -106,12 +106,12 @@ public interface Card extends MageObject {
|
||||||
boolean cast(Game game, Zone fromZone, SpellAbility ability, UUID controllerId);
|
boolean cast(Game game, Zone fromZone, SpellAbility ability, UUID controllerId);
|
||||||
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId);
|
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId);
|
||||||
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped);
|
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped);
|
||||||
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, ArrayList<UUID> appliedEffects);
|
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown);
|
||||||
|
boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList<UUID> appliedEffects);
|
||||||
List<Mana> getMana();
|
List<Mana> getMana();
|
||||||
|
|
||||||
void build();
|
void build();
|
||||||
|
|
||||||
void setUsesVariousArt(boolean usesVariousArt);
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return true if there exists various art images for this card
|
* @return true if there exists various art images for this card
|
||||||
|
@ -127,9 +127,6 @@ public interface Card extends MageObject {
|
||||||
void removeCounters(String name, int amount, Game game);
|
void removeCounters(String name, int amount, Game game);
|
||||||
void removeCounters(Counter counter, Game game);
|
void removeCounters(Counter counter, Game game);
|
||||||
|
|
||||||
void setMorphCard(boolean morphCard);
|
|
||||||
boolean isMorphCard();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Card copy();
|
Card copy();
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ import mage.Mana;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.PlayLandAbility;
|
import mage.abilities.PlayLandAbility;
|
||||||
import mage.abilities.SpellAbility;
|
import mage.abilities.SpellAbility;
|
||||||
|
import mage.abilities.keyword.MorphAbility;
|
||||||
import mage.abilities.mana.ManaAbility;
|
import mage.abilities.mana.ManaAbility;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ColoredManaSymbol;
|
import mage.constants.ColoredManaSymbol;
|
||||||
|
@ -78,7 +79,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
protected String expansionSetCode;
|
protected String expansionSetCode;
|
||||||
protected String tokenSetCode;
|
protected String tokenSetCode;
|
||||||
protected Rarity rarity;
|
protected Rarity rarity;
|
||||||
protected boolean faceDown;
|
|
||||||
protected boolean canTransform;
|
protected boolean canTransform;
|
||||||
protected Card secondSideCard;
|
protected Card secondSideCard;
|
||||||
protected boolean nightCard;
|
protected boolean nightCard;
|
||||||
|
@ -143,7 +143,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
cardNumber = card.cardNumber;
|
cardNumber = card.cardNumber;
|
||||||
expansionSetCode = card.expansionSetCode;
|
expansionSetCode = card.expansionSetCode;
|
||||||
rarity = card.rarity;
|
rarity = card.rarity;
|
||||||
faceDown = card.faceDown;
|
|
||||||
|
|
||||||
canTransform = card.canTransform;
|
canTransform = card.canTransform;
|
||||||
if (canTransform) {
|
if (canTransform) {
|
||||||
|
@ -155,7 +154,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
flipCardName = card.flipCardName;
|
flipCardName = card.flipCardName;
|
||||||
splitCard = card.splitCard;
|
splitCard = card.splitCard;
|
||||||
usesVariousArt = card.usesVariousArt;
|
usesVariousArt = card.usesVariousArt;
|
||||||
morphCard = card.isMorphCard();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -341,10 +339,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
game.rememberLKI(objectId, event.getFromZone(), this);
|
game.rememberLKI(objectId, event.getFromZone(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFaceDown() && !event.getToZone().equals(Zone.BATTLEFIELD)) { // to battlefield is possible because of Morph
|
setFaceDown(false, game);
|
||||||
setFaceDown(false);
|
|
||||||
game.getCard(this.getId()).setFaceDown(false);
|
|
||||||
}
|
|
||||||
updateZoneChangeCounter();
|
updateZoneChangeCounter();
|
||||||
switch (event.getToZone()) {
|
switch (event.getToZone()) {
|
||||||
case GRAVEYARD:
|
case GRAVEYARD:
|
||||||
|
@ -477,6 +472,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
} else {
|
} else {
|
||||||
game.getExile().createZone(exileId, name).add(this);
|
game.getExile().createZone(exileId, name).add(this);
|
||||||
}
|
}
|
||||||
|
setFaceDown(false, game);
|
||||||
updateZoneChangeCounter();
|
updateZoneChangeCounter();
|
||||||
game.setZone(objectId, event.getToZone());
|
game.setZone(objectId, event.getToZone());
|
||||||
game.addSimultaneousEvent(event);
|
game.addSimultaneousEvent(event);
|
||||||
|
@ -487,17 +483,21 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId) {
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId) {
|
||||||
return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, false);
|
return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, false, false, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped){
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped){
|
||||||
return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, tapped, null);
|
return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, tapped, false, null);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, ArrayList<UUID> appliedEffects){
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown){
|
||||||
|
return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, tapped, facedown, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList<UUID> appliedEffects){
|
||||||
ZoneChangeEvent event = new ZoneChangeEvent(this.objectId, sourceId, controllerId, fromZone, Zone.BATTLEFIELD, appliedEffects, tapped);
|
ZoneChangeEvent event = new ZoneChangeEvent(this.objectId, sourceId, controllerId, fromZone, Zone.BATTLEFIELD, appliedEffects, tapped);
|
||||||
if (!game.replaceEvent(event)) {
|
if (!game.replaceEvent(event)) {
|
||||||
if (fromZone != null) {
|
if (fromZone != null) {
|
||||||
|
@ -514,10 +514,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
break;
|
break;
|
||||||
case EXILED:
|
case EXILED:
|
||||||
game.getExile().removeCard(this, game);
|
game.getExile().removeCard(this, game);
|
||||||
if (isFaceDown()) {
|
|
||||||
// 110.6b Permanents enter the battlefield untapped, unflipped, face up, and phased in unless a spell or ability says otherwise.
|
|
||||||
this.setFaceDown(false);
|
|
||||||
}
|
|
||||||
removed = true;
|
removed = true;
|
||||||
break;
|
break;
|
||||||
case COMMAND:
|
case COMMAND:
|
||||||
|
@ -543,6 +539,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
setZone(Zone.BATTLEFIELD, game);
|
setZone(Zone.BATTLEFIELD, game);
|
||||||
game.setScopeRelevant(true);
|
game.setScopeRelevant(true);
|
||||||
permanent.setTapped(tapped);
|
permanent.setTapped(tapped);
|
||||||
|
permanent.setFaceDown(facedown, game);
|
||||||
permanent.entersBattlefield(sourceId, game, event.getFromZone(), true);
|
permanent.entersBattlefield(sourceId, game, event.getFromZone(), true);
|
||||||
game.setScopeRelevant(false);
|
game.setScopeRelevant(false);
|
||||||
game.applyEffects();
|
game.applyEffects();
|
||||||
|
@ -553,21 +550,20 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFaceDown(boolean value) {
|
public void setFaceDown(boolean value, Game game) {
|
||||||
faceDown = value;
|
game.getState().getCardState(objectId).setFaceDown(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFaceDown() {
|
public boolean isFaceDown(Game game) {
|
||||||
return faceDown;
|
return game.getState().getCardState(objectId).isFaceDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean turnFaceUp(Game game, UUID playerId) {
|
public boolean turnFaceUp(Game game, UUID playerId) {
|
||||||
GameEvent event = GameEvent.getEvent(GameEvent.EventType.TURNFACEUP, getId(), playerId);
|
GameEvent event = GameEvent.getEvent(GameEvent.EventType.TURNFACEUP, getId(), playerId);
|
||||||
if (!game.replaceEvent(event)) {
|
if (!game.replaceEvent(event)) {
|
||||||
setFaceDown(false);
|
setFaceDown(false, game);
|
||||||
game.getCard(objectId).setFaceDown(false); // Another instance?
|
|
||||||
for (Ability ability :abilities) { // abilities that were set to not visible face down must be set to visible again
|
for (Ability ability :abilities) { // abilities that were set to not visible face down must be set to visible again
|
||||||
if (ability.getWorksFaceDown() && !ability.getRuleVisible()) {
|
if (ability.getWorksFaceDown() && !ability.getRuleVisible()) {
|
||||||
ability.setRuleVisible(true);
|
ability.setRuleVisible(true);
|
||||||
|
@ -583,8 +579,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
public boolean turnFaceDown(Game game, UUID playerId) {
|
public boolean turnFaceDown(Game game, UUID playerId) {
|
||||||
GameEvent event = GameEvent.getEvent(GameEvent.EventType.TURNFACEDOWN, getId(), playerId);
|
GameEvent event = GameEvent.getEvent(GameEvent.EventType.TURNFACEDOWN, getId(), playerId);
|
||||||
if (!game.replaceEvent(event)) {
|
if (!game.replaceEvent(event)) {
|
||||||
setFaceDown(true);
|
setFaceDown(true, game);
|
||||||
game.getCard(objectId).setFaceDown(true); // Another instance?
|
|
||||||
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TURNEDFACEDOWN, getId(), playerId));
|
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TURNEDFACEDOWN, getId(), playerId));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -638,11 +633,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
@Override
|
@Override
|
||||||
public void build() {}
|
public void build() {}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUsesVariousArt(boolean usesVariousArt) {
|
|
||||||
this.usesVariousArt = usesVariousArt;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getUsesVariousArt() {
|
public boolean getUsesVariousArt() {
|
||||||
return usesVariousArt;
|
return usesVariousArt;
|
||||||
|
@ -713,21 +703,11 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
|
||||||
removeCounters(counter.getName(), counter.getCount(), game);
|
removeCounters(counter.getName(), counter.getCount(), game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMorphCard(boolean morphCard) {
|
|
||||||
this.morphCard = morphCard;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isMorphCard() {
|
|
||||||
return morphCard;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogName() {
|
public String getLogName() {
|
||||||
if (this.isFaceDown()) {
|
// if (this.isFaceDown()) {
|
||||||
return "facedown card";
|
// return "facedown card";
|
||||||
}
|
// }
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ public class FaceDownPredicate implements Predicate<Card> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Card input, Game game) {
|
public boolean apply(Card input, Game game) {
|
||||||
return input.isFaceDown();
|
return input.isFaceDown(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -9,6 +9,7 @@ import mage.counters.Counters;
|
||||||
*/
|
*/
|
||||||
public class CardState {
|
public class CardState {
|
||||||
|
|
||||||
|
protected boolean faceDown;
|
||||||
protected Map<String, String> info;
|
protected Map<String, String> info;
|
||||||
protected Counters counters;
|
protected Counters counters;
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ public class CardState {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CardState(final CardState state) {
|
public CardState(final CardState state) {
|
||||||
|
this.faceDown = state.faceDown;
|
||||||
if (state.info != null) {
|
if (state.info != null) {
|
||||||
info = new HashMap<>();
|
info = new HashMap<>();
|
||||||
info.putAll(state.info);
|
info.putAll(state.info);
|
||||||
|
@ -30,6 +32,14 @@ public class CardState {
|
||||||
return new CardState(this);
|
return new CardState(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFaceDown(boolean value) {
|
||||||
|
faceDown = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFaceDown() {
|
||||||
|
return faceDown;
|
||||||
|
}
|
||||||
|
|
||||||
public Counters getCounters() {
|
public Counters getCounters() {
|
||||||
return counters;
|
return counters;
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,8 +127,8 @@ public abstract class GameCommanderImpl extends GameImpl {
|
||||||
if(!mulliganedCards.containsKey(playerId)){
|
if(!mulliganedCards.containsKey(playerId)){
|
||||||
mulliganedCards.put(playerId, new CardsImpl());
|
mulliganedCards.put(playerId, new CardsImpl());
|
||||||
}
|
}
|
||||||
card.setFaceDown(true);
|
|
||||||
card.moveToExile(null, "", null, this);
|
card.moveToExile(null, "", null, this);
|
||||||
|
card.setFaceDown(true, this);
|
||||||
mulliganedCards.get(playerId).add(card);
|
mulliganedCards.get(playerId).add(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,8 +165,8 @@ public abstract class GameCommanderImpl extends GameImpl {
|
||||||
if(player != null && mulliganedCards.containsKey(playerId)){
|
if(player != null && mulliganedCards.containsKey(playerId)){
|
||||||
for(Card card : mulliganedCards.get(playerId).getCards(this)){
|
for(Card card : mulliganedCards.get(playerId).getCards(this)){
|
||||||
if(card != null){
|
if(card != null){
|
||||||
card.setFaceDown(false);
|
|
||||||
card.moveToZone(Zone.LIBRARY, null, this, false);
|
card.moveToZone(Zone.LIBRARY, null, this, false);
|
||||||
|
card.setFaceDown(false, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(mulliganedCards.get(playerId).size() > 0){
|
if(mulliganedCards.get(playerId).size() > 0){
|
||||||
|
|
|
@ -277,7 +277,6 @@ public abstract class GameImpl implements Game, Serializable {
|
||||||
card = ((PermanentCard)card).getCard();
|
card = ((PermanentCard)card).getCard();
|
||||||
}
|
}
|
||||||
card.setOwnerId(ownerId);
|
card.setOwnerId(ownerId);
|
||||||
card.setFaceDown(false); // can be set face down from previous game
|
|
||||||
gameCards.put(card.getId(), card);
|
gameCards.put(card.getId(), card);
|
||||||
state.addCard(card);
|
state.addCard(card);
|
||||||
if (card.isSplitCard()) {
|
if (card.isSplitCard()) {
|
||||||
|
|
|
@ -88,7 +88,16 @@ public class PermanentCard extends PermanentImpl {
|
||||||
protected void copyFromCard(Card card) {
|
protected void copyFromCard(Card card) {
|
||||||
this.name = card.getName();
|
this.name = card.getName();
|
||||||
this.abilities.clear();
|
this.abilities.clear();
|
||||||
this.abilities.addAll(card.getAbilities().copy());
|
if (this.faceDown) {
|
||||||
|
for (Ability ability: card.getAbilities()) {
|
||||||
|
if (ability.getWorksFaceDown()) {
|
||||||
|
this.abilities.add(ability.copy());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.abilities = card.getAbilities().copy();
|
||||||
|
}
|
||||||
this.abilities.setControllerId(this.controllerId);
|
this.abilities.setControllerId(this.controllerId);
|
||||||
this.cardType.clear();
|
this.cardType.clear();
|
||||||
this.cardType.addAll(card.getCardType());
|
this.cardType.addAll(card.getCardType());
|
||||||
|
@ -116,8 +125,6 @@ public class PermanentCard extends PermanentImpl {
|
||||||
}
|
}
|
||||||
this.flipCard = card.isFlipCard();
|
this.flipCard = card.isFlipCard();
|
||||||
this.flipCardName = card.getFlipCardName();
|
this.flipCardName = card.getFlipCardName();
|
||||||
this.faceDown = card.isFaceDown();
|
|
||||||
this.morphCard = card.isMorphCard();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Card getCard() {
|
public Card getCard() {
|
||||||
|
@ -134,12 +141,6 @@ public class PermanentCard extends PermanentImpl {
|
||||||
Player controller = game.getPlayer(controllerId);
|
Player controller = game.getPlayer(controllerId);
|
||||||
if (controller != null && controller.removeFromBattlefield(this, game)) {
|
if (controller != null && controller.removeFromBattlefield(this, game)) {
|
||||||
Card originalCard = game.getCard(this.getId());
|
Card originalCard = game.getCard(this.getId());
|
||||||
if (isFaceDown()) {
|
|
||||||
setFaceDown(false);
|
|
||||||
if (originalCard != null) {
|
|
||||||
originalCard.setFaceDown(false); //TODO: Do this in a better way
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, controllerId, fromZone, toZone, appliedEffects);
|
ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, controllerId, fromZone, toZone, appliedEffects);
|
||||||
if (!game.replaceEvent(event)) {
|
if (!game.replaceEvent(event)) {
|
||||||
Player owner = game.getPlayer(ownerId);
|
Player owner = game.getPlayer(ownerId);
|
||||||
|
@ -190,10 +191,6 @@ public class PermanentCard extends PermanentImpl {
|
||||||
@Override
|
@Override
|
||||||
public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList<UUID> appliedEffects) {
|
public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList<UUID> appliedEffects) {
|
||||||
Zone fromZone = game.getState().getZone(objectId);
|
Zone fromZone = game.getState().getZone(objectId);
|
||||||
if (isFaceDown() && fromZone.equals(Zone.BATTLEFIELD) && (isMorphed() || isManifested())) {
|
|
||||||
setFaceDown(false);
|
|
||||||
game.getCard(this.getId()).setFaceDown(false); //TODO: Do this in a better way
|
|
||||||
}
|
|
||||||
Player controller = game.getPlayer(controllerId);
|
Player controller = game.getPlayer(controllerId);
|
||||||
if (controller != null && controller.removeFromBattlefield(this, game)) {
|
if (controller != null && controller.removeFromBattlefield(this, game)) {
|
||||||
ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, ownerId, fromZone, Zone.EXILED, appliedEffects);
|
ZoneChangeEvent event = new ZoneChangeEvent(this, sourceId, ownerId, fromZone, Zone.EXILED, appliedEffects);
|
||||||
|
@ -228,16 +225,6 @@ public class PermanentCard extends PermanentImpl {
|
||||||
if (super.turnFaceUp(game, playerId)) {
|
if (super.turnFaceUp(game, playerId)) {
|
||||||
setManifested(false);
|
setManifested(false);
|
||||||
setMorphed(false);
|
setMorphed(false);
|
||||||
card.setFaceDown(false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean turnFaceDown(Game game, UUID playerId) {
|
|
||||||
if (super.turnFaceDown(game, playerId)) {
|
|
||||||
card.setFaceDown(true);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -258,17 +245,9 @@ public class PermanentCard extends PermanentImpl {
|
||||||
card.adjustChoices(ability, game);
|
card.adjustChoices(ability, game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFaceDown(boolean value) {
|
|
||||||
super.setFaceDown(value);
|
|
||||||
if (card != null) {
|
|
||||||
card.setFaceDown(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ManaCosts<ManaCost> getManaCost() {
|
public ManaCosts<ManaCost> getManaCost() {
|
||||||
if (isFaceDown()) { // face down permanent has always {0} mana costs
|
if (faceDown) { // face down permanent has always {0} mana costs
|
||||||
manaCost.clear();
|
manaCost.clear();
|
||||||
return manaCost;
|
return manaCost;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
||||||
protected boolean controlledFromStartOfControllerTurn;
|
protected boolean controlledFromStartOfControllerTurn;
|
||||||
protected int turnsOnBattlefield;
|
protected int turnsOnBattlefield;
|
||||||
protected boolean phasedIn = true;
|
protected boolean phasedIn = true;
|
||||||
|
protected boolean faceDown;
|
||||||
protected boolean attacking;
|
protected boolean attacking;
|
||||||
protected int blocking;
|
protected int blocking;
|
||||||
// number of creatures the permanent can block
|
// number of creatures the permanent can block
|
||||||
|
@ -139,6 +140,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
||||||
this.controlledFromStartOfControllerTurn = permanent.controlledFromStartOfControllerTurn;
|
this.controlledFromStartOfControllerTurn = permanent.controlledFromStartOfControllerTurn;
|
||||||
this.turnsOnBattlefield = permanent.turnsOnBattlefield;
|
this.turnsOnBattlefield = permanent.turnsOnBattlefield;
|
||||||
this.phasedIn = permanent.phasedIn;
|
this.phasedIn = permanent.phasedIn;
|
||||||
|
this.faceDown = permanent.faceDown;
|
||||||
this.attacking = permanent.attacking;
|
this.attacking = permanent.attacking;
|
||||||
this.blocking = permanent.blocking;
|
this.blocking = permanent.blocking;
|
||||||
this.maxBlocks = permanent.maxBlocks;
|
this.maxBlocks = permanent.maxBlocks;
|
||||||
|
@ -431,6 +433,16 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFaceDown(boolean value, Game game) {
|
||||||
|
this.faceDown = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFaceDown(Game game) {
|
||||||
|
return faceDown;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFlipped() {
|
public boolean isFlipped() {
|
||||||
return flipped;
|
return flipped;
|
||||||
|
@ -838,7 +850,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
||||||
@Override
|
@Override
|
||||||
public void entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent) {
|
public void entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent) {
|
||||||
controlledFromStartOfControllerTurn = false;
|
controlledFromStartOfControllerTurn = false;
|
||||||
if (this.isFaceDown()) {
|
if (this.isFaceDown(game)) {
|
||||||
// remove some attributes here, bceause first apply effects comes later otherwise abilities (e.g. color related) will unintended trigger
|
// remove some attributes here, bceause first apply effects comes later otherwise abilities (e.g. color related) will unintended trigger
|
||||||
MorphAbility.setPermanentToFaceDownCreature(this);
|
MorphAbility.setPermanentToFaceDownCreature(this);
|
||||||
}
|
}
|
||||||
|
@ -1226,7 +1238,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
||||||
@Override
|
@Override
|
||||||
public String getLogName() {
|
public String getLogName() {
|
||||||
if (name.isEmpty()) {
|
if (name.isEmpty()) {
|
||||||
if (isFaceDown()) {
|
if (faceDown) {
|
||||||
return "face down creature";
|
return "face down creature";
|
||||||
} else {
|
} else {
|
||||||
return "a creature without name";
|
return "a creature without name";
|
||||||
|
|
|
@ -267,10 +267,7 @@ public class Spell implements StackObject, Card {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
updateOptionalCosts(0);
|
updateOptionalCosts(0);
|
||||||
if (isFaceDown()) {
|
result = card.putOntoBattlefield(game, fromZone, ability.getSourceId(), controllerId, false, faceDown);
|
||||||
card.setFaceDown(true);
|
|
||||||
}
|
|
||||||
result = card.putOntoBattlefield(game, fromZone, ability.getSourceId(), controllerId);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -628,7 +625,7 @@ public class Spell implements StackObject, Card {
|
||||||
@Override
|
@Override
|
||||||
public int getConvertedManaCost() {
|
public int getConvertedManaCost() {
|
||||||
int cmc = 0;
|
int cmc = 0;
|
||||||
if (this.isMorphCard() && this.isFaceDown()) {
|
if (faceDown) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (Ability spellAbility: spellAbilities) {
|
for (Ability spellAbility: spellAbilities) {
|
||||||
|
@ -717,24 +714,24 @@ public class Spell implements StackObject, Card {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFaceDown(boolean value) {
|
public void setFaceDown(boolean value, Game game) {
|
||||||
faceDown = value;
|
faceDown = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean turnFaceUp(Game game, UUID playerId) {
|
public boolean turnFaceUp(Game game, UUID playerId) {
|
||||||
setFaceDown(false);
|
setFaceDown(false, game);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean turnFaceDown(Game game, UUID playerId) {
|
public boolean turnFaceDown(Game game, UUID playerId) {
|
||||||
setFaceDown(true);
|
setFaceDown(true, game);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFaceDown() {
|
public boolean isFaceDown(Game game) {
|
||||||
return faceDown;
|
return faceDown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -855,7 +852,12 @@ public class Spell implements StackObject, Card {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, ArrayList<UUID> appliedEffects) {
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown) {
|
||||||
|
throw new UnsupportedOperationException("Not supported yet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList<UUID> appliedEffects) {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
throw new UnsupportedOperationException("Not supported yet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -869,11 +871,6 @@ public class Spell implements StackObject, Card {
|
||||||
return card.getUsesVariousArt();
|
return card.getUsesVariousArt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUsesVariousArt(boolean usesVariousArt) {
|
|
||||||
card.setUsesVariousArt(usesVariousArt);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Mana> getMana() {
|
public List<Mana> getMana() {
|
||||||
return card.getMana();
|
return card.getMana();
|
||||||
|
@ -973,16 +970,6 @@ public class Spell implements StackObject, Card {
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMorphCard(boolean morphCard) {
|
|
||||||
throw new UnsupportedOperationException("Not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isMorphCard() {
|
|
||||||
return card.isMorphCard();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Card getMainCard() {
|
public Card getMainCard() {
|
||||||
return card.getMainCard();
|
return card.getMainCard();
|
||||||
|
|
|
@ -499,6 +499,19 @@ public interface Player extends MageItem, Copyable<Player> {
|
||||||
*/
|
*/
|
||||||
boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped);
|
boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses putOntoBattlefield and posts also a info message about in the game log
|
||||||
|
*
|
||||||
|
* @param card
|
||||||
|
* @param game
|
||||||
|
* @param fromZone
|
||||||
|
* @param sourceId
|
||||||
|
* @param tapped the card enters the battlefield tapped
|
||||||
|
* @param facedown the card enters the battlefield facedown
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped, boolean facedown);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the playerToCheckId is from an opponent in range
|
* Checks if the playerToCheckId is from an opponent in range
|
||||||
*
|
*
|
||||||
|
|
|
@ -2835,13 +2835,18 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId) {
|
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId) {
|
||||||
return this.putOntoBattlefieldWithInfo(card, game, fromZone, sourceId, false);
|
return this.putOntoBattlefieldWithInfo(card, game, fromZone, sourceId, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped) {
|
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped) {
|
||||||
|
return this.putOntoBattlefieldWithInfo(card, game, fromZone, sourceId, tapped, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped, boolean facedown) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
if (card.putOntoBattlefield(game, fromZone, sourceId, this.getId(), tapped)) {
|
if (card.putOntoBattlefield(game, fromZone, sourceId, this.getId(), tapped, facedown)) {
|
||||||
game.informPlayers(new StringBuilder(this.getName())
|
game.informPlayers(new StringBuilder(this.getName())
|
||||||
.append(" puts ").append(card.getLogName())
|
.append(" puts ").append(card.getLogName())
|
||||||
.append(" from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" ")
|
.append(" from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" ")
|
||||||
|
|
|
@ -25673,7 +25673,7 @@ Arashin Foremost|Dragons of Tarkir|3|R|{1}{W}{W}|Creature - Human Warrior|2|2|Do
|
||||||
Artful Maneuver|Dragons of Tarkir|4|C|{1}{W}|Instant|||Target creature gets +2/+2 until end of turn.$Rebound <i>(If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.)</i>|
|
Artful Maneuver|Dragons of Tarkir|4|C|{1}{W}|Instant|||Target creature gets +2/+2 until end of turn.$Rebound <i>(If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.)</i>|
|
||||||
Aven Sunstriker|Dragons of Tarkir|5|U|{1}{W}{W}|Creature - Bird Warrior|1|1|Flying$Double strike <i>(This creature deals both first-strike and regular combat damage.)</i>$Megamorph {4}{W} <i>(You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)</i>|
|
Aven Sunstriker|Dragons of Tarkir|5|U|{1}{W}{W}|Creature - Bird Warrior|1|1|Flying$Double strike <i>(This creature deals both first-strike and regular combat damage.)</i>$Megamorph {4}{W} <i>(You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)</i>|
|
||||||
Hidden Dragonslayer|Dragons of Tarkir|23|R|{1}{W}|Creature - Human Warrior|2|1|Lifelink$Megamorph {2}{W} <i>(You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)</i>$When Hidden Dragonslayer is turned face up, destroy target creature with power 4 or greater an opponent controls.|
|
Hidden Dragonslayer|Dragons of Tarkir|23|R|{1}{W}|Creature - Human Warrior|2|1|Lifelink$Megamorph {2}{W} <i>(You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)</i>$When Hidden Dragonslayer is turned face up, destroy target creature with power 4 or greater an opponent controls.|
|
||||||
Myth Realize|Dragons of Tarkir|26|R|Enchantment|||Whenever you cast a noncreature spell, put a lore counter on Myth Realized.${2}{W}: Put a lore counter on Myth Realized.${W}: Until end of turn, Myth Realized becomes a Monk Avatar creature in addition to its other types and gains "This creature's power and toughness are each equal to the number of lore counters on it."|
|
Myth Realized|Dragons of Tarkir|26|R|Enchantment|||Whenever you cast a noncreature spell, put a lore counter on Myth Realized.${2}{W}: Put a lore counter on Myth Realized.${W}: Until end of turn, Myth Realized becomes a Monk Avatar creature in addition to its other types and gains "This creature's power and toughness are each equal to the number of lore counters on it."|
|
||||||
Ojutai Exemplars|Dragons of Tarkir|27|M|{2}{W}{W}|Creature - Human Monk|4|4|Whenever you cast a noncreature spell, choose one - Tap target creature; Ojutai Exemplars gain first strike and lifelink until end of turn; or Exile Ojutai Exemplars, then return it to the battlefield tapped under its owner's control.|
|
Ojutai Exemplars|Dragons of Tarkir|27|M|{2}{W}{W}|Creature - Human Monk|4|4|Whenever you cast a noncreature spell, choose one - Tap target creature; Ojutai Exemplars gain first strike and lifelink until end of turn; or Exile Ojutai Exemplars, then return it to the battlefield tapped under its owner's control.|
|
||||||
Orator of Ojutai|Dragons of Tarkir|29|U|{1}{W}|Creature - Bird Monk|0|4|Defneder, flying$As an additional cost to cast Orator of Ojutai, you may reveal a Dragon card from your hand.$When Orator of Ojutai enters the battlefield, if you revealed a Dragon card or controlled a Dragon as you cast Orator of Ojutai, draw a card.|
|
Orator of Ojutai|Dragons of Tarkir|29|U|{1}{W}|Creature - Bird Monk|0|4|Defneder, flying$As an additional cost to cast Orator of Ojutai, you may reveal a Dragon card from your hand.$When Orator of Ojutai enters the battlefield, if you revealed a Dragon card or controlled a Dragon as you cast Orator of Ojutai, draw a card.|
|
||||||
Profound Journey|Dragons of Tarkir|30|R|{5}{W}{W}|Sorcery|||Return target permanent card from your graveyard to the battlefield.$Rebound <i>(If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.)</i>|
|
Profound Journey|Dragons of Tarkir|30|R|{5}{W}{W}|Sorcery|||Return target permanent card from your graveyard to the battlefield.$Rebound <i>(If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.)</i>|
|
||||||
|
|
Loading…
Reference in a new issue