diff --git a/Mage.Sets/src/mage/cards/h/HiddenStag.java b/Mage.Sets/src/mage/cards/h/HiddenStag.java new file mode 100644 index 0000000000..6083cbaf30 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HiddenStag.java @@ -0,0 +1,73 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.ControllerPlaysLandTriggeredAbility; +import mage.abilities.common.OpponentPlaysLandTriggeredAbility; +import mage.abilities.condition.common.SourceMatchesFilterCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.effects.common.continuous.BecomesEnchantmentSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.permanent.token.TokenImpl; + +/** + * + * @author jeffwadsworth + */ +public final class HiddenStag extends CardImpl { + + public HiddenStag(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + + // Whenever an opponent plays a land, if Hidden Stag is an enchantment, Hidden Stag becomes a 3/2 Elk Beast creature. + Effect effect = new BecomesCreatureSourceEffect(new ElkBeastToken(), "", Duration.WhileOnBattlefield, true, false); + TriggeredAbility ability = new OpponentPlaysLandTriggeredAbility(Zone.BATTLEFIELD, effect, false); + this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_ENCHANTMENT_PERMANENT), + "Whenever an opponent plays a land, if Hidden Stag is an enchantment, Hidden Stag becomes a 3/2 Elk Beast creature.")); + + // Whenever you play a land, if Hidden Stag is a creature, Hidden Stag becomes an enchantment. + Effect effect2 = new BecomesEnchantmentSourceEffect(); + TriggeredAbility ability2 = new ControllerPlaysLandTriggeredAbility(Zone.BATTLEFIELD, effect2, false); + this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability2, new SourceMatchesFilterCondition(StaticFilters.FILTER_PERMANENT_CREATURE), + "Whenever you play a land, if Hidden Stag is a creature, Hidden Stag becomes an enchantment.")); + + } + + public HiddenStag(final HiddenStag card) { + super(card); + } + + @Override + public HiddenStag copy() { + return new HiddenStag(this); + } +} + +class ElkBeastToken extends TokenImpl { + + public ElkBeastToken() { + super("Elk Beast", "3/2 Elk Beast creature"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.ELK); + subtype.add(SubType.BEAST); + power = new MageInt(3); + toughness = new MageInt(2); + } + + public ElkBeastToken(final ElkBeastToken token) { + super(token); + } + + public ElkBeastToken copy() { + return new ElkBeastToken(this); + } +} diff --git a/Mage.Sets/src/mage/cards/o/OpalAcrolith.java b/Mage.Sets/src/mage/cards/o/OpalAcrolith.java index 9ffae411bd..5e8e17fbda 100644 --- a/Mage.Sets/src/mage/cards/o/OpalAcrolith.java +++ b/Mage.Sets/src/mage/cards/o/OpalAcrolith.java @@ -2,33 +2,23 @@ package mage.cards.o; import java.util.UUID; import mage.MageInt; -import mage.MageObjectReference; -import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.condition.common.SourceMatchesFilterCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; -import mage.abilities.effects.common.continuous.SourceEffect; +import mage.abilities.effects.common.continuous.BecomesEnchantmentSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.DependencyType; import mage.constants.Duration; -import mage.constants.Layer; -import static mage.constants.Layer.TypeChangingEffects_4; -import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterSpell; import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; /** @@ -53,7 +43,7 @@ public final class OpalAcrolith extends CardImpl { "Whenever an opponent casts a creature spell, if Opal Acrolith is an enchantment, Opal Acrolith becomes a 2/4 Soldier creature.")); // {0}: Opal Acrolith becomes an enchantment. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesEnchantmentSourceEffect(CardType.ENCHANTMENT), new ManaCostsImpl("{0}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesEnchantmentSourceEffect(), new ManaCostsImpl("{0}"))); } @@ -67,63 +57,6 @@ public final class OpalAcrolith extends CardImpl { } } -class BecomesEnchantmentSourceEffect extends ContinuousEffectImpl implements SourceEffect { - - public BecomesEnchantmentSourceEffect(CardType cardType) { - super(Duration.Custom, Outcome.AddAbility); - staticText = "Opal Acrolith becomes an Enchantment"; - dependencyTypes.add(DependencyType.EnchantmentAddingRemoving); - - } - - public BecomesEnchantmentSourceEffect(final BecomesEnchantmentSourceEffect effect) { - super(effect); - } - - @Override - public BecomesEnchantmentSourceEffect copy() { - return new BecomesEnchantmentSourceEffect(this); - } - - @Override - public void init(Ability source, Game game) { - super.init(source, game); - affectedObjectList.add(new MageObjectReference(source.getSourceId(), game)); - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - Permanent permanent = affectedObjectList.get(0).getPermanent(game); - if (permanent != null) { - switch (layer) { - case TypeChangingEffects_4: - if (sublayer == SubLayer.NA) { - permanent.getCardType().clear(); - permanent.getSubtype(game).clear(); - if (!permanent.getCardType().contains(CardType.ENCHANTMENT)) { - permanent.getCardType().add(CardType.ENCHANTMENT); - } - } - break; - } - return true; - } - this.discard(); - return false; - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public boolean hasLayer(Layer layer) { - return Layer.TypeChangingEffects_4 == layer; - } - -} - class OpalAcrolithSoldier extends TokenImpl { public OpalAcrolithSoldier() { diff --git a/Mage.Sets/src/mage/cards/o/OpalTitan.java b/Mage.Sets/src/mage/cards/o/OpalTitan.java index 8f9655f1d8..1f215472b7 100644 --- a/Mage.Sets/src/mage/cards/o/OpalTitan.java +++ b/Mage.Sets/src/mage/cards/o/OpalTitan.java @@ -69,7 +69,7 @@ class OpalTitanBecomesCreatureEffect extends ContinuousEffectImpl implements Sou public OpalTitanBecomesCreatureEffect() { super(Duration.WhileOnBattlefield, Outcome.BecomeCreature); - setText(); + staticText = "{this} becomes a 4/4 Giant creature with protection from each of that spell's colors."; this.addDependencyType(DependencyType.BecomeCreature); } @@ -135,10 +135,6 @@ class OpalTitanBecomesCreatureEffect extends ContinuousEffectImpl implements Sou return false; } - private void setText() { - staticText = duration.toString() + " {this} becomes a 4/4 Giant creature with protection from each of that spell's colors"; - } - @Override public boolean hasLayer(Layer layer) { return layer == Layer.PTChangingEffects_7 diff --git a/Mage.Sets/src/mage/cards/s/SoulSculptor.java b/Mage.Sets/src/mage/cards/s/SoulSculptor.java new file mode 100644 index 0000000000..f82ccd16f1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoulSculptor.java @@ -0,0 +1,149 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.Condition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.DependencyType; +import mage.constants.Duration; +import mage.constants.Layer; +import static mage.constants.Layer.TypeChangingEffects_4; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.StackObject; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public final class SoulSculptor extends CardImpl { + + final String rule = "Target creature becomes an enchantment and loses all abilities until a player casts a creature spell."; + + public SoulSculptor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.HUMAN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{W}, {tap}: Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new SoulSculptorEffect(), SoulSculptorCondition.instance, rule), new ManaCostsImpl("{1}{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public SoulSculptor(final SoulSculptor card) { + super(card); + } + + @Override + public SoulSculptor copy() { + return new SoulSculptor(this); + } +} + +class SoulSculptorEffect extends ContinuousEffectImpl { + + public SoulSculptorEffect() { + super(Duration.Custom, Outcome.LoseAbility); + staticText = "target becomes an Enchantment and loses all abilites"; + dependencyTypes.add(DependencyType.EnchantmentAddingRemoving); + dependencyTypes.add(DependencyType.AddingAbility); + + } + + public SoulSculptorEffect(final SoulSculptorEffect effect) { + super(effect); + } + + @Override + public SoulSculptorEffect copy() { + return new SoulSculptorEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (targetPermanent != null) { + affectedObjectList.add(new MageObjectReference(targetPermanent, game)); + } + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Permanent permanent = affectedObjectList.get(0).getPermanent(game); + if (permanent != null) { + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + permanent.getCardType().clear(); + permanent.getSubtype(game).clear(); + if (!permanent.getCardType().contains(CardType.ENCHANTMENT)) { + permanent.getCardType().add(CardType.ENCHANTMENT); + } + } + break; + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + permanent.getAbilities().clear(); + } + break; + } + return true; + } + this.discard(); + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return Layer.TypeChangingEffects_4 == layer + || Layer.AbilityAddingRemovingEffects_6 == layer; + } + +} + +enum SoulSculptorCondition implements Condition { + + instance; + + @Override + public boolean apply(Game game, Ability source) { + if (!game.getStack().isEmpty()) { + StackObject stackObject = game.getStack().getFirst(); + if (stackObject != null) { + return !stackObject.getCardType().contains(CardType.CREATURE); + } + } + return true; + } + + @Override + public String toString() { + return "creature spell cast"; + } + +} diff --git a/Mage.Sets/src/mage/sets/UrzasSaga.java b/Mage.Sets/src/mage/sets/UrzasSaga.java index f4cabc7989..6f9e580da6 100644 --- a/Mage.Sets/src/mage/sets/UrzasSaga.java +++ b/Mage.Sets/src/mage/sets/UrzasSaga.java @@ -164,6 +164,7 @@ public final class UrzasSaga extends ExpansionSet { cards.add(new SetCardInfo("Hidden Guerrillas", 261, Rarity.UNCOMMON, mage.cards.h.HiddenGuerrillas.class)); cards.add(new SetCardInfo("Hidden Herd", 262, Rarity.RARE, mage.cards.h.HiddenHerd.class)); cards.add(new SetCardInfo("Hidden Spider", 264, Rarity.COMMON, mage.cards.h.HiddenSpider.class)); + cards.add(new SetCardInfo("Hidden Stag", 265, Rarity.RARE, mage.cards.h.HiddenStag.class)); cards.add(new SetCardInfo("Hollow Dogs", 137, Rarity.COMMON, mage.cards.h.HollowDogs.class)); cards.add(new SetCardInfo("Hopping Automaton", 297, Rarity.UNCOMMON, mage.cards.h.HoppingAutomaton.class)); cards.add(new SetCardInfo("Horseshoe Crab", 80, Rarity.COMMON, mage.cards.h.HorseshoeCrab.class)); @@ -295,6 +296,7 @@ public final class UrzasSaga extends ExpansionSet { cards.add(new SetCardInfo("Sneak Attack", 218, Rarity.RARE, mage.cards.s.SneakAttack.class)); cards.add(new SetCardInfo("Somnophore", 97, Rarity.RARE, mage.cards.s.Somnophore.class)); cards.add(new SetCardInfo("Songstitcher", 52, Rarity.UNCOMMON, mage.cards.s.Songstitcher.class)); + cards.add(new SetCardInfo("Soul Sculptor", 53, Rarity.RARE, mage.cards.s.SoulSculptor.class)); cards.add(new SetCardInfo("Spined Fluke", 160, Rarity.UNCOMMON, mage.cards.s.SpinedFluke.class)); cards.add(new SetCardInfo("Spire Owl", 98, Rarity.COMMON, mage.cards.s.SpireOwl.class)); cards.add(new SetCardInfo("Sporogenesis", 273, Rarity.RARE, mage.cards.s.Sporogenesis.class)); diff --git a/Mage/src/main/java/mage/abilities/common/ControllerPlaysLandTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/ControllerPlaysLandTriggeredAbility.java new file mode 100644 index 0000000000..252203870d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/ControllerPlaysLandTriggeredAbility.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; + +/** + * + * @author jeffwadsworth + */ +public class ControllerPlaysLandTriggeredAbility extends TriggeredAbilityImpl { + + public ControllerPlaysLandTriggeredAbility(Zone zone, Effect effect, Boolean optional) { + super(zone, effect, optional); + } + + public ControllerPlaysLandTriggeredAbility(ControllerPlaysLandTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.LAND_PLAYED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent land = game.getPermanent(event.getTargetId()); + return land.getControllerId().equals(controllerId); + } + + @Override + public ControllerPlaysLandTriggeredAbility copy() { + return new ControllerPlaysLandTriggeredAbility(this); + } + + @Override + public String getRule() { + return "Whenever you play a land, "; + } +} diff --git a/Mage/src/main/java/mage/abilities/common/OpponentPlaysLandTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/OpponentPlaysLandTriggeredAbility.java new file mode 100644 index 0000000000..7249b6679e --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/OpponentPlaysLandTriggeredAbility.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author jeffwadsworth + */ +public class OpponentPlaysLandTriggeredAbility extends TriggeredAbilityImpl { + + public OpponentPlaysLandTriggeredAbility(Zone zone, Effect effect, Boolean optional) { + super(zone, effect, optional); + } + + public OpponentPlaysLandTriggeredAbility(OpponentPlaysLandTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.LAND_PLAYED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent land = game.getPermanent(event.getTargetId()); + return game.getOpponents(controllerId).contains(land.getControllerId()); + } + + @Override + public OpponentPlaysLandTriggeredAbility copy() { + return new OpponentPlaysLandTriggeredAbility(this); + } + + @Override + public String getRule() { + return "Whenever an opponent plays a land, "; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesEnchantmentSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesEnchantmentSourceEffect.java new file mode 100644 index 0000000000..e16f3d033a --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesEnchantmentSourceEffect.java @@ -0,0 +1,79 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common.continuous; + +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.CardType; +import mage.constants.DependencyType; +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; + +/** + * + * @author jeffwadsworth + */ +public class BecomesEnchantmentSourceEffect extends ContinuousEffectImpl implements SourceEffect { + + public BecomesEnchantmentSourceEffect() { + super(Duration.Custom, Outcome.AddAbility); + staticText = "{this} becomes an Enchantment"; + dependencyTypes.add(DependencyType.EnchantmentAddingRemoving); + + } + + public BecomesEnchantmentSourceEffect(final BecomesEnchantmentSourceEffect effect) { + super(effect); + } + + @Override + public BecomesEnchantmentSourceEffect copy() { + return new BecomesEnchantmentSourceEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + affectedObjectList.add(new MageObjectReference(source.getSourceId(), game)); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Permanent permanent = affectedObjectList.get(0).getPermanent(game); + if (permanent != null) { + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + permanent.getCardType().clear(); + permanent.getSubtype(game).clear(); + if (!permanent.getCardType().contains(CardType.ENCHANTMENT)) { + permanent.getCardType().add(CardType.ENCHANTMENT); + } + } + break; + } + return true; + } + this.discard(); + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return Layer.TypeChangingEffects_4 == layer; + } + +}