diff --git a/Mage.Sets/src/mage/cards/b/BloodstoneGoblin.java b/Mage.Sets/src/mage/cards/b/BloodstoneGoblin.java index cf306ac8f2..3381ffa942 100644 --- a/Mage.Sets/src/mage/cards/b/BloodstoneGoblin.java +++ b/Mage.Sets/src/mage/cards/b/BloodstoneGoblin.java @@ -35,11 +35,11 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.KickerAbility; import mage.abilities.keyword.MenaceAbility; -import mage.constants.SubType; 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.game.Game; import mage.game.events.GameEvent; @@ -109,6 +109,6 @@ class BloodstoneGoblinTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever you cast a spell, if it was kicked," + super.getRule(); + return "Whenever you cast a spell, if that spell was kicked, " + super.getRule(); } } diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfTheFlame.java b/Mage.Sets/src/mage/cards/c/ChampionOfTheFlame.java index 434cca4ca7..3dc8630adc 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfTheFlame.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfTheFlame.java @@ -35,12 +35,12 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.AuraAttachedCount; import mage.abilities.dynamicvalue.common.EquipmentAttachedCount; import mage.abilities.effects.common.continuous.BoostSourceEffect; -import mage.constants.SubType; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; /** @@ -64,7 +64,9 @@ public class ChampionOfTheFlame extends CardImpl { DynamicValue auraAmount = new AuraAttachedCount(2); DynamicValue equipAmount = new EquipmentAttachedCount(2); DynamicValue totalAmount = new AdditiveDynamicValue(auraAmount, equipAmount); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(totalAmount, totalAmount, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(totalAmount, totalAmount, Duration.WhileOnBattlefield) + .setText("{this} gets +2/+2 for each Aura and Equipment attached to it"))); } public ChampionOfTheFlame(final ChampionOfTheFlame card) { diff --git a/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java b/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java index ecbe41de41..12d2e82177 100644 --- a/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java +++ b/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java @@ -37,17 +37,17 @@ import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; @@ -151,8 +151,6 @@ class DarigaazReincarnatedTriggeredAbility extends ConditionalTriggeredAbility { DarigaazReincarnatedCondition.instance, "At the beginning of your upkeep, if {this} is exiled with an egg counter on it, " + "remove an egg counter from it. Then if {this} has no egg counters on it, return it to the battlefield"); - this.setRuleVisible(false); - } public DarigaazReincarnatedTriggeredAbility(final DarigaazReincarnatedTriggeredAbility effect) { diff --git a/Mage.Sets/src/mage/cards/f/ForebearsBlade.java b/Mage.Sets/src/mage/cards/f/ForebearsBlade.java index 6bc0216361..65b2443841 100644 --- a/Mage.Sets/src/mage/cards/f/ForebearsBlade.java +++ b/Mage.Sets/src/mage/cards/f/ForebearsBlade.java @@ -15,8 +15,8 @@ import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; -import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AttachmentType; @@ -48,10 +48,11 @@ public class ForebearsBlade extends CardImpl { effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT); effect.setText("and trample"); ability.addEffect(effect); - + this.addAbility(ability); + // Whenever equipped creature dies, attach Forebear’s Blade to target creature you control. ability = new DiesAttachedTriggeredAbility( - new AttachEffect(Outcome.Neutral, "attach {source} to it"), "equipped creature", false); + new AttachEffect(Outcome.Neutral, "attach {this} to to target creature you control"), "equipped creature", false); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GaeasProtector.java b/Mage.Sets/src/mage/cards/g/GaeasProtector.java index 45ea734fb6..c277902f54 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasProtector.java +++ b/Mage.Sets/src/mage/cards/g/GaeasProtector.java @@ -31,10 +31,11 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; /** @@ -52,7 +53,7 @@ public class GaeasProtector extends CardImpl { this.toughness = new MageInt(2); // Gaea's Protector must be blocked if able. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MustBeBlockedByAtLeastOneSourceEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield))); } public GaeasProtector(final GaeasProtector card) { diff --git a/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java b/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java index 6730c09f04..c15cff8856 100644 --- a/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java +++ b/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java @@ -75,8 +75,6 @@ public class GarnaTheBloodflame extends CardImpl { // When Garna, the Bloodflame enters the battlefield, return to your hand all creature cards in your graveyard that were put there from anywhere this turn. this.addAbility(new EntersBattlefieldTriggeredAbility(new GarnaTheBloodflameEffect(), false), new GarnaTheBloodflameWatcher()); - this.getSpellAbility().addEffect(new GarnaTheBloodflameEffect()); - this.getSpellAbility().addWatcher(new GarnaTheBloodflameWatcher()); // Other creatures you control have haste. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, diff --git a/Mage.Sets/src/mage/cards/g/GoblinWarchief.java b/Mage.Sets/src/mage/cards/g/GoblinWarchief.java index 0b0fa0f4be..401dd689ec 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinWarchief.java +++ b/Mage.Sets/src/mage/cards/g/GoblinWarchief.java @@ -27,6 +27,7 @@ */ package mage.cards.g; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -42,8 +43,6 @@ import mage.filter.FilterCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import java.util.UUID; - /** * * @author jonubuu @@ -51,15 +50,13 @@ import java.util.UUID; public class GoblinWarchief extends CardImpl { private static final FilterCard filterSpells = new FilterCard("Goblin spells"); - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin creatures"); static { filterSpells.add(new SubtypePredicate(SubType.GOBLIN)); - filter.add(new SubtypePredicate(SubType.GOBLIN)); } public GoblinWarchief(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.WARRIOR); @@ -68,8 +65,9 @@ public class GoblinWarchief extends CardImpl { // Goblin spells you cast cost {1} less to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filterSpells, 1))); - // Goblin creatures you control have haste. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter, false))); + // Goblins you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), + Duration.WhileOnBattlefield, new FilterCreaturePermanent(SubType.GOBLIN, "Goblins"), false))); } public GoblinWarchief(final GoblinWarchief card) { diff --git a/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java b/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java index 598330ca15..abe392fffa 100644 --- a/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java +++ b/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java @@ -9,13 +9,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect; -import mage.cards.CardSetInfo; import mage.cards.CardImpl; +import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.mageobject.HistoricPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; /** * @@ -29,7 +29,7 @@ public class GuardiansOfKoilos extends CardImpl { filter.add(new AnotherPredicate()); filter.add(new HistoricPredicate()); } - + public GuardiansOfKoilos(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); this.subtype.add(SubType.CONSTRUCT); @@ -37,7 +37,8 @@ public class GuardiansOfKoilos extends CardImpl { this.toughness = new MageInt(4); // When Guardians of Koilos enters the battlefield, you may return another target historic permanent you control to its owner’s hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(filter), true)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(filter) + .setText("you may return another target historic permanent you control to its owner’s hand. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"), true)); } public GuardiansOfKoilos(final GuardiansOfKoilos card) { @@ -47,5 +48,5 @@ public class GuardiansOfKoilos extends CardImpl { @Override public GuardiansOfKoilos copy() { return new GuardiansOfKoilos(this); - } + } } diff --git a/Mage.Sets/src/mage/cards/h/HelmOfTheHost.java b/Mage.Sets/src/mage/cards/h/HelmOfTheHost.java index 2339afce09..a5aa48f058 100644 --- a/Mage.Sets/src/mage/cards/h/HelmOfTheHost.java +++ b/Mage.Sets/src/mage/cards/h/HelmOfTheHost.java @@ -46,7 +46,6 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; - /** * * @author Will @@ -54,10 +53,10 @@ import mage.target.targetpointer.FixedTarget; public class HelmOfTheHost extends CardImpl { public HelmOfTheHost(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.EQUIPMENT); - + // At the beginning of combat on your turn, create a token that’s a copy of equipped creature, except the token isn’t legendary if equipped creature is legendary. That token gains haste. TriggeredAbility ability = new BeginningOfCombatTriggeredAbility( new HelmOfTheHostEffect(), @@ -65,7 +64,7 @@ public class HelmOfTheHost extends CardImpl { false ); this.addAbility(ability); - + // Equip {5} this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(5))); } @@ -81,9 +80,10 @@ public class HelmOfTheHost extends CardImpl { } class HelmOfTheHostEffect extends OneShotEffect { + public HelmOfTheHostEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Create a token that’s a copy of equipped creature, except the token isn’t legendary if equipped creature is legendary. That token gains haste."; + this.staticText = "create a token that’s a copy of equipped creature, except the token isn’t legendary if equipped creature is legendary. That token gains haste."; } public HelmOfTheHostEffect(final HelmOfTheHostEffect effect) { diff --git a/Mage.Sets/src/mage/cards/j/JhoiraWeatherlightCaptain.java b/Mage.Sets/src/mage/cards/j/JhoiraWeatherlightCaptain.java index bb4c8578e8..017b3b2361 100644 --- a/Mage.Sets/src/mage/cards/j/JhoiraWeatherlightCaptain.java +++ b/Mage.Sets/src/mage/cards/j/JhoiraWeatherlightCaptain.java @@ -1,7 +1,7 @@ package mage.cards.j; +import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; @@ -11,27 +11,28 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.common.FilterHistoricSpell; -import java.util.UUID; - public class JhoiraWeatherlightCaptain extends CardImpl { - public JhoiraWeatherlightCaptain(UUID ownerId, CardSetInfo cardSetInfo){ + public JhoiraWeatherlightCaptain(UUID ownerId, CardSetInfo cardSetInfo) { super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}"); addSuperType(SuperType.LEGENDARY); subtype.add(SubType.HUMAN, SubType.ARTIFICER); power = new MageInt(3); toughness = new MageInt(3); - Ability ability = new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1), new FilterHistoricSpell(), false); - addAbility(ability); + // Whenever you cast a historic spell, draw a card. <i>(Artifacts, legendaries, and Sagas are historic.)</i> + addAbility(new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1) + .setText("draw a card. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"), + new FilterHistoricSpell(), false)); } - public JhoiraWeatherlightCaptain(final JhoiraWeatherlightCaptain jhoiraWeatherlightCaptain){ + public JhoiraWeatherlightCaptain(final JhoiraWeatherlightCaptain jhoiraWeatherlightCaptain) { super(jhoiraWeatherlightCaptain); } - public JhoiraWeatherlightCaptain copy(){ + @Override + public JhoiraWeatherlightCaptain copy() { return new JhoiraWeatherlightCaptain(this); } } diff --git a/Mage.Sets/src/mage/cards/j/JhoirasFamiliar.java b/Mage.Sets/src/mage/cards/j/JhoirasFamiliar.java index d055b7edb4..ac6130c2f9 100644 --- a/Mage.Sets/src/mage/cards/j/JhoirasFamiliar.java +++ b/Mage.Sets/src/mage/cards/j/JhoirasFamiliar.java @@ -56,7 +56,9 @@ public class JhoirasFamiliar extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Historic spells you cast cost {1} less to cast. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(new FilterHistoricCard(), 1))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostReductionControllerEffect(new FilterHistoricCard(), 1) + .setText("Historic spells you cast cost {1} less to cast. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"))); } public JhoirasFamiliar(final JhoirasFamiliar card) { diff --git a/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java b/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java index 703561956d..4deff3eba7 100644 --- a/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java +++ b/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java @@ -1,10 +1,9 @@ package mage.cards.m; import java.util.UUID; - import mage.MageInt; import mage.Mana; -import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; @@ -19,8 +18,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; /** - * @author JRHerlehy - * Created on 4/7/18. + * @author JRHerlehy Created on 4/7/18. */ public class MarwynTheNurturer extends CardImpl { @@ -39,10 +37,10 @@ public class MarwynTheNurturer extends CardImpl { this.toughness = new MageInt(1); // Whenever another Elf enters the battlefield under your control, put a +1/+1 counter on Marwyn, the Nurturer. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter)); // {T}: Add an amount of {G} equal to Marwyn’s power. - this.addAbility(new DynamicManaAbility(Mana.GreenMana(1), new SourcePermanentPowerCount(), "Add an amount of {G} equal to Marwyn’s power")); + this.addAbility(new DynamicManaAbility(Mana.GreenMana(1), new SourcePermanentPowerCount(), "Add an amount of {G} equal to {this}’s power")); } public MarwynTheNurturer(final MarwynTheNurturer card) { diff --git a/Mage.Sets/src/mage/cards/m/MemorialToFolly.java b/Mage.Sets/src/mage/cards/m/MemorialToFolly.java index 10f5d1f20a..be06bf802b 100644 --- a/Mage.Sets/src/mage/cards/m/MemorialToFolly.java +++ b/Mage.Sets/src/mage/cards/m/MemorialToFolly.java @@ -25,13 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.m; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; @@ -50,15 +49,17 @@ import mage.target.common.TargetCardInYourGraveyard; public class MemorialToFolly extends CardImpl { public MemorialToFolly(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); - + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + // Memorial to Folly enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - + this.addAbility(new BlackManaAbility()); - + // {2}{B}, {T}, Sacrifice Memorial to Folly: Return target creature card from your graveyard to your hand. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl("{2}{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect() + .setText("Return target creature card from your graveyard to your hand"), + new ManaCostsImpl("{2}{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); diff --git a/Mage.Sets/src/mage/cards/m/MemorialToUnity.java b/Mage.Sets/src/mage/cards/m/MemorialToUnity.java index 86b8f979e1..c84808ea2a 100644 --- a/Mage.Sets/src/mage/cards/m/MemorialToUnity.java +++ b/Mage.Sets/src/mage/cards/m/MemorialToUnity.java @@ -25,25 +25,24 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.m; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.Effect; -import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.mana.GreenManaAbility; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.filter.common.FilterCreatureCard; +import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; /** * @author Rystan @@ -52,17 +51,17 @@ public class MemorialToUnity extends CardImpl { public MemorialToUnity(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - + // Memorial to Uniity enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - + this.addAbility(new GreenManaAbility()); - + // {2}{G}, {T}, Sacrifice Memorial to Unity: Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand. Then put the rest on the bottom of your library in a random order. Effect effect = new LookLibraryAndPickControllerEffect( - new StaticValue(5), false, new StaticValue(1), new FilterCreatureCard("a creature card"), false, false + new StaticValue(5), false, new StaticValue(1), new FilterCreatureCard("a creature card"), false, true ); - + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{G}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java b/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java index bb0396c8c7..9bacb8ccd7 100644 --- a/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java +++ b/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java @@ -33,10 +33,10 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.CreateTokenCopySourceEffect; import mage.abilities.effects.common.DoIfCostPaid; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.FilterSpell; import mage.filter.predicate.mageobject.HistoricPredicate; @@ -60,7 +60,10 @@ public class MishrasSelfReplicator extends CardImpl { this.toughness = new MageInt(2); // Whenever you cast a historic spell, you may pay {1}. If you do, create a token that's a copy of Mishra's Self-Replicator. - this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(new CreateTokenCopySourceEffect(), new ManaCostsImpl("{1}")), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid( + new CreateTokenCopySourceEffect() + .setText("create a token that's a copy of (this). <i>(Artifacts, legendaries, and Sagas are historic.)</i>"), + new ManaCostsImpl("{1}")), filter, true)); } diff --git a/Mage.Sets/src/mage/cards/m/MultaniYavimayasAvatar.java b/Mage.Sets/src/mage/cards/m/MultaniYavimayasAvatar.java index d526a6cbc2..ddfa8c755d 100644 --- a/Mage.Sets/src/mage/cards/m/MultaniYavimayasAvatar.java +++ b/Mage.Sets/src/mage/cards/m/MultaniYavimayasAvatar.java @@ -28,7 +28,6 @@ package mage.cards.m; import java.util.UUID; - import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -36,24 +35,17 @@ import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.AdditiveDynamicValue; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.CardsInAllHandsCount; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; -import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.ReachAbility; -import mage.abilities.keyword.ShroudAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterLandCard; -import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetControlledPermanent; /** @@ -73,7 +65,6 @@ public class MultaniYavimayasAvatar extends CardImpl { this.power = new MageInt(0); this.toughness = new MageInt(0); - this.addAbility(ReachAbility.getInstance()); this.addAbility(TrampleAbility.getInstance()); @@ -82,9 +73,12 @@ public class MultaniYavimayasAvatar extends CardImpl { PermanentsOnBattlefieldCount permanentsOnBattlefieldCount = new PermanentsOnBattlefieldCount(LANDS_YOU_CONTROL_FILTER); DynamicValue powerToughnessValue = new AdditiveDynamicValue(graveyardCount, permanentsOnBattlefieldCount); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(powerToughnessValue, powerToughnessValue, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(powerToughnessValue, powerToughnessValue, Duration.WhileOnBattlefield) + .setText("{this} gets +1/+1 for each land you control and each land in your graveyard") + )); - //1G, Return two lands you control to their owner's hand: Return Multani from your graveyard to your hand. + //{1}{G}, Return two lands you control to their owner's hand: Return Multani from your graveyard to your hand. SimpleActivatedAbility returnToHand = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{1}{G}")); returnToHand.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, LANDS_YOU_CONTROL_FILTER, true))); this.addAbility(returnToHand); diff --git a/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java b/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java index 2f47a582b7..5630cc5fe7 100644 --- a/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java +++ b/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java @@ -31,14 +31,14 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.HistoricPredicate; @@ -71,7 +71,9 @@ public class RaffCapashenShipsMage extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // You may cast historic spells as though they had flash. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CastAsThoughItHadFlashAllEffect(Duration.WhileOnBattlefield, filter, false))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new CastAsThoughItHadFlashAllEffect(Duration.WhileOnBattlefield, filter, false) + .setText("You may cast historic spells as though they had flash. <i>(Artifacts, legendaries, and Sagas are historic.)</i>"))); } public RaffCapashenShipsMage(final RaffCapashenShipsMage card) { diff --git a/Mage.Sets/src/mage/cards/r/RatColony.java b/Mage.Sets/src/mage/cards/r/RatColony.java index dfb39c6763..dae3e405ae 100644 --- a/Mage.Sets/src/mage/cards/r/RatColony.java +++ b/Mage.Sets/src/mage/cards/r/RatColony.java @@ -70,7 +70,7 @@ public class RatColony extends CardImpl { new StaticValue(0), Duration.WhileOnBattlefield, false))); // A deck can have any number of cards named Rat Colony. - this.getSpellAbility().addEffect(new InfoEffect("A deck can have any number of cards named Rat Colony.")); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("A deck can have any number of cards named Rat Colony."))); } public RatColony(final RatColony card) { diff --git a/Mage.Sets/src/mage/cards/s/SaprolingMigration.java b/Mage.Sets/src/mage/cards/s/SaprolingMigration.java index d3e83fffd9..a5ba30ea7f 100644 --- a/Mage.Sets/src/mage/cards/s/SaprolingMigration.java +++ b/Mage.Sets/src/mage/cards/s/SaprolingMigration.java @@ -52,7 +52,7 @@ public class SaprolingMigration extends CardImpl { // Create two 1/1 green saproling creature tokens. If this spell was kicked, create four of those tokens instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new CreateTokenEffect(new SaprolingToken(), 4), new CreateTokenEffect(new SaprolingToken(), 2), KickedCondition.instance, - "Create twp 1/1 green Saproling creature tokens. If this spell was kicked, create four of those tokens instead")); + "Create two 1/1 green Saproling creature tokens. If this spell was kicked, create four of those tokens instead")); } public SaprolingMigration(final SaprolingMigration card) { diff --git a/Mage.Sets/src/mage/cards/s/SeismicShift.java b/Mage.Sets/src/mage/cards/s/SeismicShift.java index 5f50b0d730..84748a305a 100644 --- a/Mage.Sets/src/mage/cards/s/SeismicShift.java +++ b/Mage.Sets/src/mage/cards/s/SeismicShift.java @@ -51,7 +51,9 @@ public class SeismicShift extends CardImpl { // Destroy target land. Up to two target creatures can't block this turn. this.getSpellAbility().addEffect(new DestroyTargetEffect(false, false)); this.getSpellAbility().addTarget(new TargetLandPermanent()); - this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn).setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn) + .setText("Up to two target creatures can't block this turn") + .setTargetPointer(new SecondTargetPointer())); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); } diff --git a/Mage.Sets/src/mage/cards/s/ShieldOfTheRealm.java b/Mage.Sets/src/mage/cards/s/ShieldOfTheRealm.java index 74544c3a2f..ef04a9549a 100644 --- a/Mage.Sets/src/mage/cards/s/ShieldOfTheRealm.java +++ b/Mage.Sets/src/mage/cards/s/ShieldOfTheRealm.java @@ -53,7 +53,8 @@ public class ShieldOfTheRealm extends CardImpl { this.subtype.add(SubType.EQUIPMENT); // If a source would deal damage to equipped creature, prevent 2 of that damage. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PreventDamageToAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT, 2, false))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new PreventDamageToAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT, 2, false))); // Equip {1} this.addAbility(new EquipAbility(Outcome.PreventDamage, new GenericManaCost(1))); } diff --git a/Mage.Sets/src/mage/cards/s/Skizzik.java b/Mage.Sets/src/mage/cards/s/Skizzik.java index e300c3911f..89596ce9a7 100644 --- a/Mage.Sets/src/mage/cards/s/Skizzik.java +++ b/Mage.Sets/src/mage/cards/s/Skizzik.java @@ -48,7 +48,7 @@ import mage.constants.TargetController; public class Skizzik extends CardImpl { public Skizzik(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.ELEMENTAL); this.power = new MageInt(5); @@ -61,7 +61,8 @@ public class Skizzik extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); // At the beginning of the end step, sacrifice Skizzik unless it was kicked. - this.addAbility(new BeginningOfEndStepTriggeredAbility(new SacrificeSourceUnlessConditionEffect(KickedCondition.instance), TargetController.ANY, false)); + this.addAbility(new BeginningOfEndStepTriggeredAbility( + new SacrificeSourceUnlessConditionEffect(KickedCondition.instance), TargetController.NEXT, false)); } public Skizzik(final Skizzik card) { diff --git a/Mage.Sets/src/mage/cards/s/SongOfFreyalise.java b/Mage.Sets/src/mage/cards/s/SongOfFreyalise.java index fc2e9024c4..2935f0bd6f 100644 --- a/Mage.Sets/src/mage/cards/s/SongOfFreyalise.java +++ b/Mage.Sets/src/mage/cards/s/SongOfFreyalise.java @@ -36,14 +36,14 @@ import mage.abilities.keyword.IndestructibleAbility; import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.mana.AnyColorManaAbility; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SagaChapter; +import mage.constants.SubType; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; +import static mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURES; /** * @@ -51,8 +51,6 @@ import mage.filter.common.FilterControlledCreaturePermanent; */ public class SongOfFreyalise extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creatures you control"); - public SongOfFreyalise(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); @@ -63,16 +61,17 @@ public class SongOfFreyalise extends CardImpl { // I, II — Until your next turn, creatures you control gain "T: Add one mana of any color." sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, - new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.UntilYourNextTurn, filter) + new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.UntilYourNextTurn, FILTER_CONTROLLED_CREATURES) + .setText("Until your next turn, creatures you control gain \"{T}: Add one mana of any color.\"") ); // III — Put a +1/+1 counter on each creature you control. Those creatures gain vigilance, trample, and indestructible until end of turn. - Ability ability = sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter)); - ability.addEffect(new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, filter) - .setText("Those creatures gain vigilance,")); - ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filter) - .setText("trample,")); - ability.addEffect(new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, filter) + Ability ability = sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new AddCountersAllEffect(CounterType.P1P1.createInstance(), FILTER_CONTROLLED_CREATURES)); + ability.addEffect(new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, FILTER_CONTROLLED_CREATURES) + .setText("Those creatures gain vigilance")); + ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, FILTER_CONTROLLED_CREATURES) + .setText(", trample")); + ability.addEffect(new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, FILTER_CONTROLLED_CREATURES) .setText("and indestructible until end of turn")); this.addAbility(sagaAbility); } diff --git a/Mage.Sets/src/mage/cards/t/ThallidOmnivore.java b/Mage.Sets/src/mage/cards/t/ThallidOmnivore.java index 192286c6d7..ccd8e8788d 100644 --- a/Mage.Sets/src/mage/cards/t/ThallidOmnivore.java +++ b/Mage.Sets/src/mage/cards/t/ThallidOmnivore.java @@ -87,7 +87,7 @@ class ThallidOmnivoreEffect extends OneShotEffect { public ThallidOmnivoreEffect() { super(Outcome.GainLife); - this.staticText = "If a saproling was sacrificed in this way you gain 2 life"; + this.staticText = "If a Saproling was sacrificed this way, you gain 2 life"; } public ThallidOmnivoreEffect(final ThallidOmnivoreEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TheFirstEruption.java b/Mage.Sets/src/mage/cards/t/TheFirstEruption.java index ef0c8949b9..d456f607cd 100644 --- a/Mage.Sets/src/mage/cards/t/TheFirstEruption.java +++ b/Mage.Sets/src/mage/cards/t/TheFirstEruption.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.common.SagaAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.BasicManaEffect; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.constants.SubType; @@ -50,7 +49,6 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.BelzenlokDemonToken; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetControlledPermanent; @@ -82,7 +80,7 @@ public class TheFirstEruption extends CardImpl { sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new BasicManaEffect(Mana.RedMana(2))); // III — Sacrifice a Mountain. If you do, The First Eruption deals 3 damage to each creature. - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new CreateTokenEffect(new BelzenlokDemonToken())); + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new TheFirstEruptionEffect()); this.addAbility(sagaAbility); } diff --git a/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java index 7f68af91bb..f3e0e18876 100644 --- a/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java +++ b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java @@ -67,13 +67,14 @@ public class TorgaarFamineIncarnate extends CardImpl { this.toughness = new MageInt(6); // As an additional cost to cast this spell, you may sacrifice any number of creatures. - this.getSpellAbility().addCost(new SacrificeXTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT)); + Cost cost = new SacrificeXTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT); + cost.setText("As an additional cost to cast this spell, you may sacrifice any number of creatures."); + this.getSpellAbility().addCost(cost); // This spell costs {2} less to cast for each creature sacrificed this way. - Ability ability = new SimpleStaticAbility(Zone.STACK, new TorgaarFamineIncarnateEffectCostReductionEffect()); - this.addAbility(ability); + this.addAbility(new SimpleStaticAbility(Zone.STACK, new TorgaarFamineIncarnateEffectCostReductionEffect())); // When Torgaar, Famine Incarnate enters the battlefield, up to one target player's life total becomes half their starting life total, rounded down. - ability = new EntersBattlefieldTriggeredAbility(new TorgaarFamineIncarnateEffect(), false); + Ability ability = new EntersBattlefieldTriggeredAbility(new TorgaarFamineIncarnateEffect(), false); ability.addTarget(new TargetPlayer(0, 1, false)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TraxosScourgeOfKroog.java b/Mage.Sets/src/mage/cards/t/TraxosScourgeOfKroog.java index 9436cc3631..cfa3251d01 100644 --- a/Mage.Sets/src/mage/cards/t/TraxosScourgeOfKroog.java +++ b/Mage.Sets/src/mage/cards/t/TraxosScourgeOfKroog.java @@ -34,14 +34,13 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.UntapSourceEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.HistoricPredicate; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.common.FilterHistoricSpell; /** * @@ -49,12 +48,6 @@ import mage.filter.predicate.mageobject.HistoricPredicate; */ public class TraxosScourgeOfKroog extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a historic spell"); - - static { - filter.add(new HistoricPredicate()); - } - public TraxosScourgeOfKroog(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); @@ -72,7 +65,7 @@ public class TraxosScourgeOfKroog extends CardImpl { ability.addEffect(new DontUntapInControllersUntapStepSourceEffect()); this.addAbility(ability); // Whenever you cast a historic spell untap Traxos. - this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), new FilterHistoricSpell(), false)); } public TraxosScourgeOfKroog(final TraxosScourgeOfKroog card) { diff --git a/Mage.Sets/src/mage/cards/w/WhisperBloodLiturgist.java b/Mage.Sets/src/mage/cards/w/WhisperBloodLiturgist.java index dcd1963f3d..0868e3f823 100644 --- a/Mage.Sets/src/mage/cards/w/WhisperBloodLiturgist.java +++ b/Mage.Sets/src/mage/cards/w/WhisperBloodLiturgist.java @@ -41,7 +41,7 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.StaticFilters; -import static mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledCreaturePermanent; @@ -61,8 +61,10 @@ public class WhisperBloodLiturgist extends CardImpl { this.toughness = new MageInt(2); // {T}, Sacrifice two creatures: Return target creature card from your graveyard to the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToBattlefieldTargetEffect(), new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(2, 2, FILTER_CONTROLLED_CREATURE_SHORT_TEXT, true))); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToBattlefieldTargetEffect() + .setText("Return target creature card from your graveyard to the battlefield"), + new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(2, 2, new FilterControlledCreaturePermanent("two creature"), true))); ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WizardsLightning.java b/Mage.Sets/src/mage/cards/w/WizardsLightning.java index 1359355031..fbf87292cf 100644 --- a/Mage.Sets/src/mage/cards/w/WizardsLightning.java +++ b/Mage.Sets/src/mage/cards/w/WizardsLightning.java @@ -41,13 +41,14 @@ import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetCreatureOrPlayer; + /** * * @author Will */ public class WizardsLightning extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Wizard"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a Wizard"); static { filter.add(new SubtypePredicate(SubType.WIZARD)); diff --git a/Mage.Sets/src/mage/sets/Dominaria.java b/Mage.Sets/src/mage/sets/Dominaria.java index 86f2d721fb..cbf069aaf4 100644 --- a/Mage.Sets/src/mage/sets/Dominaria.java +++ b/Mage.Sets/src/mage/sets/Dominaria.java @@ -113,7 +113,7 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Divination", 52, Rarity.COMMON, mage.cards.d.Divination.class)); cards.add(new SetCardInfo("Dread Shade", 88, Rarity.RARE, mage.cards.d.DreadShade.class)); cards.add(new SetCardInfo("Drudge Sentinel", 89, Rarity.COMMON, mage.cards.d.DrudgeSentinel.class)); - cards.add(new SetCardInfo("Dub", 15, Rarity.SPECIAL, mage.cards.d.Dub.class)); + cards.add(new SetCardInfo("Dub", 15, Rarity.COMMON, mage.cards.d.Dub.class)); cards.add(new SetCardInfo("Elfhame Druid", 159, Rarity.UNCOMMON, mage.cards.e.ElfhameDruid.class)); cards.add(new SetCardInfo("Eviscerate", 91, Rarity.COMMON, mage.cards.e.Eviscerate.class)); cards.add(new SetCardInfo("Evra, Halcyon Witness", 16, Rarity.RARE, mage.cards.e.EvraHalcyonWitness.class)); @@ -126,7 +126,7 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Final Parting", 93, Rarity.UNCOMMON, mage.cards.f.FinalParting.class)); cards.add(new SetCardInfo("Fire Elemental", 120, Rarity.COMMON, mage.cards.f.FireElemental.class)); cards.add(new SetCardInfo("Firefist Adept", 121, Rarity.UNCOMMON, mage.cards.f.FirefistAdept.class)); - cards.add(new SetCardInfo("Firesong and Sunspeaker", 280, Rarity.RARE, mage.cards.f.FiresongAndSunspeaker.class)); + cards.add(new SetCardInfo("Firesong and Sunspeaker", 280, Rarity.RARE, mage.cards.f.FiresongAndSunspeaker.class)); cards.add(new SetCardInfo("Forebear's Blade", 214, Rarity.RARE, mage.cards.f.ForebearsBlade.class)); cards.add(new SetCardInfo("Forest", 266, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 267, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); @@ -220,7 +220,7 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Oath of Teferi", 200, Rarity.RARE, mage.cards.o.OathOfTeferi.class)); cards.add(new SetCardInfo("On Serra's Wings", 28, Rarity.UNCOMMON, mage.cards.o.OnSerrasWings.class)); cards.add(new SetCardInfo("Opt", 60, Rarity.COMMON, mage.cards.o.Opt.class)); - cards.add(new SetCardInfo("Orcish Vandal", 137, Rarity.COMMON, mage.cards.o.OrcishVandal.class)); + cards.add(new SetCardInfo("Orcish Vandal", 137, Rarity.UNCOMMON, mage.cards.o.OrcishVandal.class)); cards.add(new SetCardInfo("Pardic Wanderer", 226, Rarity.COMMON, mage.cards.p.PardicWanderer.class)); cards.add(new SetCardInfo("Pegasus Courser", 29, Rarity.COMMON, mage.cards.p.PegasusCourser.class)); cards.add(new SetCardInfo("Phyrexian Scriptures", 100, Rarity.MYTHIC, mage.cards.p.PhyrexianScriptures.class)); @@ -285,7 +285,7 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Teferi, Hero of Dominaria", 207, Rarity.MYTHIC, mage.cards.t.TeferiHeroOfDominaria.class)); cards.add(new SetCardInfo("Teferi, Timebender", 270, Rarity.MYTHIC, mage.cards.t.TeferiTimebender.class)); cards.add(new SetCardInfo("Tempest Djinn", 68, Rarity.RARE, mage.cards.t.TempestDjinn.class)); - cards.add(new SetCardInfo("Temporal Machinations", 271, Rarity.UNCOMMON, mage.cards.t.TemporalMachinations.class)); + cards.add(new SetCardInfo("Temporal Machinations", 271, Rarity.COMMON, mage.cards.t.TemporalMachinations.class)); cards.add(new SetCardInfo("Territorial Allosaurus", 184, Rarity.RARE, mage.cards.t.TerritorialAllosaurus.class)); cards.add(new SetCardInfo("Teshar, Ancestor's Apostle", 36, Rarity.RARE, mage.cards.t.TesharAncestorsApostle.class)); cards.add(new SetCardInfo("Tetsuko Umezawa, Fugitive", 69, Rarity.UNCOMMON, mage.cards.t.TetsukoUmezawaFugitive.class)); diff --git a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java index 0dd32af4e7..6bae81f1d4 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java @@ -14,6 +14,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @@ -71,7 +72,7 @@ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - StringBuilder sb = new StringBuilder("Whenever you attack with " + minAttackers + " or more "); + StringBuilder sb = new StringBuilder("Whenever you attack with " + CardUtil.numberToText(minAttackers) + " or more "); sb.append(filter.getMessage()); sb.append(", "); sb.append(super.getRule()); diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java index d0139521cc..47ad9fbf81 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java @@ -152,7 +152,7 @@ public class BeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl { case OPPONENT: return sb.insert(0, generateZoneString()).insert(0, "At the beginning of each opponent's upkeep, ").toString(); case ANY: - return sb.insert(0, generateZoneString()).insert(0, "At the beginning of each player's upkeep, ").toString(); + return sb.insert(0, generateZoneString()).insert(0, "At the beginning of each upkeep, ").toString(); case CONTROLLER_ATTACHED_TO: return sb.insert(0, generateZoneString()).insert(0, "At the beginning of the upkeep of enchanted creature's controller, ").toString(); } diff --git a/Mage/src/main/java/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java b/Mage/src/main/java/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java index df84b8d1f4..fe8a1d269d 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java @@ -52,9 +52,14 @@ public class ReturnToHandChosenControlledPermanentCost extends CostImpl { target.setNotTarget(true); this.addTarget(target); if (target.getMaxNumberOfTargets() > 1 && target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { - this.text = "return " + CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' ' + target.getTargetName() + " you control to their owner's hand"; + this.text = "return " + CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' ' + + target.getTargetName() + + (target.getTargetName().endsWith(" you control") ? "" : " you control") + + " to their owner's hand"; } else { - this.text = "return " + target.getTargetName() + " you control to its owner's hand"; + this.text = "return " + target.getTargetName() + + (target.getTargetName().endsWith(" you control") ? "" : " you control") + + " to its owner's hand"; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/AdditiveDynamicValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/AdditiveDynamicValue.java index 980810f3df..bd488c7cf5 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/AdditiveDynamicValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/AdditiveDynamicValue.java @@ -1,37 +1,39 @@ package mage.abilities.dynamicvalue; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.game.Game; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - public class AdditiveDynamicValue implements DynamicValue { - private List<DynamicValue> dynamicValues; + private final List<DynamicValue> dynamicValues; /** - * Creates a {@link DynamicValue} from that adds together multiple {@link DynamicValue}s. + * Creates a {@link DynamicValue} from that adds together multiple + * {@link DynamicValue}s. + * * @param dynamicValues The dynamic values to add together. */ - public AdditiveDynamicValue(DynamicValue...dynamicValues){ + public AdditiveDynamicValue(DynamicValue... dynamicValues) { this.dynamicValues = Arrays.asList(dynamicValues); } /** - * Creates a {@link DynamicValue} from that adds together multiple {@link DynamicValue}s. + * Creates a {@link DynamicValue} from that adds together multiple + * {@link DynamicValue}s. + * * @param dynamicValues The dynamic values to add together. */ - public AdditiveDynamicValue(List<DynamicValue> dynamicValues){ + public AdditiveDynamicValue(List<DynamicValue> dynamicValues) { this.dynamicValues = dynamicValues; } @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return dynamicValues.stream().mapToInt(d->d.calculate(game, sourceAbility, effect)).sum(); + return dynamicValues.stream().mapToInt(d -> d.calculate(game, sourceAbility, effect)).sum(); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java index 84551cb93c..0e9127e709 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java @@ -52,7 +52,7 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { .append(CardUtil.numberToText(amount)) .append(" mana of any ") .append(amount > 1 ? "one " : "") - .append("color to your mana pool").toString(); + .append("color").toString(); } public AddManaOfAnyColorEffect(final AddManaOfAnyColorEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java index c202714545..c0606e874f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java @@ -169,6 +169,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff * @param targetZonePickedCards * @param optional * @param putOnTopSelected + * @param anyOrder */ public LookLibraryAndPickControllerEffect(DynamicValue numberOfCards, boolean mayShuffleAfter, DynamicValue numberToPick, diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToAttachedEffect.java index 40f319594e..2d94f7d493 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToAttachedEffect.java @@ -49,7 +49,7 @@ public class PreventDamageToAttachedEffect extends PreventionEffectImpl { } public PreventDamageToAttachedEffect(Duration duration, AttachmentType attachmentType, int amountToPrevent, boolean combatOnly) { - super(duration, Integer.MAX_VALUE, false, false); + super(duration, amountToPrevent, combatOnly, false); this.attachmentType = attachmentType; staticText = setText(); } @@ -88,14 +88,14 @@ public class PreventDamageToAttachedEffect extends PreventionEffectImpl { sb.append("combat "); } sb.append("damage that would be dealt to "); - sb.append(attachmentType.toString()).append(" creature"); + sb.append(attachmentType.verb()).append(" creature"); } else { sb.append("If a source would deal "); if (onlyCombat) { sb.append("combat "); } sb.append("damage to "); - sb.append(attachmentType.toString()); + sb.append(attachmentType.verb()); sb.append("creature, prevent ").append(amountToPrevent);; sb.append("of that damage"); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java index bd9def4d8e..502b70186b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java @@ -57,7 +57,7 @@ public class UntapLandsEffect extends OneShotEffect { super(Outcome.Untap); this.amount = amount; this.upTo = upTo; - staticText = "Untap " + (upTo ? "up to " : "") + CardUtil.numberToText(amount, staticText) + " lands"; + staticText = "untap " + (upTo ? "up to " : "") + CardUtil.numberToText(amount, staticText) + " lands"; } public UntapLandsEffect(final UntapLandsEffect effect) {