From 861fd7a0397149ec9f29790fd88897102e19f676 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Sat, 29 May 2021 12:09:44 -0700 Subject: [PATCH 1/6] Implement 4 MH2 cards --- Mage.Sets/src/mage/sets/ModernHorizons2.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Sets/src/mage/sets/ModernHorizons2.java b/Mage.Sets/src/mage/sets/ModernHorizons2.java index 0fe7f95727b..d41030f1755 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons2.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons2.java @@ -29,6 +29,7 @@ public final class ModernHorizons2 extends ExpansionSet { cards.add(new SetCardInfo("Abiding Grace", 1, Rarity.UNCOMMON, mage.cards.a.AbidingGrace.class)); cards.add(new SetCardInfo("Abundant Harvest", 147, Rarity.COMMON, mage.cards.a.AbundantHarvest.class)); + cards.add(new SetCardInfo("Altar of the Goyf", 220, Rarity.UNCOMMON, mage.cards.a.AltarOfTheGoyf.class)); cards.add(new SetCardInfo("Aeromoeba", 37, Rarity.COMMON, mage.cards.a.Aeromoeba.class)); cards.add(new SetCardInfo("Arcbound Mouser", 3, Rarity.COMMON, mage.cards.a.ArcboundMouser.class)); cards.add(new SetCardInfo("Arcbound Shikari", 184, Rarity.UNCOMMON, mage.cards.a.ArcboundShikari.class)); @@ -37,6 +38,7 @@ public final class ModernHorizons2 extends ExpansionSet { cards.add(new SetCardInfo("Arid Mesa", 244, Rarity.RARE, mage.cards.a.AridMesa.class)); cards.add(new SetCardInfo("Asmoranomardicadaistinaculdacar", 186, Rarity.RARE, mage.cards.a.Asmoranomardicadaistinaculdacar.class)); cards.add(new SetCardInfo("Battle Plan", 114, Rarity.COMMON, mage.cards.b.BattlePlan.class)); + cards.add(new SetCardInfo("Blazing Rootwalla", 115, Rarity.UNCOMMON, mage.cards.b.BlazingRootwalla.class)); cards.add(new SetCardInfo("Bone Shards", 76, Rarity.COMMON, mage.cards.b.BoneShards.class)); cards.add(new SetCardInfo("Bone Shredder", 272, Rarity.UNCOMMON, mage.cards.b.BoneShredder.class)); cards.add(new SetCardInfo("Bottle Golems", 222, Rarity.COMMON, mage.cards.b.BottleGolems.class)); @@ -48,9 +50,11 @@ public final class ModernHorizons2 extends ExpansionSet { cards.add(new SetCardInfo("Calibrated Blast", 118, Rarity.RARE, mage.cards.c.CalibratedBlast.class)); cards.add(new SetCardInfo("Chance Encounter", 277, Rarity.RARE, mage.cards.c.ChanceEncounter.class)); cards.add(new SetCardInfo("Chatterstorm", 152, Rarity.COMMON, mage.cards.c.Chatterstorm.class)); + cards.add(new SetCardInfo("Clattering Augur", 79, Rarity.UNCOMMON, mage.cards.c.ClatteringAugur.class)); cards.add(new SetCardInfo("Constable of the Realm", 10, Rarity.UNCOMMON, mage.cards.c.ConstableOfTheRealm.class)); cards.add(new SetCardInfo("Counterspell", 267, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); cards.add(new SetCardInfo("Dakkon, Shadow Slayer", 192, Rarity.MYTHIC, mage.cards.d.DakkonShadowSlayer.class)); + cards.add(new SetCardInfo("Damn", 80, Rarity.RARE, mage.cards.d.Damn.class)); cards.add(new SetCardInfo("Darkmoss Bridge", 245, Rarity.COMMON, mage.cards.d.DarkmossBridge.class)); cards.add(new SetCardInfo("Diamond Lion", 225, Rarity.RARE, mage.cards.d.DiamondLion.class)); cards.add(new SetCardInfo("Discerning Taste", 82, Rarity.COMMON, mage.cards.d.DiscerningTaste.class)); From a3a10784f3d4a39fe46c0764b365a0eaa72067e2 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Sat, 29 May 2021 12:11:14 -0700 Subject: [PATCH 2/6] [MH2] Implement Altar of the Goyf --- .../src/mage/cards/a/AltarOfTheGoyf.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java diff --git a/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java new file mode 100644 index 00000000000..b9668facaa2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java @@ -0,0 +1,98 @@ +package mage.cards.a; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +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; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author jmharmon + */ + +public final class AltarOfTheGoyf extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Lhurgoyf creatures"); + + static { + filter.add(CardType.CREATURE.getPredicate()); + filter.add(SubType.LHURGOYF.getPredicate()); + } + + public AltarOfTheGoyf(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.ARTIFACT}, "{5}"); + + this.subtype.add(SubType.LHURGOYF); + + // Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyard. + this.addAbility(new AltarOfTheGoyfAbility()); + + // Lhurgoyf creatures you control have trample. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter))); + } + + private AltarOfTheGoyf(final AltarOfTheGoyf card) { + super(card); + } + + @Override + public AltarOfTheGoyf copy() { + return new AltarOfTheGoyf(this); + } +} + +class AltarOfTheGoyfAbility extends TriggeredAbilityImpl{ + + public AltarOfTheGoyfAbility() { + super(Zone.BATTLEFIELD, new BoostTargetEffect( + CardTypesInGraveyardCount.instance, CardTypesInGraveyardCount.instance, Duration.EndOfTurn, true), false); + } + + public AltarOfTheGoyfAbility(final AltarOfTheGoyfAbility ability) { + super(ability); + } + + @Override + public AltarOfTheGoyfAbility copy() { + return new AltarOfTheGoyfAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (game.isActivePlayer(this.controllerId)) { + if (game.getCombat().attacksAlone()) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0))); + } + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature you control attacks alone, " + + "it gets +X/+X until end of turn, " + + "where X is the number of card types among cards in all graveyard."; + } +} From f8702342028ffb319ac978b4f3a7beec5b1dfd57 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Sat, 29 May 2021 12:12:42 -0700 Subject: [PATCH 3/6] [MH2] Implement Blazing Rootwalla --- .../src/mage/cards/b/BlazingRootwalla.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BlazingRootwalla.java diff --git a/Mage.Sets/src/mage/cards/b/BlazingRootwalla.java b/Mage.Sets/src/mage/cards/b/BlazingRootwalla.java new file mode 100644 index 00000000000..f3e450b8d7a --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlazingRootwalla.java @@ -0,0 +1,46 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.MadnessAbility; +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 java.util.UUID; + +/** + * @author jmharmon + */ + +public final class BlazingRootwalla extends CardImpl { + + public BlazingRootwalla(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + + this.subtype.add(SubType.LIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {R}: Blazing Rootwalla gets +2/+0 until end of turn. Activate this ability only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(2, 0, Duration.EndOfTurn), new ManaCostsImpl("{R}"))); + + // Madness{0} + this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{0}"))); + } + + private BlazingRootwalla(final BlazingRootwalla card) { + super(card); + } + + @Override + public BlazingRootwalla copy() { + return new BlazingRootwalla(this); + } +} From d00a63c47dc79dbf6c1937209d5bf21af534edea Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Sat, 29 May 2021 12:15:10 -0700 Subject: [PATCH 4/6] [MH2] Implement Clattering Augur --- .../src/mage/cards/c/ClatteringAugur.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ClatteringAugur.java diff --git a/Mage.Sets/src/mage/cards/c/ClatteringAugur.java b/Mage.Sets/src/mage/cards/c/ClatteringAugur.java new file mode 100644 index 00000000000..3801f40b20d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClatteringAugur.java @@ -0,0 +1,57 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CantBlockAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * @author jmharmon + */ + +public final class ClatteringAugur extends CardImpl { + + public ClatteringAugur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.SHAMAN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Clattering Augur can’t block. + this.addAbility(new CantBlockAbility()); + + // When Clattering Augur enters the battlefield, you draw a card and you lose 1 life. + Effect drawEffect = new DrawCardSourceControllerEffect(1, "you"); + Ability ability = new EntersBattlefieldTriggeredAbility(drawEffect); + Effect lifeEffect = new LoseLifeSourceControllerEffect(1); + ability.addEffect(lifeEffect.concatBy("and")); + this.addAbility(ability); + + // {2}{B}{B}: Return Clattering Augur from your graveyard to your hand. + this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{2}{B}{B}"))); + } + + private ClatteringAugur(final ClatteringAugur card) { + super(card); + } + + @Override + public ClatteringAugur copy() { + return new ClatteringAugur(this); + } +} From d73277325924ead5ef4f573d4d55511989be85cf Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Sat, 29 May 2021 12:15:53 -0700 Subject: [PATCH 5/6] [MH2] Implement Damn --- Mage.Sets/src/mage/cards/d/Damn.java | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/Damn.java diff --git a/Mage.Sets/src/mage/cards/d/Damn.java b/Mage.Sets/src/mage/cards/d/Damn.java new file mode 100644 index 00000000000..5a917b4f785 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Damn.java @@ -0,0 +1,40 @@ +package mage.cards.d; + +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.OverloadAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; +import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES; + +import java.util.UUID; + +/** + * @author jmharmon + */ + +public final class Damn extends CardImpl { + + public Damn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}{B}"); + + // Destroy target creature. A creature destroyed this way can’t be regenerated. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); + + // Overload {2}{W}{W} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of “target” with “each.”) + this.addAbility(new OverloadAbility(this, new DestroyAllEffect(FILTER_PERMANENT_CREATURES, true), new ManaCostsImpl("{2}{W}{W"))); + } + + private Damn(final Damn card) { + super(card); + } + + @Override + public Damn copy() { + return new Damn(this); + } +} From 8ec751db2b6358a01fed678f2f1640cea5a7546a Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Thu, 3 Jun 2021 23:43:08 -0700 Subject: [PATCH 6/6] Update AltarOfTheGoyf.java --- Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java index b9668facaa2..a02b4b0a826 100644 --- a/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java +++ b/Mage.Sets/src/mage/cards/a/AltarOfTheGoyf.java @@ -39,7 +39,7 @@ public final class AltarOfTheGoyf extends CardImpl { this.subtype.add(SubType.LHURGOYF); // Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyard. - this.addAbility(new AltarOfTheGoyfAbility()); + this.addAbility(new AltarOfTheGoyfAbility().addHint(CardTypesInGraveyardCount.ALL)); // Lhurgoyf creatures you control have trample. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter))); @@ -80,8 +80,8 @@ class AltarOfTheGoyfAbility extends TriggeredAbilityImpl{ public boolean checkTrigger(GameEvent event, Game game) { if (game.isActivePlayer(this.controllerId)) { if (game.getCombat().attacksAlone()) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0))); + this.getEffects().setTargetPointer(new + FixedTarget(game.getCombat().getAttackers().get(0), game)); { } return true; }