From 26dbee6f2d210bd93d91fd8cc9ce2abe0239dce3 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 25 Mar 2017 17:30:14 -0500 Subject: [PATCH] - Added BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(). Converted all the Genju cards to use it. This class is subject to rule 611.2c. --- .../src/mage/cards/g/GenjuOfTheFalls.java | 4 +- .../src/mage/cards/g/GenjuOfTheFens.java | 4 +- .../src/mage/cards/g/GenjuOfTheFields.java | 4 +- .../src/mage/cards/g/GenjuOfTheRealm.java | 4 +- .../src/mage/cards/g/GenjuOfTheSpires.java | 4 +- ...chedWithActivatedAbilityOrSpellEffect.java | 196 ++++++++++++++++++ 6 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java diff --git a/Mage.Sets/src/mage/cards/g/GenjuOfTheFalls.java b/Mage.Sets/src/mage/cards/g/GenjuOfTheFalls.java index d6324eead40..7af016f1272 100644 --- a/Mage.Sets/src/mage/cards/g/GenjuOfTheFalls.java +++ b/Mage.Sets/src/mage/cards/g/GenjuOfTheFalls.java @@ -34,7 +34,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -49,6 +48,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect; /** * @@ -70,7 +70,7 @@ public class GenjuOfTheFalls extends CardImpl { this.addAbility(ability); // {2}: Enchanted Island becomes a 3/2 blue Spirit creature with flying until end of turn. It's still a land. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new SpiritToken(), "Enchanted Island becomes a 3/2 blue Spirit creature with flying until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(new SpiritToken(), "Enchanted Island becomes a 3/2 blue Spirit creature with flying until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); this.addAbility(ability2); // When enchanted Island is put into a graveyard, you may return Genju of the Falls from your graveyard to your hand. TargetPermanent auraTarget = new TargetLandPermanent(filter); diff --git a/Mage.Sets/src/mage/cards/g/GenjuOfTheFens.java b/Mage.Sets/src/mage/cards/g/GenjuOfTheFens.java index ada5a34a2dd..a2ab0041d88 100644 --- a/Mage.Sets/src/mage/cards/g/GenjuOfTheFens.java +++ b/Mage.Sets/src/mage/cards/g/GenjuOfTheFens.java @@ -35,7 +35,6 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -50,6 +49,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect; /** * @@ -71,7 +71,7 @@ public class GenjuOfTheFens extends CardImpl { this.addAbility(ability); // {2}: Until end of turn, enchanted Swamp becomes a 2/2 black Spirit creature with "{B}: This creature gets +1/+1 until end of turn." It's still a land. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new SpiritToken(), "Until end of turn, enchanted Swamp becomes a 2/2 black Spirit creature with \"{B}: This creature gets +1/+1 until end of turn.\" It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(new SpiritToken(), "Until end of turn, enchanted Swamp becomes a 2/2 black Spirit creature with \"{B}: This creature gets +1/+1 until end of turn.\" It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); this.addAbility(ability2); // When enchanted Swamp is put into a graveyard, you may return Genju of the Fens from your graveyard to your hand. diff --git a/Mage.Sets/src/mage/cards/g/GenjuOfTheFields.java b/Mage.Sets/src/mage/cards/g/GenjuOfTheFields.java index e6e9a147b5d..c8b28c4520a 100644 --- a/Mage.Sets/src/mage/cards/g/GenjuOfTheFields.java +++ b/Mage.Sets/src/mage/cards/g/GenjuOfTheFields.java @@ -36,7 +36,6 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -48,6 +47,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect; /** * @@ -69,7 +69,7 @@ public class GenjuOfTheFields extends CardImpl { this.addAbility(ability); // {2}: Until end of turn, enchanted Plains becomes a 2/5 white Spirit creature with "Whenever this creature deals damage, its controller gains that much life." It's still a land. - Effect effect = new BecomesCreatureAttachedEffect(new SpiritToken(), + Effect effect = new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(new SpiritToken(), "Until end of turn, enchanted Plains becomes a 2/5 white Spirit creature", Duration.EndOfTurn); Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2)); effect = new GainAbilityAttachedEffect(new DealsDamageGainLifeSourceTriggeredAbility(), AttachmentType.AURA, Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/g/GenjuOfTheRealm.java b/Mage.Sets/src/mage/cards/g/GenjuOfTheRealm.java index 3c0ca8b547b..3cb819d25f6 100644 --- a/Mage.Sets/src/mage/cards/g/GenjuOfTheRealm.java +++ b/Mage.Sets/src/mage/cards/g/GenjuOfTheRealm.java @@ -34,7 +34,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -48,6 +47,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect; /** * @@ -68,7 +68,7 @@ public class GenjuOfTheRealm extends CardImpl { this.addAbility(ability); // {2}: Enchanted land becomes a legendary 8/12 Spirit creature with trample until end of turn. It's still a land. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new SpiritToken(), "Enchanted land becomes a legendary 8/12 Spirit creature with trample until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(new SpiritToken(), "Enchanted land becomes a legendary 8/12 Spirit creature with trample until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); this.addAbility(ability2); // When enchanted land is put into a graveyard, you may return Genju of the Realm from your graveyard to your hand. diff --git a/Mage.Sets/src/mage/cards/g/GenjuOfTheSpires.java b/Mage.Sets/src/mage/cards/g/GenjuOfTheSpires.java index 22ecddcda5b..0779c3f60a3 100644 --- a/Mage.Sets/src/mage/cards/g/GenjuOfTheSpires.java +++ b/Mage.Sets/src/mage/cards/g/GenjuOfTheSpires.java @@ -34,7 +34,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,6 +47,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect; /** * @@ -69,7 +69,7 @@ public class GenjuOfTheSpires extends CardImpl { this.addAbility(ability); // {2}: Enchanted Mountain becomes a 6/1 red Spirit creature until end of turn. It's still a land. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new SpiritToken(), "Enchanted Mountain becomes a 6/1 red Spirit creature until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(new SpiritToken(), "Enchanted Mountain becomes a 6/1 red Spirit creature until end of turn. It's still a land", Duration.EndOfTurn), new GenericManaCost(2)); this.addAbility(ability2); // When enchanted Mountain is put into a graveyard, you may return Genju of the Spires from your graveyard to your hand. diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java new file mode 100644 index 00000000000..bfaceb60c4f --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java @@ -0,0 +1,196 @@ +/* + * 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.abilities.effects.common.continuous; + +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.Token; + +/** + * @author jeffwadsworth + */ +public class BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect extends ContinuousEffectImpl { + + public enum LoseType { + + NONE, ALL, ALL_BUT_COLOR, ABILITIES, ABILITIES_SUBTYPE_AND_PT + } + + protected Token token; + protected String type; + protected LoseType loseType; // what attributes are lost + + public BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(Token token, String text, Duration duration) { + this(token, text, duration, LoseType.NONE); + } + + public BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(Token token, String text, Duration duration, LoseType loseType) { + super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.BecomeCreature); + this.token = token; + this.loseType = loseType; + staticText = text; + } + + public BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(final BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect effect) { + super(effect); + this.token = effect.token.copy(); + this.type = effect.type; + this.loseType = effect.loseType; + } + + @Override + public BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect copy() { + return new BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + Permanent attachedPermanent = game.getPermanent(source.getSourceId()); + if (attachedPermanent != null) { + Permanent permanentAttachedTo = game.getPermanent(attachedPermanent.getAttachedTo()); + if (permanentAttachedTo != null) { + affectedObjectList.add(new MageObjectReference(permanentAttachedTo, game)); + } + } + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + boolean attachedExists = false; + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null) { + for (MageObjectReference mageObjectReference : affectedObjectList) { + Permanent permanentAttachedTo = mageObjectReference.getPermanent(game); + if (permanentAttachedTo != null) { + attachedExists = true; + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + for (String superType : token.getSupertype()) { + if (!permanentAttachedTo.getSupertype().contains(superType)) { + permanentAttachedTo.getSupertype().add(superType); + } + } + // card type + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + permanentAttachedTo.getCardType().clear(); + break; + } + for (CardType cardType : token.getCardType()) { + permanentAttachedTo.getCardType().add(cardType); + } + + // sub type + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + case ABILITIES_SUBTYPE_AND_PT: + permanentAttachedTo.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + break; + } + for (String subType : token.getSubtype(game)) { + if (!permanentAttachedTo.getSubtype(game).contains(subType)) { + permanentAttachedTo.getSubtype(game).add(subType); + } + } + + } + break; + case ColorChangingEffects_5: + if (sublayer == SubLayer.NA) { + if (loseType == LoseType.ALL) { + permanentAttachedTo.getColor(game).setBlack(false); + permanentAttachedTo.getColor(game).setGreen(false); + permanentAttachedTo.getColor(game).setBlue(false); + permanentAttachedTo.getColor(game).setWhite(false); + permanentAttachedTo.getColor(game).setRed(false); + } + if (token.getColor(game).hasColor()) { + permanentAttachedTo.getColor(game).setColor(token.getColor(game)); + } + } + break; + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + case ABILITIES: + case ABILITIES_SUBTYPE_AND_PT: + permanentAttachedTo.removeAllAbilities(source.getSourceId(), game); + break; + } + for (Ability ability : token.getAbilities()) { + permanentAttachedTo.addAbility(ability, source.getSourceId(), game); + } + + } + break; + case PTChangingEffects_7: + if (sublayer == SubLayer.SetPT_7b) { + permanentAttachedTo.getPower().setValue(token.getPower().getValue()); + permanentAttachedTo.getToughness().setValue(token.getToughness().getValue()); + break; + } + } + } + if (!attachedExists) { + discard(); + } + return true; + } + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.PTChangingEffects_7 + || layer == Layer.AbilityAddingRemovingEffects_6 + || layer == Layer.ColorChangingEffects_5 + || layer == Layer.TypeChangingEffects_4; + } + +}