diff --git a/Mage.Sets/src/mage/sets/commander2013/MarathWillOfTheWild.java b/Mage.Sets/src/mage/sets/commander2013/MarathWillOfTheWild.java index f24bb796b4..f56934af52 100644 --- a/Mage.Sets/src/mage/sets/commander2013/MarathWillOfTheWild.java +++ b/Mage.Sets/src/mage/sets/commander2013/MarathWillOfTheWild.java @@ -158,8 +158,8 @@ class MarathWillOfTheWildCreateTokenEffect extends OneShotEffect { if (player != null) { int amount = new ManacostVariableValue().calculate(game, source, this); Token token = new MarathWillOfTheWildElementalToken(); - token.getPower().initValue(amount); - token.getToughness().initValue(amount); + token.getPower().modifyBaseValue(amount); + token.getToughness().modifyBaseValue(amount); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java b/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java index fc3441c4d5..0bdba0a96c 100644 --- a/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java +++ b/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java @@ -113,8 +113,8 @@ class WireflyToken extends Token { WireflyToken() { super("Wirefly", "2/2 colorless Insect artifact creature token named Wirefly"); this.setOriginalExpansionSetCode("DST"); - this.getPower().initValue(2); - this.getToughness().initValue(2); + this.getPower().modifyBaseValue(2); + this.getToughness().modifyBaseValue(2); this.getSubtype().add("Insect"); this.getCardType().add(CardType.ARTIFACT); this.getCardType().add(CardType.CREATURE); diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/IdentityThief.java b/Mage.Sets/src/mage/sets/eldritchmoon/IdentityThief.java index 9e9400b86c..12cbb8c3b6 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/IdentityThief.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/IdentityThief.java @@ -106,10 +106,7 @@ class IdentityThiefAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getSourceId().equals(this.getSourceId())) { - return true; - } - return false; + return event.getSourceId().equals(this.getSourceId()); } @Override @@ -141,7 +138,11 @@ class IdentityThiefEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && permanent != null && sourcePermanent != null) { - CopyEffect copyEffect = new CopyEffect(Duration.EndOfTurn, permanent, source.getSourceId()); + Permanent permanentReset = permanent.copy(); + permanentReset.getCounters().clear(); + permanentReset.getPower().resetToBaseValue(); + permanentReset.getToughness().resetToBaseValue(); + CopyEffect copyEffect = new CopyEffect(Duration.EndOfTurn, permanentReset, source.getSourceId()); if (controller.moveCardToExileWithInfo(permanent, source.getSourceId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) { // Copy exiled permanent game.addEffect(copyEffect, source); diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/TreeOfPerdition.java b/Mage.Sets/src/mage/sets/eldritchmoon/TreeOfPerdition.java index b0fb21ace2..9e0b05f8d8 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/TreeOfPerdition.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/TreeOfPerdition.java @@ -33,14 +33,11 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; 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; @@ -108,7 +105,9 @@ class TreeOfPerditionEffect extends OneShotEffect { return false; } opponent.setLife(amount, game); - game.addEffect(new SetPowerToughnessSourceEffect(Integer.MIN_VALUE, life, Duration.Custom, SubLayer.SetPT_7b), source); + perm.getPower().modifyBaseValue(life); + perm.getToughness().modifyBaseValue(life); + // game.addEffect(new SetPowerToughnessSourceEffect(Integer.MIN_VALUE, life, Duration.Custom, SubLayer.SetPT_7b), source); return true; } } diff --git a/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java b/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java index 9fc07352c2..eac5d491f8 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java +++ b/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java @@ -82,8 +82,8 @@ class CamaridToken extends Token { CamaridToken() { super("Camarid", "1/1 blue Camarid creature tokens"); this.setOriginalExpansionSetCode("FEM"); - this.getPower().initValue(1); - this.getToughness().initValue(1); + this.getPower().modifyBaseValue(1); + this.getToughness().modifyBaseValue(1); this.color.setBlue(true); this.getSubtype().add("Camarid"); this.getCardType().add(CardType.CREATURE); diff --git a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java index 6057b91fbc..eb7f8e61a6 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java +++ b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -43,7 +42,6 @@ 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 +150,9 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } - game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); + permanent.getPower().modifyBaseValue(power); + permanent.getToughness().modifyBaseValue(toughness); + // game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); } return false; diff --git a/Mage.Sets/src/mage/sets/gatecrash/MimingSlime.java b/Mage.Sets/src/mage/sets/gatecrash/MimingSlime.java index a6c1216c76..1146f4d423 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/MimingSlime.java +++ b/Mage.Sets/src/mage/sets/gatecrash/MimingSlime.java @@ -1,117 +1,117 @@ -/* - * 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.sets.gatecrash; - -import java.util.List; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.cards.CardImpl; -import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.permanent.token.Token; -import mage.players.Player; - -/** - * - * @author LevelX2 - */ -public class MimingSlime extends CardImpl { - - public MimingSlime(UUID ownerId) { - super(ownerId, 126, "Miming Slime", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); - this.expansionSetCode = "GTC"; - - // Put an X/X green Ooze creature token onto the battlefield, where X is the greatest power among creatures you control. - this.getSpellAbility().addEffect(new MimingSlimeEffect()); - } - - public MimingSlime(final MimingSlime card) { - super(card); - } - - @Override - public MimingSlime copy() { - return new MimingSlime(this); - } -} - -class MimingSlimeEffect extends OneShotEffect { - - public MimingSlimeEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "Put an X/X green Ooze creature token onto the battlefield, where X is the greatest power among creatures you control"; - } - - public MimingSlimeEffect(final MimingSlimeEffect effect) { - super(effect); - } - - @Override - public MimingSlimeEffect copy() { - return new MimingSlimeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - List creatures = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game); - int amount = 0; - for (Permanent creature : creatures) { - int power = creature.getPower().getValue(); - if (amount < power) { - amount = power; - } - } - OozeToken oozeToken = new OozeToken(); - oozeToken.getPower().initValue(amount); - oozeToken.getToughness().initValue(amount); - oozeToken.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - return true; - } - return false; - } -} - -class OozeToken extends Token { - public OozeToken() { - super("Ooze", "X/X green Ooze creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Ooze"); - color.setGreen(true); - power = new MageInt(0); - toughness = new MageInt(0); - setOriginalExpansionSetCode("RTR"); - } -} +/* + * 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.sets.gatecrash; + +import java.util.List; +import java.util.UUID; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.Token; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class MimingSlime extends CardImpl { + + public MimingSlime(UUID ownerId) { + super(ownerId, 126, "Miming Slime", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); + this.expansionSetCode = "GTC"; + + // Put an X/X green Ooze creature token onto the battlefield, where X is the greatest power among creatures you control. + this.getSpellAbility().addEffect(new MimingSlimeEffect()); + } + + public MimingSlime(final MimingSlime card) { + super(card); + } + + @Override + public MimingSlime copy() { + return new MimingSlime(this); + } +} + +class MimingSlimeEffect extends OneShotEffect { + + public MimingSlimeEffect() { + super(Outcome.PutCreatureInPlay); + staticText = "Put an X/X green Ooze creature token onto the battlefield, where X is the greatest power among creatures you control"; + } + + public MimingSlimeEffect(final MimingSlimeEffect effect) { + super(effect); + } + + @Override + public MimingSlimeEffect copy() { + return new MimingSlimeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + List creatures = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game); + int amount = 0; + for (Permanent creature : creatures) { + int power = creature.getPower().getValue(); + if (amount < power) { + amount = power; + } + } + OozeToken oozeToken = new OozeToken(); + oozeToken.getPower().modifyBaseValue(amount); + oozeToken.getToughness().modifyBaseValue(amount); + oozeToken.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + return true; + } + return false; + } +} + +class OozeToken extends Token { + public OozeToken() { + super("Ooze", "X/X green Ooze creature token"); + cardType.add(CardType.CREATURE); + subtype.add("Ooze"); + color.setGreen(true); + power = new MageInt(0); + toughness = new MageInt(0); + setOriginalExpansionSetCode("RTR"); + } +} diff --git a/Mage.Sets/src/mage/sets/gatecrash/OozeFlux.java b/Mage.Sets/src/mage/sets/gatecrash/OozeFlux.java index 8fdb455bce..074fec116f 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/OozeFlux.java +++ b/Mage.Sets/src/mage/sets/gatecrash/OozeFlux.java @@ -1,109 +1,109 @@ -/* - * 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.sets.gatecrash; - -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.RemoveVariableCountersTargetCost; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; -import mage.cards.CardImpl; -import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; -import mage.game.permanent.token.Token; - -/** - * - * @author LevelX2 - */ -public class OozeFlux extends CardImpl { - - public OozeFlux(UUID ownerId) { - super(ownerId, 128, "Ooze Flux", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); - this.expansionSetCode = "GTC"; - - // {1}{G}, Remove one or more +1/+1 counters from among creatures you control: Put an X/X green Ooze creature token onto the battlefield, where X is the number of +1/+1 counters removed this way. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new OozeFluxCreateTokenEffect(new OozeToken()),new ManaCostsImpl("{1}{G}")); - ability.addCost(new RemoveVariableCountersTargetCost(new FilterControlledCreaturePermanent("creatures you control"), CounterType.P1P1, "one or more", 1)); - this.addAbility(ability); - } - - public OozeFlux(final OozeFlux card) { - super(card); - } - - @Override - public OozeFlux copy() { - return new OozeFlux(this); - } -} - -class OozeFluxCreateTokenEffect extends OneShotEffect { - - private final Token token; - - public OozeFluxCreateTokenEffect(Token token) { - super(Outcome.PutCreatureInPlay); - this.token = token; - staticText = "Put an X/X green Ooze creature token onto the battlefield, where X is the number of +1/+1 counters removed this way"; - } - - public OozeFluxCreateTokenEffect(final OozeFluxCreateTokenEffect effect) { - super(effect); - this.token = effect.token.copy(); - } - - @Override - public OozeFluxCreateTokenEffect copy() { - return new OozeFluxCreateTokenEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int xValue = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof RemoveVariableCountersTargetCost) { - xValue = ((RemoveVariableCountersTargetCost) cost).getAmount(); - break; - } - } - Token tokenCopy = token.copy(); - tokenCopy.getAbilities().newId(); - tokenCopy.getPower().initValue(xValue); - tokenCopy.getToughness().initValue(xValue); - tokenCopy.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - return true; - } -} +/* + * 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.sets.gatecrash; + +import java.util.UUID; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.RemoveVariableCountersTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.token.Token; + +/** + * + * @author LevelX2 + */ +public class OozeFlux extends CardImpl { + + public OozeFlux(UUID ownerId) { + super(ownerId, 128, "Ooze Flux", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); + this.expansionSetCode = "GTC"; + + // {1}{G}, Remove one or more +1/+1 counters from among creatures you control: Put an X/X green Ooze creature token onto the battlefield, where X is the number of +1/+1 counters removed this way. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new OozeFluxCreateTokenEffect(new OozeToken()),new ManaCostsImpl("{1}{G}")); + ability.addCost(new RemoveVariableCountersTargetCost(new FilterControlledCreaturePermanent("creatures you control"), CounterType.P1P1, "one or more", 1)); + this.addAbility(ability); + } + + public OozeFlux(final OozeFlux card) { + super(card); + } + + @Override + public OozeFlux copy() { + return new OozeFlux(this); + } +} + +class OozeFluxCreateTokenEffect extends OneShotEffect { + + private final Token token; + + public OozeFluxCreateTokenEffect(Token token) { + super(Outcome.PutCreatureInPlay); + this.token = token; + staticText = "Put an X/X green Ooze creature token onto the battlefield, where X is the number of +1/+1 counters removed this way"; + } + + public OozeFluxCreateTokenEffect(final OozeFluxCreateTokenEffect effect) { + super(effect); + this.token = effect.token.copy(); + } + + @Override + public OozeFluxCreateTokenEffect copy() { + return new OozeFluxCreateTokenEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int xValue = 0; + for (Cost cost : source.getCosts()) { + if (cost instanceof RemoveVariableCountersTargetCost) { + xValue = ((RemoveVariableCountersTargetCost) cost).getAmount(); + break; + } + } + Token tokenCopy = token.copy(); + tokenCopy.getAbilities().newId(); + tokenCopy.getPower().modifyBaseValue(xValue); + tokenCopy.getToughness().modifyBaseValue(xValue); + tokenCopy.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java b/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java index 12b236a2a1..1600dac4b5 100644 --- a/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java +++ b/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java @@ -91,8 +91,8 @@ class SkeletonToken extends Token { SkeletonToken() { super("Skeleton", "1/1 black Skeleton creature token onto the battlefield. It has \"{B}: Regenerate this creature.\""); this.setOriginalExpansionSetCode("HML"); - this.getPower().initValue(1); - this.getToughness().initValue(1); + this.getPower().modifyBaseValue(1); + this.getToughness().modifyBaseValue(1); this.color.setBlack(true); this.getSubtype().add("Skeleton"); this.getCardType().add(CardType.CREATURE); diff --git a/Mage.Sets/src/mage/sets/innistrad/EssenceOfTheWild.java b/Mage.Sets/src/mage/sets/innistrad/EssenceOfTheWild.java index 982232021c..7372a9e86b 100644 --- a/Mage.Sets/src/mage/sets/innistrad/EssenceOfTheWild.java +++ b/Mage.Sets/src/mage/sets/innistrad/EssenceOfTheWild.java @@ -99,7 +99,11 @@ class EssenceOfTheWildEffect extends ReplacementEffectImpl { public boolean replaceEvent(GameEvent event, Ability source, Game game) { Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourceObject != null) { - game.addEffect(new CopyEffect(Duration.Custom, sourceObject, event.getTargetId()), source); + Permanent permanentReset = sourceObject.copy(); + permanentReset.getCounters().clear(); + permanentReset.getPower().resetToBaseValue(); + permanentReset.getToughness().resetToBaseValue(); + game.addEffect(new CopyEffect(Duration.Custom, permanentReset, event.getTargetId()), source); } return false; } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/PharikaGodOfAffliction.java b/Mage.Sets/src/mage/sets/journeyintonyx/PharikaGodOfAffliction.java index 7b30c6509c..5f968091fc 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/PharikaGodOfAffliction.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/PharikaGodOfAffliction.java @@ -73,14 +73,13 @@ public class PharikaGodOfAffliction extends CardImpl { // As long as your devotion to black and green is less than seven, Pharika isn't a creature. Effect effect = new LoseCreatureTypeSourceEffect(new DevotionCount(ColoredManaSymbol.B, ColoredManaSymbol.G), 7); effect.setText("As long as your devotion to black and green is less than seven, Pharika isn't a creature"); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); // {B}{G}: Exile target creature card from a graveyard. It's owner puts a 1/1 black and green Snake enchantment creature token with deathtouch onto the battlefield. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PharikaExileEffect(), new ManaCostsImpl("{B}{G}")); Target target = new TargetCardInGraveyard(new FilterCreatureCard("a creature card from a graveyard")); ability.addTarget(target); this.addAbility(ability); - - + } public PharikaGodOfAffliction(final PharikaGodOfAffliction card) { @@ -98,7 +97,7 @@ class PharikaExileEffect extends OneShotEffect { public PharikaExileEffect() { super(Outcome.PutCreatureInPlay); staticText = "Exile target creature card from a graveyard. It's owner puts a 1/1 black and green Snake enchantment creature token with deathtouch onto the battlefield"; - } + } public PharikaExileEffect(final PharikaExileEffect effect) { super(effect); @@ -116,8 +115,8 @@ class PharikaExileEffect extends OneShotEffect { Player tokenController = game.getPlayer(targetCard.getOwnerId()); if (tokenController != null) { return new PharikaSnakeToken().putOntoBattlefield(1, game, source.getSourceId(), tokenController.getId()); - } - } + } + } } return false; } @@ -132,15 +131,13 @@ class PharikaExileEffect extends OneShotEffect { class PharikaSnakeToken extends Token { public PharikaSnakeToken() { - super("Snake", "1/1 black and green Snake enchantment creature token with deathtouch"); + super("Snake", "1/1 black and green Snake enchantment creature token with deathtouch", 1, 1); this.setOriginalExpansionSetCode("JOU"); cardType.add(CardType.ENCHANTMENT); cardType.add(CardType.CREATURE); subtype.add("Snake"); color.setBlack(true); color.setGreen(true); - power.setValue(1); - toughness.setValue(1); this.addAbility(DeathtouchAbility.getInstance()); } } diff --git a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java index 0bb8806720..a0c75b4138 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java @@ -134,8 +134,8 @@ class NissaSageAnimistToken extends Token { super("Ashaya, the Awoken World", "legendary 4/4 green Elemental creature token named Ashaya, the Awoken World"); this.setOriginalExpansionSetCode("ORI"); this.getSupertype().add("Legendary"); - this.getPower().initValue(4); - this.getToughness().initValue(4); + this.getPower().modifyBaseValue(4); + this.getToughness().modifyBaseValue(4); this.color.setGreen(true); this.getSubtype().add("Elemental"); this.getCardType().add(CardType.CREATURE); diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java index 320df19d47..22646d8a79 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java @@ -81,8 +81,8 @@ public class PhyrexianRebirth extends CardImpl { count += permanent.destroy(source.getSourceId(), game, false) ? 1 : 0; } HorrorToken horrorToken = new HorrorToken(); - horrorToken.getPower().initValue(count); - horrorToken.getToughness().initValue(count); + horrorToken.getPower().modifyBaseValue(count); + horrorToken.getToughness().modifyBaseValue(count); horrorToken.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java index d833505128..f798f676eb 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java +++ b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java @@ -74,8 +74,8 @@ class CatWarriorToken extends Token { CatWarriorToken() { super("Cat Warrior", "2/2 green Cat Warrior creature token with forestwalk"); this.setOriginalExpansionSetCode("PLC"); - this.getPower().initValue(2); - this.getToughness().initValue(2); + this.getPower().modifyBaseValue(2); + this.getToughness().modifyBaseValue(2); this.color.setGreen(true); this.getSubtype().add("Cat"); this.getSubtype().add("Warrior"); diff --git a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java index 4dc8803fc8..00c173a7ff 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java +++ b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -43,7 +42,6 @@ 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; @@ -153,7 +151,9 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } - game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); + permanent.getPower().modifyBaseValue(power); + permanent.getToughness().modifyBaseValue(toughness); + // game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b), source); } return false; diff --git a/Mage.Sets/src/mage/sets/ravnica/MoltenSentry.java b/Mage.Sets/src/mage/sets/ravnica/MoltenSentry.java index 53b7012a2c..2090222a81 100644 --- a/Mage.Sets/src/mage/sets/ravnica/MoltenSentry.java +++ b/Mage.Sets/src/mage/sets/ravnica/MoltenSentry.java @@ -31,11 +31,8 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.continuous.SetPowerSourceEffect; -import mage.abilities.effects.common.continuous.SetToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; @@ -95,14 +92,14 @@ class MoltenSentryEffect extends OneShotEffect { if (controller != null && permanent != null) { if (controller.flipCoin(game)) { game.informPlayers("Heads: " + permanent.getLogName() + " enters the battlefield as a 5/2 creature with haste"); - game.addEffect(new SetPowerSourceEffect(new StaticValue(5), Duration.WhileOnBattlefield), source); - game.addEffect(new SetToughnessSourceEffect(new StaticValue(2), Duration.WhileOnBattlefield), source); + permanent.getPower().modifyBaseValue(5); + permanent.getToughness().modifyBaseValue(2); game.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield), source); return true; } else { game.informPlayers("Tails: " + permanent.getLogName() + " enters the battlefield as a 2/5 creature with defender"); - game.addEffect(new SetPowerSourceEffect(new StaticValue(2), Duration.WhileOnBattlefield), source); - game.addEffect(new SetToughnessSourceEffect(new StaticValue(5), Duration.WhileOnBattlefield), source); + permanent.getPower().modifyBaseValue(2); + permanent.getToughness().modifyBaseValue(5); game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.WhileOnBattlefield), source); return true; } diff --git a/Mage.Sets/src/mage/sets/returntoravnica/SlimeMolding.java b/Mage.Sets/src/mage/sets/returntoravnica/SlimeMolding.java index d9e9e1e031..d18e1990e6 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/SlimeMolding.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/SlimeMolding.java @@ -80,8 +80,8 @@ class SlimeMoldingEffect extends OneShotEffect { int count = source.getManaCostsToPay().getX(); OozeToken oozeToken = new OozeToken(); - oozeToken.getPower().initValue(count); - oozeToken.getToughness().initValue(count); + oozeToken.getPower().modifyBaseValue(count); + oozeToken.getToughness().modifyBaseValue(count); oozeToken.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/DevastatingSummons.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/DevastatingSummons.java index 8a2737c7da..02706e336d 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/DevastatingSummons.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/DevastatingSummons.java @@ -83,8 +83,8 @@ class DevastatingSummonsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { ElementalToken token = new ElementalToken(); - token.getPower().initValue(new GetXValue().calculate(game, source, this)); - token.getToughness().initValue(new GetXValue().calculate(game, source, this)); + token.getPower().modifyBaseValue(new GetXValue().calculate(game, source, this)); + token.getToughness().modifyBaseValue(new GetXValue().calculate(game, source, this)); token.putOntoBattlefield(2, game, source.getSourceId(), source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GelatinousGenesis.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GelatinousGenesis.java index 02c3b66476..195e675e3c 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GelatinousGenesis.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GelatinousGenesis.java @@ -80,8 +80,8 @@ class GelatinousGenesisEffect extends OneShotEffect { int count = source.getManaCostsToPay().getX(); OozeToken oozeToken = new OozeToken(); - oozeToken.getPower().initValue(count); - oozeToken.getToughness().initValue(count); + oozeToken.getPower().modifyBaseValue(count); + oozeToken.getToughness().modifyBaseValue(count); oozeToken.putOntoBattlefield(count, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java index 6ec8403ec4..8dd24f9cb2 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java @@ -72,15 +72,15 @@ class QuicksilverGargantuanApplyToPermanent extends ApplyToPermanent { @Override public Boolean apply(Game game, Permanent permanent) { - permanent.getPower().initValue(7); - permanent.getToughness().initValue(7); + permanent.getPower().modifyBaseValue(7); + permanent.getToughness().modifyBaseValue(7); return true; } @Override public Boolean apply(Game game, MageObject mageObject) { - mageObject.getPower().initValue(7); - mageObject.getToughness().initValue(7); + mageObject.getPower().modifyBaseValue(7); + mageObject.getToughness().modifyBaseValue(7); return true; } diff --git a/Mage.Sets/src/mage/sets/timespiral/Wurmcalling.java b/Mage.Sets/src/mage/sets/timespiral/Wurmcalling.java index fac4952c75..a2f6d7f420 100644 --- a/Mage.Sets/src/mage/sets/timespiral/Wurmcalling.java +++ b/Mage.Sets/src/mage/sets/timespiral/Wurmcalling.java @@ -80,8 +80,8 @@ class WurmcallingEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { int count = source.getManaCostsToPay().getX(); WurmToken token = new WurmToken(); - token.getPower().initValue(count); - token.getToughness().initValue(count); + token.getPower().modifyBaseValue(count); + token.getToughness().modifyBaseValue(count); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/urzassaga/PhyrexianProcessor.java b/Mage.Sets/src/mage/sets/urzassaga/PhyrexianProcessor.java index 6c5eab1115..5f93f9346f 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/PhyrexianProcessor.java +++ b/Mage.Sets/src/mage/sets/urzassaga/PhyrexianProcessor.java @@ -129,8 +129,8 @@ class PhyrexianProcessorCreateTokenEffect extends OneShotEffect { if(object != null && object instanceof Integer) { int lifePaid = (int) object; MinionToken token = new MinionToken(); - token.getPower().initValue(lifePaid); - token.getToughness().initValue(lifePaid); + token.getPower().modifyBaseValue(lifePaid); + token.getToughness().modifyBaseValue(lifePaid); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java index 634eee84bb..fcd158d5dc 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java @@ -225,6 +225,8 @@ public class MorphTest extends CardTestPlayerBase { */ @Test public void testPineWalkerWithUnboostEffect() { + // Morph {4}{G} + // Whenever Pine Walker or another creature you control is turned face up, untap that creature. addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 8); @@ -641,24 +643,25 @@ public class MorphTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Pine Walker", 5, 5); assertTapped("Pine Walker", false); } - + /** - * Reflector Mage bouncing a creature that can be played as a morph should not prevent the card - * from being replayed as a morph. Morph creatures are nameless. - * - * Reported bug: - * Face-up morph creatures that are bounced by Reflector Mage should be able to be replayed as morphs - * without the "until the next turn" restriction." + * Reflector Mage bouncing a creature that can be played as a morph should + * not prevent the card from being replayed as a morph. Morph creatures are + * nameless. + * + * Reported bug: Face-up morph creatures that are bounced by Reflector Mage + * should be able to be replayed as morphs without the "until the next turn" + * restriction." */ @Test public void testReflectorMageBouncesFaceupCreatureReplayAsMorph() { - - // {1}{W}{U} When Reflector Mage enters the battlefield, return target creature an opponent controls to its owner's hand. + + // {1}{W}{U} When Reflector Mage enters the battlefield, return target creature an opponent controls to its owner's hand. // That creature's owner can't cast spells with the same name as that creature until your next turn. addCard(Zone.HAND, playerA, "Reflector Mage"); // 2/3 addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); addCard(Zone.BATTLEFIELD, playerA, "Island", 2); - + //Tap: Add {G}, {U}, or {R} to your mana pool. // Morph 2 (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) // When Rattleclaw Mystic is turned face up, add {G}{U}{R} to your mana pool. @@ -666,36 +669,37 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Forest"); addCard(Zone.BATTLEFIELD, playerB, "Island"); addCard(Zone.BATTLEFIELD, playerB, "Mountain"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reflector Mage"); addTarget(playerA, "Rattleclaw Mystic"); - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Rattleclaw Mystic"); setChoice(playerB, "Yes"); // cast it face down as 2/2 creature setStopAt(2, PhaseStep.BEGIN_COMBAT); - + execute(); - - assertPermanentCount(playerA, "Reflector Mage", 1); - assertPermanentCount(playerB, "Rattleclaw Mystic", 0); + + assertPermanentCount(playerA, "Reflector Mage", 1); + assertPermanentCount(playerB, "Rattleclaw Mystic", 0); assertHandCount(playerB, "Rattleclaw Mystic", 0); // should have been replayed assertPermanentCount(playerB, "", 1); // Rattleclaw played as a morph } - + /** - * Reflector Mage bouncing a creature that can be played as a morph should not prevent the card - * from being replayed as a morph. Morph creatures are nameless. - * - * Reported bug: - * Face-up morph creatures that are bounced by Reflector Mage should be able to be replayed as morphs - * without the "until the next turn" restriction." - * + * Reflector Mage bouncing a creature that can be played as a morph should + * not prevent the card from being replayed as a morph. Morph creatures are + * nameless. + * + * Reported bug: Face-up morph creatures that are bounced by Reflector Mage + * should be able to be replayed as morphs without the "until the next turn" + * restriction." + * * Testing bouncing a face-down creature played next turn face-up. */ @Test public void testReflectorMageBouncesMorphCreatureReplayAsFaceup() { - + //Tap: Add {G}, {U}, or {R} to your mana pool. // Morph 2 (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) // When Rattleclaw Mystic is turned face up, add {G}{U}{R} to your mana pool. @@ -703,28 +707,28 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest"); addCard(Zone.BATTLEFIELD, playerA, "Island"); addCard(Zone.BATTLEFIELD, playerA, "Mountain"); - - // {1}{W}{U} When Reflector Mage enters the battlefield, return target creature an opponent controls to its owner's hand. + + // {1}{W}{U} When Reflector Mage enters the battlefield, return target creature an opponent controls to its owner's hand. // That creature's owner can't cast spells with the same name as that creature until your next turn. - addCard(Zone.HAND, playerB, "Reflector Mage"); // 2/3 - addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); - addCard(Zone.BATTLEFIELD, playerB, "Island", 2); - + addCard(Zone.HAND, playerB, "Reflector Mage"); // 2/3 + addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rattleclaw Mystic"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Reflector Mage"); addTarget(playerB, ""); - + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Rattleclaw Mystic"); setChoice(playerA, "No"); // cast it face down as 2/2 creature setStopAt(3, PhaseStep.BEGIN_COMBAT); - + execute(); - - assertPermanentCount(playerB, "Reflector Mage", 1); - assertPermanentCount(playerA, "Rattleclaw Mystic", 1); + + assertPermanentCount(playerB, "Reflector Mage", 1); + assertPermanentCount(playerA, "Rattleclaw Mystic", 1); assertHandCount(playerA, "Rattleclaw Mystic", 0); // should have been replayed faceup } } diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 23e9d33060..501f2afa37 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -381,7 +381,9 @@ public class TestPlayer implements Player { @Override public boolean priority(Game game) { int numberOfActions = actions.size(); - for (PlayerAction action : actions) { + List tempActions = new ArrayList<>(); + tempActions.addAll(actions); + for (PlayerAction action : tempActions) { if (action.getTurnNum() == game.getTurnNum() && action.getStep() == game.getStep().getType()) { if (action.getAction().startsWith("activate:")) { @@ -478,7 +480,7 @@ public class TestPlayer implements Player { int turns = Integer.parseUnsignedInt(groups[1].substring(6)); game.rollbackTurns(turns); actions.remove(action); - break; + return true; } } } diff --git a/Mage/src/main/java/mage/MageInt.java b/Mage/src/main/java/mage/MageInt.java index c16f926820..bb0fb75f82 100644 --- a/Mage/src/main/java/mage/MageInt.java +++ b/Mage/src/main/java/mage/MageInt.java @@ -24,8 +24,7 @@ * 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; import java.io.Serializable; @@ -49,15 +48,28 @@ public class MageInt implements Serializable, Copyable { }; protected int baseValue; + protected int baseValueModified; + protected int boostedValue; protected String cardValue = ""; public MageInt(int value) { this.baseValue = value; + this.baseValueModified = baseValue; + this.boostedValue = baseValue; this.cardValue = Integer.toString(value); } public MageInt(int baseValue, String cardValue) { this.baseValue = baseValue; + this.baseValueModified = baseValue; + this.boostedValue = baseValue; + this.cardValue = cardValue; + } + + public MageInt(int baseValue, int baseValueModified, int boostedValue, String cardValue) { + this.baseValue = baseValue; + this.baseValueModified = baseValueModified; + this.boostedValue = boostedValue; this.cardValue = cardValue; } @@ -66,24 +78,37 @@ public class MageInt implements Serializable, Copyable { if (this == EmptyMageInt) { return this; } - return new MageInt(baseValue, cardValue); + return new MageInt(baseValue, baseValueModified, boostedValue, cardValue); } - public int getValue() { + public int getBaseValue() { return baseValue; } - public void initValue(int value) { - this.baseValue = value; + public int getBaseValueModified() { + return baseValueModified; + } + + public int getValue() { + return boostedValue; + } + + public void modifyBaseValue(int value) { + this.baseValueModified = value; + this.boostedValue = value; this.cardValue = Integer.toString(value); } public void setValue(int value) { - this.baseValue = value; + this.boostedValue = value; } public void boostValue(int amount) { - this.baseValue += amount; + this.boostedValue += amount; + } + + public void resetToBaseValue() { + this.boostedValue = this.baseValueModified; } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java index 1e7ccd2a5e..4e80d92298 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java @@ -47,13 +47,12 @@ import mage.game.Game; import mage.game.permanent.Permanent; /** - * This effect lets the card be a 2/2 face-down creature, with no text, - * no name, no subtypes, and no mana cost, if it's face down on the battlefield. - * And it adds the a TurnFaceUpAbility ability. - * + * This effect lets the card be a 2/2 face-down creature, with no text, no name, + * no subtypes, and no mana cost, if it's face down on the battlefield. And it + * adds the a TurnFaceUpAbility ability. + * * @author LevelX2 */ - public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implements SourceEffect { public enum FaceDownType { @@ -65,15 +64,15 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen protected int zoneChangeCounter; protected Ability turnFaceUpAbility = null; - protected MageObjectReference objectReference= null; + protected MageObjectReference objectReference = null; protected boolean foundPermanent; protected FaceDownType faceDownType; - public BecomesFaceDownCreatureEffect(Duration duration, FaceDownType faceDownType){ + public BecomesFaceDownCreatureEffect(Duration duration, FaceDownType faceDownType) { this(null, null, duration, faceDownType); } - public BecomesFaceDownCreatureEffect(Costs turnFaceUpCosts, FaceDownType faceDownType){ + public BecomesFaceDownCreatureEffect(Costs turnFaceUpCosts, FaceDownType faceDownType) { this(turnFaceUpCosts, null, faceDownType); } @@ -97,7 +96,6 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen this.faceDownType = faceDownType; } - public BecomesFaceDownCreatureEffect(final BecomesFaceDownCreatureEffect effect) { super(effect); this.zoneChangeCounter = effect.zoneChangeCounter; @@ -147,11 +145,11 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen } else { permanent = game.getPermanent(source.getSourceId()); } - + if (permanent != null && permanent.isFaceDown(game)) { if (!foundPermanent) { foundPermanent = true; - switch(faceDownType) { + switch (faceDownType) { case MANIFESTED: case MANUAL: // sets manifested image permanent.setManifested(true); @@ -184,11 +182,9 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen if (ability.getWorksFaceDown()) { ability.setRuleVisible(false); continue; - } else { - if (!ability.getRuleVisible() && !ability.getEffects().isEmpty()) { - if (ability.getEffects().get(0) instanceof BecomesFaceDownCreatureEffect) { - continue; - } + } else if (!ability.getRuleVisible() && !ability.getEffects().isEmpty()) { + if (ability.getEffects().get(0) instanceof BecomesFaceDownCreatureEffect) { + continue; } } abilitiesToRemove.add(ability); @@ -200,14 +196,12 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen break; case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { - permanent.getPower().setValue(2); - permanent.getToughness().setValue(2); +// permanent.getPower().setValue(2); +// permanent.getToughness().setValue(2); } } - } else { - if (duration.equals(Duration.Custom) && foundPermanent == true) { - discard(); - } + } else if (duration.equals(Duration.Custom) && foundPermanent == true) { + discard(); } return true; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java index 9ced7947bb..31655da573 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostTargetEffect.java @@ -115,7 +115,7 @@ public class BoostTargetEffect extends ContinuousEffectImpl { if (staticText != null && !staticText.isEmpty()) { return staticText; } - if (mode == null || mode.getTargets().size() == 0) { + if (mode == null || mode.getTargets().isEmpty()) { return "no target"; } Target target = mode.getTargets().get(0); diff --git a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java index f5726d50f7..0ce6b3c490 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java @@ -208,7 +208,6 @@ class FlashbackEffect extends OneShotEffect { if (!game.isSimulation()) { game.informPlayers(controller.getLogName() + " flashbacks " + card.getLogName()); } - // spellAbility.setCostModificationActive(false); // prevents to apply cost modification twice for flashbacked spells if (controller.cast(spellAbility, game, false)) { ContinuousEffect effect = new FlashbackReplacementEffect(); effect.setTargetPointer(new FixedTarget(source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId()))); diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index afaf4246c2..c77fa4c893 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -295,8 +295,8 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost } public static void setPermanentToFaceDownCreature(MageObject mageObject) { - mageObject.getPower().initValue(2); - mageObject.getToughness().initValue(2); + mageObject.getPower().modifyBaseValue(2); + mageObject.getToughness().modifyBaseValue(2); mageObject.getAbilities().clear(); mageObject.getColor(null).setColor(new ObjectColor()); mageObject.setName(""); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java index 35c9e779d1..6fd8f34574 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java @@ -61,6 +61,8 @@ public class PermanentCard extends PermanentImpl { } private void init(Card card, Game game) { + power = card.getPower().copy(); + toughness = card.getToughness().copy(); copyFromCard(card); // if temporary added abilities to the spell/card exist, you need to add it to the permanent derived from that card Abilities otherAbilities = game.getState().getAllOtherAbilities(card.getId()); @@ -94,6 +96,8 @@ public class PermanentCard extends PermanentImpl { // when the permanent is reset, copy all original values from the card // must copy card each reset so that the original values don't get modified copyFromCard(card); + power.resetToBaseValue(); + toughness.resetToBaseValue(); super.reset(game); } @@ -115,8 +119,6 @@ public class PermanentCard extends PermanentImpl { this.cardType.addAll(card.getCardType()); this.color = card.getColor(null).copy(); this.manaCost = card.getManaCost().copy(); - this.power = card.getPower().copy(); - this.toughness = card.getToughness().copy(); if (card instanceof PermanentCard) { this.maxLevelCounters = ((PermanentCard) card).maxLevelCounters; } @@ -232,6 +234,8 @@ public class PermanentCard extends PermanentImpl { @Override public boolean turnFaceUp(Game game, UUID playerId) { if (super.turnFaceUp(game, playerId)) { + power.modifyBaseValue(power.getBaseValue()); + toughness.modifyBaseValue(toughness.getBaseValue()); setManifested(false); setMorphed(false); return true; @@ -241,7 +245,7 @@ public class PermanentCard extends PermanentImpl { @Override public void adjustTargets(Ability ability, Game game) { - if (this.isTransformed()) { + if (this.isTransformed() && card.getSecondCardFace() != null) { card.getSecondCardFace().adjustTargets(ability, game); } else { card.adjustTargets(ability, game); @@ -250,7 +254,7 @@ public class PermanentCard extends PermanentImpl { @Override public void adjustCosts(Ability ability, Game game) { - if (this.isTransformed()) { + if (this.isTransformed() && card.getSecondCardFace() != null) { card.getSecondCardFace().adjustCosts(ability, game); } else { card.adjustCosts(ability, game); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentToken.java b/Mage/src/main/java/mage/game/permanent/PermanentToken.java index d8e02c5e12..2c649bf5f8 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentToken.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentToken.java @@ -82,8 +82,8 @@ public class PermanentToken extends PermanentImpl { } this.cardType = token.getCardType(); this.color = token.getColor(game).copy(); - this.power.initValue(token.getPower().getValue()); - this.toughness.initValue(token.getToughness().getValue()); + this.power.modifyBaseValue(token.getPower().getBaseValueModified()); + this.toughness.modifyBaseValue(token.getToughness().getBaseValueModified()); this.supertype = token.getSupertype(); this.subtype = token.getSubtype(); } diff --git a/Mage/src/main/java/mage/game/permanent/token/Token.java b/Mage/src/main/java/mage/game/permanent/token/Token.java index 51c02248ca..91e719ce57 100644 --- a/Mage/src/main/java/mage/game/permanent/token/Token.java +++ b/Mage/src/main/java/mage/game/permanent/token/Token.java @@ -81,11 +81,11 @@ public class Token extends MageObjectImpl { this.name = name; this.description = description; } - + public Token(String name, String description, int power, int toughness) { this(name, description); - this.power.setValue(power); - this.toughness.setValue(toughness); + this.power.modifyBaseValue(power); + this.toughness.modifyBaseValue(toughness); } public Token(String name, String description, ObjectColor color, List subtype, int power, int toughness, Abilities abilities) { @@ -93,8 +93,8 @@ public class Token extends MageObjectImpl { this.cardType.add(CardType.CREATURE); this.color = color.copy(); this.subtype = subtype; - this.power.setValue(power); - this.toughness.setValue(toughness); + this.power.modifyBaseValue(power); + this.toughness.modifyBaseValue(toughness); if (abilities != null) { this.abilities = abilities.copy(); } @@ -217,11 +217,11 @@ public class Token extends MageObjectImpl { } return false; } - + public void setPower(int power) { this.power.setValue(power); } - + public void setToughness(int toughness) { this.toughness.setValue(toughness); } @@ -264,17 +264,13 @@ public class Token extends MageObjectImpl { if (availableImageSetCodes.size() > 0) { if (availableImageSetCodes.contains(code)) { setOriginalExpansionSetCode(code); - } else { - // we should not set random set if appropriate set is already used - if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty() - || !availableImageSetCodes.contains(getOriginalExpansionSetCode())) { - setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); - } - } - } else { - if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty()) { - setOriginalExpansionSetCode(code); + } else // we should not set random set if appropriate set is already used + if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty() + || !availableImageSetCodes.contains(getOriginalExpansionSetCode())) { + setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); } + } else if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty()) { + setOriginalExpansionSetCode(code); } } diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java index 8281818ac2..b5452b3ff1 100644 --- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java +++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java @@ -108,9 +108,9 @@ public class CopyTokenFunction implements Function { ability.setSourceId(target.getId()); target.addAbility(ability); } - // Needed to do it this way because only the cardValue does not include the increased value from cards like "Intangible Virtue" will be copied. - target.getPower().initValue(Integer.parseInt(sourceObj.getPower().toString())); - target.getToughness().initValue(Integer.parseInt(sourceObj.getToughness().toString())); + + target.getPower().modifyBaseValue(sourceObj.getPower().getBaseValueModified()); + target.getToughness().modifyBaseValue(sourceObj.getToughness().getBaseValueModified()); return target; }