From 8fa23501eeac32f2c26b3a091bb4774b35327d58 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 27 Feb 2014 16:42:44 +0100 Subject: [PATCH] * Polis Crusher - Fixed that it can't be the target of enchantments. * Polis Crusher - Fixed that the targeted enchantment of it's second ability was chosen too late during resolution. --- .../src/mage/sets/theros/PolisCrusher.java | 76 +++++++++---------- .../ConditionalTriggeredAbility.java | 12 ++- .../continious/GainAbilityTargetEffect.java | 2 +- .../mage/abilities/keyword/BestowAbility.java | 2 +- .../mage/game/permanent/PermanentImpl.java | 16 ++-- 5 files changed, 52 insertions(+), 56 deletions(-) diff --git a/Mage.Sets/src/mage/sets/theros/PolisCrusher.java b/Mage.Sets/src/mage/sets/theros/PolisCrusher.java index b1aeada5372..0e6fc297ba5 100644 --- a/Mage.Sets/src/mage/sets/theros/PolisCrusher.java +++ b/Mage.Sets/src/mage/sets/theros/PolisCrusher.java @@ -33,22 +33,24 @@ import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.condition.common.MonstrousCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.MonstrosityAbility; import mage.abilities.keyword.ProtectionAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; +import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.common.FilterEnchantmentPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; +import mage.target.targetpointer.FirstTargetPointer; /** * @@ -56,6 +58,12 @@ import mage.target.TargetPermanent; */ public class PolisCrusher extends CardImpl { + private static final FilterCard filter = new FilterCard("enchantments"); + + static { + filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); + } + public PolisCrusher(UUID ownerId) { super(ownerId, 198, "Polis Crusher", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{G}"); this.expansionSetCode = "THS"; @@ -69,12 +77,12 @@ public class PolisCrusher extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // protection from enchantments - this.addAbility(new ProtectionAbility(new FilterEnchantmentPermanent())); + this.addAbility(new ProtectionAbility(filter)); // {4}{R}{G}: Monstrosity 3. this.addAbility(new MonstrosityAbility("{4}{R}{G}", 3)); // Whenever Polis Crusher deals combat damage to a player, if Polis Crusher is monstrous, destroy target enchantment that player controls. Ability ability = new ConditionalTriggeredAbility( - new DealsCombatDamageToAPlayerTriggeredAbility(new PolisCrusherDestroyEffect(), false, true), + new DealsCombatDamageToAPlayerTriggeredAbility(new DestroyTargetEffect(), false, true), MonstrousCondition.getInstance(), "Whenever {this} deals combat damage to a player, if {this} is monstrous, destroy target enchantment that player controls."); this.addAbility(ability); @@ -84,45 +92,29 @@ public class PolisCrusher extends CardImpl { super(card); } + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof ConditionalTriggeredAbility) { + for (Effect effect : ability.getEffects()) { + if (effect instanceof DestroyTargetEffect) { + Player attackedPlayer = game.getPlayer(effect.getTargetPointer().getFirst(game, ability)); + if (attackedPlayer != null) { + ability.getTargets().clear(); + FilterPermanent filterEnchantment = new FilterEnchantmentPermanent("enchantment attacked player controls"); + filter.add(new ControllerIdPredicate(attackedPlayer.getId())); + Target target = new TargetPermanent(filterEnchantment); + target.setRequired(true); + ability.addTarget(target); + effect.setTargetPointer(new FirstTargetPointer()); + break; + } + } + } + } + } + @Override public PolisCrusher copy() { return new PolisCrusher(this); } } - -class PolisCrusherDestroyEffect extends OneShotEffect { - - public PolisCrusherDestroyEffect() { - super(Outcome.DestroyPermanent); - this.staticText = "destroy target enchantment that player controls"; - } - - public PolisCrusherDestroyEffect(final PolisCrusherDestroyEffect effect) { - super(effect); - } - - @Override - public PolisCrusherDestroyEffect copy() { - return new PolisCrusherDestroyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player attackedPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && attackedPlayer != null) { - FilterPermanent filter = new FilterEnchantmentPermanent("enchantment attacked player controls"); - filter.add(new ControllerIdPredicate(attackedPlayer.getId())); - Target target = new TargetPermanent(filter); - target.setRequired(true); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) - && controller.chooseTarget(outcome, target, source, game)) { - Permanent enchantment = game.getPermanent(target.getFirstTarget()); - if (enchantment != null) { - return enchantment.destroy(source.getSourceId(), game, false); - } - } - } - return false; - } -} diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index bf91224a045..e5adced28e1 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -3,6 +3,7 @@ package mage.abilities.decorator; import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.condition.Condition; +import mage.abilities.effects.Effects; import mage.game.Game; import mage.game.events.GameEvent; @@ -51,10 +52,7 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl 1){ + if(target.getMaxNumberOfTargets() > 1){ if (target.getNumberOfTargets() < target.getMaxNumberOfTargets()) { sb.append("Up to"); } diff --git a/Mage/src/mage/abilities/keyword/BestowAbility.java b/Mage/src/mage/abilities/keyword/BestowAbility.java index 5b99c92c9c0..9339a6bd9a7 100644 --- a/Mage/src/mage/abilities/keyword/BestowAbility.java +++ b/Mage/src/mage/abilities/keyword/BestowAbility.java @@ -39,12 +39,12 @@ import mage.cards.Card; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Layer; +import static mage.constants.Layer.TypeChangingEffects_4; import mage.constants.Outcome; import mage.constants.SubLayer; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index da96c58ea52..4fa6cd5291b 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -97,8 +97,8 @@ public abstract class PermanentImpl> extends CardImpl protected int maxBlockedBy = 0; protected boolean loyaltyUsed; protected boolean deathtouched; - protected List attachments = new ArrayList(); - protected Map> connectedCards = new HashMap>(); + protected List attachments = new ArrayList<>(); + protected Map> connectedCards = new HashMap<>(); protected List dealtDamageByThisTurn; protected UUID attachedTo; protected UUID pairedCard; @@ -139,9 +139,9 @@ public abstract class PermanentImpl> extends CardImpl this.connectedCards.put(entry.getKey(), entry.getValue()); } if (permanent.dealtDamageByThisTurn != null) { - dealtDamageByThisTurn = new ArrayList(permanent.dealtDamageByThisTurn); + dealtDamageByThisTurn = new ArrayList<>(permanent.dealtDamageByThisTurn); if (permanent.markedDamage != null) { - markedDamage = new ArrayList(); + markedDamage = new ArrayList<>(); for (Counter counter : permanent.markedDamage) { markedDamage.add(counter.copy()); } @@ -552,7 +552,7 @@ public abstract class PermanentImpl> extends CardImpl if (this.connectedCards.containsKey(key)) { this.connectedCards.get(key).add(connectedCard); } else { - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(connectedCard); this.connectedCards.put(key, list); } @@ -643,7 +643,7 @@ public abstract class PermanentImpl> extends CardImpl deathtouched = true; } if (dealtDamageByThisTurn == null) { - dealtDamageByThisTurn = new ArrayList(); + dealtDamageByThisTurn = new ArrayList<>(); } dealtDamageByThisTurn.add(sourceId); } @@ -736,7 +736,7 @@ public abstract class PermanentImpl> extends CardImpl private void markDamage(Counter counter) { if (markedDamage == null) { - markedDamage = new ArrayList(); + markedDamage = new ArrayList<>(); } markedDamage.add(counter); } @@ -1001,7 +1001,7 @@ public abstract class PermanentImpl> extends CardImpl if (connectedCards.containsKey("imprint")) { this.connectedCards.get("imprint").add(imprintedCard); } else { - List imprinted = new ArrayList(); + List imprinted = new ArrayList<>(); imprinted.add(imprintedCard); this.connectedCards.put("imprint", imprinted); }