diff --git a/Mage/src/main/java/mage/game/command/planes/AgyremPlane.java b/Mage/src/main/java/mage/game/command/planes/AgyremPlane.java index 6582338512..c18e5d979f 100644 --- a/Mage/src/main/java/mage/game/command/planes/AgyremPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/AgyremPlane.java @@ -179,19 +179,14 @@ class AgyremRestrictionEffect extends RestrictionEffect { @Override public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) { Plane cPlane = game.getState().getCurrentPlane(); - if (cPlane == null) { - return true; + if (cPlane != null && cPlane.getName().equalsIgnoreCase("Plane - Agyrem")) { + return !defenderId.equals(source.getControllerId()); } - if (cPlane != null) { - if (cPlane.getName().equalsIgnoreCase("Plane - Agyrem")) { - return false; - } - } - return !defenderId.equals(source.getControllerId()); + return true; } @Override public AgyremRestrictionEffect copy() { return new AgyremRestrictionEffect(this); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java index f2b6d4ba50..44799fef90 100644 --- a/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/FeedingGroundsPlane.java @@ -29,8 +29,10 @@ package mage.game.command.planes; import java.util.ArrayList; import java.util.List; +import mage.MageObject; import mage.ObjectColor; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MainPhaseStackEmptyCondition; @@ -38,8 +40,12 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.TargetConvertedManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.RollPlanarDieEffect; -import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.Card; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; @@ -47,9 +53,12 @@ import mage.filter.FilterCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; import mage.game.command.Plane; +import mage.game.stack.Spell; import mage.target.Target; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import mage.watchers.common.PlanarRollWatcher; /** @@ -58,15 +67,7 @@ import mage.watchers.common.PlanarRollWatcher; */ public class FeedingGroundsPlane extends Plane { - private static final FilterCard filter = new FilterCard("Red spells or Green spells"); - private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("a creature"); - - static { - filter.add(Predicates.or( - new ColorPredicate(ObjectColor.RED), - new ColorPredicate(ObjectColor.GREEN))); - } - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature"); private static final String rule = "put X +1/+1 counters on target creature, where X is that creature's converted mana cost"; public FeedingGroundsPlane() { @@ -74,13 +75,12 @@ public class FeedingGroundsPlane extends Plane { this.setExpansionSetCodeForImage("PCA"); // Red spells cost {1} less to cast. Green spells cost {1} less to cast - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new SpellsCostReductionControllerEffect(filter, 1)); - + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new FeedingGroundsEffect()); this.getAbilities().add(ability); // Active player can roll the planar die: Whenever you roll {CHAOS}, target red or green creature gets X +1/+1 counters Effect chaosEffect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(), new TargetConvertedManaCost()); - Target chaosTarget = new TargetCreaturePermanent(1, 1, filter2, false); + Target chaosTarget = new TargetCreaturePermanent(1, 1, filter, false); List chaosEffects = new ArrayList(); chaosEffects.add(chaosEffect); @@ -94,3 +94,91 @@ public class FeedingGroundsPlane extends Plane { this.getAbilities().add(new SimpleStaticAbility(Zone.ALL, new PlanarDieRollCostIncreasingEffect(chaosAbility.getOriginalId()))); } } + +class FeedingGroundsEffect extends CostModificationEffectImpl { + + private static final FilterCard filter = new FilterCard("Red spells or Green spells"); + + static { + filter.add(Predicates.or( + new ColorPredicate(ObjectColor.RED), + new ColorPredicate(ObjectColor.GREEN))); + } + + private static final String rule = "Red spells cost {1} less to cast. Green spells cost {1} less to cast."; + private int amount = 1; + + public FeedingGroundsEffect() { + super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST); + this.amount = 1; + this.staticText = rule; + } + + protected FeedingGroundsEffect(FeedingGroundsEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + MageObject object = abilityToModify.getSourceObject(game); + int reduce = 0; + if (object != null) { + if (object.getColor(game).isRed()) { + reduce++; + } + if (object.getColor(game).isGreen()) { + reduce++; + } + } + CardUtil.reduceCost(abilityToModify, reduce); + return true; + } + + /** + * Overwrite this in effect that inherits from this + * + * @param card + * @param source + * @param game + * @return + */ + protected boolean selectedByRuntimeData(Card card, Ability source, Game game) { + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (abilityToModify instanceof SpellAbility) { + Plane cPlane = game.getState().getCurrentPlane(); + if (cPlane == null) { + return false; + } + if (cPlane != null) { + if (!cPlane.getName().equalsIgnoreCase("Plane - Feeding Grounds")) { + return false; + } + } + + Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); + if (spell != null) { + return this.filter.match(spell, game) && selectedByRuntimeData(spell, source, game); + } else { + // used at least for flashback ability because Flashback ability doesn't use stack + Card sourceCard = game.getCard(abilityToModify.getSourceId()); + return sourceCard != null && this.filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); + } + } + return false; + } + + @Override + public FeedingGroundsEffect copy() { + return new FeedingGroundsEffect(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/planes/NayaPlane.java b/Mage/src/main/java/mage/game/command/planes/NayaPlane.java index 934a96d37d..aa2bd8dc49 100644 --- a/Mage/src/main/java/mage/game/command/planes/NayaPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/NayaPlane.java @@ -76,7 +76,7 @@ public class NayaPlane extends Plane { Ability ability = new SimpleStaticAbility(Zone.COMMAND, new PlayAdditionalLandsAllEffect(Integer.MAX_VALUE)); this.getAbilities().add(ability); - // Active player can roll the planar die: Whenever you roll {CHAOS}, target red, green or white creature gets +1/+1 until end of turn for each land you control + // Active player can roll the planar die: Whenever you roll {CHAOS}, target red, green or white creature you control gets +1/+1 until end of turn for each land you control Effect chaosEffect = new BoostTargetEffect(new PermanentsOnBattlefieldCount(filter2), new PermanentsOnBattlefieldCount(filter2), Duration.EndOfTurn); Target chaosTarget = new TargetControlledCreaturePermanent(1, 1, filter, false); diff --git a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java index 08d216244a..852e994d5e 100644 --- a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java @@ -30,6 +30,7 @@ package mage.game.command.planes; import java.util.ArrayList; import java.util.List; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MainPhaseStackEmptyCondition; @@ -37,15 +38,23 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.abilities.effects.common.RollPlanarDieEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.SpellsCostReductionAllEffect; +import mage.cards.Card; import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; import mage.game.command.Plane; +import mage.game.stack.Spell; import mage.target.Target; +import mage.util.CardUtil; import mage.watchers.common.PlanarRollWatcher; /** @@ -54,19 +63,12 @@ import mage.watchers.common.PlanarRollWatcher; */ public class TurriIslandPlane extends Plane { - private static final FilterCard filter = new FilterCard("creature spells"); - - static { - filter.add(new CardTypePredicate(CardType.CREATURE)); - } - public TurriIslandPlane() { this.setName("Plane - Turri Island"); this.setExpansionSetCodeForImage("PCA"); // Creature spells cost {2} less to cast. - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new SpellsCostReductionAllEffect(filter, 2)); - + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new TurriIslandEffect(2)); this.getAbilities().add(ability); // Active player can roll the planar die: Whenever you roll {CHAOS}, reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest into your graveyard. @@ -85,3 +87,79 @@ public class TurriIslandPlane extends Plane { this.getAbilities().add(new SimpleStaticAbility(Zone.ALL, new PlanarDieRollCostIncreasingEffect(chaosAbility.getOriginalId()))); } } + +class TurriIslandEffect extends CostModificationEffectImpl { + + private static final FilterCard filter = new FilterCard("creature spells"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + } + + private static final String rule = "Creature spells cost {2} less to cast"; + private int amount = 2; + + public TurriIslandEffect(int amount) { + super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST); + this.amount = 2; + this.staticText = rule; + } + + protected TurriIslandEffect(TurriIslandEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardUtil.reduceCost(abilityToModify, this.amount); + return true; + } + + /** + * Overwrite this in effect that inherits from this + * + * @param card + * @param source + * @param game + * @return + */ + protected boolean selectedByRuntimeData(Card card, Ability source, Game game) { + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (abilityToModify instanceof SpellAbility) { + Plane cPlane = game.getState().getCurrentPlane(); + if (cPlane == null) { + return false; + } + if (cPlane != null) { + if (!cPlane.getName().equalsIgnoreCase("Plane - Turri Island")) { + return false; + } + } + + Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); + if (spell != null) { + return this.filter.match(spell, game) && selectedByRuntimeData(spell, source, game); + } else { + // used at least for flashback ability because Flashback ability doesn't use stack + Card sourceCard = game.getCard(abilityToModify.getSourceId()); + return sourceCard != null && this.filter.match(sourceCard, game) && selectedByRuntimeData(sourceCard, source, game); + } + } + return false; + } + + @Override + public TurriIslandEffect copy() { + return new TurriIslandEffect(this); + } +}