diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/NekoTe.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/NekoTe.java index d61a5e0d39d..2ea41876bb1 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/NekoTe.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/NekoTe.java @@ -59,7 +59,7 @@ public class NekoTe extends CardImpl { // Whenever equipped creature deals damage to a creature, tap that creature. That creature doesn't untap during its controller's untap step for as long as Neko-Te remains on the battlefield. ContinuousRuleModifiyingEffect skipUntapEffect = new SkipUntapTargetEffect(Duration.WhileOnBattlefield); skipUntapEffect.setText("That creature doesn't untap during its controller's untap step for as long as {this} remains on the battlefield"); - ConditionalContinuousRuleModifyingEffect effect = new ConditionalContinuousRuleModifyingEffect(skipUntapEffect, new SourceOnBattelfieldCondition(), false); + ConditionalContinuousRuleModifyingEffect effect = new ConditionalContinuousRuleModifyingEffect(skipUntapEffect, new SourceOnBattelfieldCondition()); Ability ability = new DealsDamageToACreatureAttachedTriggeredAbility(new TapTargetEffect("that creature"), false, "equipped creature", false, true); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java b/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java index 90b1c29a2f3..56c09aec437 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java @@ -61,7 +61,7 @@ public class PillarOfWar extends CardImpl { // As long as Pillar of War is enchanted, it can attack as though it didn't have defender. Effect effect = new ConditionalAsThoughEffect( new CanAttackAsThoughtItDidntHaveDefenderEffect(Duration.WhileOnBattlefield), - new EnchantedCondition(), false); + new EnchantedCondition()); effect.setText("As long as {this} is enchanted, it can attack as though it didn't have defender"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); diff --git a/Mage.Sets/src/mage/sets/darkascension/BreakOfDay.java b/Mage.Sets/src/mage/sets/darkascension/BreakOfDay.java index 9f935edd9e7..6ef09312d35 100644 --- a/Mage.Sets/src/mage/sets/darkascension/BreakOfDay.java +++ b/Mage.Sets/src/mage/sets/darkascension/BreakOfDay.java @@ -28,6 +28,7 @@ package mage.sets.darkascension; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; @@ -57,8 +58,8 @@ public class BreakOfDay extends CardImpl { // Fateful hour - If you have 5 or less life, those creatures also are indestructible this turn. this.getSpellAbility().addEffect(new ConditionalContinousEffect( new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control"), false), - FatefulHourCondition.getInstance(), - "If you have 5 or less life, those creatures also are indestructible this turn", true)); + new LockedInCondition(FatefulHourCondition.getInstance()), + "If you have 5 or less life, those creatures also are indestructible this turn")); } public BreakOfDay(final BreakOfDay card) { diff --git a/Mage.Sets/src/mage/sets/darkascension/TragicSlip.java b/Mage.Sets/src/mage/sets/darkascension/TragicSlip.java index 239ff892388..23398114324 100644 --- a/Mage.Sets/src/mage/sets/darkascension/TragicSlip.java +++ b/Mage.Sets/src/mage/sets/darkascension/TragicSlip.java @@ -28,7 +28,6 @@ package mage.sets.darkascension; import java.util.UUID; -import mage.abilities.condition.FixedCondition; import mage.abilities.condition.LockedInCondition; import mage.constants.CardType; import mage.constants.Duration; @@ -57,8 +56,7 @@ public class TragicSlip extends CardImpl { new BoostTargetEffect(-13, -13, Duration.EndOfTurn), new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new LockedInCondition(MorbidCondition.getInstance()), - "Target creature gets -1/-1 until end of turn. Morbid - That creature gets -13/-13 until end of turn instead if a creature died this turn", - true)); + "Target creature gets -1/-1 until end of turn. Morbid - That creature gets -13/-13 until end of turn instead if a creature died this turn")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/sets/eventide/BatwingBrume.java b/Mage.Sets/src/mage/sets/eventide/BatwingBrume.java index 49ff415f6af..c7226b9495a 100644 --- a/Mage.Sets/src/mage/sets/eventide/BatwingBrume.java +++ b/Mage.Sets/src/mage/sets/eventide/BatwingBrume.java @@ -29,6 +29,7 @@ package mage.sets.eventide; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalReplacementEffect; @@ -61,7 +62,7 @@ public class BatwingBrume extends CardImpl { // Prevent all combat damage that would be dealt this turn if {W} was spent to cast Batwing Brume. Each player loses 1 life for each attacking creature he or she controls if {B} was spent to cast Batwing Brume. Effect effect = new ConditionalReplacementEffect(new PreventAllDamageByAllEffect(Duration.EndOfTurn, true), - new ManaWasSpentCondition(ColoredManaSymbol.W), true); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.W))); effect.setText("Prevent all combat damage that would be dealt this turn if {W} was spent to cast {this}"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new ConditionalOneShotEffect( diff --git a/Mage.Sets/src/mage/sets/eventide/CankerousThirst.java b/Mage.Sets/src/mage/sets/eventide/CankerousThirst.java index dc85de1f1a7..b184e11b2e9 100644 --- a/Mage.Sets/src/mage/sets/eventide/CankerousThirst.java +++ b/Mage.Sets/src/mage/sets/eventide/CankerousThirst.java @@ -28,6 +28,7 @@ package mage.sets.eventide; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalContinousEffect; import mage.abilities.effects.common.continious.BoostTargetEffect; @@ -56,10 +57,12 @@ public class CankerousThirst extends CardImpl { // If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. this.getSpellAbility().addEffect(new ConditionalContinousEffect( new BoostTargetEffect(-3, -3, Duration.EndOfTurn), - new ManaWasSpentCondition(ColoredManaSymbol.B), "If {B} was spent to cast {this}, you may have target creature get -3/-3 until end of turn", true)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.B)), + "If {B} was spent to cast {this}, you may have target creature get -3/-3 until end of turn")); this.getSpellAbility().addEffect(new ConditionalContinousEffect( new BoostTargetEffect(3, 3, Duration.EndOfTurn), - new ManaWasSpentCondition(ColoredManaSymbol.G), "If {G} was spent to cast {this}, you may have target creature get +3/+3 until end of turn", true)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.G)), + "If {G} was spent to cast {this}, you may have target creature get +3/+3 until end of turn")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.addInfo("Info1", "(Do both if {B}{G} was spent.)"); } diff --git a/Mage.Sets/src/mage/sets/eventide/FigureOfDestiny.java b/Mage.Sets/src/mage/sets/eventide/FigureOfDestiny.java index 8a83c34de15..201679675e4 100644 --- a/Mage.Sets/src/mage/sets/eventide/FigureOfDestiny.java +++ b/Mage.Sets/src/mage/sets/eventide/FigureOfDestiny.java @@ -30,6 +30,7 @@ package mage.sets.eventide; import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.SourceMatchesFilterCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalContinousEffect; @@ -78,9 +79,8 @@ public class FigureOfDestiny extends CardImpl { Zone.BATTLEFIELD, new ConditionalContinousEffect( new BecomesCreatureSourceEffect(new FigureOfDestiny.FigureOfDestinyToken2(), "", Duration.Custom), - new SourceMatchesFilterCondition(filter2), - "If {this} is a Spirit, it becomes a Kithkin Spirit Warrior with base power and toughness 4/4", - true), + new LockedInCondition(new SourceMatchesFilterCondition(filter2)), + "If {this} is a Spirit, it becomes a Kithkin Spirit Warrior with base power and toughness 4/4"), new ManaCostsImpl("{R/W}{R/W}{R/W}") )); // {RW}{RW}{RW}{RW}{RW}{RW}: If Figure of Destiny is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike. @@ -88,9 +88,8 @@ public class FigureOfDestiny extends CardImpl { Zone.BATTLEFIELD, new ConditionalContinousEffect( new BecomesCreatureSourceEffect(new FigureOfDestiny.FigureOfDestinyToken3(), "", Duration.Custom), - new SourceMatchesFilterCondition(filter3), - "If {this} is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike", - true), + new LockedInCondition(new SourceMatchesFilterCondition(filter3)), + "If {this} is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike"), new ManaCostsImpl("{R/W}{R/W}{R/W}{R/W}{R/W}{R/W}") )); } diff --git a/Mage.Sets/src/mage/sets/eventide/InvertTheSkies.java b/Mage.Sets/src/mage/sets/eventide/InvertTheSkies.java index e447fbc7ace..b4c562fa779 100644 --- a/Mage.Sets/src/mage/sets/eventide/InvertTheSkies.java +++ b/Mage.Sets/src/mage/sets/eventide/InvertTheSkies.java @@ -30,6 +30,7 @@ package mage.sets.eventide; import java.util.Set; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalContinousEffect; import mage.abilities.effects.ContinuousEffectImpl; @@ -40,7 +41,6 @@ import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Duration; import mage.constants.Layer; -import mage.constants.ManaType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.SubLayer; @@ -65,10 +65,12 @@ public class InvertTheSkies extends CardImpl { // Creatures your opponents control lose flying until end of turn if {G} was spent to cast Invert the Skies, and creatures you control gain flying until end of turn if {U} was spent to cast it. this.getSpellAbility().addEffect(new ConditionalContinousEffect( new InvertTheSkiesEffect(), - new ManaWasSpentCondition(ColoredManaSymbol.G), "Creatures your opponents control lose flying until end of turn if {G} was spent to cast {this},", true)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.G)), + "Creatures your opponents control lose flying until end of turn if {G} was spent to cast {this},")); this.getSpellAbility().addEffect(new ConditionalContinousEffect( new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), - new ManaWasSpentCondition(ColoredManaSymbol.U), "and creatures you control gain flying until end of turn if {U} was spent to cast it", true)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.U)), + "and creatures you control gain flying until end of turn if {U} was spent to cast it")); this.addInfo("Info1", "(Do both if {G}{U} was spent.)"); } diff --git a/Mage.Sets/src/mage/sets/eventide/Moonhold.java b/Mage.Sets/src/mage/sets/eventide/Moonhold.java index 26daf8e0cdc..9bff5335443 100644 --- a/Mage.Sets/src/mage/sets/eventide/Moonhold.java +++ b/Mage.Sets/src/mage/sets/eventide/Moonhold.java @@ -30,6 +30,7 @@ package mage.sets.eventide; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.effects.ContinuousRuleModifiyingEffect; @@ -65,10 +66,10 @@ public class Moonhold extends CardImpl { effect2.setText("and can't play creature cards this turn if {W} was spent to cast it."); this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect( effect, - new ManaWasSpentCondition(ColoredManaSymbol.R), false)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.R)))); this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect( effect2, - new ManaWasSpentCondition(ColoredManaSymbol.W), false)); + new LockedInCondition(new ManaWasSpentCondition(ColoredManaSymbol.W)))); this.getSpellAbility().addTarget(new TargetPlayer()); this.addInfo("Info1", "(Do both if {R}{W} was spent.)"); } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/ArmamentOfNyx.java b/Mage.Sets/src/mage/sets/journeyintonyx/ArmamentOfNyx.java index 40b0eb684a8..cb8f5afd932 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/ArmamentOfNyx.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/ArmamentOfNyx.java @@ -85,7 +85,7 @@ public class ArmamentOfNyx extends CardImpl { condition, "Enchanted creature has double strike as long as it's an enchantment")); ReplacementEffect effect = new PreventAllDamageByAttachedEffect(Duration.WhileOnBattlefield, "enchanted creature", false); effect.setText("Otherwise, prevent all damage that would be dealt by enchanted creature"); - ability.addEffect(new ConditionalReplacementEffect(effect, new InvertCondition(condition), false)); + ability.addEffect(new ConditionalReplacementEffect(effect, new InvertCondition(condition))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java b/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java index 721707e2e6e..6f49d77ef8c 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java @@ -40,6 +40,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.FilterCard; import mage.filter.common.FilterNonlandCard; import mage.game.ExileZone; import mage.game.Game; @@ -107,16 +108,18 @@ class BrainMaggotExileEffect extends OneShotEffect { Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && opponent != null && sourcePermanent != null) { - opponent.revealCards(sourcePermanent.getName(), opponent.getHand(), game); + opponent.revealCards(sourcePermanent.getLogName(), opponent.getHand(), game); - TargetCard target = new TargetCard(Zone.HAND, new FilterNonlandCard("nonland card to exile")); - if (controller.choose(Outcome.Exile, opponent.getHand(), target, game)) { + FilterCard filter = new FilterNonlandCard("nonland card to exile"); + TargetCard target = new TargetCard(Zone.HAND, filter); + if (opponent.getHand().count(filter, game) > 0 && controller.choose(Outcome.Exile, opponent.getHand(), target, game)) { Card card = opponent.getHand().get(target.getFirstTarget(), game); // If source permanent leaves the battlefield before its triggered ability resolves, the target card won't be exiled. if (card != null && game.getState().getZone(source.getSourceId()) == Zone.BATTLEFIELD) { controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourcePermanent.getName(), source.getSourceId(), game, Zone.HAND); } - } + } + return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2014/FesteringNewt.java b/Mage.Sets/src/mage/sets/magic2014/FesteringNewt.java index 9f56dacf2e6..019d3085526 100644 --- a/Mage.Sets/src/mage/sets/magic2014/FesteringNewt.java +++ b/Mage.Sets/src/mage/sets/magic2014/FesteringNewt.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.ControlsPermanentCondition; import mage.abilities.decorator.ConditionalContinousEffect; import mage.abilities.effects.Effect; @@ -70,9 +71,8 @@ public class FesteringNewt extends CardImpl { Effect effect = new ConditionalContinousEffect( new BoostTargetEffect(-4,-4, Duration.EndOfTurn), new BoostTargetEffect(-1,-1, Duration.EndOfTurn), - new ControlsPermanentCondition(filterBogbrewWitch), - "target creature an opponent controls gets -1/-1 until end of turn. That creature gets -4/-4 instead if you control a creature named Bogbrew Witch", - true); + new LockedInCondition(new ControlsPermanentCondition(filterBogbrewWitch)), + "target creature an opponent controls gets -1/-1 until end of turn. That creature gets -4/-4 instead if you control a creature named Bogbrew Witch"); Ability ability = new DiesTriggeredAbility(effect); ability.addTarget(new TargetCreaturePermanent(filterCreature)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/MirranMettle.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/MirranMettle.java index 4a9990ff44a..4242ac91f6f 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/MirranMettle.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/MirranMettle.java @@ -28,6 +28,7 @@ package mage.sets.mirrodinbesieged; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; @@ -53,7 +54,8 @@ public class MirranMettle extends CardImpl { this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new ConditionalContinousEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn), MetalcraftCondition.getInstance(), effectText, true)); + this.getSpellAbility().addEffect(new ConditionalContinousEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn), + new LockedInCondition(MetalcraftCondition.getInstance()), effectText)); } public MirranMettle(final MirranMettle card) { diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/SpireSerpent.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/SpireSerpent.java index 6fd2b51c65a..8f44471cc48 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/SpireSerpent.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/SpireSerpent.java @@ -65,7 +65,7 @@ public class SpireSerpent extends CardImpl { ConditionalContinousEffect effect1 = new ConditionalContinousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), MetalcraftCondition.getInstance(), abilityText1); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect1); Effect effect = new ConditionalAsThoughEffect(new CanAttackAsThoughtItDidntHaveDefenderEffect(Duration.WhileOnBattlefield), - MetalcraftCondition.getInstance(), false); + MetalcraftCondition.getInstance()); effect.setText("and can attack as though it didn't have defender"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java b/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java index 29516ea002e..9d174f418fb 100644 --- a/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java +++ b/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java @@ -80,15 +80,13 @@ public class RepentantVampire extends CardImpl { Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect( new SetCardColorSourceEffect(ObjectColor.WHITE, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), - "Threshold - As long as seven or more cards are in your graveyard, {this} is white", - false)); + "Threshold - As long as seven or more cards are in your graveyard, {this} is white")); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new TapSourceCost()); gainedAbility.addTarget(new TargetCreaturePermanent(filter)); ability.addEffect(new ConditionalContinousEffect( new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), - "and has \"{t}: Destroy target black creature.\"", - false)); + "and has \"{t}: Destroy target black creature.\"")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java b/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java index 21feea9982d..a3fb29e8abb 100644 --- a/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java +++ b/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java @@ -74,26 +74,22 @@ public class WaywardAngel extends CardImpl { Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect( new BoostSourceEffect(3, 3, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), - "Threshold - As long as seven or more cards are in your graveyard, {this} gets +3/+3,", - false)); + "Threshold - As long as seven or more cards are in your graveyard, {this} gets +3/+3,")); ability.addEffect(new ConditionalContinousEffect( new SetCardColorSourceEffect(ObjectColor.BLACK, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), - " is black,", - false)); + " is black,")); ability.addEffect(new ConditionalContinousEffect( new GainAbilitySourceEffect(TrampleAbility.getInstance()), new CardsInControllerGraveCondition(7), - " has trample,", - false)); + " has trample,")); Ability gainedAbility = new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(new FilterControlledCreaturePermanent(), 1, ""), TargetController.YOU, false); ability.addEffect(new ConditionalContinousEffect( new GainAbilitySourceEffect(gainedAbility), new CardsInControllerGraveCondition(7), - " and has \"At the beginning of your upkeep, sacrifice a creature.\" ", - false)); + " and has \"At the beginning of your upkeep, sacrifice a creature.\" ")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/planeshift/OrimsChant.java b/Mage.Sets/src/mage/sets/planeshift/OrimsChant.java index 5fcc3564a01..a3fda60f7e8 100644 --- a/Mage.Sets/src/mage/sets/planeshift/OrimsChant.java +++ b/Mage.Sets/src/mage/sets/planeshift/OrimsChant.java @@ -30,17 +30,17 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.KickedCondition; import mage.abilities.effects.ContinuousRuleModifiyingEffectImpl; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.combat.CantAttackAllAnyPlayerEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; @@ -65,7 +65,7 @@ public class OrimsChant extends CardImpl { this.getSpellAbility().addEffect(new OrimsChantCantCastEffect()); // If Orim's Chant was kicked, creatures can't attack this turn. - this.getSpellAbility().addEffect(new OrimsChantCantAttackEffect()); + this.getSpellAbility().addEffect(new OrimsChantEffect()); } public OrimsChant(final OrimsChant card) { @@ -79,6 +79,32 @@ public class OrimsChant extends CardImpl { } +class OrimsChantEffect extends OneShotEffect { + + public OrimsChantEffect() { + super(Outcome.Benefit); + this.staticText = "If {this} was kicked, creatures can't attack this turn"; + } + + public OrimsChantEffect(final OrimsChantEffect effect) { + super(effect); + } + + @Override + public OrimsChantEffect copy() { + return new OrimsChantEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && KickedCondition.getInstance().apply(game, source)) { + game.addEffect(new CantAttackAllAnyPlayerEffect(Duration.EndOfTurn, new FilterCreaturePermanent("creatures")), source); + } + return false; + } +} + class OrimsChantCantCastEffect extends ContinuousRuleModifiyingEffectImpl { public OrimsChantCantCastEffect() { @@ -111,46 +137,3 @@ class OrimsChantCantCastEffect extends ContinuousRuleModifiyingEffectImpl { return false; } } - -class OrimsChantCantAttackEffect extends ReplacementEffectImpl { - - private static final String effectText = "If {this} was kicked, creatures can't attack this turn"; - private Condition condition = new LockedInCondition(KickedCondition.getInstance()); - - OrimsChantCantAttackEffect ( ) { - super(Duration.EndOfTurn, Outcome.Benefit); - staticText = effectText; - } - - OrimsChantCantAttackEffect (final OrimsChantCantAttackEffect effect ) { - super(effect); - this.condition = effect.condition; - } - - @Override - public boolean apply(Game game, Ability source) { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - if ( event.getType() == GameEvent.EventType.DECLARE_ATTACKER) { - return true; - } - return false; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if ( event.getType() == GameEvent.EventType.DECLARE_ATTACKER && condition.apply(game, source)) { - return true; - } - return false; - } - - @Override - public OrimsChantCantAttackEffect copy() { - return new OrimsChantCantAttackEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/sets/theros/ColossusOfAkros.java b/Mage.Sets/src/mage/sets/theros/ColossusOfAkros.java index c926acb01b8..ac7caf9ed05 100644 --- a/Mage.Sets/src/mage/sets/theros/ColossusOfAkros.java +++ b/Mage.Sets/src/mage/sets/theros/ColossusOfAkros.java @@ -74,7 +74,7 @@ public class ColossusOfAkros extends CardImpl { MonstrousCondition.getInstance(), "As long as {this} is monstrous, it has trample")); Effect effect = new ConditionalAsThoughEffect(new CanAttackAsThoughtItDidntHaveDefenderEffect(Duration.WhileOnBattlefield), - MonstrousCondition.getInstance(), false); + MonstrousCondition.getInstance()); effect.setText("and can attack as though it didn't have defender"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/timespiral/MightOfOldKrosa.java b/Mage.Sets/src/mage/sets/timespiral/MightOfOldKrosa.java index e55cad979d9..222a4add842 100644 --- a/Mage.Sets/src/mage/sets/timespiral/MightOfOldKrosa.java +++ b/Mage.Sets/src/mage/sets/timespiral/MightOfOldKrosa.java @@ -28,6 +28,7 @@ package mage.sets.timespiral; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; @@ -53,9 +54,8 @@ public class MightOfOldKrosa extends CardImpl { this.getSpellAbility().addEffect(new ConditionalContinousEffect( new BoostTargetEffect(4,4, Duration.EndOfTurn), new BoostTargetEffect(2, 2, Duration.EndOfTurn), - MyMainPhaseCondition.getInstance(), - "Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead", - true)); + new LockedInCondition(MyMainPhaseCondition.getInstance()), + "Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java b/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java index 0ff0258ba56..5aa6ba5ffbf 100644 --- a/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java +++ b/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java @@ -62,7 +62,7 @@ public class QuestForRenewal extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect( new UntapAllDuringEachOtherPlayersUntapStepEffect(filter), new SourceHasCounterCondition(CounterType.QUEST, 4), - "As long as there are four or more quest counters on {this}, untap all creatures you control during each other player's untap step.", false))); + "As long as there are four or more quest counters on {this}, untap all creatures you control during each other player's untap step."))); } public QuestForRenewal(final QuestForRenewal card) { diff --git a/Mage.Sets/src/mage/sets/worldwake/TombHex.java b/Mage.Sets/src/mage/sets/worldwake/TombHex.java index cea357df5cd..8e56e332e16 100644 --- a/Mage.Sets/src/mage/sets/worldwake/TombHex.java +++ b/Mage.Sets/src/mage/sets/worldwake/TombHex.java @@ -28,6 +28,7 @@ package mage.sets.worldwake; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.constants.CardType; import mage.constants.Rarity; @@ -54,7 +55,9 @@ public class TombHex extends CardImpl { // Target creature gets -2/-2 until end of turn. // Landfall - If you had a land enter the battlefield under your control this turn, that creature gets -4/-4 until end of turn instead. this.addWatcher(new LandfallWatcher()); - this.getSpellAbility().addEffect(new ConditionalContinousEffect(new BoostTargetEffect(-4, -4, Duration.EndOfTurn), new BoostTargetEffect(-2, -2, Duration.EndOfTurn), LandfallCondition.getInstance(), "Target creature gets -2/-2 until end of turn. Landfall - If you had a land enter the battlefield under your control this turn, that creature gets -4/-4 until end of turn instead", true)); + this.getSpellAbility().addEffect(new ConditionalContinousEffect(new BoostTargetEffect(-4, -4, Duration.EndOfTurn), new BoostTargetEffect(-2, -2, Duration.EndOfTurn), + new LockedInCondition(LandfallCondition.getInstance()), + "Target creature gets -2/-2 until end of turn. Landfall - If you had a land enter the battlefield under your control this turn, that creature gets -4/-4 until end of turn instead")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/sets/zendikar/BoldDefense.java b/Mage.Sets/src/mage/sets/zendikar/BoldDefense.java index 1704d44537e..f2c868cb6cd 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BoldDefense.java +++ b/Mage.Sets/src/mage/sets/zendikar/BoldDefense.java @@ -27,14 +27,10 @@ */ package mage.sets.zendikar; +import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalContinousEffect; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continious.BoostControlledEffect; import mage.abilities.effects.common.continious.GainAbilityControlledEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -42,20 +38,17 @@ import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.Rarity; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; - -import java.util.UUID; - +import mage.players.Player; /** * @author nantuko, Loki */ public class BoldDefense extends CardImpl { - private final String staticText = "If {this]} was kicked, instead creatures you control get +2/+2 and gain first strike until end of turn"; - public BoldDefense(UUID ownerId) { super(ownerId, 3, "Bold Defense", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); this.expansionSetCode = "ZEN"; @@ -65,10 +58,7 @@ public class BoldDefense extends CardImpl { this.addAbility(new KickerAbility("{3}{W}")); // Creatures you control get +1/+1 until end of turn. If Bold Defense was kicked, instead creatures you control get +2/+2 and gain first strike until end of turn. - DynamicValue dn = new BoldDefensePTCount(); - this.getSpellAbility().addEffect(new BoostControlledEffect(dn, dn, Duration.EndOfTurn)); - ContinuousEffect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), false); - this.getSpellAbility().addEffect(new ConditionalContinousEffect(effect, KickedCondition.getInstance(), staticText, true)); + this.getSpellAbility().addEffect(new BoldDefenseEffect()); } public BoldDefense(final BoldDefense card) { @@ -81,39 +71,33 @@ public class BoldDefense extends CardImpl { } } -class BoldDefensePTCount implements DynamicValue { +class BoldDefenseEffect extends OneShotEffect { - private Condition condition = new LockedInCondition(KickedCondition.getInstance()); + public BoldDefenseEffect() { + super(Outcome.BoostCreature); + this.staticText = "Creatures you control get +1/+1 until end of turn. If {this} was kicked, instead creatures you control get +2/+2 and gain first strike until end of turn"; + } - public BoldDefensePTCount() { + public BoldDefenseEffect(final BoldDefenseEffect effect) { + super(effect); } @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - if (condition.apply(game, sourceAbility)) { - return 2; - } else { - return 1; + public BoldDefenseEffect copy() { + return new BoldDefenseEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + if (KickedCondition.getInstance().apply(game, source)) { + game.addEffect(new BoostControlledEffect(2, 2, Duration.EndOfTurn), source); + game.addEffect(new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), false), source); + } else { + game.addEffect(new BoostControlledEffect(1, 1, Duration.EndOfTurn), source); + } } - } - - public BoldDefensePTCount(final BoldDefensePTCount dynamicValue) { - this.condition = dynamicValue.condition; - - } - - @Override - public DynamicValue copy() { - return new BoldDefensePTCount(this); - } - - @Override - public String toString() { - return "1"; - } - - @Override - public String getMessage() { - return "1"; + return false; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/GoblinBushwhacker.java b/Mage.Sets/src/mage/sets/zendikar/GoblinBushwhacker.java index f31755bd242..474389949b1 100644 --- a/Mage.Sets/src/mage/sets/zendikar/GoblinBushwhacker.java +++ b/Mage.Sets/src/mage/sets/zendikar/GoblinBushwhacker.java @@ -64,7 +64,7 @@ public class GoblinBushwhacker extends CardImpl { // When Goblin Bushwhacker enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn. EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn), false); ability.addEffect(new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); - this.addAbility(new ConditionalTriggeredAbility(ability, new LockedInCondition(KickedCondition.getInstance()), "When {this} enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn.")); + this.addAbility(new ConditionalTriggeredAbility(ability, KickedCondition.getInstance(), "When {this} enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn.")); } public GoblinBushwhacker(final GoblinBushwhacker card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/KorAeronaut.java b/Mage.Sets/src/mage/sets/zendikar/KorAeronaut.java index 5d55d2fd922..b16844a0093 100644 --- a/Mage.Sets/src/mage/sets/zendikar/KorAeronaut.java +++ b/Mage.Sets/src/mage/sets/zendikar/KorAeronaut.java @@ -65,7 +65,7 @@ public class KorAeronaut extends CardImpl { EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false); ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(new ConditionalTriggeredAbility(ability, new LockedInCondition(KickedCondition.getInstance()), "When {this} enters the battlefield, if it was kicked, target creature gains flying until end of turn.")); + this.addAbility(new ConditionalTriggeredAbility(ability, KickedCondition.getInstance(), "When {this} enters the battlefield, if it was kicked, target creature gains flying until end of turn.")); } public KorAeronaut(final KorAeronaut card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/MoldShambler.java b/Mage.Sets/src/mage/sets/zendikar/MoldShambler.java index 188a22dcc72..d8e4126f089 100644 --- a/Mage.Sets/src/mage/sets/zendikar/MoldShambler.java +++ b/Mage.Sets/src/mage/sets/zendikar/MoldShambler.java @@ -73,7 +73,7 @@ public class MoldShambler extends CardImpl { EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false); Target target = new TargetPermanent(filter); ability.addTarget(target); - this.addAbility(new ConditionalTriggeredAbility(ability, new LockedInCondition(KickedCondition.getInstance()), "When {this} enters the battlefield, if it was kicked, destroy target noncreature permanent.")); + this.addAbility(new ConditionalTriggeredAbility(ability, KickedCondition.getInstance(), "When {this} enters the battlefield, if it was kicked, destroy target noncreature permanent.")); } public MoldShambler(final MoldShambler card) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/conditional/TragicSlipTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/TragicSlipTest.java index 77741d2ca40..d101d7b33e5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/conditional/TragicSlipTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/TragicSlipTest.java @@ -78,4 +78,51 @@ public class TragicSlipTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Silvercoat Lion", 0); assertPermanentCount(playerA, "Pillarfield Ox", 0); } + + /* + Killed an opponent's Young Pyromancer with Ulcerate then flashed back Tragic Slip with Snapcaster Mage targeting his Tarmogoyf. + Morbid didn't seem to work and only applied -1/-1 to the Tarmogoyf. + */ + @Test + public void testPlayedWithFlashbackAgain() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + + // Tragic Slip - Instant, B - Target creature gets -1/-1 until end of turn. + // Morbid — That creature gets -13/-13 until end of turn instead if a creature died this turn. + addCard(Zone.HAND, playerA, "Tragic Slip"); + + // Creature - Human Wizard + // 2/1 + // Flash + // When Snapcaster Mage enters the battlefield, target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. + addCard(Zone.HAND, playerA, "Snapcaster Mage"); + addCard(Zone.HAND, playerA, "Lightning Bolt"); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + // Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1 + addCard(Zone.BATTLEFIELD, playerB, "Tarmogoyf"); + addCard(Zone.GRAVEYARD, playerB, "Mountain"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tragic Slip", "Silvercoat Lion"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Snapcaster Mage"); + setChoice(playerA, "Tragic Slip"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Snapcaster Mage"); + + activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Flashback {B}"); // now snapcaster mage is died so -13/-13 + addTarget(playerA, "Tarmogoyf"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertHandCount(playerA, "Tragic Slip", 0); + assertPermanentCount(playerA, "Snapcaster Mage", 0); + assertExileCount("Tragic Slip", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertPowerToughness(playerB, "Silvercoat Lion", 1,1); + assertGraveyardCount(playerB, "Tarmogoyf", 1); + } } diff --git a/Mage/src/mage/abilities/condition/LockedInCondition.java b/Mage/src/mage/abilities/condition/LockedInCondition.java index da4838cd2b4..a388889839c 100644 --- a/Mage/src/mage/abilities/condition/LockedInCondition.java +++ b/Mage/src/mage/abilities/condition/LockedInCondition.java @@ -31,8 +31,14 @@ import mage.abilities.Ability; import mage.game.Game; /** - * A simple {@link Condition} to check the condition only one time at the start (result locked in). - * All subsequent checks return the first result. + * The use of this class must be handled carefully because conditions don't + * have a copy method, the condition state is kept when the effect or ability + * is copied that uses the condition. + * So if you use this class, you have to do it like in ConditionalContinuousEffect, + * where always a new FixedCondition(condition.apply(...)) is used if a + * LockedInCondition is given. + * + * Needs probably some redesign, don't like it the way it's done now. * * @author LevelX2 */ @@ -40,7 +46,7 @@ public class LockedInCondition implements Condition { private boolean conditionChecked = false; private boolean result; - private Condition condition; + private final Condition condition; public LockedInCondition ( Condition condition ) { this.condition = condition; @@ -58,4 +64,8 @@ public class LockedInCondition implements Condition { return result; } + public Condition getBaseCondition() { + return condition; + } + } diff --git a/Mage/src/mage/abilities/condition/common/MorbidCondition.java b/Mage/src/mage/abilities/condition/common/MorbidCondition.java index 4e81b7666a7..04de2a9aec9 100644 --- a/Mage/src/mage/abilities/condition/common/MorbidCondition.java +++ b/Mage/src/mage/abilities/condition/common/MorbidCondition.java @@ -37,7 +37,7 @@ import mage.watchers.Watcher; */ public class MorbidCondition implements Condition { - private static MorbidCondition fInstance = new MorbidCondition(); + private static final MorbidCondition fInstance = new MorbidCondition(); public static Condition getInstance() { return fInstance; @@ -48,4 +48,5 @@ public class MorbidCondition implements Condition { Watcher watcher = game.getState().getWatchers().get("Morbid"); return watcher.conditionMet(); } + } diff --git a/Mage/src/mage/abilities/decorator/ConditionalAsThoughEffect.java b/Mage/src/mage/abilities/decorator/ConditionalAsThoughEffect.java index 45f1ff1bd40..40835db9101 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalAsThoughEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalAsThoughEffect.java @@ -45,19 +45,17 @@ public class ConditionalAsThoughEffect extends AsThoughEffectImpl { protected AsThoughEffect effect; protected AsThoughEffect otherwiseEffect; protected Condition condition; - protected boolean lockedInCondition; protected boolean conditionState; - public ConditionalAsThoughEffect(AsThoughEffect effect, Condition condition, boolean lockedInCondition) { - this(effect, condition, null, lockedInCondition); + public ConditionalAsThoughEffect(AsThoughEffect effect, Condition condition) { + this(effect, condition, null); } - public ConditionalAsThoughEffect(AsThoughEffect effect, Condition condition, AsThoughEffect otherwiseEffect, boolean lockedInCondition) { + public ConditionalAsThoughEffect(AsThoughEffect effect, Condition condition, AsThoughEffect otherwiseEffect) { super(effect.getAsThoughEffectType(), effect.getDuration(), effect.getOutcome()); this.effect = effect; this.condition = condition; this.otherwiseEffect = otherwiseEffect; - this.lockedInCondition = lockedInCondition; } public ConditionalAsThoughEffect(final ConditionalAsThoughEffect effect) { @@ -67,7 +65,6 @@ public class ConditionalAsThoughEffect extends AsThoughEffectImpl { this.otherwiseEffect = (AsThoughEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; this.conditionState = effect.conditionState; } @@ -78,9 +75,6 @@ public class ConditionalAsThoughEffect extends AsThoughEffectImpl { @Override public boolean apply(Game game, Ability source) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); - } conditionState = condition.apply(game, source); if (conditionState) { effect.setTargetPointer(this.targetPointer); @@ -100,9 +94,6 @@ public class ConditionalAsThoughEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); - } conditionState = condition.apply(game, source); if (conditionState) { effect.setTargetPointer(this.targetPointer); diff --git a/Mage/src/mage/abilities/decorator/ConditionalContinousEffect.java b/Mage/src/mage/abilities/decorator/ConditionalContinousEffect.java index 3ff8dc5e15d..958cf7ecd69 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalContinousEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalContinousEffect.java @@ -4,6 +4,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.condition.Condition; import mage.abilities.condition.FixedCondition; +import mage.abilities.condition.LockedInCondition; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.Duration; @@ -20,18 +21,15 @@ public class ConditionalContinousEffect extends ContinuousEffectImpl { protected ContinuousEffect effect; protected ContinuousEffect otherwiseEffect; + protected Condition baseCondition; protected Condition condition; - protected boolean lockedInCondition; protected boolean initDone = false; + public ConditionalContinousEffect(ContinuousEffect effect, Condition condition, String text) { this(effect, null, condition, text); } - public ConditionalContinousEffect(ContinuousEffect effect, Condition condition, String text, boolean lockedInCondition) { - this(effect, null, condition, text, lockedInCondition); - } - /** * Only use this if both effects have the same layers * @@ -41,25 +39,11 @@ public class ConditionalContinousEffect extends ContinuousEffectImpl { * @param text */ public ConditionalContinousEffect(ContinuousEffect effect, ContinuousEffect otherwiseEffect, Condition condition, String text) { - this(effect, otherwiseEffect, condition, text, false); - } - - /** - * Only use this if both effects have the same layers - * - * @param effect - * @param otherwiseEffect - * @param condition - * @param text - * @param lockedInCondition - */ - public ConditionalContinousEffect(ContinuousEffect effect, ContinuousEffect otherwiseEffect, Condition condition, String text, boolean lockedInCondition) { super(effect.getDuration(), effect.getLayer(), effect.getSublayer(), effect.getOutcome()); this.effect = effect; this.otherwiseEffect = otherwiseEffect; - this.condition = condition; + this.baseCondition = condition; this.staticText = text; - this.lockedInCondition = lockedInCondition; } public ConditionalContinousEffect(final ConditionalContinousEffect effect) { @@ -69,7 +53,7 @@ public class ConditionalContinousEffect extends ContinuousEffectImpl { this.otherwiseEffect = (ContinuousEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; + this.baseCondition = effect.baseCondition; this.initDone = effect.initDone; } @@ -80,8 +64,10 @@ public class ConditionalContinousEffect extends ContinuousEffectImpl { @Override public void init(Ability source, Game game) { - if (lockedInCondition) { - condition = new FixedCondition(condition.apply(game, source)); + if (baseCondition instanceof LockedInCondition) { + condition = new FixedCondition(((LockedInCondition) baseCondition).getBaseCondition().apply(game, source)); + } else { + condition = baseCondition; } effect.setTargetPointer(this.targetPointer); effect.init(source, game); diff --git a/Mage/src/mage/abilities/decorator/ConditionalContinuousRuleModifyingEffect.java b/Mage/src/mage/abilities/decorator/ConditionalContinuousRuleModifyingEffect.java index 781b57511e3..03f7f71cbdc 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalContinuousRuleModifyingEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalContinuousRuleModifyingEffect.java @@ -31,6 +31,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.condition.Condition; import mage.abilities.condition.FixedCondition; +import mage.abilities.condition.LockedInCondition; import mage.abilities.effects.ContinuousRuleModifiyingEffect; import mage.abilities.effects.ContinuousRuleModifiyingEffectImpl; import mage.game.Game; @@ -45,19 +46,18 @@ public class ConditionalContinuousRuleModifyingEffect extends ContinuousRuleModi protected ContinuousRuleModifiyingEffect effect; protected ContinuousRuleModifiyingEffect otherwiseEffect; protected Condition condition; - protected boolean lockedInCondition; - protected boolean conditionState; + protected Condition baseCondition; + protected boolean initDone = false; - public ConditionalContinuousRuleModifyingEffect(ContinuousRuleModifiyingEffect effect, Condition condition, boolean lockedInCondition) { - this(effect, condition, null, lockedInCondition); + public ConditionalContinuousRuleModifyingEffect(ContinuousRuleModifiyingEffect effect, Condition condition) { + this(effect, condition, null); } - public ConditionalContinuousRuleModifyingEffect(ContinuousRuleModifiyingEffect effect, Condition condition, ContinuousRuleModifiyingEffect otherwiseEffect, boolean lockedInCondition) { + public ConditionalContinuousRuleModifyingEffect(ContinuousRuleModifiyingEffect effect, Condition condition, ContinuousRuleModifiyingEffect otherwiseEffect) { super(effect.getDuration(), effect.getOutcome()); this.effect = effect; - this.condition = condition; + this.baseCondition = condition; this.otherwiseEffect = otherwiseEffect; - this.lockedInCondition = lockedInCondition; } public ConditionalContinuousRuleModifyingEffect(final ConditionalContinuousRuleModifyingEffect effect) { @@ -67,10 +67,28 @@ public class ConditionalContinuousRuleModifyingEffect extends ContinuousRuleModi this.otherwiseEffect = (ContinuousRuleModifiyingEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; - this.conditionState = effect.conditionState; + this.baseCondition = effect.baseCondition; + this.initDone = effect.initDone; } + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (baseCondition instanceof LockedInCondition) { + condition = new FixedCondition(((LockedInCondition) baseCondition).getBaseCondition().apply(game, source)); + } else { + condition = baseCondition; + } + effect.setTargetPointer(this.targetPointer); + effect.init(source, game); + if (otherwiseEffect != null) { + otherwiseEffect.setTargetPointer(this.targetPointer); + otherwiseEffect.init(source, game); + } + initDone = true; + } + + @Override public boolean isDiscarded() { return effect.isDiscarded() || (otherwiseEffect != null && otherwiseEffect.isDiscarded()); @@ -83,11 +101,10 @@ public class ConditionalContinuousRuleModifyingEffect extends ContinuousRuleModi @Override public boolean applies(GameEvent event, Ability source, Game game) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); + if (!initDone) { // if simpleStaticAbility, init won't be called + init(source, game); } - conditionState = condition.apply(game, source); - if (conditionState) { + if (condition.apply(game, source)) { effect.setTargetPointer(this.targetPointer); return effect.applies(event, source, game); } else if (otherwiseEffect != null) { diff --git a/Mage/src/mage/abilities/decorator/ConditionalReplacementEffect.java b/Mage/src/mage/abilities/decorator/ConditionalReplacementEffect.java index ec597c16122..501317ceb77 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalReplacementEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalReplacementEffect.java @@ -31,6 +31,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.condition.Condition; import mage.abilities.condition.FixedCondition; +import mage.abilities.condition.LockedInCondition; import mage.abilities.effects.ReplacementEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.constants.Duration; @@ -45,20 +46,20 @@ public class ConditionalReplacementEffect extends ReplacementEffectImpl { protected ReplacementEffect effect; protected ReplacementEffect otherwiseEffect; + protected Condition baseCondition; protected Condition condition; - protected boolean lockedInCondition; protected boolean conditionState; + protected boolean initDone = false; - public ConditionalReplacementEffect(ReplacementEffect effect, Condition condition, boolean lockedInCondition) { - this(effect, condition, null, lockedInCondition); + public ConditionalReplacementEffect(ReplacementEffect effect, Condition condition) { + this(effect, condition, null); } - public ConditionalReplacementEffect(ReplacementEffect effect, Condition condition, ReplacementEffect otherwiseEffect, boolean lockedInCondition) { + public ConditionalReplacementEffect(ReplacementEffect effect, Condition condition, ReplacementEffect otherwiseEffect) { super(effect.getDuration(), effect.getOutcome()); this.effect = effect; - this.condition = condition; + this.baseCondition = condition; this.otherwiseEffect = otherwiseEffect; - this.lockedInCondition = lockedInCondition; } public ConditionalReplacementEffect(final ConditionalReplacementEffect effect) { @@ -68,8 +69,9 @@ public class ConditionalReplacementEffect extends ReplacementEffectImpl { this.otherwiseEffect = (ReplacementEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; this.conditionState = effect.conditionState; + this.baseCondition = effect.baseCondition; + this.initDone = effect.initDone; } @Override @@ -77,6 +79,23 @@ public class ConditionalReplacementEffect extends ReplacementEffectImpl { return effect.isDiscarded() || (otherwiseEffect != null && otherwiseEffect.isDiscarded()); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (baseCondition instanceof LockedInCondition) { + condition = new FixedCondition(((LockedInCondition) baseCondition).getBaseCondition().apply(game, source)); + } else { + condition = baseCondition; + } + effect.setTargetPointer(this.targetPointer); + effect.init(source, game); + if (otherwiseEffect != null) { + otherwiseEffect.setTargetPointer(this.targetPointer); + otherwiseEffect.init(source, game); + } + initDone = true; + } + @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { if (conditionState) { @@ -102,8 +121,8 @@ public class ConditionalReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); + if (!initDone) { // if simpleStaticAbility, init won't be called + init(source, game); } conditionState = condition.apply(game, source); if (conditionState) { diff --git a/Mage/src/mage/abilities/decorator/ConditionalRequirementEffect.java b/Mage/src/mage/abilities/decorator/ConditionalRequirementEffect.java index 9538e13f08c..6bfb6810893 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalRequirementEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalRequirementEffect.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.condition.FixedCondition; +import mage.abilities.condition.LockedInCondition; import mage.abilities.effects.RequirementEffect; import mage.constants.Duration; import mage.constants.EffectType; @@ -47,8 +48,9 @@ public class ConditionalRequirementEffect extends RequirementEffect { protected RequirementEffect effect; protected RequirementEffect otherwiseEffect; protected Condition condition; - protected boolean lockedInCondition; protected boolean conditionState; + protected Condition baseCondition; + protected boolean initDone = false; public ConditionalRequirementEffect(RequirementEffect effect, Condition condition) { this(Duration.WhileOnBattlefield, effect, condition, null, false); @@ -58,9 +60,8 @@ public class ConditionalRequirementEffect extends RequirementEffect { super(duration); this.effectType = EffectType.REQUIREMENT; this.effect = effect; - this.condition = condition; + this.baseCondition = condition; this.otherwiseEffect = otherwiseEffect; - this.lockedInCondition = lockedInCondition; } public ConditionalRequirementEffect(final ConditionalRequirementEffect effect) { @@ -70,14 +71,32 @@ public class ConditionalRequirementEffect extends RequirementEffect { this.otherwiseEffect = (RequirementEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; this.conditionState = effect.conditionState; + this.baseCondition = effect.baseCondition; + this.initDone = effect.initDone; + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (baseCondition instanceof LockedInCondition) { + condition = new FixedCondition(((LockedInCondition) baseCondition).getBaseCondition().apply(game, source)); + } else { + condition = baseCondition; + } + effect.setTargetPointer(this.targetPointer); + effect.init(source, game); + if (otherwiseEffect != null) { + otherwiseEffect.setTargetPointer(this.targetPointer); + otherwiseEffect.init(source, game); + } + initDone = true; } @Override public boolean applies(Permanent permanent, Ability source, Game game) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); + if (!initDone) { // if simpleStaticAbility, init won't be called + init(source, game); } conditionState = condition.apply(game, source); if (conditionState) { diff --git a/Mage/src/mage/abilities/decorator/ConditionalRestrictionEffect.java b/Mage/src/mage/abilities/decorator/ConditionalRestrictionEffect.java index 3183bb43a05..d829e3a85b4 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalRestrictionEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalRestrictionEffect.java @@ -31,6 +31,7 @@ package mage.abilities.decorator; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.condition.FixedCondition; +import mage.abilities.condition.LockedInCondition; import mage.abilities.effects.RestrictionEffect; import mage.constants.Duration; import mage.constants.EffectType; @@ -47,20 +48,20 @@ public class ConditionalRestrictionEffect extends RestrictionEffect { protected RestrictionEffect effect; protected RestrictionEffect otherwiseEffect; protected Condition condition; - protected boolean lockedInCondition; protected boolean conditionState; + protected Condition baseCondition; + protected boolean initDone = false; public ConditionalRestrictionEffect(RestrictionEffect effect, Condition condition) { - this(Duration.WhileOnBattlefield, effect, condition, null, false); + this(Duration.WhileOnBattlefield, effect, condition, null); } - public ConditionalRestrictionEffect(Duration duration, RestrictionEffect effect, Condition condition, RestrictionEffect otherwiseEffect, boolean lockedInCondition) { + public ConditionalRestrictionEffect(Duration duration, RestrictionEffect effect, Condition condition, RestrictionEffect otherwiseEffect) { super(duration); this.effectType = EffectType.RESTRICTION; this.effect = effect; - this.condition = condition; + this.baseCondition = condition; this.otherwiseEffect = otherwiseEffect; - this.lockedInCondition = lockedInCondition; } public ConditionalRestrictionEffect(final ConditionalRestrictionEffect effect) { @@ -70,14 +71,33 @@ public class ConditionalRestrictionEffect extends RestrictionEffect { this.otherwiseEffect = (RestrictionEffect) effect.otherwiseEffect.copy(); } this.condition = effect.condition; - this.lockedInCondition = effect.lockedInCondition; this.conditionState = effect.conditionState; + this.baseCondition = effect.baseCondition; + this.initDone = effect.initDone; } + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (baseCondition instanceof LockedInCondition) { + condition = new FixedCondition(((LockedInCondition) baseCondition).getBaseCondition().apply(game, source)); + } else { + condition = baseCondition; + } + effect.setTargetPointer(this.targetPointer); + effect.init(source, game); + if (otherwiseEffect != null) { + otherwiseEffect.setTargetPointer(this.targetPointer); + otherwiseEffect.init(source, game); + } + initDone = true; + } + + @Override public boolean applies(Permanent permanent, Ability source, Game game) { - if (lockedInCondition && !(condition instanceof FixedCondition)) { - condition = new FixedCondition(condition.apply(game, source)); + if (!initDone) { // if simpleStaticAbility, init won't be called + init(source, game); } conditionState = condition.apply(game, source); if (conditionState) { diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index e38a29fcad0..b7816fb78ac 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -31,13 +31,14 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { this.text = text; } - public ConditionalTriggeredAbility(ConditionalTriggeredAbility triggered) { + public ConditionalTriggeredAbility(final ConditionalTriggeredAbility triggered) { super(triggered); this.ability = triggered.ability; this.condition = triggered.condition; this.text = triggered.text; } - + + @Override public boolean checkInterveningIfClause(Game game) { return condition.apply(game, this); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index ddf7432c752..4b3ac95949a 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1957,6 +1957,11 @@ public abstract class PlayerImpl implements Player, Serializable { playable.add(ability); } } + LinkedHashMap useable = new LinkedHashMap<>(); + getOtherUseableActivatedAbilities(card, Zone.GRAVEYARD, game, useable); + for (Ability ability: useable.values()) { + playable.add(ability); + } } for (ExileZone exile : game.getExile().getExileZones()) { for (Card card : exile.getCards(game)) {