diff --git a/Mage.Sets/src/mage/sets/commander/TrenchGorger.java b/Mage.Sets/src/mage/sets/commander/TrenchGorger.java index cc5820767c1..b9ca2c24126 100644 --- a/Mage.Sets/src/mage/sets/commander/TrenchGorger.java +++ b/Mage.Sets/src/mage/sets/commander/TrenchGorger.java @@ -40,6 +40,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterLandCard; import mage.game.Game; @@ -100,13 +101,13 @@ class TrenchGorgerEffect extends OneShotEffect { TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, new FilterLandCard("any number of land cards")); target.choose(outcome, controller.getId(), controller.getId(), game); int count = 0; - for (UUID cardId: target.getTargets()) { + for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); count++; } controller.shuffleLibrary(game); - game.addEffect(new SetPowerToughnessSourceEffect(count, count, Duration.EndOfGame), source); + game.addEffect(new SetPowerToughnessSourceEffect(count, count, Duration.EndOfGame, SubLayer.SetPT_7b), source); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/commander2015/Gigantoplasm.java b/Mage.Sets/src/mage/sets/commander2015/Gigantoplasm.java index b0cbf221333..d7e6e9a85db 100644 --- a/Mage.Sets/src/mage/sets/commander2015/Gigantoplasm.java +++ b/Mage.Sets/src/mage/sets/commander2015/Gigantoplasm.java @@ -43,6 +43,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; @@ -83,9 +84,9 @@ class GigantoplasmApplyToPermanent extends ApplyToPermanent { @Override public Boolean apply(Game game, Permanent permanent) { DynamicValue variableMana = new ManacostVariableValue(); - Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield); + Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield, SubLayer.SetPT_7b); effect.setText("This creature has base power and toughness X/X"); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,effect, new ManaCostsImpl("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); permanent.getAbilities().add(ability); return true; } @@ -93,11 +94,11 @@ class GigantoplasmApplyToPermanent extends ApplyToPermanent { @Override public Boolean apply(Game game, MageObject mageObject) { DynamicValue variableMana = new ManacostVariableValue(); - Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield); + Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield, SubLayer.SetPT_7b); effect.setText("This creature has base power and toughness X/X"); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,effect, new ManaCostsImpl("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); mageObject.getAbilities().add(ability); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/eventide/BattlegateMimic.java b/Mage.Sets/src/mage/sets/eventide/BattlegateMimic.java index f109141e065..f531d0c82b0 100644 --- a/Mage.Sets/src/mage/sets/eventide/BattlegateMimic.java +++ b/Mage.Sets/src/mage/sets/eventide/BattlegateMimic.java @@ -39,6 +39,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; @@ -47,14 +48,14 @@ import mage.filter.predicate.mageobject.ColorPredicate; * @author jeffwadsworth */ public class BattlegateMimic extends CardImpl { - + private static final FilterSpell filter = new FilterSpell("a spell that's both red and white"); - + static { filter.add(new ColorPredicate(ObjectColor.RED)); filter.add(new ColorPredicate(ObjectColor.WHITE)); } - + private String rule = "Whenever you cast a spell that's both red and white, {this} has base power and toughness 4/2 and gains first strike until end of turn."; public BattlegateMimic(UUID ownerId) { @@ -66,10 +67,10 @@ public class BattlegateMimic extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a spell that's both red and white, Battlegate Mimic has base power and toughness 4/2 and gains first strike until end of turn. - Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 2, Duration.EndOfTurn), filter, false, rule); + Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 2, Duration.EndOfTurn, SubLayer.SetPT_7b), filter, false, rule); ability.addEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, false, true)); this.addAbility(ability); - + } public BattlegateMimic(final BattlegateMimic card) { diff --git a/Mage.Sets/src/mage/sets/eventide/NightskyMimic.java b/Mage.Sets/src/mage/sets/eventide/NightskyMimic.java index 195ba1f3771..4bb385b9af1 100644 --- a/Mage.Sets/src/mage/sets/eventide/NightskyMimic.java +++ b/Mage.Sets/src/mage/sets/eventide/NightskyMimic.java @@ -39,18 +39,19 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; /** * * @author jeffwadsworth - + * */ public class NightskyMimic extends CardImpl { - + private static final FilterSpell filter = new FilterSpell("a spell that's both black and green"); - + static { filter.add(new ColorPredicate(ObjectColor.WHITE)); filter.add(new ColorPredicate(ObjectColor.BLACK)); @@ -69,7 +70,7 @@ public class NightskyMimic extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a spell that's both white and black, Nightsky Mimic has base power and toughness 4/4 until end of turn and gains flying until end of turn. - Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 4, Duration.EndOfTurn), filter, false, rule); + Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 4, Duration.EndOfTurn, SubLayer.SetPT_7b), filter, false, rule); ability.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn, false, true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/eventide/RiverfallMimic.java b/Mage.Sets/src/mage/sets/eventide/RiverfallMimic.java index 43def6c29ad..e3c6f650e7c 100644 --- a/Mage.Sets/src/mage/sets/eventide/RiverfallMimic.java +++ b/Mage.Sets/src/mage/sets/eventide/RiverfallMimic.java @@ -39,23 +39,24 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; /** * * @author jeffwadsworth - + * */ public class RiverfallMimic extends CardImpl { - + private static final FilterSpell filter = new FilterSpell("a spell that's both blue and red"); - + static { filter.add(new ColorPredicate(ObjectColor.BLUE)); filter.add(new ColorPredicate(ObjectColor.RED)); } - + private String rule = "Whenever you cast a spell that's both blue and red, {this} has base power and toughness 3/3 until end of turn and can't be blocked this turn."; public RiverfallMimic(UUID ownerId) { @@ -69,7 +70,7 @@ public class RiverfallMimic extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a spell that's both blue and red, Riverfall Mimic has base power and toughness 3/3 until end of turn and can't be blocked this turn. - Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn), filter, false, rule); + Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn, SubLayer.SetPT_7b), filter, false, rule); ability.addEffect(new GainAbilitySourceEffect(new CantBeBlockedSourceAbility(), Duration.EndOfTurn, false, true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/eventide/ShorecrasherMimic.java b/Mage.Sets/src/mage/sets/eventide/ShorecrasherMimic.java index c4850c75cf4..41711f60d12 100644 --- a/Mage.Sets/src/mage/sets/eventide/ShorecrasherMimic.java +++ b/Mage.Sets/src/mage/sets/eventide/ShorecrasherMimic.java @@ -39,18 +39,19 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; /** * * @author jeffwadsworth - + * */ public class ShorecrasherMimic extends CardImpl { - + private static final FilterSpell filter = new FilterSpell("a spell that's both green and blue"); - + static { filter.add(new ColorPredicate(ObjectColor.GREEN)); filter.add(new ColorPredicate(ObjectColor.BLUE)); @@ -69,10 +70,10 @@ public class ShorecrasherMimic extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a spell that's both green and blue, Shorecrasher Mimic has base power and toughness 5/3 until end of turn and gains trample until end of turn. - Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(5, 3, Duration.EndOfTurn), filter, false, rule); + Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(5, 3, Duration.EndOfTurn, SubLayer.SetPT_7b), filter, false, rule); ability.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, false, true)); this.addAbility(ability); - + } public ShorecrasherMimic(final ShorecrasherMimic card) { diff --git a/Mage.Sets/src/mage/sets/eventide/WoodlurkerMimic.java b/Mage.Sets/src/mage/sets/eventide/WoodlurkerMimic.java index 59bf022dde0..92a514ea7aa 100644 --- a/Mage.Sets/src/mage/sets/eventide/WoodlurkerMimic.java +++ b/Mage.Sets/src/mage/sets/eventide/WoodlurkerMimic.java @@ -39,25 +39,26 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.ColorPredicate; /** * * @author jeffwadsworth - + * */ public class WoodlurkerMimic extends CardImpl { - + private static final FilterSpell filter = new FilterSpell("a spell that's both black and green"); - + static { filter.add(new ColorPredicate(ObjectColor.BLACK)); filter.add(new ColorPredicate(ObjectColor.GREEN)); } private String rule = "Whenever you cast a spell that's both black and green, {this} has base power and toughness 4/5 until end of turn and gains wither until end of turn."; - + public WoodlurkerMimic(UUID ownerId) { super(ownerId, 130, "Woodlurker Mimic", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B/G}"); this.expansionSetCode = "EVE"; @@ -69,10 +70,10 @@ public class WoodlurkerMimic extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a spell that's both black and green, Woodlurker Mimic has base power and toughness 4/5 until end of turn and gains wither until end of turn. - Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 5, Duration.EndOfTurn), filter, false, rule); + Ability ability = new SpellCastControllerTriggeredAbility(new SetPowerToughnessSourceEffect(4, 5, Duration.EndOfTurn, SubLayer.SetPT_7b), filter, false, rule); ability.addEffect(new GainAbilitySourceEffect(WitherAbility.getInstance(), Duration.EndOfTurn, false, true)); this.addAbility(ability); - + } public WoodlurkerMimic(final WoodlurkerMimic card) { diff --git a/Mage.Sets/src/mage/sets/exodus/EntropicSpecter.java b/Mage.Sets/src/mage/sets/exodus/EntropicSpecter.java index b2e6ebf7cca..acbe6da3679 100644 --- a/Mage.Sets/src/mage/sets/exodus/EntropicSpecter.java +++ b/Mage.Sets/src/mage/sets/exodus/EntropicSpecter.java @@ -44,6 +44,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -70,7 +71,7 @@ public class EntropicSpecter extends CardImpl { this.addAbility(new AsEntersBattlefieldAbility(new ChooseOpponentEffect(Outcome.Detriment))); // Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. - this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInTargetPlayerHandCount(), Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInTargetPlayerHandCount(), Duration.WhileOnBattlefield, SubLayer.SetPT_7b))); // Whenever Entropic Specter deals damage to a player, that player discards a card. this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1, false), false, true)); diff --git a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java index 9ac15c4a2c1..6057b91fbc4 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java +++ b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java @@ -43,6 +43,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; @@ -151,7 +152,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } - game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom), source); + game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); } return false; diff --git a/Mage.Sets/src/mage/sets/iceage/Lhurgoyf.java b/Mage.Sets/src/mage/sets/iceage/Lhurgoyf.java index f927d789a56..7f7bcacc82a 100644 --- a/Mage.Sets/src/mage/sets/iceage/Lhurgoyf.java +++ b/Mage.Sets/src/mage/sets/iceage/Lhurgoyf.java @@ -28,17 +28,19 @@ package mage.sets.iceage; import java.util.UUID; - -import mage.constants.*; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount; import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.players.Player; @@ -71,17 +73,13 @@ public class Lhurgoyf extends CardImpl { } } - - class LhurgoyfEffect extends ContinuousEffectImpl { - public LhurgoyfEffect() { - super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.SetPT_7b, Outcome.BoostCreature); + super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.CharacteristicDefining_7a, Outcome.BoostCreature); staticText = "{this}'s power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1"; } - public LhurgoyfEffect(final LhurgoyfEffect effect) { super(effect); } diff --git a/Mage.Sets/src/mage/sets/innistrad/TreeOfRedemption.java b/Mage.Sets/src/mage/sets/innistrad/TreeOfRedemption.java index f5a37fb5ce7..b20abba0013 100644 --- a/Mage.Sets/src/mage/sets/innistrad/TreeOfRedemption.java +++ b/Mage.Sets/src/mage/sets/innistrad/TreeOfRedemption.java @@ -28,11 +28,6 @@ package mage.sets.innistrad; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -41,6 +36,12 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -94,14 +95,17 @@ class TreeOfRedemptionEffect extends OneShotEffect { if (perm != null) { int amount = perm.getToughness().getValue(); int life = player.getLife(); - if (life == amount) + if (life == amount) { return false; - if (life < amount && !player.isCanGainLife()) + } + if (life < amount && !player.isCanGainLife()) { return false; - if (life > amount && !player.isCanLoseLife()) + } + if (life > amount && !player.isCanLoseLife()) { return false; + } player.setLife(amount, game); - game.addEffect(new SetPowerToughnessSourceEffect(Integer.MIN_VALUE, life, Duration.WhileOnBattlefield), source); + game.addEffect(new SetPowerToughnessSourceEffect(Integer.MIN_VALUE, life, Duration.WhileOnBattlefield, SubLayer.SetPT_7b), source); return true; } } @@ -113,4 +117,4 @@ class TreeOfRedemptionEffect extends OneShotEffect { return new TreeOfRedemptionEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java index 65428a838bb..719eca0111e 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java +++ b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java @@ -41,6 +41,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -54,6 +55,7 @@ import mage.target.common.TargetControlledPermanent; public class MarshFlitter extends CardImpl { private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Goblin"); + static { filter.add(new SubtypePredicate("Goblin")); } @@ -72,7 +74,7 @@ public class MarshFlitter extends CardImpl { // When Marsh Flitter enters the battlefield, put two 1/1 black Goblin Rogue creature tokens onto the battlefield. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinRogueToken(), 2), false)); // Sacrifice a Goblin: Marsh Flitter has base power and toughness 3/3 until end of turn. - Effect effect = new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn); + Effect effect = new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn, SubLayer.SetPT_7b); effect.setText("{this} has base power and toughness 3/3 until end of turn"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new SacrificeTargetCost(new TargetControlledPermanent(filter))); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java index 55b7eb6adb2..273836df79d 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java +++ b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java @@ -43,6 +43,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; @@ -152,7 +153,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } - game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom), source); + game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); } return false; diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java index 51cddc6978c..8ce0408692b 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java @@ -39,6 +39,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -56,14 +57,13 @@ public class ShapeStealer extends CardImpl { this.subtype.add("Spirit"); this.power = new MageInt(1); this.toughness = new MageInt(1); - - // This ability triggers once for each creature blocked by or blocking Shape Stealer. + + // This ability triggers once for each creature blocked by or blocking Shape Stealer. // If multiple creatures block it, Shape Stealer's power and toughness will change for // each one in succession. The first trigger put on the stack will be the last to resolve, // so that will set Shape Stealer's final power and toughness. - // Whenever Shape Stealer blocks or becomes blocked by a creature, change Shape Stealer's base power and toughness to that creature's power and toughness until end of turn. - this.addAbility(new BlocksOrBecomesBlockedByCreatureTriggeredAbility(new ShapeStealerEffect(), false)); + this.addAbility(new BlocksOrBecomesBlockedByCreatureTriggeredAbility(new ShapeStealerEffect(), false)); } public ShapeStealer(final ShapeStealer card) { @@ -77,28 +77,28 @@ public class ShapeStealer extends CardImpl { } class ShapeStealerEffect extends OneShotEffect { - + public ShapeStealerEffect() { super(Outcome.Detriment); this.staticText = "change {this}'s base power and toughness to that creature's power and toughness until end of turn"; } - + public ShapeStealerEffect(final ShapeStealerEffect effect) { super(effect); } - + @Override public ShapeStealerEffect copy() { return new ShapeStealerEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); if (permanent != null) { - ContinuousEffect effect = new SetPowerToughnessSourceEffect(permanent.getPower().getValue(), permanent.getToughness().getValue(), Duration.EndOfTurn); + ContinuousEffect effect = new SetPowerToughnessSourceEffect(permanent.getPower().getValue(), permanent.getToughness().getValue(), Duration.EndOfTurn, SubLayer.SetPT_7b); game.addEffect(effect, source); return true; } diff --git a/Mage.Sets/src/mage/sets/tempest/Dracoplasm.java b/Mage.Sets/src/mage/sets/tempest/Dracoplasm.java index 8776797ba03..914dd47cd6d 100644 --- a/Mage.Sets/src/mage/sets/tempest/Dracoplasm.java +++ b/Mage.Sets/src/mage/sets/tempest/Dracoplasm.java @@ -44,6 +44,7 @@ import mage.constants.ColoredManaSymbol; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; @@ -141,7 +142,7 @@ class DracoplasmEffect extends ReplacementEffectImpl { toughness += targetCreature.getToughness().getValue(); } } - ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom); + ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b); game.addEffect(effect, source); } } diff --git a/Mage.Sets/src/mage/sets/zendikar/Gigantiform.java b/Mage.Sets/src/mage/sets/zendikar/Gigantiform.java index d4f19449b93..52cf4888409 100644 --- a/Mage.Sets/src/mage/sets/zendikar/Gigantiform.java +++ b/Mage.Sets/src/mage/sets/zendikar/Gigantiform.java @@ -48,6 +48,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; @@ -100,7 +101,7 @@ class GigantiformAbility extends StaticAbility { public GigantiformAbility() { super(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA)); - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new SetPowerToughnessSourceEffect(8, 8, Duration.WhileOnBattlefield)); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new SetPowerToughnessSourceEffect(8, 8, Duration.WhileOnBattlefield, SubLayer.SetPT_7b)); this.addEffect(new GainAbilityAttachedEffect(ability, AttachmentType.AURA)); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/HumilityTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/HumilityTest.java new file mode 100644 index 00000000000..e8fdbcb958a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/HumilityTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.replacement; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class HumilityTest extends CardTestPlayerBase { + + /** + * During a commander game both were on the battlefield, and Masumaro's P/T + * was not displaying as 1/1. + */ + @Test + public void testHumilityAndMasumaro() { + + // Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand. + addCard(Zone.BATTLEFIELD, playerB, "Masumaro, First to Live"); + + // Enchantment {2}{W}{W} + // All creatures lose all abilities and are 1/1. + addCard(Zone.BATTLEFIELD, playerA, "Humility"); + + addCard(Zone.HAND, playerB, "Plains", 3); + + setStopAt(1, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPowerToughness(playerB, "Masumaro, First to Live", 1, 1); + + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index e5978b008f0..6e85c699d7c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -865,6 +865,24 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement Assert.assertEquals("(Graveyard " + player.getName() + ") Card counts are not equal (" + cardName + ")", count, actualCount); } + /** + * Assert card count in player's library. + * + * @param player {@link Player} who's library should be counted. + * @param cardName Name of the cards that should be counted. + * @param count Expected count. + */ + public void assertLibraryCount(Player player, String cardName, int count) throws AssertionError { + int actualCount = 0; + for (Card card : player.getLibrary().getCards(currentGame)) { + if (card.getName().equals(cardName)) { + actualCount++; + } + } + + Assert.assertEquals("(Library " + player.getName() + ") Card counts are not equal (" + cardName + ")", count, actualCount); + } + /** * Asserts added actions count. Usefull to make sure that all actions were * executed. diff --git a/Mage/src/mage/abilities/common/PutIntoGraveFromAnywhereSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/PutIntoGraveFromAnywhereSourceTriggeredAbility.java index 96fae22b3b7..4a2ec10503a 100644 --- a/Mage/src/mage/abilities/common/PutIntoGraveFromAnywhereSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/PutIntoGraveFromAnywhereSourceTriggeredAbility.java @@ -7,6 +7,7 @@ import mage.constants.Zone; * @author Loki */ public class PutIntoGraveFromAnywhereSourceTriggeredAbility extends ZoneChangeTriggeredAbility { + public PutIntoGraveFromAnywhereSourceTriggeredAbility(Effect effect, boolean optional) { super(Zone.GRAVEYARD, effect, "When {this} is put into a graveyard from anywhere, ", optional); } diff --git a/Mage/src/mage/abilities/effects/common/continuous/SetPowerToughnessSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/SetPowerToughnessSourceEffect.java index 1c2e3dbc87a..85333968831 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/SetPowerToughnessSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/SetPowerToughnessSourceEffect.java @@ -48,13 +48,21 @@ public class SetPowerToughnessSourceEffect extends ContinuousEffectImpl { private int toughness; public SetPowerToughnessSourceEffect(DynamicValue amount, Duration duration) { - super(duration, Layer.PTChangingEffects_7, SubLayer.SetPT_7b, Outcome.BoostCreature); + this(amount, duration, SubLayer.CharacteristicDefining_7a); + } + + public SetPowerToughnessSourceEffect(DynamicValue amount, Duration duration, SubLayer subLayer) { + super(duration, Layer.PTChangingEffects_7, subLayer, Outcome.BoostCreature); this.amount = amount; staticText = "{this}'s power and toughness are each equal to the number of " + amount.getMessage(); } public SetPowerToughnessSourceEffect(int power, int toughness, Duration duration) { - super(duration, Layer.PTChangingEffects_7, SubLayer.SetPT_7b, Outcome.BoostCreature); + this(power, toughness, duration, SubLayer.CharacteristicDefining_7a); + } + + public SetPowerToughnessSourceEffect(int power, int toughness, Duration duration, SubLayer subLayer) { + super(duration, Layer.PTChangingEffects_7, subLayer, Outcome.BoostCreature); this.power = power; this.toughness = toughness; staticText = "{this}'s power and toughness is " + power + "/" + toughness + " " + duration.toString(); diff --git a/Mage/src/mage/abilities/keyword/LevelerCardBuilder.java b/Mage/src/mage/abilities/keyword/LevelerCardBuilder.java index a5691ed3222..950d40d0088 100644 --- a/Mage/src/mage/abilities/keyword/LevelerCardBuilder.java +++ b/Mage/src/mage/abilities/keyword/LevelerCardBuilder.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,15 +20,15 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.keyword; -import mage.constants.Zone; +import java.util.ArrayList; +import java.util.List; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; import mage.abilities.Ability; @@ -39,18 +39,17 @@ import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; -import mage.cards.Card; -import mage.cards.LevelerCard; import mage.constants.Duration; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.counters.CounterType; -import java.util.ArrayList; -import java.util.List; - /** - * The implementation by BetaSteward was discarded as requires special handling in Mage.Core. + * The implementation by BetaSteward was discarded as requires special handling + * in Mage.Core. * - * Instead it was replaced by conditional continuous effects and builder pattern. + * Instead it was replaced by conditional continuous effects and builder + * pattern. * * @author BetaSteward_at_googlemail.com * @author noxx @@ -82,7 +81,7 @@ public class LevelerCardBuilder { constructed.add(staticAbility); } - ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.WhileOnBattlefield); + ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.WhileOnBattlefield, SubLayer.SetPT_7b); ConditionalContinuousEffect ptEffect = new ConditionalContinuousEffect(effect, condition, rule); constructed.add(new SimpleStaticAbility(Zone.BATTLEFIELD, ptEffect)); @@ -212,12 +211,11 @@ public class LevelerCardBuilder { sb.append("Level ").append(level1); if (level2 == -1) { sb.append("+"); - } - else { + } else { sb.append("-").append(level2); } sb.append(": ").append(power).append("/").append(toughness).append(" "); - for (String rule: abilities.getRules("{this}")) { + for (String rule : abilities.getRules("{this}")) { sb.append(rule).append(" "); } return sb.toString(); diff --git a/Mage/src/mage/game/stack/Spell.java b/Mage/src/mage/game/stack/Spell.java index 58d81e3fe6e..9e09c8d7ebb 100644 --- a/Mage/src/mage/game/stack/Spell.java +++ b/Mage/src/mage/game/stack/Spell.java @@ -328,8 +328,13 @@ public class Spell extends StackObjImpl implements Card { @Override public void counter(UUID sourceId, Game game) { + this.counter(sourceId, game, true); + } + + @Override + public void counter(UUID sourceId, Game game, boolean moveToGraveyard) { this.countered = true; - if (!isCopiedSpell()) { + if (!isCopiedSpell() && moveToGraveyard) { Player player = game.getPlayer(getControllerId()); if (player != null) { Ability counteringAbility = null; @@ -337,7 +342,7 @@ public class Spell extends StackObjImpl implements Card { if (counteringObject instanceof StackObject) { counteringAbility = ((StackObject) counteringObject).getStackAbility(); } - player.moveCards(card, Zone.STACK, Zone.GRAVEYARD, counteringAbility, game); + player.moveCards(card, Zone.GRAVEYARD, counteringAbility, game); } } } @@ -662,11 +667,7 @@ public class Spell extends StackObjImpl implements Card { if (this.isCopiedSpell() && !zone.equals(Zone.STACK)) { return true; } - Card card = game.getCard(getSourceId()); - if (card != null) { - return card.moveToZone(zone, sourceId, game, flag, appliedEffects); - } - throw new UnsupportedOperationException("Unsupported operation"); + return card.moveToZone(zone, sourceId, game, flag, appliedEffects); } @Override diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index b23de503454..c437795c271 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -122,6 +122,11 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public void counter(UUID sourceId, Game game) { + this.counter(sourceId, game, true); + } + + @Override + public void counter(UUID sourceId, Game game, boolean moveToGraveyard) { //20100716 - 603.8 if (ability instanceof StateTriggeredAbility) { ((StateTriggeredAbility) ability).counter(game); diff --git a/Mage/src/mage/game/stack/StackObject.java b/Mage/src/mage/game/stack/StackObject.java index ce408387aa5..db3753f1474 100644 --- a/Mage/src/mage/game/stack/StackObject.java +++ b/Mage/src/mage/game/stack/StackObject.java @@ -1,31 +1,30 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright notice, this list -* of conditions and the following disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR -* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* The views and conclusions contained in the software and documentation are those of the -* authors and should not be interpreted as representing official policies, either expressed -* or implied, of BetaSteward_at_googlemail.com. -*/ - + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ package mage.game.stack; import java.util.UUID; @@ -38,11 +37,19 @@ import mage.game.Game; public interface StackObject extends MageObject, Controllable { boolean resolve(Game game); + UUID getSourceId(); + void counter(UUID sourceId, Game game); + + void counter(UUID sourceId, Game game, boolean moveToGraveyard); + Ability getStackAbility(); + int getConvertedManaCost(); + boolean chooseNewTargets(Game game, UUID playerId, boolean forceChange, boolean onlyOneTarget, FilterPermanent filterNewTarget); + @Override StackObject copy(); }