From eea55c2f76ad8202576b146cf45666df1e5a0ad6 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 21 Apr 2019 04:42:23 +0400 Subject: [PATCH] Fixed Tomik, Distinguished Advokist that it cause wrong class cast error with lands; --- .../src/mage/cards/t/TaigamOjutaiMaster.java | 8 ++-- .../cards/t/TomikDistinguishedAdvokist.java | 38 +++++++++++++++---- .../java/mage/target/TargetStackObject.java | 12 +++--- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TaigamOjutaiMaster.java b/Mage.Sets/src/mage/cards/t/TaigamOjutaiMaster.java index 2ea1bd128ee..24ac35adcd0 100644 --- a/Mage.Sets/src/mage/cards/t/TaigamOjutaiMaster.java +++ b/Mage.Sets/src/mage/cards/t/TaigamOjutaiMaster.java @@ -1,4 +1,3 @@ - package mage.cards.t; import mage.MageInt; @@ -16,7 +15,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterSpell; -import mage.filter.FilterStackObject; +import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -30,7 +29,6 @@ import mage.watchers.common.AttackedThisTurnWatcher; import java.util.UUID; /** - * * @author spjspj */ public final class TaigamOjutaiMaster extends CardImpl { @@ -57,8 +55,8 @@ public final class TaigamOjutaiMaster extends CardImpl { this.toughness = new MageInt(4); // Instant, sorcery, and Dragon spells you control can't be countered. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeCounteredControlledEffect(filter, new FilterStackObject(), Duration.WhileOnBattlefield))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeCounteredControlledEffect(filter, StaticFilters.FILTER_SPELL_OR_ABILITY, Duration.WhileOnBattlefield))); + // Whenever you cast an instant or sorcery spell from your hand, if Taigam, Ojutai Master attacked this turn, that spell gains rebound. Ability ability = new ConditionalInterveningIfTriggeredAbility(new TaigamOjutaiMasterTriggeredAbility(), AttackedThisTurnSourceCondition.instance, diff --git a/Mage.Sets/src/mage/cards/t/TomikDistinguishedAdvokist.java b/Mage.Sets/src/mage/cards/t/TomikDistinguishedAdvokist.java index 2d59ecbc869..90d1b60e495 100644 --- a/Mage.Sets/src/mage/cards/t/TomikDistinguishedAdvokist.java +++ b/Mage.Sets/src/mage/cards/t/TomikDistinguishedAdvokist.java @@ -1,6 +1,7 @@ package mage.cards.t; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; @@ -13,9 +14,10 @@ import mage.constants.*; import mage.filter.FilterObject; import mage.filter.FilterStackObject; import mage.filter.StaticFilters; -import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.predicate.Predicate; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.players.Player; @@ -26,13 +28,6 @@ import java.util.UUID; */ public final class TomikDistinguishedAdvokist extends CardImpl { - private static final FilterObject filter - = new FilterStackObject(); - - static { - filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - public TomikDistinguishedAdvokist(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}"); @@ -46,6 +41,8 @@ public final class TomikDistinguishedAdvokist extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Lands on the battlefield and land cards in graveyards can't be the targets of spells or abilities your opponents control. + FilterObject filter = new FilterStackObject(); + filter.add(new TargetedByOpponentsPredicate(this.getId())); Ability ability = new SimpleStaticAbility(new CantBeTargetedAllEffect( StaticFilters.FILTER_LANDS, filter, Duration.WhileOnBattlefield ).setText("lands on the battlefield")); @@ -66,6 +63,31 @@ public final class TomikDistinguishedAdvokist extends CardImpl { } } +class TargetedByOpponentsPredicate implements Predicate { + + private final UUID sourceId; + + public TargetedByOpponentsPredicate(UUID sourceId) { + this.sourceId = sourceId; + } + + @Override + public boolean apply(MageObject input, Game game) { + StackObject stackObject = game.getStack().getStackObject(input.getId()); + Permanent source = game.getPermanentOrLKIBattlefield(this.sourceId); + if (stackObject != null && source != null) { + Player controller = game.getPlayer(source.getControllerId()); + return controller != null && game.isOpponent(controller, stackObject.getControllerId()); + } + return false; + } + + @Override + public String toString() { + return "targeted spells or abilities your opponents control"; + } +} + class TomikDistinguishedAdvokistTargetEffect extends ContinuousRuleModifyingEffectImpl { TomikDistinguishedAdvokistTargetEffect() { diff --git a/Mage/src/main/java/mage/target/TargetStackObject.java b/Mage/src/main/java/mage/target/TargetStackObject.java index a9eb6a3b4b7..eeccdc2df7f 100644 --- a/Mage/src/main/java/mage/target/TargetStackObject.java +++ b/Mage/src/main/java/mage/target/TargetStackObject.java @@ -1,10 +1,9 @@ - - package mage.target; -import mage.constants.Zone; import mage.abilities.Ability; +import mage.constants.Zone; import mage.filter.FilterStackObject; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.StackObject; @@ -13,7 +12,6 @@ import java.util.Set; import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public class TargetStackObject extends TargetObject { @@ -21,7 +19,7 @@ public class TargetStackObject extends TargetObject { protected final FilterStackObject filter; public TargetStackObject() { - this(1, 1, new FilterStackObject()); + this(1, 1, StaticFilters.FILTER_SPELL_OR_ABILITY); } public TargetStackObject(FilterStackObject filter) { @@ -59,7 +57,7 @@ public class TargetStackObject extends TargetObject { @Override public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { int count = 0; - for (StackObject stackObject: game.getStack()) { + for (StackObject stackObject : game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) && filter.match(stackObject, sourceId, sourceControllerId, game)) { count++; if (count >= this.minNumberOfTargets) { @@ -78,7 +76,7 @@ public class TargetStackObject extends TargetObject { @Override public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set possibleTargets = new HashSet<>(); - for (StackObject stackObject: game.getStack()) { + for (StackObject stackObject : game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) && filter.match(stackObject, sourceId, sourceControllerId, game)) { possibleTargets.add(stackObject.getId()); }