From 5f4ce7a3972bc6b2ab966661502d1cd17780af61 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Tue, 3 Sep 2024 12:06:11 -0400 Subject: [PATCH] [DSK] Implement The Jolly Balloon Man --- .../src/mage/cards/t/TheJollyBalloonMan.java | 93 +++++++++++++++++++ .../src/mage/sets/DuskmournHouseOfHorror.java | 1 + .../common/CreateTokenCopyTargetEffect.java | 21 +++-- .../src/main/java/mage/constants/SubType.java | 1 + 4 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/TheJollyBalloonMan.java diff --git a/Mage.Sets/src/mage/cards/t/TheJollyBalloonMan.java b/Mage.Sets/src/mage/cards/t/TheJollyBalloonMan.java new file mode 100644 index 00000000000..8909d862974 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheJollyBalloonMan.java @@ -0,0 +1,93 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TheJollyBalloonMan extends CardImpl { + + public TheJollyBalloonMan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLOWN); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // {1}, {T}: Create a token that's a copy of another target creature you control, except it's a 1/1 red Balloon creature in addition to its other colors and types and it has flying and haste. Sacrifice it at the beginning of the next end step. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(new TheJollyBalloonManEffect(), new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL)); + this.addAbility(ability); + } + + private TheJollyBalloonMan(final TheJollyBalloonMan card) { + super(card); + } + + @Override + public TheJollyBalloonMan copy() { + return new TheJollyBalloonMan(this); + } +} + +class TheJollyBalloonManEffect extends OneShotEffect { + + TheJollyBalloonManEffect() { + super(Outcome.Benefit); + staticText = "create a token that's a copy of another target creature you control, " + + "except it's a 1/1 red Balloon creature in addition to its other colors " + + "and types and it has flying and haste. Sacrifice it at the beginning of the next end step"; + } + + private TheJollyBalloonManEffect(final TheJollyBalloonManEffect effect) { + super(effect); + } + + @Override + public TheJollyBalloonManEffect copy() { + return new TheJollyBalloonManEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null) { + return false; + } + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect( + null, CardType.CREATURE, true, 1, false, + false, null, 1, 1, true + ); + effect.setExtraColor(ObjectColor.RED); + effect.withAdditionalSubType(SubType.BALLOON); + effect.apply(game, source); + effect.sacrificeTokensCreatedAtNextEndStep(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java index 49374b6fda6..85b21d72ced 100644 --- a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java +++ b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java @@ -57,6 +57,7 @@ public final class DuskmournHouseOfHorror extends ExpansionSet { cards.add(new SetCardInfo("Split Up", 32, Rarity.RARE, mage.cards.s.SplitUp.class)); cards.add(new SetCardInfo("Strangled Cemetery", 268, Rarity.COMMON, mage.cards.s.StrangledCemetery.class)); cards.add(new SetCardInfo("Swamp", 274, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("The Jolly Balloon Man", 219, Rarity.RARE, mage.cards.t.TheJollyBalloonMan.class)); cards.add(new SetCardInfo("The Wandering Rescuer", 41, Rarity.MYTHIC, mage.cards.t.TheWanderingRescuer.class)); cards.add(new SetCardInfo("Toby, Beastie Befriender", 35, Rarity.RARE, mage.cards.t.TobyBeastieBefriender.class)); cards.add(new SetCardInfo("Unwanted Remake", 39, Rarity.UNCOMMON, mage.cards.u.UnwantedRemake.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java index bcf7f83578b..204befa2900 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java @@ -25,7 +25,6 @@ import mage.util.functions.CopyTokenFunction; import mage.util.functions.EmptyCopyApplier; import java.util.*; -import java.util.stream.Collectors; /** * @author LevelX2 @@ -46,7 +45,8 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { private UUID attachedTo = null; private final boolean attacking; private boolean becomesArtifact; - private ObjectColor color; + private ObjectColor onlyColor; + private ObjectColor extraColor; private CounterType counter; private final boolean gainsFlying; private boolean hasHaste; @@ -139,7 +139,8 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { this.attachedTo = effect.attachedTo; this.attacking = effect.attacking; this.becomesArtifact = effect.becomesArtifact; - this.color = effect.color; + this.onlyColor = effect.onlyColor; + this.extraColor = effect.extraColor; this.counter = effect.counter; this.gainsFlying = effect.gainsFlying; this.hasHaste = effect.hasHaste; @@ -243,8 +244,11 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { token.addSubType(additionalSubType); } } - if (color != null) { - token.setColor(color); + if (onlyColor != null) { + token.setColor(onlyColor); + } + if (extraColor != null) { + token.getColor().addColor(extraColor); } additionalAbilities.stream().forEach(token::addAbility); if (permanentModifier != null) { @@ -336,7 +340,12 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { } public CreateTokenCopyTargetEffect setOnlyColor(ObjectColor color) { - this.color = color; + this.onlyColor = color; + return this; + } + + public CreateTokenCopyTargetEffect setExtraColor(ObjectColor extraColor) { + this.extraColor = extraColor; return this; } diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index 9190e31f95d..5af70f3a3bf 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -90,6 +90,7 @@ public enum SubType { AZRA("Azra", SubTypeSet.CreatureType), // B BADGER("Badger", SubTypeSet.CreatureType), + BALLOON("Balloon", SubTypeSet.CreatureType), BARABEL("Barabel", SubTypeSet.CreatureType, true), // Star Wars BARBARIAN("Barbarian", SubTypeSet.CreatureType), BARD("Bard", SubTypeSet.CreatureType),