diff --git a/Mage.Sets/src/mage/cards/b/BlightTitan.java b/Mage.Sets/src/mage/cards/b/BlightTitan.java new file mode 100644 index 00000000000..ad5bbc18d76 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlightTitan.java @@ -0,0 +1,81 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.keyword.IncubateEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; + +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BlightTitan extends CardImpl { + + public BlightTitan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); + + this.subtype.add(SubType.PHYREXIAN); + this.subtype.add(SubType.GIANT); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Whenever Blight Titan enters the battlefield or attacks, mill two cards, then incubate X, where X is the number of creature cards in your graveyard. + Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new MillCardsControllerEffect(2)); + ability.addEffect(new BlightTitanEffect()); + this.addAbility(ability); + } + + private BlightTitan(final BlightTitan card) { + super(card); + } + + @Override + public BlightTitan copy() { + return new BlightTitan(this); + } +} + +class BlightTitanEffect extends OneShotEffect { + + BlightTitanEffect() { + super(Outcome.Benefit); + staticText = ", then incubate X, where X is the number of creature cards in your graveyard"; + } + + private BlightTitanEffect(final BlightTitanEffect effect) { + super(effect); + } + + @Override + public BlightTitanEffect copy() { + return new BlightTitanEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int count = Optional.of(source.getControllerId()) + .map(game::getPlayer) + .filter(Objects::nonNull) + .map(Player::getGraveyard) + .map(graveyard -> graveyard.count(StaticFilters.FILTER_CARD_CREATURE, game)) + .orElse(0); + return IncubateEffect.doIncubate(count, game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BloatedProcessor.java b/Mage.Sets/src/mage/cards/b/BloatedProcessor.java index 9245e7e6da5..d8054a48030 100644 --- a/Mage.Sets/src/mage/cards/b/BloatedProcessor.java +++ b/Mage.Sets/src/mage/cards/b/BloatedProcessor.java @@ -78,6 +78,6 @@ class BloatedProcessorEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = source.getSourcePermanentOrLKI(game); - return permanent != null && new IncubateEffect(permanent.getPower().getValue()).apply(game, source); + return permanent != null && IncubateEffect.doIncubate(permanent.getPower().getValue(), game, source); } } diff --git a/Mage.Sets/src/mage/cards/c/ChromeHostSeedshark.java b/Mage.Sets/src/mage/cards/c/ChromeHostSeedshark.java index 2333be6aaa4..e3b0d3b0c23 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeHostSeedshark.java +++ b/Mage.Sets/src/mage/cards/c/ChromeHostSeedshark.java @@ -68,6 +68,6 @@ class ChromeHostSeedsharkEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Spell spell = (Spell) getValue("spellCast"); - return spell != null && new IncubateEffect(spell.getManaValue()).apply(game, source); + return spell != null && IncubateEffect.doIncubate(spell.getManaValue(), game, source); } } diff --git a/Mage.Sets/src/mage/cards/f/FurnaceGremlin.java b/Mage.Sets/src/mage/cards/f/FurnaceGremlin.java index 2da5510d106..e0c4f244f2c 100644 --- a/Mage.Sets/src/mage/cards/f/FurnaceGremlin.java +++ b/Mage.Sets/src/mage/cards/f/FurnaceGremlin.java @@ -77,6 +77,6 @@ class FurnaceGremlinEffect extends OneShotEffect { .map(MageObject::getPower) .map(MageInt::getValue) .orElse(0); - return new IncubateEffect(power).apply(game, source); + return IncubateEffect.doIncubate(power, game, source); } } diff --git a/Mage.Sets/src/mage/cards/g/GlisteningDawn.java b/Mage.Sets/src/mage/cards/g/GlisteningDawn.java index fd2fc105125..74101d83fc7 100644 --- a/Mage.Sets/src/mage/cards/g/GlisteningDawn.java +++ b/Mage.Sets/src/mage/cards/g/GlisteningDawn.java @@ -58,8 +58,8 @@ class GlisteningDawnEffect extends OneShotEffect { StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND, source.getControllerId(), source, game ); - new IncubateEffect(lands).apply(game, source); - new IncubateEffect(lands).apply(game, source); + IncubateEffect.doIncubate(lands, game, source); + IncubateEffect.doIncubate(lands, game, source); return true; } } diff --git a/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java b/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java index dadc4de8e46..bf0f7e47cc1 100644 --- a/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java +++ b/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java @@ -86,7 +86,7 @@ class ProgenitorExarchEffect extends OneShotEffect { return false; } for (int i = 0; i < xValue; i++) { - new IncubateEffect(3).apply(game, source); + IncubateEffect.doIncubate(3, game, source); } return true; } diff --git a/Mage.Sets/src/mage/cards/s/Sunfall.java b/Mage.Sets/src/mage/cards/s/Sunfall.java index d1fd881dff9..27659318dbf 100644 --- a/Mage.Sets/src/mage/cards/s/Sunfall.java +++ b/Mage.Sets/src/mage/cards/s/Sunfall.java @@ -64,7 +64,7 @@ class SunfallEffect extends OneShotEffect { StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source, game )); player.moveCards(cards, Zone.EXILED, source, game); - new IncubateEffect(cards.size()).apply(game, source); + IncubateEffect.doIncubate(cards.size(), game, source); return true; } } diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java b/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java index 13fecbaed7e..a4e45753437 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java @@ -47,6 +47,7 @@ public final class MarchOfTheMachineCommander extends ExpansionSet { cards.add(new SetCardInfo("Begin the Invasion", 79, Rarity.MYTHIC, mage.cards.b.BeginTheInvasion.class)); cards.add(new SetCardInfo("Bitterthorn, Nissa's Animus", 45, Rarity.RARE, mage.cards.b.BitterthornNissasAnimus.class)); cards.add(new SetCardInfo("Blade Splicer", 175, Rarity.RARE, mage.cards.b.BladeSplicer.class)); + cards.add(new SetCardInfo("Blight Titan", 25, Rarity.RARE, mage.cards.b.BlightTitan.class)); cards.add(new SetCardInfo("Bloodforged Battle-Axe", 349, Rarity.RARE, mage.cards.b.BloodforgedBattleAxe.class)); cards.add(new SetCardInfo("Bloodline Pretender", 350, Rarity.UNCOMMON, mage.cards.b.BloodlinePretender.class)); cards.add(new SetCardInfo("Bojuka Bog", 391, Rarity.COMMON, mage.cards.b.BojukaBog.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/IncubateEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/IncubateEffect.java index 2d8379f0e45..d646d5dc237 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/IncubateEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/IncubateEffect.java @@ -39,14 +39,21 @@ public class IncubateEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + return doIncubate(amount, game, source); + } + + public static boolean doIncubate(int amount, Game game, Ability source) { + return doIncubate(amount, source.getControllerId(), game, source); + } + + public static boolean doIncubate(int amount, UUID playerId, Game game, Ability source) { Token token = new IncubatorToken(); - token.putOntoBattlefield(1, game, source); + token.putOntoBattlefield(1, game, source, playerId); for (UUID tokenId : token.getLastAddedTokenIds()) { Permanent permanent = game.getPermanent(tokenId); - if (permanent == null) { - continue; + if (permanent != null && amount > 0) { + permanent.addCounters(CounterType.P1P1.createInstance(amount), source.getControllerId(), source, game); } - permanent.addCounters(CounterType.P1P1.createInstance(amount), source.getControllerId(), source, game); } return true; }