* Fixed Mid's Dilation bugs (fixes #2077).

This commit is contained in:
LevelX2 2016-07-14 17:14:06 +02:00
parent 4d0cfb332c
commit 4bdc4936f0
3 changed files with 19 additions and 56 deletions

View file

@ -32,15 +32,11 @@ import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.constants.AsThoughEffectType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Rarity; import mage.constants.Rarity;
import mage.constants.Zone; import mage.constants.Zone;
@ -64,8 +60,7 @@ public class MindsDilation extends CardImpl {
// Whenever an opponent casts his or her first spell each turn, that player exiles the top card of his or her library. If it's a nonland card, // Whenever an opponent casts his or her first spell each turn, that player exiles the top card of his or her library. If it's a nonland card,
// you may cast it without paying its mana cost. // you may cast it without paying its mana cost.
Ability ability = new MindsDilationTriggeredAbility(new MindsDilationEffect(), false); this.addAbility(new MindsDilationTriggeredAbility(new MindsDilationEffect(), false), new SpellsCastWatcher());
this.addAbility(ability, new SpellsCastWatcher());
} }
public MindsDilation(final MindsDilation card) { public MindsDilation(final MindsDilation card) {
@ -113,7 +108,7 @@ class MindsDilationTriggeredAbility extends SpellCastOpponentTriggeredAbility {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever an opponent casts his or her first spell each turn, that player exiles the top card of his or her library." return "Whenever an opponent casts his or her first spell each turn, that player exiles the top card of his or her library."
+ " If it's a nonland card, you may cast it without paying its mana cost"; + " If it's a nonland card, you may cast it without paying its mana cost.";
} }
} }
@ -121,7 +116,7 @@ class MindsDilationEffect extends OneShotEffect {
MindsDilationEffect() { MindsDilationEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "that player exiles the top card of his or her library. If it's a nonland card, you may cast it without paying its mana cost."; this.staticText = "that player exiles the top card of his or her library. If it's a nonland card, you may cast it without paying its mana cost";
} }
MindsDilationEffect(final MindsDilationEffect effect) { MindsDilationEffect(final MindsDilationEffect effect) {
@ -140,54 +135,17 @@ class MindsDilationEffect extends OneShotEffect {
Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source)); Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller != null && sourceObject != null && opponent != null) { if (controller != null && sourceObject != null && opponent != null) {
if (opponent.getLibrary().size() > 0) { if (opponent.getLibrary().size() > 0) {
Card card = opponent.getLibrary().removeFromTop(game); Card card = opponent.getLibrary().getFromTop(game);
if (card != null) { if (card != null && opponent.moveCards(card, Zone.EXILED, source, game)) {
opponent.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); if (!card.getCardType().contains(CardType.LAND)) {
ContinuousEffect effect = new MindsDilationCastFromExileEffect(); if (controller.chooseUse(outcome, "Cast " + card.getLogName() + " without paying its mana cost from exile?", source, game)) {
effect.setTargetPointer(new FixedTarget(card.getId()));
game.addEffect(effect, source);
}
}
return true;
}
return false;
}
}
class MindsDilationCastFromExileEffect extends AsThoughEffectImpl {
MindsDilationCastFromExileEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
staticText = "If it's a nonland card, you may cast it without paying its mana cost";
}
MindsDilationCastFromExileEffect(final MindsDilationCastFromExileEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public MindsDilationCastFromExileEffect copy() {
return new MindsDilationCastFromExileEffect(this);
}
@Override
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
UUID targetId = getTargetPointer().getFirst(game, source);
Player controller = game.getPlayer(source.getControllerId());
if (targetId != null && controller != null) {
Card card = game.getCard(targetId);
if (card != null && !card.getCardType().contains(CardType.LAND) && game.getState().getZone(targetId) == Zone.EXILED) {
if (controller.chooseUse(outcome, "Cast " + card.getLogName() + "?", source, game)) {
controller.cast(card.getSpellAbility(), game, true); controller.cast(card.getSpellAbility(), game, true);
} }
return true;
} }
} }
}
return true;
}
return false; return false;
} }
} }

View file

@ -50,8 +50,8 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements
protected Token token; protected Token token;
protected String type; protected String type;
protected boolean losePreviousTypes; protected boolean losePreviousTypes;
protected DynamicValue power; protected DynamicValue power = null;
protected DynamicValue toughness; protected DynamicValue toughness = null;
public BecomesCreatureSourceEffect(Token token, String type, Duration duration) { public BecomesCreatureSourceEffect(Token token, String type, Duration duration) {
this(token, type, duration, false, false); this(token, type, duration, false, false);
@ -77,9 +77,13 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements
this.token = effect.token.copy(); this.token = effect.token.copy();
this.type = effect.type; this.type = effect.type;
this.losePreviousTypes = effect.losePreviousTypes; this.losePreviousTypes = effect.losePreviousTypes;
if (effect.power != null) {
this.power = effect.power.copy(); this.power = effect.power.copy();
}
if (effect.toughness != null) {
this.toughness = effect.toughness.copy(); this.toughness = effect.toughness.copy();
} }
}
@Override @Override
public BecomesCreatureSourceEffect copy() { public BecomesCreatureSourceEffect copy() {

View file

@ -32,6 +32,7 @@ public class SpellsCastWatcher extends Watcher {
public SpellsCastWatcher(final SpellsCastWatcher watcher) { public SpellsCastWatcher(final SpellsCastWatcher watcher) {
super(watcher); super(watcher);
this.spellsCast.putAll(watcher.spellsCast);
} }
@Override @Override