diff --git a/Mage.Sets/src/mage/cards/k/KotisSibsigChampion.java b/Mage.Sets/src/mage/cards/k/KotisSibsigChampion.java new file mode 100644 index 00000000000..2a5ea82c714 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KotisSibsigChampion.java @@ -0,0 +1,98 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.CastFromGraveyardOnceEachTurnAbility; +import mage.abilities.common.EntersBattlefieldOneOrMoreTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.game.Game; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * + * @author Jmlundeen + */ +public final class KotisSibsigChampion extends CardImpl { + + private static final FilterCreatureCard filter = new FilterCreatureCard("a creature spell"); + private static final FilterCard filter2 = new FilterCard("other cards"); + + static { + filter2.add(AnotherPredicate.instance); + } + + public KotisSibsigChampion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{G}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Once during each of your turns, you may cast a creature spell from your graveyard by exiling three other cards from your graveyard in addition to paying its other costs. + Cost cost = new ExileFromGraveCost(new TargetCardInYourGraveyard(3, filter2)); + cost.setText(cost.getText().replace("exile", "exiling")); + this.addAbility(new CastFromGraveyardOnceEachTurnAbility(filter, cost)); + + // Whenever one or more creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put two +1/+1 counters on Kotis. + this.addAbility(new KotisSibsigTriggeredAbility()); + } + + private KotisSibsigChampion(final KotisSibsigChampion card) { + super(card); + } + + @Override + public KotisSibsigChampion copy() { + return new KotisSibsigChampion(this); + } +} + +class KotisSibsigTriggeredAbility extends EntersBattlefieldOneOrMoreTriggeredAbility { + + KotisSibsigTriggeredAbility() { + super(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, TargetController.YOU); + setTriggerPhrase("Whenever one or more creatures you control enter, " + + "if one or more of them entered from a graveyard or was cast from a graveyard, "); + } + + private KotisSibsigTriggeredAbility(final KotisSibsigTriggeredAbility ability) { + super(ability); + } + + @Override + public KotisSibsigTriggeredAbility copy() { + return new KotisSibsigTriggeredAbility(this); + } + + @Override + public boolean checkEvent(ZoneChangeEvent event, Game game) { + if (super.checkEvent(event, game)) { + Zone fromZone = event.getFromZone(); + if (fromZone == Zone.GRAVEYARD) { + return true; + } + if (fromZone == Zone.STACK) { + Permanent permanent = event.getTarget(); + Spell spell = game.getSpellOrLKIStack(permanent.getId()); + return spell != null && spell.getFromZone() == Zone.GRAVEYARD; + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java index 7731a5afb4e..c25cd68e19f 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java @@ -191,6 +191,7 @@ public final class TarkirDragonstormCommander extends ExpansionSet { cards.add(new SetCardInfo("Keiga, the Tide Star", 156, Rarity.RARE, mage.cards.k.KeigaTheTideStar.class)); cards.add(new SetCardInfo("Kessig Wolf Run", 375, Rarity.RARE, mage.cards.k.KessigWolfRun.class)); cards.add(new SetCardInfo("Kodama's Reach", 261, Rarity.COMMON, mage.cards.k.KodamasReach.class)); + cards.add(new SetCardInfo("Kotis, Sibsig Champion", 5, Rarity.MYTHIC, mage.cards.k.KotisSibsigChampion.class)); cards.add(new SetCardInfo("Lathliss, Dragon Queen", 219, Rarity.RARE, mage.cards.l.LathlissDragonQueen.class)); cards.add(new SetCardInfo("Legion Loyalty", 122, Rarity.MYTHIC, mage.cards.l.LegionLoyalty.class)); cards.add(new SetCardInfo("Legion Warboss", 220, Rarity.RARE, mage.cards.l.LegionWarboss.class)); diff --git a/Mage/src/main/java/mage/abilities/common/CastFromGraveyardOnceEachTurnAbility.java b/Mage/src/main/java/mage/abilities/common/CastFromGraveyardOnceEachTurnAbility.java index 17ddc9a8bd5..3a0f520b724 100644 --- a/Mage/src/main/java/mage/abilities/common/CastFromGraveyardOnceEachTurnAbility.java +++ b/Mage/src/main/java/mage/abilities/common/CastFromGraveyardOnceEachTurnAbility.java @@ -4,6 +4,9 @@ import mage.MageIdentifier; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.SpellAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.Costs; +import mage.abilities.costs.CostsImpl; import mage.abilities.effects.AsThoughEffectImpl; import mage.cards.Card; import mage.constants.*; @@ -28,7 +31,11 @@ import java.util.UUID; public class CastFromGraveyardOnceEachTurnAbility extends SimpleStaticAbility { public CastFromGraveyardOnceEachTurnAbility(FilterCard filter) { - super(new CastFromGraveyardOnceEffect(filter)); + this(filter, null); + } + + public CastFromGraveyardOnceEachTurnAbility(FilterCard filter, Cost additionalCost) { + super(new CastFromGraveyardOnceEffect(filter, additionalCost)); this.addWatcher(new CastFromGraveyardOnceWatcher()); this.setIdentifier(MageIdentifier.CastFromGraveyardOnceWatcher); } @@ -46,17 +53,21 @@ public class CastFromGraveyardOnceEachTurnAbility extends SimpleStaticAbility { class CastFromGraveyardOnceEffect extends AsThoughEffectImpl { private final FilterCard filter; + private final Cost additionalCost; - CastFromGraveyardOnceEffect(FilterCard filter) { + CastFromGraveyardOnceEffect(FilterCard filter, Cost additionalCost) { super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit); this.filter = filter; this.staticText = "Once during each of your turns, you may cast " + filter.getMessage() - + (filter.getMessage().contains("your graveyard") ? "" : " from your graveyard"); + + (filter.getMessage().contains("your graveyard") ? "" : " from your graveyard") + + (additionalCost == null ? "" : " by " + additionalCost.getText() + " in addition to paying its other costs."); + this.additionalCost = additionalCost; } private CastFromGraveyardOnceEffect(final CastFromGraveyardOnceEffect effect) { super(effect); this.filter = effect.filter; + this.additionalCost = effect.additionalCost; } @Override @@ -97,7 +108,14 @@ class CastFromGraveyardOnceEffect extends AsThoughEffectImpl { } Set allowedToBeCastNow = spellAbility.spellCanBeActivatedNow(playerId, game); if (allowedToBeCastNow.contains(MageIdentifier.Default)) { - return filter.match(cardToCheck, playerId, source, game); + boolean matched = filter.match(cardToCheck, playerId, source, game); + if (matched && additionalCost != null) { + Costs costs = new CostsImpl<>(); + costs.add(additionalCost); + controller.setCastSourceIdWithAlternateMana(objectId, spellAbility.getManaCosts(), + costs, MageIdentifier.CastFromGraveyardOnceWatcher); + } + return matched; } } return false;